@jenga-ai/agent 3.5.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 (136) hide show
  1. package/README.md +85 -78
  2. package/agents/developer.md +1 -1
  3. package/agents/scrum-master.md +20 -2
  4. package/agents/tester.md +3 -3
  5. package/hooks/on_session_end.sh +5 -5
  6. package/lib/generate-agent-context.js +2 -2
  7. package/lib/generate-copilot-hooks.js +1 -1
  8. package/lib/generate-skill-allow-list.js +79 -8
  9. package/lib/mirror.js +1 -1
  10. package/lib/postinstall-manifest.js +1 -1
  11. package/lib/skill-allow-list.json +2 -2
  12. package/mcp/help/index.js +8 -17
  13. package/mcp/help/scan.js +73 -0
  14. package/package.json +5 -1
  15. package/project/app/api/lib/resolve-project-root.js +1 -1
  16. package/project/app/api/parsers/knowledge-graph.js +100 -9
  17. package/project/app/api/routes/health.js +36 -0
  18. package/project/app/api/scripts/capture-snapshot.js +9 -6
  19. package/project/app/package.json +4 -0
  20. package/project/app/ui/dist/assets/index-BADc5mmH.css +1 -0
  21. package/project/app/ui/dist/assets/index-C3oiuli_.js +104 -0
  22. package/project/app/ui/dist/index.html +2 -2
  23. package/project/app/ui/package.json +4 -0
  24. package/project/app/ui/scripts/build-snapshot-html.cjs +63 -2
  25. package/scripts/acquire-concurrency-slot.sh +35 -5
  26. package/scripts/apply-j-prefix.sh +46 -5
  27. package/scripts/build-pages-site.sh +1 -1
  28. package/scripts/check-public-playbook-steps.sh +158 -52
  29. package/scripts/check-publicignore-match.sh +2 -2
  30. package/scripts/compute-deploy-reconcile.sh +5 -5
  31. package/scripts/delete-bare-skill-dirs.sh +329 -0
  32. package/scripts/generate-legacy-shipped-paths.js +2 -2
  33. package/scripts/idea_manager.sh +273 -3
  34. package/scripts/mark-deployed.sh +2 -2
  35. package/scripts/populate-knowledge-graph.entity-resolution.test.js +254 -0
  36. package/scripts/populate-knowledge-graph.js +213 -5
  37. package/scripts/populate-knowledge-graph.staleness.test.js +130 -0
  38. package/scripts/postinstall.js +1 -1
  39. package/scripts/release-concurrency-slot.sh +34 -4
  40. package/scripts/render-ranked-list.sh +270 -0
  41. package/scripts/repoint-dead-bare-path-prose.py +81 -0
  42. package/scripts/repoint-skill-refs.sh +539 -0
  43. package/scripts/rewrite-stale-skill-preambles.py +188 -0
  44. package/scripts/strip-polyfill-frontmatter.py +166 -0
  45. package/scripts/todo_manager.sh +16 -1
  46. package/scripts/validate-typed-object.sh +750 -0
  47. package/scripts/verify-legacy-seed-reconcile.sh +10 -10
  48. package/scripts/verify-postinstall-reconcile.sh +7 -7
  49. package/scripts/write-context-digest.sh +1 -1
  50. package/skills/j-brainstorm/SKILL.md +3 -4
  51. package/skills/j-btw/SKILL.md +3 -4
  52. package/skills/j-clearify/SKILL.md +5 -6
  53. package/skills/j-close-story/SKILL.md +11 -12
  54. package/skills/j-close-story/scripts/check-privatized.sh +4 -4
  55. package/skills/j-close-story/scripts/check-story-closeable.sh +11 -4
  56. package/skills/j-commit/SKILL.md +3 -4
  57. package/skills/j-continue/SKILL.md +5 -6
  58. package/skills/j-deep-dive/SKILL.md +3 -4
  59. package/skills/j-distribute/CONFIG_SCHEMA.md +82 -5
  60. package/skills/j-distribute/SKILL.md +3 -4
  61. package/skills/j-do/SKILL.md +100 -18
  62. package/skills/j-doc/SKILL.md +3 -4
  63. package/skills/j-doc-sync/SKILL.md +4 -4
  64. package/skills/j-dooo/SKILL.md +6 -15
  65. package/skills/j-error/SKILL.md +3 -4
  66. package/skills/j-evaluate/SKILL.md +3 -4
  67. package/skills/j-examplify/SKILL.md +3 -4
  68. package/skills/j-gitignore/SKILL.md +157 -0
  69. package/skills/j-gitignore/assets/jenga-paths.txt +50 -0
  70. package/skills/j-gitignore/scripts/_catalog.sh +105 -0
  71. package/skills/j-gitignore/scripts/audit-gitignore.sh +194 -0
  72. package/skills/j-gitignore/scripts/repair-gitignore.sh +226 -0
  73. package/skills/j-gitignore/scripts/untrack-jenga-files.sh +210 -0
  74. package/skills/j-help/SKILL.md +3 -4
  75. package/skills/j-idea/SKILL.md +80 -9
  76. package/skills/j-idea/assets/idea_template.md +1 -1
  77. package/skills/j-improve/SKILL.md +4 -5
  78. package/skills/j-init/SKILL.md +23 -14
  79. package/skills/j-init/assets/scope-thresholds_template.json +5 -2
  80. package/skills/j-init/scripts/apply-scaffold-visibility.sh +9 -7
  81. package/skills/j-init/scripts/init.sh +4 -4
  82. package/skills/j-jbp/SKILL.md +3 -4
  83. package/skills/j-lgtm/SKILL.md +3 -4
  84. package/skills/j-pi-plan/SKILL.md +3 -4
  85. package/skills/j-playbook/SKILL.md +1 -1
  86. package/skills/j-proceed/SKILL.md +3 -4
  87. package/skills/j-publish/SKILL.md +4 -5
  88. package/skills/j-publish/adapters/npm-ci.md +6 -1
  89. package/skills/j-publish/adapters/npm.md +1 -1
  90. package/skills/j-publish/scripts/generate_release_notes.sh +1 -1
  91. package/skills/j-publish/scripts/npm_stage_inspect.sh +61 -0
  92. package/skills/j-publish/scripts/run_gates.sh +1 -1
  93. package/skills/j-reconcile/SKILL.md +40 -7
  94. package/skills/j-reconcile/assets/report_format.md +11 -0
  95. package/skills/j-reconcile/scripts/detect-unlinked-code.sh +13 -13
  96. package/skills/j-reconcile-origin/SKILL.md +3 -4
  97. package/skills/j-redo/SKILL.md +4 -5
  98. package/skills/j-skillify/SKILL.md +3 -4
  99. package/skills/j-spinoff/SKILL.md +4 -5
  100. package/skills/j-status/SKILL.md +18 -4
  101. package/skills/j-todo/SKILL.md +44 -5
  102. package/skills/j-todo/scripts/argument-is-not-ranked-list.sh +92 -0
  103. package/skills/j-todo/scripts/argument-is-ranked-list.sh +78 -0
  104. package/skills/j-uncharted/SKILL.md +252 -13
  105. package/skills/j-uncharted/scripts/detect-dependencies.sh +80 -22
  106. package/skills/j-uncharted/scripts/detect-tests.sh +1 -1
  107. package/skills/j-uncharted/scripts/diff-since-baseline.sh +600 -0
  108. package/skills/j-uncharted/scripts/elicitation-state.sh +1 -1
  109. package/skills/j-uncharted/scripts/find-scan-baseline.sh +545 -0
  110. package/skills/j-uncharted/scripts/run-engine.sh +36 -2
  111. package/skills/j-uncharted/scripts/validate-proposed-items.sh +1 -1
  112. package/skills/j-uncharted/scripts/write-scan-record.sh +361 -0
  113. package/skills/j-wtf/SKILL.md +4 -5
  114. package/skills/jenga/SKILL.md +106 -11
  115. package/skills/jenga/playbooks/board-hygiene.json +32 -0
  116. package/skills/jenga/playbooks/schema.json +73 -6
  117. package/skills/jenga/playbooks/understand-then-commit.json +19 -0
  118. package/skills/jenga/scripts/load-nl-catalog.js +5 -2
  119. package/skills/jenga/scripts/load-nl-catalog.sh +1 -1
  120. package/skills/jenga/scripts/load-playbooks.sh +290 -5
  121. package/skills/jenga/scripts/match-playbook.sh +4 -4
  122. package/skills/jenga/scripts/run-playbook-step.sh +267 -1
  123. package/templates/SCRUM_BOARD_SCHEMA.md +14 -1
  124. package/templates/SKILL_TEMPLATE.md +12 -0
  125. package/templates/permission-levels/level-1-locked.json +1 -1
  126. package/templates/permission-levels/level-2-guarded.json +1 -1
  127. package/templates/permission-levels/level-3-standard.json +1 -1
  128. package/templates/permission-levels/level-4-elevated.json +2 -2
  129. package/templates/permission-levels/level-5-unrestricted.json +2 -2
  130. package/templates/playbook-types.json +40 -6
  131. package/project/app/ui/dist/assets/index-7fj-vllY.js +0 -104
  132. package/project/app/ui/dist/assets/index-CdK3Qrep.css +0 -1
  133. package/scripts/audit-twin-divergence.sh +0 -625
  134. package/scripts/generate-j-alias.sh +0 -333
  135. package/skills/j-dev-done/SKILL.md +0 -53
  136. package/skills/j-dev-done/scripts/classify-commit-outcome.sh +0 -114
@@ -83,8 +83,8 @@ make_pkg() {
83
83
  cat > "$dir/package.json" <<'JSON'
84
84
  { "name": "@jenga-ai/agent", "version": "3.0.0", "type": "module" }
85
85
  JSON
86
- mkdir -p "$dir/skills/do" "$dir/agents"
87
- printf '# do skill (still shipped)\n' > "$dir/skills/do/SKILL.md"
86
+ mkdir -p "$dir/skills/j-do" "$dir/agents"
87
+ printf '# do skill (still shipped)\n' > "$dir/skills/j-do/SKILL.md"
88
88
  printf '# developer agent (still shipped)\n' > "$dir/agents/developer.md"
89
89
  }
90
90
 
@@ -116,7 +116,7 @@ PKG="$FIXTURE/pkg"
116
116
  make_pkg "$PKG"
117
117
  write_legacy_paths "$PKG" \
118
118
  "agents/developer.md" \
119
- "skills/do/SKILL.md" \
119
+ "skills/j-do/SKILL.md" \
120
120
  "skills/j-legacy-twin/SKILL.md" \
121
121
  "../OUTSIDE-THE-FIXTURE.txt" \
122
122
  "skills/trap/LINK.md"
@@ -146,7 +146,7 @@ assert_dir "$CONSUMER_A/.agents/skills/j-legacy-twin" \
146
146
  "directory survives because it still holds a consumer file (.agents)"
147
147
  assert_grep "seeded from known-shipped legacy paths" "$FIXTURE/a-install.log" \
148
148
  "install log attributes the cleanup to legacy-path seeding"
149
- assert_file "$CONSUMER_A/.agents/skills/do/SKILL.md" \
149
+ assert_file "$CONSUMER_A/.agents/skills/j-do/SKILL.md" \
150
150
  "currently-shipped skill untouched"
151
151
  assert_file "$CONSUMER_A/.agents/agents/developer.md" \
152
152
  "currently-shipped agent file untouched"
@@ -158,7 +158,7 @@ import json, sys
158
158
  paths = json.load(open(sys.argv[1]))["paths"]
159
159
  assert "skills/j-legacy-twin/SKILL.md" not in paths, "deleted orphan must not be in the fresh manifest"
160
160
  assert "skills/j-legacy-twin/my-notes.md" not in paths, "consumer file must never be in the manifest"
161
- assert "skills/do/SKILL.md" in paths and "agents/developer.md" in paths, "current package paths must be present"
161
+ assert "skills/j-do/SKILL.md" in paths and "agents/developer.md" in paths, "current package paths must be present"
162
162
  PYEOF
163
163
  if [ $? -eq 0 ]; then pass "fresh manifest describes only what is actually on disk post-cleanup"; else fail "fresh manifest is inaccurate"; fi
164
164
 
@@ -174,13 +174,13 @@ assert_nogrep_re "[1-9][0-9]* stale file" "$FIXTURE/b-install.log" \
174
174
  "first-ever install deletes nothing despite a non-empty legacy path list"
175
175
  assert_grep "no previous install manifest" "$FIXTURE/b-install.log" \
176
176
  "first-ever install reports plain additive-only, not a seeded outcome"
177
- assert_file "$CONSUMER_B/.agents/skills/do/SKILL.md" \
177
+ assert_file "$CONSUMER_B/.agents/skills/j-do/SKILL.md" \
178
178
  "first-ever install still copies current package files"
179
179
 
180
180
  # ═══ Scenario C — a legacy path still currently shipped is never touched ═════
181
- # (Implicitly exercised by Scenario A's "do"/"developer.md" already surviving, but
181
+ # (Implicitly exercised by Scenario A's "j-do"/"developer.md" already surviving, but
182
182
  # asserted here as its own named check for clarity.)
183
- assert_file "$CONSUMER_A/.claude/skills/do/SKILL.md" \
183
+ assert_file "$CONSUMER_A/.claude/skills/j-do/SKILL.md" \
184
184
  "a legacy-listed path that is STILL shipped survives untouched (not stale)"
185
185
 
186
186
  # ═══ Scenario D — a legacy path absent from disk is never phantom-seeded ═════
@@ -219,7 +219,7 @@ PKG_F1="$FIXTURE/pkg-f1"
219
219
  make_pkg "$PKG_F1"
220
220
  mkdir -p "$PKG_F1/skills/renamed-old"
221
221
  printf '# renamed-old — removed in the next version\n' > "$PKG_F1/skills/renamed-old/SKILL.md"
222
- write_legacy_paths "$PKG_F1" "agents/developer.md" "skills/do/SKILL.md"
222
+ write_legacy_paths "$PKG_F1" "agents/developer.md" "skills/j-do/SKILL.md"
223
223
 
224
224
  PKG_F2="$FIXTURE/pkg-f2"
225
225
  make_pkg "$PKG_F2"
@@ -228,7 +228,7 @@ import json
228
228
  p = '$PKG_F2/package.json'
229
229
  d = json.load(open(p)); d['version'] = '3.0.1'; json.dump(d, open(p, 'w'))
230
230
  "
231
- write_legacy_paths "$PKG_F2" "agents/developer.md" "skills/do/SKILL.md" "skills/renamed-old/SKILL.md"
231
+ write_legacy_paths "$PKG_F2" "agents/developer.md" "skills/j-do/SKILL.md" "skills/renamed-old/SKILL.md"
232
232
 
233
233
  CONSUMER_F="$FIXTURE/consumer-f"
234
234
  mkdir -p "$CONSUMER_F"
@@ -90,7 +90,7 @@ echo " fixture: $FIXTURE"
90
90
  # ── package v1.0.0 ───────────────────────────────────────────────────────────
91
91
  PKG1="$FIXTURE/pkg-v1"
92
92
  make_pkg "$PKG1" "1.0.0"
93
- add_skill "$PKG1" "do" "# do — stable across both versions"
93
+ add_skill "$PKG1" "j-do" "# j-do — stable across both versions"
94
94
  add_skill "$PKG1" "renamed-old" "# renamed-old — becomes renamed-new in v2"
95
95
  add_skill "$PKG1" "j-legacy-twin" "# j-legacy-twin — excluded in v2 (E50_S06 style)"
96
96
  printf '# developer agent v1\n' > "$PKG1/agents/developer.md"
@@ -98,7 +98,7 @@ printf '# developer agent v1\n' > "$PKG1/agents/developer.md"
98
98
  # ── package v2.0.0 ───────────────────────────────────────────────────────────
99
99
  PKG2="$FIXTURE/pkg-v2"
100
100
  make_pkg "$PKG2" "2.0.0"
101
- add_skill "$PKG2" "do" "# do — stable across both versions" # byte-identical
101
+ add_skill "$PKG2" "j-do" "# j-do — stable across both versions" # byte-identical
102
102
  add_skill "$PKG2" "renamed-new" "# renamed-new — replaces renamed-old"
103
103
  # j-legacy-twin intentionally absent (excluded), renamed-old intentionally absent
104
104
  printf '# developer agent v2 (changed)\n' > "$PKG2/agents/developer.md"
@@ -136,7 +136,7 @@ assert_file "$CONSUMER/.claude/.jenga-postinstall-manifest.json" \
136
136
  "manifest written to .claude on first install"
137
137
  assert_nogrep "preexisting/JUNK.md" "$CONSUMER/.agents/.jenga-postinstall-manifest.json" \
138
138
  "consumer file is NOT recorded in the manifest"
139
- assert_grep "skills/do/SKILL.md" "$CONSUMER/.agents/.jenga-postinstall-manifest.json" \
139
+ assert_grep "skills/j-do/SKILL.md" "$CONSUMER/.agents/.jenga-postinstall-manifest.json" \
140
140
  "manifest records mirrored package paths"
141
141
 
142
142
  # ═══ Scenario B — upgrade with renames / removals / exclusions ════════════════
@@ -153,7 +153,7 @@ done
153
153
 
154
154
  # Record identity of a file common to both versions, to prove it is not needlessly
155
155
  # deleted and recopied (mirror() should classify it as `skipped`).
156
- DO_BEFORE="$(ls -li "$CONSUMER/.agents/skills/do/SKILL.md" | awk '{print $1, $6, $7, $8}')"
156
+ DO_BEFORE="$(ls -li "$CONSUMER/.agents/skills/j-do/SKILL.md" | awk '{print $1, $6, $7, $8}')"
157
157
 
158
158
  run_install "$PKG2" "$CONSUMER" "$FIXTURE/install-v2.log"
159
159
 
@@ -196,7 +196,7 @@ assert_file "$CONSUMER/.claude/skills/renamed-new/SKILL.md" \
196
196
  "renamed-to skill installed (.claude)"
197
197
 
198
198
  # 5. Unchanged common file was neither deleted nor recopied.
199
- DO_AFTER="$(ls -li "$CONSUMER/.agents/skills/do/SKILL.md" | awk '{print $1, $6, $7, $8}')"
199
+ DO_AFTER="$(ls -li "$CONSUMER/.agents/skills/j-do/SKILL.md" | awk '{print $1, $6, $7, $8}')"
200
200
  if [ "$DO_BEFORE" = "$DO_AFTER" ]; then
201
201
  pass "file common to both versions untouched (same inode+mtime)"
202
202
  else
@@ -375,9 +375,9 @@ mkdir -p "$CONSUMER_M"
375
375
  run_install "$PKG1" "$CONSUMER_M" "$FIXTURE/missing-v1.log"
376
376
  run_install "$PKG2M" "$CONSUMER_M" "$FIXTURE/missing-v2.log"
377
377
 
378
- assert_file "$CONSUMER_M/.agents/skills/do/SKILL.md" \
378
+ assert_file "$CONSUMER_M/.agents/skills/j-do/SKILL.md" \
379
379
  "missing copySet entry does not wipe the mirrored subtree (.agents)"
380
- assert_file "$CONSUMER_M/.claude/skills/do/SKILL.md" \
380
+ assert_file "$CONSUMER_M/.claude/skills/j-do/SKILL.md" \
381
381
  "missing copySet entry does not wipe the mirrored subtree (.claude)"
382
382
  assert_grep "Upgrade cleanup skipped" "$FIXTURE/missing-v2.log" \
383
383
  "packaging regression reported, cleanup skipped"
@@ -32,7 +32,7 @@
32
32
  # <producer> | write-context-digest.sh --agent <agent> --session-id <id> --task-id <id>
33
33
  #
34
34
  # If neither --content nor --content-file is given, digest content is read
35
- # from stdin (mirrors skills/uncharted/scripts/import-source.sh's snippet
35
+ # from stdin (mirrors skills/j-uncharted/scripts/import-source.sh's snippet
36
36
  # convention).
37
37
  #
38
38
  # Options:
@@ -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,11 +21,11 @@ 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
- > **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/wtf/SKILL.md`, which delegates to these same instructions.
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
 
31
30
  ## Instructions
32
31
 
@@ -56,4 +55,4 @@ This file is generated/synced by `scripts/generate-j-alias.sh clearify` from `sk
56
55
  ## Examples
57
56
  - `/clearify` — Clarify the most recent user message / relevant conversation context
58
57
  - `/clearify <pasted text>` — Clarify the attached text directly
59
- - `/wtf` — Alias for `/clearify`, invoked via the companion skill in `skills/wtf/`
58
+ - `/wtf` — Alias for `/clearify`, invoked via the companion skill in `skills/j-wtf/`
@@ -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
@@ -5,8 +5,8 @@
5
5
  # Static (run-independent) `.publicignore` membership check for a single
6
6
  # board ticket, invoked by /close-story at both task granularity (Step 2's
7
7
  # per-task loop) and story granularity (Step 4's finalization), per
8
- # E51_S03_T03. Unlike `Merged` (skills/self-sync/scripts/mark-merged.sh) and
9
- # `Publicized` (skills/mirror-public/scripts/mark-publicized.sh, E51_S03_T02),
8
+ # E51_S03_T03. Unlike `Merged` (skills/j-self-sync/scripts/mark-merged.sh) and
9
+ # `Publicized` (skills/j-mirror-public/scripts/mark-publicized.sh, E51_S03_T02),
10
10
  # which both react to a specific run's file diff, `Privatized` has NO
11
11
  # dependency on any run ever having occurred -- it is a pure blocklist
12
12
  # membership test against the ticket's own derived touched-file list, per
@@ -25,7 +25,7 @@
25
25
  # write target.
26
26
  #
27
27
  # Touched-file derivation -- IDENTICAL technique to
28
- # skills/self-sync/scripts/mark-merged.sh (reused, not reinvented, per this
28
+ # skills/j-self-sync/scripts/mark-merged.sh (reused, not reinvented, per this
29
29
  # task's own description):
30
30
  # 1. git log --all --no-merges --extended-regexp \
31
31
  # --grep="<id>([^0-9_]|$)" --pretty=format:'%H'
@@ -41,7 +41,7 @@
41
41
  # 4. Zero matched commits -> nothing to check -> UNCHANGED (not an error).
42
42
  #
43
43
  # .publicignore matching -- ported (not sourced) from
44
- # skills/mirror-public/scripts/mirror.sh's `_publicignore_rule_for` helper:
44
+ # skills/j-mirror-public/scripts/mirror.sh's `_publicignore_rule_for` helper:
45
45
  # directory-prefix match for trailing-"/" lines, glob match against the full
46
46
  # relative path and the basename for everything else, skipping comments,
47
47
  # blank lines, and "+"-prefixed include lines (which never block anything).
@@ -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