@jenga-ai/agent 3.6.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/lib/generate-skill-allow-list.js +42 -5
  2. package/lib/skill-allow-list.json +1 -1
  3. package/package.json +1 -2
  4. package/project/app/api/lib/resolve-project-root.js +1 -1
  5. package/project/app/package.json +4 -0
  6. package/project/app/ui/dist/assets/index-BADc5mmH.css +1 -0
  7. package/project/app/ui/dist/assets/index-C3oiuli_.js +104 -0
  8. package/project/app/ui/dist/index.html +2 -2
  9. package/scripts/acquire-concurrency-slot.sh +34 -4
  10. package/scripts/apply-j-prefix.sh +1 -1
  11. package/scripts/delete-bare-skill-dirs.sh +1 -2
  12. package/scripts/idea_manager.sh +16 -1
  13. package/scripts/release-concurrency-slot.sh +34 -4
  14. package/scripts/render-ranked-list.sh +270 -0
  15. package/scripts/repoint-dead-bare-path-prose.py +81 -0
  16. package/scripts/rewrite-stale-skill-preambles.py +188 -0
  17. package/scripts/strip-polyfill-frontmatter.py +166 -0
  18. package/scripts/todo_manager.sh +16 -1
  19. package/scripts/validate-typed-object.sh +750 -0
  20. package/skills/j-brainstorm/SKILL.md +3 -4
  21. package/skills/j-btw/SKILL.md +3 -4
  22. package/skills/j-clearify/SKILL.md +3 -4
  23. package/skills/j-close-story/SKILL.md +11 -12
  24. package/skills/j-close-story/scripts/check-story-closeable.sh +11 -4
  25. package/skills/j-commit/SKILL.md +3 -4
  26. package/skills/j-continue/SKILL.md +5 -6
  27. package/skills/j-deep-dive/SKILL.md +3 -4
  28. package/skills/j-distribute/SKILL.md +3 -4
  29. package/skills/j-do/SKILL.md +13 -15
  30. package/skills/j-doc/SKILL.md +3 -4
  31. package/skills/j-doc-sync/SKILL.md +3 -4
  32. package/skills/j-dooo/SKILL.md +6 -15
  33. package/skills/j-error/SKILL.md +3 -4
  34. package/skills/j-evaluate/SKILL.md +3 -4
  35. package/skills/j-examplify/SKILL.md +3 -4
  36. package/skills/j-help/SKILL.md +3 -4
  37. package/skills/j-idea/SKILL.md +3 -4
  38. package/skills/j-improve/SKILL.md +3 -4
  39. package/skills/j-init/SKILL.md +20 -11
  40. package/skills/j-init/scripts/apply-scaffold-visibility.sh +8 -6
  41. package/skills/j-jbp/SKILL.md +3 -4
  42. package/skills/j-lgtm/SKILL.md +3 -4
  43. package/skills/j-pi-plan/SKILL.md +3 -4
  44. package/skills/j-proceed/SKILL.md +3 -4
  45. package/skills/j-publish/SKILL.md +3 -4
  46. package/skills/j-publish/scripts/run_gates.sh +1 -1
  47. package/skills/j-reconcile/SKILL.md +38 -5
  48. package/skills/j-reconcile/assets/report_format.md +11 -0
  49. package/skills/j-reconcile/scripts/detect-unlinked-code.sh +2 -2
  50. package/skills/j-reconcile-origin/SKILL.md +3 -4
  51. package/skills/j-redo/SKILL.md +3 -4
  52. package/skills/j-skillify/SKILL.md +3 -4
  53. package/skills/j-spinoff/SKILL.md +3 -4
  54. package/skills/j-status/SKILL.md +4 -5
  55. package/skills/j-todo/SKILL.md +42 -5
  56. package/skills/j-todo/scripts/argument-is-not-ranked-list.sh +92 -0
  57. package/skills/j-todo/scripts/argument-is-ranked-list.sh +78 -0
  58. package/skills/j-uncharted/SKILL.md +251 -12
  59. package/skills/j-uncharted/scripts/detect-dependencies.sh +79 -21
  60. package/skills/j-uncharted/scripts/diff-since-baseline.sh +600 -0
  61. package/skills/j-uncharted/scripts/find-scan-baseline.sh +545 -0
  62. package/skills/j-uncharted/scripts/run-engine.sh +36 -2
  63. package/skills/j-uncharted/scripts/write-scan-record.sh +361 -0
  64. package/skills/j-wtf/SKILL.md +3 -4
  65. package/skills/jenga/SKILL.md +69 -8
  66. package/skills/jenga/playbooks/schema.json +4 -4
  67. package/skills/jenga/scripts/load-nl-catalog.js +5 -2
  68. package/skills/jenga/scripts/load-playbooks.sh +289 -4
  69. package/skills/jenga/scripts/match-playbook.sh +4 -4
  70. package/skills/jenga/scripts/run-playbook-step.sh +267 -1
  71. package/templates/permission-levels/level-1-locked.json +1 -1
  72. package/templates/permission-levels/level-2-guarded.json +1 -1
  73. package/templates/permission-levels/level-3-standard.json +1 -1
  74. package/templates/permission-levels/level-4-elevated.json +1 -1
  75. package/templates/permission-levels/level-5-unrestricted.json +1 -1
  76. package/templates/playbook-types.json +6 -0
  77. package/project/app/ui/dist/assets/index-BVR_7Owg.css +0 -1
  78. package/project/app/ui/dist/assets/index-CtU2xLQm.js +0 -104
  79. package/scripts/audit-twin-divergence.sh +0 -693
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.brainstorm
3
- description: Polyfill alias of the brainstorm skill under a collision-safe directory name. Identical behavior to /brainstorm — Engage the scrum-master agent in a focused planning session to define, refine, or challenge features, improvements, tasks, stories, and epics. The agent asks probing questions, challenges assumptions, and helps shape ideas into actionable backlog items. Use when the bare /brainstorm form is shadowed by another tool's own built-in command of the same name.
3
+ description: Engage the scrum-master agent in a focused planning session to define, refine, or challenge features, improvements, tasks, stories, and epics. The agent asks probing questions, challenges assumptions, and helps shape ideas into actionable backlog items.
4
4
  keywords:
5
5
  - brainstorm
6
6
  - plan
@@ -8,7 +8,6 @@ keywords:
8
8
  - feature planning
9
9
  - requirements
10
10
  - j-brainstorm
11
- - polyfill
12
11
  examples:
13
12
  - "let's brainstorm ideas for X"
14
13
  - "I need to plan a new feature"
@@ -19,9 +18,9 @@ metadata:
19
18
 
20
19
  # Brainstorm — Collaborative Planning with the Scrum Master
21
20
 
22
- This skill is a literal-directory-name duplicate of `skills/brainstorm/`. It exists so that `/j-brainstorm` (and `j.j-brainstorm`) give a guaranteed-unshadowed way to reach the same flow as `/brainstorm`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/brainstorm` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
21
+ `skills/j-brainstorm/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-brainstorm/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
23
22
 
24
- This file is generated/synced by `scripts/generate-j-alias.sh brainstorm` from `skills/brainstorm/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
23
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/brainstorm/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
25
24
 
26
25
  ## Instructions
27
26
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.btw
3
- description: Polyfill alias of the btw skill under a collision-safe directory name. Identical behavior to /btw — Capture a new mission (feature, change, or addition) and fit it into the project's Epic/Story structure, then choose to implement now or defer. Use when the bare /btw form is shadowed by another tool's own built-in command of the same name.
3
+ description: Capture a new mission (feature, change, or addition) and fit it into the project's Epic/Story structure, then choose to implement now or defer.
4
4
  keywords:
5
5
  - btw
6
6
  - capture
@@ -8,7 +8,6 @@ keywords:
8
8
  - new idea
9
9
  - side task
10
10
  - j-btw
11
- - polyfill
12
11
  examples:
13
12
  - "btw I also need to add X"
14
13
  - "capture this as a new task"
@@ -19,9 +18,9 @@ metadata:
19
18
 
20
19
  # BTW — Capture a Mission
21
20
 
22
- This skill is a literal-directory-name duplicate of `skills/btw/`. It exists so that `/j-btw` (and `j.j-btw`) give a guaranteed-unshadowed way to reach the same flow as `/btw`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/btw` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
21
+ `skills/j-btw/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-btw/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
23
22
 
24
- This file is generated/synced by `scripts/generate-j-alias.sh btw` from `skills/btw/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
23
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/btw/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
25
24
 
26
25
  ## Instructions
27
26
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.clearify
3
- description: Polyfill alias of the clearify skill under a collision-safe directory name. Identical behavior to /clearify — Clarifies ambiguous, dense, or under-specified prompts and conversation on request — inspects an attached prompt or falls back to the current conversation and surfaces plain-language clarifications with examples. Use when the bare /clearify form is shadowed by another tool's own built-in command of the same name.
3
+ description: Clarifies ambiguous, dense, or under-specified prompts and conversation on request — inspects an attached prompt or falls back to the current conversation and surfaces plain-language clarifications with examples.
4
4
  keywords:
5
5
  - clarify this
6
6
  - clarify
@@ -10,7 +10,6 @@ keywords:
10
10
  - explain that again
11
11
  - can you simplify
12
12
  - j-clearify
13
- - polyfill
14
13
  examples:
15
14
  - "clarify this"
16
15
  - "clearify the last message"
@@ -22,9 +21,9 @@ alias: wtf
22
21
 
23
22
  # Clearify — Ambiguity Clarification
24
23
 
25
- This skill is a literal-directory-name duplicate of `skills/clearify/`. It exists so that `/j-clearify` (and `j.j-clearify`) give a guaranteed-unshadowed way to reach the same flow as `/clearify`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/clearify` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
24
+ `skills/j-clearify/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-clearify/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
26
25
 
27
- This file is generated/synced by `scripts/generate-j-alias.sh clearify` from `skills/clearify/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
26
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/clearify/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
28
27
 
29
28
  > **Note on the `alias: wtf` frontmatter field:** this repo has no runtime mechanism that reads an `alias` key to route slash commands — no existing `SKILL.md` implements one, and `project/configs/workflow.json` has no alias registry. The field here documents the intended relationship only. `/wtf` is made invocable as a working alias by the companion skill folder at `skills/j-wtf/SKILL.md`, which delegates to these same instructions.
30
29
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.close-story
3
- description: Polyfill alias of the close-story skill under a collision-safe directory name. Identical behavior to /close-story — Close a story by verifying all tasks are in terminal state, extracting actual diff stats per task, computing scope divergence flags, and writing closure metadata to task frontmatter. Use when the bare /close-story form is shadowed by another tool's own built-in command of the same name.
3
+ description: Close a story by verifying all tasks are in terminal state, extracting actual diff stats per task, computing scope divergence flags, and writing closure metadata to task frontmatter.
4
4
  keywords:
5
5
  - close story
6
6
  - close
@@ -8,7 +8,6 @@ keywords:
8
8
  - complete story
9
9
  - story done
10
10
  - j-close-story
11
- - polyfill
12
11
  examples:
13
12
  - "close story E17_S06"
14
13
  - "/close-story E32_S06"
@@ -18,9 +17,9 @@ examples:
18
17
 
19
18
  # close-story — Close a Story
20
19
 
21
- This skill is a literal-directory-name duplicate of `skills/close-story/`. It exists so that `/j-close-story` (and `j.j-close-story`) give a guaranteed-unshadowed way to reach the same flow as `/close-story`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/close-story` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
20
+ `skills/j-close-story/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-close-story/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
22
21
 
23
- This file is generated/synced by `scripts/generate-j-alias.sh close-story` from `skills/close-story/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
22
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/close-story/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
24
23
 
25
24
  ## Purpose
26
25
 
@@ -45,7 +44,7 @@ This file is generated/synced by `scripts/generate-j-alias.sh close-story` from
45
44
  Run the guard script:
46
45
 
47
46
  ```bash
48
- bash skills/j-close-story/scripts/check-story-closeable.sh <story-id>
47
+ bash "$([ -f skills/j-close-story/scripts/check-story-closeable.sh ] && echo skills/j-close-story/scripts/check-story-closeable.sh || echo node_modules/@jenga-ai/agent/skills/j-close-story/scripts/check-story-closeable.sh)" <story-id>
49
48
  ```
50
49
 
51
50
  - If it exits with code 0 and prints `CLOSEABLE`, continue.
@@ -72,7 +71,7 @@ For **each task ID** listed in the story's `tasks:` frontmatter array:
72
71
 
73
72
  3. **Run per-task diff stat extraction:**
74
73
  ```bash
75
- bash skills/j-close-story/scripts/extract-task-diff-stats.sh <task-id>
74
+ bash "$([ -f skills/j-close-story/scripts/extract-task-diff-stats.sh ] && echo skills/j-close-story/scripts/extract-task-diff-stats.sh || echo node_modules/@jenga-ai/agent/skills/j-close-story/scripts/extract-task-diff-stats.sh)" <task-id>
76
75
  ```
77
76
  The script outputs:
78
77
  ```
@@ -83,11 +82,11 @@ For **each task ID** listed in the story's `tasks:` frontmatter array:
83
82
 
84
83
  4. **Write stats to task frontmatter:**
85
84
  ```bash
86
- bash skills/j-close-story/scripts/update-task-frontmatter.sh \
85
+ bash "$([ -f skills/j-close-story/scripts/update-task-frontmatter.sh ] && echo skills/j-close-story/scripts/update-task-frontmatter.sh || echo node_modules/@jenga-ai/agent/skills/j-close-story/scripts/update-task-frontmatter.sh)" \
87
86
  "project/board/tasks/<task-id>_*.md" \
88
87
  actual_files_changed <N>
89
88
 
90
- bash skills/j-close-story/scripts/update-task-frontmatter.sh \
89
+ bash "$([ -f skills/j-close-story/scripts/update-task-frontmatter.sh ] && echo skills/j-close-story/scripts/update-task-frontmatter.sh || echo node_modules/@jenga-ai/agent/skills/j-close-story/scripts/update-task-frontmatter.sh)" \
91
90
  "project/board/tasks/<task-id>_*.md" \
92
91
  actual_lines_delta <N>
93
92
  ```
@@ -104,13 +103,13 @@ For **each task ID** listed in the story's `tasks:` frontmatter array:
104
103
 
105
104
  Run the divergence computation:
106
105
  ```bash
107
- DIVERGENCE_FLAG=$(bash skills/j-close-story/scripts/compute-scope-divergence.sh \
106
+ DIVERGENCE_FLAG=$(bash "$([ -f skills/j-close-story/scripts/compute-scope-divergence.sh ] && echo skills/j-close-story/scripts/compute-scope-divergence.sh || echo node_modules/@jenga-ai/agent/skills/j-close-story/scripts/compute-scope-divergence.sh)" \
108
107
  "<execution_scope>" <actual_files_changed> <actual_lines_delta>)
109
108
  ```
110
109
 
111
110
  Write the result to task frontmatter:
112
111
  ```bash
113
- bash skills/j-close-story/scripts/update-task-frontmatter.sh \
112
+ bash "$([ -f skills/j-close-story/scripts/update-task-frontmatter.sh ] && echo skills/j-close-story/scripts/update-task-frontmatter.sh || echo node_modules/@jenga-ai/agent/skills/j-close-story/scripts/update-task-frontmatter.sh)" \
114
113
  "project/board/tasks/<task-id>_*.md" \
115
114
  scope_divergence_flag "$DIVERGENCE_FLAG"
116
115
  ```
@@ -127,7 +126,7 @@ For **each task ID** listed in the story's `tasks:` frontmatter array:
127
126
  frontmatter writes and divergence computation above, check whether this
128
127
  task's own work is permanently excluded from the public mirror:
129
128
  ```bash
130
- bash skills/j-close-story/scripts/check-privatized.sh <task-id> "project/board/tasks/<task-id>_*.md"
129
+ bash "$([ -f skills/j-close-story/scripts/check-privatized.sh ] && echo skills/j-close-story/scripts/check-privatized.sh || echo node_modules/@jenga-ai/agent/skills/j-close-story/scripts/check-privatized.sh)" <task-id> "project/board/tasks/<task-id>_*.md"
131
130
  ```
132
131
  This is a **static** check (per `$([ -f templates/SCRUM_BOARD_SCHEMA.md ] && echo templates/SCRUM_BOARD_SCHEMA.md || echo node_modules/@jenga-ai/agent/templates/SCRUM_BOARD_SCHEMA.md)`'s "Static
133
132
  vs. Reactive Status Setting" section) — it derives the task's touched-file
@@ -177,7 +176,7 @@ against the story's own direct commits (E51_S03_T03) **before** deciding the
177
176
  story's terminal status:
178
177
 
179
178
  ```bash
180
- bash skills/j-close-story/scripts/check-privatized.sh <story-id> "project/board/stories/<story-id>_*.md"
179
+ bash "$([ -f skills/j-close-story/scripts/check-privatized.sh ] && echo skills/j-close-story/scripts/check-privatized.sh || echo node_modules/@jenga-ai/agent/skills/j-close-story/scripts/check-privatized.sh)" <story-id> "project/board/stories/<story-id>_*.md"
181
180
  ```
182
181
 
183
182
  Passing the story id (`E##_S##`) rather than a task id makes the script's
@@ -21,11 +21,18 @@ usage() {
21
21
  exit 1
22
22
  }
23
23
 
24
- # Locate the project root relative to this script's location.
25
- # Script lives at: skills/j-close-story/scripts/check-story-closeable.sh
26
- # Project root is three levels up (skills/ → repo root).
24
+ # Locate the project root via git, not a fixed relative climb — this script
25
+ # is deployed both at its source location (skills/j-close-story/scripts/)
26
+ # and mirrored to .claude/skills/j-close-story/scripts/, and a fixed "three
27
+ # levels up" climb lands in the wrong place from the mirror. Same approach as
28
+ # this directory's siblings: check-privatized.sh:138 and
29
+ # compute-scope-divergence.sh:54.
27
30
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
28
- PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
31
+ PROJECT_ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || true)"
32
+ if [[ -z "$PROJECT_ROOT" ]]; then
33
+ echo "ERROR: could not locate project root (git rev-parse --show-toplevel failed from $SCRIPT_DIR)" >&2
34
+ exit 1
35
+ fi
29
36
  STORIES_DIR="$PROJECT_ROOT/project/board/stories"
30
37
  TASKS_DIR="$PROJECT_ROOT/project/board/tasks"
31
38
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.commit
3
- description: Polyfill alias of the commit skill under a collision-safe directory name. Identical behavior to /commit — Commit implemented epic, story, or task work using the EST naming convention. Also handles user-action prerequisites and new-epic boundaries. Use after completing any EST work item. Use when the bare /commit form is shadowed by another tool's own built-in command of the same name.
3
+ description: Commit implemented epic, story, or task work using the EST naming convention. Also handles user-action prerequisites and new-epic boundaries. Use after completing any EST work item.
4
4
  keywords:
5
5
  - commit
6
6
  - save
@@ -8,7 +8,6 @@ keywords:
8
8
  - done
9
9
  - push
10
10
  - j-commit
11
- - polyfill
12
11
  examples:
13
12
  - "commit this work"
14
13
  - "save my changes"
@@ -17,9 +16,9 @@ examples:
17
16
 
18
17
  # Commit — Commit Completed Work
19
18
 
20
- This skill is a literal-directory-name duplicate of `skills/commit/`. It exists so that `/j-commit` (and `j.j-commit`) give a guaranteed-unshadowed way to reach the same flow as `/commit`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/commit` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
19
+ `skills/j-commit/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-commit/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
21
20
 
22
- This file is generated/synced by `scripts/generate-j-alias.sh commit` from `skills/commit/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
21
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/commit/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
23
22
 
24
23
  ## Inline Mode (called by /do for inline-scoped tasks)
25
24
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.continue
3
- description: Polyfill alias of the continue skill under a collision-safe directory name. Identical behavior to /continue — Check project status across PROJECT_SUMMARY.md, epics, and stories to determine what should be done next. Reports "All done!" if everything is complete. Use when the bare /continue form is shadowed by another tool's own built-in command of the same name.
3
+ description: Check project status across PROJECT_SUMMARY.md, epics, and stories to determine what should be done next. Reports "All done!" if everything is complete.
4
4
  keywords:
5
5
  - continue
6
6
  - next
@@ -8,7 +8,6 @@ keywords:
8
8
  - what's next
9
9
  - status
10
10
  - j-continue
11
- - polyfill
12
11
  examples:
13
12
  - "what should I do next?"
14
13
  - "continue with the project"
@@ -17,17 +16,17 @@ examples:
17
16
 
18
17
  # Continue — Pick Up the Next Work Item
19
18
 
20
- This skill is a literal-directory-name duplicate of `skills/continue/`. It exists so that `/j-continue` (and `j.j-continue`) give a guaranteed-unshadowed way to reach the same flow as `/continue`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/continue` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
19
+ `skills/j-continue/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-continue/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
21
20
 
22
- This file is generated/synced by `scripts/generate-j-alias.sh continue` from `skills/continue/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
21
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/continue/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
23
22
 
24
23
  ## Instructions
25
24
 
26
25
  1. **Check `project/PROJECT_SUMMARY.md`** — Determine if there is outstanding work at the project level.
27
26
 
28
- 2. **Check `project/epics/`** — If the project summary is done, check if any epics have remaining work.
27
+ 2. **Check `project/board/epics/`** — If the project summary is done, check if any epics have remaining work.
29
28
 
30
- 3. **Check `project/stories/`** — If epics are done, check if any stories have remaining work.
29
+ 3. **Check `project/board/stories/`** — If epics are done, check if any stories have remaining work.
31
30
 
32
31
  **Important:** Always check story status within an epic even if the epic itself is marked as done.
33
32
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.deep-dive
3
- description: Polyfill alias of the deep-dive skill under a collision-safe directory name. Identical behavior to /deep-dive — >. Use when the bare /deep-dive form is shadowed by another tool's own built-in command of the same name.
3
+ description: ">."
4
4
  metadata:
5
5
  prefered_agent: scrum_master
6
6
  keywords:
@@ -9,7 +9,6 @@ keywords:
9
9
  - "analyze thoroughly"
10
10
  - "think through"
11
11
  - j-deep-dive
12
- - polyfill
13
12
  examples:
14
13
  - "deep dive on this idea"
15
14
  - "let's think through this properly"
@@ -20,9 +19,9 @@ examples:
20
19
 
21
20
  # /deep-dive — Deep Investigation Workflow
22
21
 
23
- This skill is a literal-directory-name duplicate of `skills/deep-dive/`. It exists so that `/j-deep-dive` (and `j.j-deep-dive`) give a guaranteed-unshadowed way to reach the same flow as `/deep-dive`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/deep-dive` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
22
+ `skills/j-deep-dive/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-deep-dive/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
24
23
 
25
- This file is generated/synced by `scripts/generate-j-alias.sh deep-dive` from `skills/deep-dive/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
24
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/deep-dive/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
26
25
 
27
26
  ## Overview
28
27
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.distribute
3
- description: Polyfill alias of the distribute skill under a collision-safe directory name. Identical behavior to /distribute — Distribute Jenga AI framework files from this private monorepo to one or more consuming projects via the local filesystem. Manages release type selection, version bumping, dry-run preview, per-target file copy, and a post-distribution git commit. Use when the bare /distribute form is shadowed by another tool's own built-in command of the same name.
3
+ description: Distribute Jenga AI framework files from this private monorepo to one or more consuming projects via the local filesystem. Manages release type selection, version bumping, dry-run preview, per-target file copy, and a post-distribution git commit.
4
4
  keywords:
5
5
  - distribute
6
6
  - private distribution
@@ -9,7 +9,6 @@ keywords:
9
9
  - version bump
10
10
  - distribute to projects
11
11
  - j-distribute
12
- - polyfill
13
12
  examples:
14
13
  - "/distribute"
15
14
  - "/distribute /path/to/consuming-project"
@@ -19,9 +18,9 @@ examples:
19
18
 
20
19
  # Distribute
21
20
 
22
- This skill is a literal-directory-name duplicate of `skills/distribute/`. It exists so that `/j-distribute` (and `j.j-distribute`) give a guaranteed-unshadowed way to reach the same flow as `/distribute`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/distribute` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
21
+ `skills/j-distribute/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-distribute/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
23
22
 
24
- This file is generated/synced by `scripts/generate-j-alias.sh distribute` from `skills/distribute/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
23
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/distribute/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
25
24
 
26
25
  Copies Jenga AI framework files from this monorepo to all active consuming projects registered in `distribute.config.json`. Manages the full version lifecycle: release type selection, `package.json` version bump, dry-run preview, per-target file copy, and a final git commit of the version bump.
27
26
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.do
3
- description: Polyfill alias of the do skill under a collision-safe directory name. Identical behavior to /do — Execute tasks from the scrum board. Reads from project/todo.md, resolves each entry to its full scrum board context, and drives the developer agent through implementation with the correct sender object and communication contract. Loops until all selected tasks are done or the user exits. Use when the bare /do form is shadowed by another tool's own built-in command of the same name.
3
+ description: Execute tasks from the scrum board. Reads from project/todo.md, resolves each entry to its full scrum board context, and drives the developer agent through implementation with the correct sender object and communication contract. Loops until all selected tasks are done or the user exits.
4
4
  keywords:
5
5
  - do
6
6
  - execute
@@ -8,7 +8,6 @@ keywords:
8
8
  - work on
9
9
  - build
10
10
  - j-do
11
- - polyfill
12
11
  examples:
13
12
  - "implement the login feature"
14
13
  - "work on the API endpoint"
@@ -26,11 +25,10 @@ directory under a distinct name, so a host tool shipping its own same-named buil
26
25
  shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see
27
26
  `docs/skill-authoring.md`'s "Invocation Convention").
28
27
 
29
- > ⚠️ **Do not run `scripts/generate-j-alias.sh do` against this directory.** This file was
30
- > previously generated from `skills/do/SKILL.md`, and carried a banner saying so. That relationship
31
- > is inverted under the contract above: edits land here first, and `skills/do/` is the copy awaiting
32
- > deletion by `E50_S15`. Regenerating would overwrite this file from the stale bare directory.
33
- > CLAUDE.md states the same prohibition in general terms; this is the concrete instance of it.
28
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is
29
+ > nothing to run.** This file was previously generated from a bare `skills/do/SKILL.md` source;
30
+ > `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for
31
+ > this skill — edit it directly.
34
32
 
35
33
  ## `--trivial` Flag
36
34
 
@@ -194,7 +192,7 @@ After acquiring the epic lock and before writing the bundle manifest, scan all o
194
192
 
195
193
  1. **Extract expected files** from the task's frontmatter field `scope_rationale` and from the task's `## Description` section. Use a best-effort prose heuristic: split the text on whitespace and punctuation, then retain any token that either (a) contains a `/` character or (b) matches the pattern `*.*` (a dot surrounded by non-dot characters on both sides, e.g. `SKILL.md`, `foo.json`). Collect all retained tokens into a set called `expected_files`. This is intentionally permissive — false positives (expected files that were never actually changed) are acceptable and produce no report.
196
194
 
197
- 2. **Compute unexpected files**: let `actual_files` = the array stored at `task_changed_files[<task_id>]` in the bundle manifest (from step c.1). Compute `unexpected = actual_files − expected_files` (set difference: files in `actual_files` that have no match in `expected_files`). Matching is case-sensitive and exact against the relative path or the basename of the path — a token like `SKILL.md` matches any actual file whose basename is `SKILL.md` (e.g. `skills/do/SKILL.md`).
195
+ 2. **Compute unexpected files**: let `actual_files` = the array stored at `task_changed_files[<task_id>]` in the bundle manifest (from step c.1). Compute `unexpected = actual_files − expected_files` (set difference: files in `actual_files` that have no match in `expected_files`). Matching is case-sensitive and exact against the relative path or the basename of the path — a token like `SKILL.md` matches any actual file whose basename is `SKILL.md` (e.g. `skills/j-do/SKILL.md`).
198
196
 
199
197
  3. **If `unexpected` is non-empty**:
200
198
  a. Write a Markdown conflict report to `project/queue/conflict-<task_id>.md` with the following structure:
@@ -235,14 +233,14 @@ After acquiring the epic lock and before writing the bundle manifest, scan all o
235
233
  2. Create the lock file: write the current ISO 8601 timestamp into `project/board/tasks/<task_id>_*.md.lock`.
236
234
  3. Update the task frontmatter field `status: Failed`.
237
235
  4. Delete the lock file immediately after the write completes.
238
- Then invoke the rollback anchor cleanup procedure (see "### Bundle Manifest and Rollback Anchor" — failure path). After the rollback anchor completes, **release the developer concurrency slot** acquired in step 3 above: `scripts/release-concurrency-slot.sh developer <E##_S##> <orchestrator_session_id>` (per `### 4.4` step 2 below). Then **release the epic lock**: run `rm -f project/queue/epic-lock-<E##>.json`. Mark the bundle as failed and **halt** — do not execute any remaining tasks in the sequence.
236
+ Then invoke the rollback anchor cleanup procedure (see "### Bundle Manifest and Rollback Anchor" — failure path). After the rollback anchor completes, **release the developer concurrency slot** acquired in step 3 above: `"$([ -f scripts/release-concurrency-slot.sh ] && echo scripts/release-concurrency-slot.sh || echo node_modules/@jenga-ai/agent/scripts/release-concurrency-slot.sh)" developer <E##_S##> <orchestrator_session_id>` (per `### 4.4` step 2 below). Then **release the epic lock**: run `rm -f project/queue/epic-lock-<E##>.json`. Mark the bundle as failed and **halt** — do not execute any remaining tasks in the sequence.
239
237
 
240
238
  5. **Post-bundle verification** (runs only if all tasks completed without failure):
241
239
  - Inspect each task in the bundle for `needs_docs: true` in its frontmatter.
242
240
  - **If any task has `needs_docs: true`**: invoke the tester agent once for the full story. Pass the story ID, the list of all task IDs in the bundle, and the shared worktree path. The tester is responsible for updating individual task statuses.
243
241
  - **If all tasks have `needs_docs: false`**: the developer agent self-verifies — reviews each task's implementation against its acceptance criteria without invoking the tester. After self-verification passes, write `status: Passed` and `date_completed: <YYYY-MM-DD>` (today's date) to each task file using the file-locking protocol (steps c.1–c.4 above). No tester invocation occurs.
244
242
 
245
- 6. **Cleanup**: on successful bundle completion, invoke the rollback anchor success path (see "### Bundle Manifest and Rollback Anchor" — success path) to delete the bundle manifest. Then **release the developer concurrency slot** acquired in step 3 above: `scripts/release-concurrency-slot.sh developer <E##_S##> <orchestrator_session_id>` (per `### 4.4` step 2 below). Then **release the epic lock**: run `rm -f project/queue/epic-lock-<E##>.json`.
243
+ 6. **Cleanup**: on successful bundle completion, invoke the rollback anchor success path (see "### Bundle Manifest and Rollback Anchor" — success path) to delete the bundle manifest. Then **release the developer concurrency slot** acquired in step 3 above: `"$([ -f scripts/release-concurrency-slot.sh ] && echo scripts/release-concurrency-slot.sh || echo node_modules/@jenga-ai/agent/scripts/release-concurrency-slot.sh)" developer <E##_S##> <orchestrator_session_id>` (per `### 4.4` step 2 below). Then **release the epic lock**: run `rm -f project/queue/epic-lock-<E##>.json`.
246
244
 
247
245
  ### Bundle Manifest and Rollback Anchor
248
246
 
@@ -443,7 +441,7 @@ After resolving the task context (step 4), passing override validation (step 4.1
443
441
 
444
442
  1. **Acquire a developer concurrency slot, then spawn a developer subagent.** Acquire first, per `### 4.4. Developer Concurrency Slot Enforcement` below (`<id>` = this task's id). On a full cap (`capacity_blocked` outcome), do not spawn anything — `### 4.4` already reverts this task's status to `Pending`, logs the `capacity_blocked` event, and tracks the consecutive-block count; stop here and let `/jenga` Phase 4 retry this task on a later wave once a slot frees up. On a successful acquire, spawn the subagent (Agent tool, `subagent_type: "developer"`) with the same sender object and context payload as step 5 would use, but with an explicit instruction added to the dispatch prompt: **do not create a worktree** — implement directly against the current checkout (the session's existing working tree), not an isolated `.claude/worktrees/<slug>` copy. This is the one concrete difference from the step-5 `task` path: everything else about how the subagent implements the task (reading the task file, following acceptance criteria, following repo conventions) is unchanged.
445
443
 
446
- 2. **After the developer subagent reports implementation complete**, first **release the developer concurrency slot** acquired in step 1: `scripts/release-concurrency-slot.sh developer <task_id> <orchestrator_session_id>` (per `### 4.4` step 2) — this subagent's session has ended, so the slot is released now regardless of what it reports, before the smoke test result is even known. Then run the smoke test harness using the same invocation convention as `### 4.2. Inline Execution Path`:
444
+ 2. **After the developer subagent reports implementation complete**, first **release the developer concurrency slot** acquired in step 1: `"$([ -f scripts/release-concurrency-slot.sh ] && echo scripts/release-concurrency-slot.sh || echo node_modules/@jenga-ai/agent/scripts/release-concurrency-slot.sh)" developer <task_id> <orchestrator_session_id>` (per `### 4.4` step 2) — this subagent's session has ended, so the slot is released now regardless of what it reports, before the smoke test result is even known. Then run the smoke test harness using the same invocation convention as `### 4.2. Inline Execution Path`:
447
445
  - Run `bash "$([ -f scripts/smoke-harness.sh ] && echo scripts/smoke-harness.sh || echo node_modules/@jenga-ai/agent/scripts/smoke-harness.sh)" <changed_file>...`, passing the paths the subagent changed. With no arguments the harness infers them from `git diff --name-only HEAD`. It exits `0` on pass and `1` on failure.
448
446
  - If neither `scripts/smoke-harness.sh` nor `node_modules/@jenga-ai/agent/scripts/smoke-harness.sh` exists, log a warning and treat the result as a pass:
449
447
  ```
@@ -468,7 +466,7 @@ This is a self-contained, reusable procedure with two current callers — `### 4
468
466
  2. **Create a worktree** for the task, named `<E##_S##_T##-short-slug>` per standard Worktree Management conventions, if one does not already exist for this task. (A task dispatched under `light` scope, or forced `inline` via `--trivial`, never had one — both premises skip worktree creation — so this step always creates a fresh worktree in that case.)
469
467
  3. **Acquire a developer concurrency slot** (per `### 4.4. Developer Concurrency Slot Enforcement` below, `<id>` = this task's id). This fallback spawn is a distinct developer-subagent lifecycle from whatever `light`/`trivial` attempt preceded it — that attempt's own slot, if any, was already acquired and released around it (`### 4.3` step 1/2, or no slot at all for a `--trivial`-forced inline attempt, which never spawns a subagent) — so this step always acquires its own fresh slot. On a full cap (`capacity_blocked` outcome), do not spawn anything here either: apply `### 4.4`'s Pending-revert/log/consecutive-block handling for this task id and stop the fallback. The task remains exactly as the reduced-overhead attempt left it (any commits already made by that attempt stay in the worktree/branch just created in step 2), and `/jenga` Phase 4 retries it on a later wave once a slot frees up.
470
468
  4. **Spawn a developer subagent** in that worktree and have it pick up from the current state of the code (the changes already made by the reduced-overhead attempt are still present in the working tree / already committed, if any commit occurred — the subagent continues from there rather than starting over).
471
- 5. **Invoke the tester agent** per the normal `### 5. Invoke the developer agent` flow's contract — full sender object, commit SHAs, worktree path. The tester is responsible for the terminal status write, exactly as in the standard `task`-scope pipeline. Once this developer subagent's session ends — tester-verified, failed, or errored — **release the slot** acquired in step 3: `scripts/release-concurrency-slot.sh developer <task_id> <orchestrator_session_id>` (per `### 4.4` step 2).
469
+ 5. **Invoke the tester agent** per the normal `### 5. Invoke the developer agent` flow's contract — full sender object, commit SHAs, worktree path. The tester is responsible for the terminal status write, exactly as in the standard `task`-scope pipeline. Once this developer subagent's session ends — tester-verified, failed, or errored — **release the slot** acquired in step 3: `"$([ -f scripts/release-concurrency-slot.sh ] && echo scripts/release-concurrency-slot.sh || echo node_modules/@jenga-ai/agent/scripts/release-concurrency-slot.sh)" developer <task_id> <orchestrator_session_id>` (per `### 4.4` step 2).
472
470
  6. **Emit a clear, non-fatal fallback notice** to the user/orchestrator, using the message matching the caller's origin:
473
471
  - origin `light`:
474
472
  ```
@@ -497,7 +495,7 @@ Detecting which case applies is mechanical: if the dispatch context already cont
497
495
 
498
496
  1. **Acquire.** Before spawning the developer subagent (or the bundle's shared developer subagent), run:
499
497
  ```
500
- scripts/acquire-concurrency-slot.sh developer <id> <orchestrator_session_id>
498
+ "$([ -f scripts/acquire-concurrency-slot.sh ] && echo scripts/acquire-concurrency-slot.sh || echo node_modules/@jenga-ai/agent/scripts/acquire-concurrency-slot.sh)" developer <id> <orchestrator_session_id>
501
499
  ```
502
500
  Per that script's own exit-code contract:
503
501
  - **Exit `0`** — slot acquired. Proceed to spawn the subagent exactly as documented at the calling site, and carry out step 2 below (release) once that subagent's session ends.
@@ -523,7 +521,7 @@ Detecting which case applies is mechanical: if the dispatch context already cont
523
521
 
524
522
  2. **Release — on every subagent exit path.** Once the spawned developer subagent's session ends — whether it reports success, failure, or an error/exception — run:
525
523
  ```
526
- scripts/release-concurrency-slot.sh developer <id> <orchestrator_session_id>
524
+ "$([ -f scripts/release-concurrency-slot.sh ] && echo scripts/release-concurrency-slot.sh || echo node_modules/@jenga-ai/agent/scripts/release-concurrency-slot.sh)" developer <id> <orchestrator_session_id>
527
525
  ```
528
526
  This call is unconditional and must be reached from every branch that follows a successful acquire in step 1: the success path, the ordinary `/do` failure→skip→`Pending` path, and any other error/exception branch that aborts the calling section early. `release-concurrency-slot.sh` is idempotent by its own contract (a no-op success if the holder entry is already absent), so calling it defensively — even in a code path where it is uncertain whether the acquire actually landed — is always safe and never an error.
529
527
 
@@ -564,7 +562,7 @@ The developer agent will:
564
562
  - Implement, commit at milestones, and invoke the tester agent
565
563
  - Return when the tester has verified the work
566
564
 
567
- **Release the slot on every exit path.** Once the developer agent's session ends — whether it returns having implemented and been verified by the tester, fails outright, or errors — release the slot immediately: `scripts/release-concurrency-slot.sh developer <task_id> <orchestrator_session_id>` (per `### 4.4` step 2). This applies uniformly to the success path above, `/jenga`'s existing "`/do` failure (background agent)" skip-to-`Pending` path (`skills/jenga/SKILL.md`'s Edge Cases), and any other error/exception that aborts this section early.
565
+ **Release the slot on every exit path.** Once the developer agent's session ends — whether it returns having implemented and been verified by the tester, fails outright, or errors — release the slot immediately: `"$([ -f scripts/release-concurrency-slot.sh ] && echo scripts/release-concurrency-slot.sh || echo node_modules/@jenga-ai/agent/scripts/release-concurrency-slot.sh)" developer <task_id> <orchestrator_session_id>` (per `### 4.4` step 2). This applies uniformly to the success path above, `/jenga`'s existing "`/do` failure (background agent)" skip-to-`Pending` path (`skills/jenga/SKILL.md`'s Edge Cases), and any other error/exception that aborts this section early.
568
566
 
569
567
  ### 5.1. Intent-vs-Diff Check (needs_docs: false only)
570
568
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.doc
3
- description: Polyfill alias of the doc skill under a collision-safe directory name. Identical behavior to /doc — Generate or update a documentation file by resolving a target path to a clear documentation objective before writing. Use when the bare /doc form is shadowed by another tool's own built-in command of the same name.
3
+ description: Generate or update a documentation file by resolving a target path to a clear documentation objective before writing.
4
4
  metadata:
5
5
  prefered_agent: developer
6
6
  keywords:
@@ -10,7 +10,6 @@ keywords:
10
10
  - generate docs
11
11
  - update docs
12
12
  - j-doc
13
- - polyfill
14
13
  examples:
15
14
  - "/doc"
16
15
  - "/doc docs/API.md"
@@ -22,9 +21,9 @@ examples:
22
21
 
23
22
  # Doc — Documentation Synthesis and Regeneration
24
23
 
25
- This skill is a literal-directory-name duplicate of `skills/doc/`. It exists so that `/j-doc` (and `j.j-doc`) give a guaranteed-unshadowed way to reach the same flow as `/doc`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/doc` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
24
+ `skills/j-doc/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-doc/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
26
25
 
27
- This file is generated/synced by `scripts/generate-j-alias.sh doc` from `skills/doc/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
26
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/doc/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
28
27
 
29
28
  ## Input Format
30
29
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.doc-sync
3
- description: Polyfill alias of the doc-sync skill under a collision-safe directory name. Identical behavior to /doc-sync — Compare the current state of a project with its documentation and update documentation to reflect changes. Accepts `update:`, `source:`, `exclude:`, and `minify:` arguments to control scope. Use when documentation may be out of date with implementation, or when the user asks to sync, refresh, update, or shrink docs. Use when the bare /doc-sync form is shadowed by another tool's own built-in command of the same name.
3
+ description: Compare the current state of a project with its documentation and update documentation to reflect changes. Accepts `update:`, `source:`, `exclude:`, and `minify:` arguments to control scope. Use when documentation may be out of date with implementation, or when the user asks to sync, refresh, update, or shrink docs.
4
4
  output_types: file_list
5
5
  keywords:
6
6
  - doc-sync
@@ -8,7 +8,6 @@ keywords:
8
8
  - update docs
9
9
  - sync docs
10
10
  - j-doc-sync
11
- - polyfill
12
11
  examples:
13
12
  - "update the documentation"
14
13
  - "sync docs with current state"
@@ -17,9 +16,9 @@ examples:
17
16
 
18
17
  # Doc-Sync — Keep Documentation in Sync with the Codebase
19
18
 
20
- This skill is a literal-directory-name duplicate of `skills/doc-sync/`. It exists so that `/j-doc-sync` (and `j.j-doc-sync`) give a guaranteed-unshadowed way to reach the same flow as `/doc-sync`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/doc-sync` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
19
+ `skills/j-doc-sync/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-doc-sync/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
21
20
 
22
- This file is generated/synced by `scripts/generate-j-alias.sh doc-sync` from `skills/doc-sync/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
21
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/doc-sync/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
23
22
 
24
23
  ## What this skill does
25
24
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: j.dooo
3
- description: Polyfill alias of the dooo skill under a collision-safe directory name. Identical behavior to /dooo — Parallel execution orchestrator. Calls /do to start implementations via sub-agents, then loops back to the board to identify and offer parallelisable tasks until the user selects "Done". Use when the bare /dooo form is shadowed by another tool's own built-in command of the same name.
3
+ description: Parallel execution orchestrator. Calls /do to start implementations via sub-agents, then loops back to the board to identify and offer parallelisable tasks until the user selects "Done".
4
4
  keywords:
5
5
  - dooo
6
6
  - parallel
@@ -8,7 +8,6 @@ keywords:
8
8
  - multiple tasks
9
9
  - orchestrate
10
10
  - j-dooo
11
- - polyfill
12
11
  examples:
13
12
  - "run all pending tasks in parallel"
14
13
  - "execute multiple tasks at once"
@@ -19,32 +18,24 @@ metadata:
19
18
 
20
19
  # Dooo — Parallel Execution Orchestrator
21
20
 
22
- This skill is a literal-directory-name duplicate of `skills/dooo/`. It exists so that `/j-dooo` (and `j.j-dooo`) give a guaranteed-unshadowed way to reach the same flow as `/dooo`, even if a host tool's own built-in command of the same name would otherwise shadow or override the bare `/dooo` alias (Claude Code's native skill resolution is a literal-string, directory-name-based match — see `docs/skill-authoring.md`'s "Invocation Convention").
21
+ `skills/j-dooo/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-dooo/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
23
22
 
24
- This file is generated/synced by `scripts/generate-j-alias.sh dooo` from `skills/dooo/SKILL.md` — do not hand-edit it; re-run the generator instead to pick up source changes.
23
+ > ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/dooo/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
25
24
 
26
25
  ## Instructions
27
26
 
28
27
  ### 1. Invoke `/do`
29
28
  Call the `/do` skill to let the user select and start an implementation. `/do` will launch a background sub-agent to handle the implementation. Once the sub-agent is launched, `/do` returns control here.
30
29
 
31
- After `/do` hands back control, mark the story/task that was just started as **Running** in its board file (update the `status:` field in the YAML front-matter).
30
+ After `/do` hands back control, mark the story/task that was just started as **In Progress** in its board file (update the `status:` field in the YAML front-matter).
32
31
 
33
32
  ### 2. Return to the board — identify parallelisable tasks
34
33
 
35
- Collect candidates from two sources:
36
-
37
- 1. **Stories** — read all files from `project/board/stories/`.
38
- 2. **Tasks derived from stories** — read all files from `project/board/tasks/`. A task is considered in-scope if its parent story (`story_id` in the task's front-matter) is listed in `project/todo.md`, even if the task itself is not directly listed there.
39
-
40
- A story or task is **eligible** to be presented as a parallel candidate if ALL of the following are true:
41
- - Its status is `Pending` (not `Running`, `In Progress`, `Passed`, etc.)
42
- - It has no unresolved dependencies (all blocking stories/tasks are at least `Running` or `Passed`)
43
- - It is directly listed in `project/todo.md`, **OR** its parent story is listed in `project/todo.md`
34
+ Run `scripts/render-ranked-list.sh` from the project root. It scans `project/board/stories/` and `project/board/tasks/` against `project/todo.md` and prints the eligible items as a ranked, 1-indexed `<id> — <title>` list (stories first, then tasks) — this is the same eligibility scan and rendering `/dooo` has always used (status `Pending`, no unresolved dependencies, directly listed in `project/todo.md` or — for tasks — parent story listed), now implemented once in a shared script rather than described here as inline prose (`E63_S01_T01`; see `scripts/render-ranked-list.sh`'s own header for the full rule and its env-var overrides). A sibling command, `/todo --ranked-list`, calls the same script for a non-interactive view of this same list.
44
35
 
45
36
  ### 3. Present choices to the user
46
37
 
47
- Build a numbered list of eligible story titles (use `ask_user` with `choices`). **Always append "Done" as the last option.**
38
+ Relay the script's output as the numbered list (use `ask_user` with `choices`). **Always append "Done" as the last option.**
48
39
 
49
40
  Example:
50
41
  ```