-
Notifications
You must be signed in to change notification settings - Fork 26
v2 #24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
v2 #24
Changes from all commits
96db8e2
e6bb259
b7e23df
3f8d806
9d912d1
98d3c26
4ae90c3
c1aaf13
460c5d0
f389c3b
b6d82a7
1d3f32f
bcb42af
e3ef200
82af7ad
0f896e7
a0469b0
b567d16
dd49bd2
23eb4ef
78f2e23
53ebba5
c7ceed5
c0ee627
77fd7f8
b817803
94c7c5b
0aa0e7b
41fde5f
6bb9d83
e1856ab
4b6ce19
59db4ed
d75586c
ab90ec2
05b0e6d
1eb9bb4
b572a7d
88c4634
48a5893
1e6d267
da00f7b
2ff142e
21d3aba
7adf922
0fb137a
59cf0fd
f1e6007
be849d1
0fd438b
d5058c3
0583a15
da8396f
215a307
5047913
6c74f16
6560c3c
34d7df3
1cc4893
314585e
a16bb4d
b8d3a6a
553b14c
aaee2e2
66b6f90
742231c
2a47a69
306355b
f83fac5
3b16a1c
326bfaa
74eef36
7970b5c
b9df02f
00221aa
b2dc873
99b76a7
187a872
42f6417
4efe4e7
585eaf1
181c96b
4047bf3
7b0409e
2f22adb
5264ac4
76e697b
5bba031
a44616a
ecff053
1561675
ddb8fd1
b90e682
ef3a373
dcf4d1b
81ce4d8
5d62d69
ad3086f
1ea61f8
80ae999
e4bdbe0
4575002
913c45f
590efc2
b019382
a033454
1e3bde9
c77b597
9a0d3ee
58b0131
00b0f28
5436ed1
a5ab012
95ceba7
c50ced9
104ae6e
f222aad
5743a99
c93ee20
d58e3cf
f73935b
29fc7b6
78d6da9
ea0236f
15ba227
688e638
4ef886e
f1dc254
f7e1b06
b66439f
23a0175
894848d
ebb10c2
a61dc15
4f6998e
8db0a0c
99df12f
07ff237
899c337
774cb96
bf419c3
0cbc885
c9e9fb4
8c667ae
ece9773
f1fce6d
964c426
493285b
99d4ea1
238b3d1
1ddd172
f2624e8
30f9e9d
bffe856
9447bb1
a9c75ac
73809bd
1e1bb1f
7338812
5027fef
19e0ca5
3588468
78ad32f
8d593ee
b5875e5
8fa2eb0
fb9fe45
e2db5c6
053eaf9
335d093
ab79eab
0e006c8
a261fc7
4d98c80
837b986
330af12
2cf982e
4e95fb6
0119f12
e73c6ae
99391e5
f0519ad
d168f66
b550aa8
efc053e
8d87a9c
96dd2bd
67afb8f
9506d00
9e883b2
02bc1e6
711a8f8
a77e746
262ba63
37a0a35
ebc5bed
8f76e04
64d7161
064070a
0ea2834
5fefe1f
f464e0d
3194542
eae5b88
92691e6
59fe863
c9cf1e0
0a70808
4ef484e
d6fd906
a1c9b82
918badf
1f037f3
0f49d6d
d30f864
50259c9
62e3fe8
af4be9a
d4d4c94
f53a089
198f053
097a7dd
e94768e
c287280
223b2a8
a7a0b89
b672eb9
59fdb5f
c458e46
645f342
f67842a
6eefe52
382f102
a20fd81
4fb7862
eb8b793
23fc28b
eae48d2
30f01ec
d562a08
19ab71d
880c019
5a8be7e
22db0fd
823fdef
f445d5a
0f4883b
c7e6d24
12862b8
38a44b4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,168 @@ | ||||||
| --- | ||||||
| name: screenize-explorer | ||||||
| description: Explore and debug .screenize project packages. Lists projects, reads project.json, summarizes event streams, displays timeline segments, and shows recording statistics. | ||||||
| user-invocable: true | ||||||
| allowed-tools: | ||||||
| - Bash | ||||||
| - Read | ||||||
| - Glob | ||||||
| - Grep | ||||||
| - AskUserQuestion | ||||||
| --- | ||||||
|
|
||||||
| <role> | ||||||
| You are a Screenize project data inspector. You help developers explore and debug .screenize package contents by reading JSON files and presenting structured summaries. You understand the Screenize data model including project metadata, event streams, timeline tracks, and render settings. | ||||||
| </role> | ||||||
|
|
||||||
| <context> | ||||||
| Screenize is a macOS screen recording app. Projects are stored as `.screenize` packages (macOS directory bundles that appear as single files in Finder). | ||||||
|
|
||||||
| ### Package Structure | ||||||
|
|
||||||
| ``` | ||||||
| MyProject.screenize/ | ||||||
| ├── project.json # ScreenizeProject v5 | ||||||
| └── recording/ | ||||||
| ├── recording.mp4 # Video file | ||||||
| ├── metadata.json # PolyRecordingMetadata | ||||||
| ├── mousemoves-0.json # [PolyMouseMoveEvent] | ||||||
| ├── mouseclicks-0.json # [PolyMouseClickEvent] | ||||||
| ├── keystrokes-0.json # [PolyKeystrokeEvent] | ||||||
| └── uistates-0.json # [PolyUIStateEvent] | ||||||
| ``` | ||||||
|
|
||||||
| ### project.json Schema (v5) | ||||||
|
|
||||||
| Top-level fields: | ||||||
| - `id` (UUID), `version` (int), `name`, `createdAt`, `modifiedAt` (ISO 8601) | ||||||
| - `media`: `{ videoPath, mouseDataPath, pixelSize: {width, height}, frameRate, duration }` | ||||||
| - `captureMeta`: `{ displayID?, boundsPt: {x,y,width,height}, scaleFactor }` | ||||||
| - `timeline`: `{ tracks: [{type, data}], duration, trimStart, trimEnd? }` | ||||||
| - `renderSettings`: codec, quality, resolution, background, corners, shadow, padding, motionBlur | ||||||
| - `interop`: `{ sourceKind, eventBundleVersion, recordingMetadataPath, streams: {mouseMoves, mouseClicks, keystrokes, uiStates}, primaryVideoPath }` | ||||||
| - `frameAnalysisCache` (optional array), `frameAnalysisVersion` | ||||||
|
|
||||||
| ### Timeline Track Types | ||||||
|
|
||||||
| Each track is wrapped as `{ type: "transform"|"cursor"|"keystroke", data: {...} }`: | ||||||
|
|
||||||
| **Camera track** (type: "transform"): segments with `startTime`, `endTime`, `startTransform: {zoom, center: {x, y}}`, `endTransform`, `interpolation`, `mode` ("manual"/"followCursor"), `cursorFollow`, `transitionToNext` | ||||||
|
|
||||||
| **Cursor track** (type: "cursor"): `useSmoothCursor`, segments with `startTime`, `endTime`, `style`, `visible`, `scale`, `clickFeedback`, `transitionToNext` | ||||||
|
|
||||||
| **Keystroke track** (type: "keystroke"): segments with `startTime`, `endTime`, `displayText`, `position`, `fadeInDuration`, `fadeOutDuration` | ||||||
|
|
||||||
| ### Event Stream Formats | ||||||
|
|
||||||
| **metadata.json**: `{ formatVersion, recorderName, recorderVersion, createdAt, processTimeStartMs, processTimeEndMs, unixTimeStartMs, display: { widthPx, heightPx, scaleFactor } }` | ||||||
|
|
||||||
| **mousemoves-0.json**: Array of `{ type, processTimeMs, unixTimeMs, x, y, cursorId?, activeModifiers, button? }`. Coordinates: display-local pixels, top-left origin. | ||||||
|
|
||||||
| **mouseclicks-0.json**: Array of `{ type: "mouseDown"|"mouseUp", processTimeMs, unixTimeMs, x, y, button: "left"|"right", cursorId?, activeModifiers }`. | ||||||
|
|
||||||
| **keystrokes-0.json**: Array of `{ type: "keyDown"|"keyUp", processTimeMs, unixTimeMs, character?, isARepeat, activeModifiers }`. | ||||||
|
|
||||||
| **uistates-0.json**: Array of `{ processTimeMs, unixTimeMs, cursorX, cursorY, elementRole?, elementSubrole?, elementTitle?, elementAppName?, elementFrameX/Y/W/H?, elementIsClickable?, caretX/Y/W/H? }`. | ||||||
|
|
||||||
| ### Computing Timeline Seconds | ||||||
|
|
||||||
| `timelineSec = (event.processTimeMs - metadata.processTimeStartMs) / 1000.0` | ||||||
| </context> | ||||||
|
|
||||||
| <workflow> | ||||||
| When invoked, follow these steps. All output must be in English. | ||||||
|
|
||||||
| ## Step 1: Find Project | ||||||
|
|
||||||
| If the user provides a specific `.screenize` path as an argument, use it directly. | ||||||
|
|
||||||
| Otherwise, search for projects in these locations (in order): | ||||||
| 1. `./projects/` relative to the current working directory | ||||||
| 2. `~/Movies/Screenize/` | ||||||
|
|
||||||
| Use Glob to find `.screenize` packages: | ||||||
| ``` | ||||||
| pattern: projects/**/*.screenize | ||||||
| ``` | ||||||
|
|
||||||
| If multiple projects are found, list them with names and ask the user which one to inspect. If only one is found, use it automatically. If none are found, inform the user. | ||||||
|
|
||||||
| ## Step 2: Package Overview | ||||||
|
|
||||||
| Read `project.json` from the package root. Present: | ||||||
|
|
||||||
| ``` | ||||||
| ### Project: [name] | ||||||
| - **Version**: [version] | **ID**: [id] | ||||||
| - **Created**: [date] | **Modified**: [date] | ||||||
| - **Video**: [width]x[height] @ [fps] fps, [MM:SS duration] | ||||||
| - **Capture**: Display [id], [w]x[h] pt, scale [factor]x | ||||||
| - **Export**: [codec] / [quality] / [resolution] | ||||||
| - **Background**: [enabled/disabled] | ||||||
| - **Trim**: [start] - [end] (or "None") | ||||||
| ``` | ||||||
|
|
||||||
| ## Step 3: Timeline Summary | ||||||
|
|
||||||
| For each track in the timeline: | ||||||
|
|
||||||
| ### Camera Track ([N] segments) | ||||||
| Table with columns: `#`, `Time Range`, `Start Zoom`, `End Zoom`, `Center`, `Mode`, `Easing` | ||||||
|
|
||||||
| ### Cursor Track ([N] segments, smooth: [yes/no]) | ||||||
| Table with columns: `#`, `Time Range`, `Style`, `Visible`, `Scale` | ||||||
|
|
||||||
| ### Keystroke Track ([N] segments) | ||||||
| Table with columns: `#`, `Time Range`, `Text` | ||||||
|
|
||||||
| ## Step 4: Event Stream Statistics | ||||||
|
|
||||||
| Read `recording/metadata.json` first for processTimeStartMs. | ||||||
|
|
||||||
| For each event stream file that exists, read it (use Bash `wc -l` for very large files, or Read for moderate ones) and report: | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
A more reliable approach is a lightweight Python one-liner, which also avoids the " 📄 Suggested fix-For each event stream file that exists, read it (use Bash `wc -l` for very large files, or Read for moderate ones) and report:
+For each event stream file that exists, read it (use Read for moderate files; for very large files use Bash and a lightweight count: `python3 -c "import json,sys; print(len(json.load(open(sys.argv[1]))))" <path>`) and report:📝 Committable suggestion
Suggested change
🧰 Tools🪛 LanguageTool[style] ~122-~122: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase. (EN_WEAK_ADJECTIVE) 🤖 Prompt for AI Agents |
||||||
|
|
||||||
| ### Recording Metadata | ||||||
| - Recorder: [name] v[version] | ||||||
| - Display: [w]x[h] px @ [scale]x | ||||||
| - Duration: [computed] sec | ||||||
| - Created: [date] | ||||||
|
|
||||||
| ### Mouse Moves | ||||||
| - Total: [count] events | ||||||
| - Time range: [first] - [last] sec | ||||||
| - Avg frequency: [count/duration] Hz | ||||||
|
|
||||||
| ### Mouse Clicks | ||||||
| - Total: [count] ([downs] mouseDown, [ups] mouseUp) | ||||||
| - Left: [count] | Right: [count] | ||||||
|
|
||||||
| ### Keystrokes | ||||||
| - Total: [count] ([downs] keyDown, [ups] keyUp) | ||||||
| - Characters: [first 20 unique non-nil characters] | ||||||
|
|
||||||
| ### UI States | ||||||
| - Total: [count] samples | ||||||
| - Unique apps: [list] | ||||||
| - Unique roles: [list] | ||||||
|
|
||||||
| ## Step 5: Deep Dive (Optional) | ||||||
|
|
||||||
| After showing the summary, ask the user if they want to: | ||||||
| 1. View raw JSON of a specific file | ||||||
| 2. Inspect events in a specific time range (e.g., "show clicks between 5.0-10.0 sec") | ||||||
| 3. See detailed camera segment transitions with easing curves | ||||||
| 4. List all UI element interactions in chronological order | ||||||
|
|
||||||
| Only proceed if the user requests one of these. | ||||||
| </workflow> | ||||||
|
|
||||||
| <constraints> | ||||||
| - All output in English. | ||||||
| - Format durations as MM:SS.mmm for precise values, MM:SS for summaries. | ||||||
| - Format coordinates to 3 decimal places. | ||||||
| - For large event files (>10000 events), show count only. For detail, show first 5 and last 5 with "..." between. | ||||||
| - Mark missing files as "[missing]" rather than erroring. | ||||||
| - Never modify any package files. This skill is read-only. | ||||||
| - Use the Read tool for JSON files, not cat via Bash. | ||||||
| - When reading JSON, use Bash `python3 -m json.tool` only if needed for formatting, otherwise Read directly. | ||||||
| </constraints> | ||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -63,5 +63,7 @@ xcuserdata/ | |
| tools | ||
| release | ||
| private-docs | ||
| projects/ | ||
|
|
||
| __pycache__ | ||
| .worktrees/ | ||
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,145 @@ | ||||||||||
| # AGENTS.md | ||||||||||
| Guidance for autonomous coding agents working in this repository. | ||||||||||
|
|
||||||||||
| ## Repository Snapshot | ||||||||||
| - Project: **Screenize** (macOS screen recording and editing app) | ||||||||||
| - Language: **Swift** | ||||||||||
| - UI framework: **SwiftUI** | ||||||||||
| - Target platform: **macOS 13+** | ||||||||||
| - Build system: **Xcode project** (`Screenize.xcodeproj`) | ||||||||||
| - External dependency: **Sparkle** (via Swift Package Manager) | ||||||||||
|
|
||||||||||
| ## Mandatory Agent Workflow | ||||||||||
| Follow this sequence for each meaningful work unit: | ||||||||||
| 1. **START**: run the `work-context-finder` agent to check prior related work. | ||||||||||
| 2. **WORK**: implement the task. | ||||||||||
| 3. **FINISH**: execute `/log-work` using the `work-logger` skill. | ||||||||||
|
|
||||||||||
| Notes: | ||||||||||
| - This workflow is defined in `CLAUDE.md` and should be treated as repository policy. | ||||||||||
| - All generated logs/summaries/tags for vector DB workflows must be in English. | ||||||||||
|
|
||||||||||
| ## Build, Lint, and Test Commands | ||||||||||
| Run all commands from repository root (`/Users/sung-yein/Workspace/screenize`). | ||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The repository root path is hardcoded to a user-specific directory. This should be generalized to be useful for any contributor. Using a placeholder like
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hardcoded local path should be generic.
📝 Suggested fix-Run all commands from repository root (`/Users/sung-yein/Workspace/screenize`).
+Run all commands from the repository root.📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||
|
|
||||||||||
| ### Build | ||||||||||
| ```bash | ||||||||||
| xcodebuild -project Screenize.xcodeproj -scheme Screenize -configuration Debug build | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ### Lint | ||||||||||
| ```bash | ||||||||||
| ./scripts/lint.sh | ||||||||||
| ``` | ||||||||||
| Auto-fix lint violations where possible: | ||||||||||
| ```bash | ||||||||||
| ./scripts/lint.sh --fix | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ### Tests (Current Status + How To Run) | ||||||||||
| Current repository status: | ||||||||||
| - There is currently **no test target** configured in `Screenize.xcodeproj`. | ||||||||||
| - There are currently **no `*Tests*` files/directories** in the repo. | ||||||||||
| - Primary verification today is **successful build + lint**. | ||||||||||
|
|
||||||||||
| When tests are added, use these command patterns: | ||||||||||
|
|
||||||||||
| Run all tests for a scheme: | ||||||||||
| ```bash | ||||||||||
| xcodebuild -project Screenize.xcodeproj -scheme Screenize -destination 'platform=macOS' test | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| Run a single test class: | ||||||||||
| ```bash | ||||||||||
| xcodebuild -project Screenize.xcodeproj -scheme Screenize -destination 'platform=macOS' -only-testing:ScreenizeTests/MyFeatureTests test | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| Run a single test method: | ||||||||||
| ```bash | ||||||||||
| xcodebuild -project Screenize.xcodeproj -scheme Screenize -destination 'platform=macOS' -only-testing:ScreenizeTests/MyFeatureTests/testExample test | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| Tip: if scheme/target names differ, inspect with: | ||||||||||
| ```bash | ||||||||||
| xcodebuild -list -project Screenize.xcodeproj | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ### Permission Reset Helpers (Local Dev) | ||||||||||
| If screen/microphone permission state is broken: | ||||||||||
| ```bash | ||||||||||
| tccutil reset ScreenCapture com.screenize.Screenize | ||||||||||
| tccutil reset Microphone com.screenize.Screenize | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ## Code Style and Conventions | ||||||||||
|
|
||||||||||
| ### Language and Documentation | ||||||||||
| - Write **all code, comments, commit messages, and docs in English**. | ||||||||||
| - Keep comments focused on non-obvious intent or constraints. | ||||||||||
|
|
||||||||||
| ### Imports | ||||||||||
| - Use explicit imports required by each file (avoid unnecessary imports). | ||||||||||
| - Keep import blocks clean and grouped at the file top. | ||||||||||
| - Prefer Apple frameworks first; avoid wildcard or indirect import patterns. | ||||||||||
|
|
||||||||||
| ### Formatting and Lint Rules | ||||||||||
| This repo uses SwiftLint (`.swiftlint.yml`) with key limits: | ||||||||||
| - `line_length`: warning 140, error 200 | ||||||||||
| - `file_length`: warning 600, error 1000 | ||||||||||
| - `function_body_length`: warning 80, error 150 | ||||||||||
| - `type_body_length`: warning 400, error 600 | ||||||||||
| - `function_parameter_count`: warning 8, error 12 | ||||||||||
| - `nesting`: type level 2, function level 5 | ||||||||||
| - `force_cast`: warning only (required in some AXValue APIs) | ||||||||||
| - `force_try`: error | ||||||||||
|
|
||||||||||
| General formatting expectations: | ||||||||||
| - Use clear `// MARK:` sectioning in larger files. | ||||||||||
| - Keep methods small and focused. | ||||||||||
| - Respect existing spacing and brace style already used in nearby code. | ||||||||||
|
|
||||||||||
| ### Types, Concurrency, and State | ||||||||||
| - Prefer strong, domain-specific types over untyped dictionaries. | ||||||||||
| - Use `@MainActor` for major app/state classes and UI-facing state. | ||||||||||
| - Use `Sendable` and safe queue/concurrency boundaries where relevant. | ||||||||||
| - Use async/await patterns consistently with existing code. | ||||||||||
| - Keep singleton usage aligned with existing architecture (`AppState.shared`, `ProjectManager.shared`). | ||||||||||
|
Comment on lines
+102
to
+106
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Vary sentence starts for readability. Three consecutive bullets start with “Use”, which reads monotonous. Consider rephrasing one or two. 🧰 Tools🪛 LanguageTool[style] ~105-~105: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym. (ENGLISH_WORD_REPEAT_BEGINNING_RULE) 🤖 Prompt for AI Agents |
||||||||||
|
|
||||||||||
| ### Naming Conventions | ||||||||||
| - Use descriptive Swift names in standard Apple style. | ||||||||||
| - Use `Manager` / `Coordinator` suffixes for orchestration components. | ||||||||||
| - Keep keyframe/timeline terms consistent with domain model naming. | ||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. AGENTS.md references terminology and features that this PR removes. Three items are now stale given this PR's changes:
Since this file is being added in the same PR, it should reflect the post-migration state. Also applies to: 123-123, 129-129 🤖 Prompt for AI Agents |
||||||||||
| - Use imperative, behavior-first function names for actions. | ||||||||||
|
|
||||||||||
| ### Error Handling and Logging | ||||||||||
| - Prefer typed error propagation (`throw`) when callers can act on failures. | ||||||||||
| - In UI/state layers, convert errors to user-visible messages when appropriate. | ||||||||||
| - Avoid silent failure unless intentionally best-effort. | ||||||||||
| - Keep logs concise and contextual; avoid noisy debug output in stable paths. | ||||||||||
|
|
||||||||||
| ### Architecture-Specific Rules | ||||||||||
| - Internal coordinate standard is **NormalizedPoint** (`0...1`, bottom-left origin). | ||||||||||
| - Convert coordinate spaces only at API boundaries using `CoordinateConverter`. | ||||||||||
| - Keep timeline keyframes sorted by time within tracks. | ||||||||||
| - Preserve three-phase flow: recording -> editor -> export. | ||||||||||
|
|
||||||||||
| ### File and Project System Expectations | ||||||||||
| - Project package format is `.screenize` with `project.json` and `recording/` media. | ||||||||||
| - Persist relative media paths in project JSON; resolve absolute URLs at load boundaries. | ||||||||||
|
|
||||||||||
| ## Git and Change Hygiene for Agents | ||||||||||
| - Do not revert unrelated local changes in a dirty worktree. | ||||||||||
| - Keep edits scoped to the requested task. | ||||||||||
| - Prefer small, reviewable diffs. | ||||||||||
| - Use imperative commit messages when committing (if requested). | ||||||||||
|
|
||||||||||
| ## Cursor / Copilot Rule Files | ||||||||||
| Checked paths: | ||||||||||
| - `.cursor/rules/` | ||||||||||
| - `.cursorrules` | ||||||||||
| - `.github/copilot-instructions.md` | ||||||||||
|
|
||||||||||
| Current status: | ||||||||||
| - No Cursor rules or Copilot instruction files were found in this repository. | ||||||||||
|
|
||||||||||
| If these files are added later, update this document to mirror any required agent constraints. | ||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Second search path (
~/Movies/Screenize/) is not covered by the provided Glob pattern.Step 1 lists two locations to search (lines 79–81), but only one Glob pattern is given (line 85:
projects/**/*.screenize).~/Movies/Screenize/is never matched, so a model following this skill will silently skip that location and the fallback will never trigger.Add a second Glob call, or combine both patterns into the instructions:
📄 Suggested fix
pattern: projects/**/*.screenize
🧰 Tools
🪛 markdownlint-cli2 (0.21.0)
[warning] 84-84: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents