@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.
- package/README.md +85 -78
- package/agents/developer.md +1 -1
- package/agents/scrum-master.md +20 -2
- package/agents/tester.md +3 -3
- package/hooks/on_session_end.sh +5 -5
- package/lib/generate-agent-context.js +2 -2
- package/lib/generate-copilot-hooks.js +1 -1
- package/lib/generate-skill-allow-list.js +79 -8
- package/lib/mirror.js +1 -1
- package/lib/postinstall-manifest.js +1 -1
- package/lib/skill-allow-list.json +2 -2
- package/mcp/help/index.js +8 -17
- package/mcp/help/scan.js +73 -0
- package/package.json +5 -1
- package/project/app/api/lib/resolve-project-root.js +1 -1
- package/project/app/api/parsers/knowledge-graph.js +100 -9
- package/project/app/api/routes/health.js +36 -0
- package/project/app/api/scripts/capture-snapshot.js +9 -6
- package/project/app/package.json +4 -0
- package/project/app/ui/dist/assets/index-BADc5mmH.css +1 -0
- package/project/app/ui/dist/assets/index-C3oiuli_.js +104 -0
- package/project/app/ui/dist/index.html +2 -2
- package/project/app/ui/package.json +4 -0
- package/project/app/ui/scripts/build-snapshot-html.cjs +63 -2
- package/scripts/acquire-concurrency-slot.sh +35 -5
- package/scripts/apply-j-prefix.sh +46 -5
- package/scripts/build-pages-site.sh +1 -1
- package/scripts/check-public-playbook-steps.sh +158 -52
- package/scripts/check-publicignore-match.sh +2 -2
- package/scripts/compute-deploy-reconcile.sh +5 -5
- package/scripts/delete-bare-skill-dirs.sh +329 -0
- package/scripts/generate-legacy-shipped-paths.js +2 -2
- package/scripts/idea_manager.sh +273 -3
- package/scripts/mark-deployed.sh +2 -2
- package/scripts/populate-knowledge-graph.entity-resolution.test.js +254 -0
- package/scripts/populate-knowledge-graph.js +213 -5
- package/scripts/populate-knowledge-graph.staleness.test.js +130 -0
- package/scripts/postinstall.js +1 -1
- package/scripts/release-concurrency-slot.sh +34 -4
- package/scripts/render-ranked-list.sh +270 -0
- package/scripts/repoint-dead-bare-path-prose.py +81 -0
- package/scripts/repoint-skill-refs.sh +539 -0
- package/scripts/rewrite-stale-skill-preambles.py +188 -0
- package/scripts/strip-polyfill-frontmatter.py +166 -0
- package/scripts/todo_manager.sh +16 -1
- package/scripts/validate-typed-object.sh +750 -0
- package/scripts/verify-legacy-seed-reconcile.sh +10 -10
- package/scripts/verify-postinstall-reconcile.sh +7 -7
- package/scripts/write-context-digest.sh +1 -1
- package/skills/j-brainstorm/SKILL.md +3 -4
- package/skills/j-btw/SKILL.md +3 -4
- package/skills/j-clearify/SKILL.md +5 -6
- package/skills/j-close-story/SKILL.md +11 -12
- package/skills/j-close-story/scripts/check-privatized.sh +4 -4
- package/skills/j-close-story/scripts/check-story-closeable.sh +11 -4
- package/skills/j-commit/SKILL.md +3 -4
- package/skills/j-continue/SKILL.md +5 -6
- package/skills/j-deep-dive/SKILL.md +3 -4
- package/skills/j-distribute/CONFIG_SCHEMA.md +82 -5
- package/skills/j-distribute/SKILL.md +3 -4
- package/skills/j-do/SKILL.md +100 -18
- package/skills/j-doc/SKILL.md +3 -4
- package/skills/j-doc-sync/SKILL.md +4 -4
- package/skills/j-dooo/SKILL.md +6 -15
- package/skills/j-error/SKILL.md +3 -4
- package/skills/j-evaluate/SKILL.md +3 -4
- package/skills/j-examplify/SKILL.md +3 -4
- package/skills/j-gitignore/SKILL.md +157 -0
- package/skills/j-gitignore/assets/jenga-paths.txt +50 -0
- package/skills/j-gitignore/scripts/_catalog.sh +105 -0
- package/skills/j-gitignore/scripts/audit-gitignore.sh +194 -0
- package/skills/j-gitignore/scripts/repair-gitignore.sh +226 -0
- package/skills/j-gitignore/scripts/untrack-jenga-files.sh +210 -0
- package/skills/j-help/SKILL.md +3 -4
- package/skills/j-idea/SKILL.md +80 -9
- package/skills/j-idea/assets/idea_template.md +1 -1
- package/skills/j-improve/SKILL.md +4 -5
- package/skills/j-init/SKILL.md +23 -14
- package/skills/j-init/assets/scope-thresholds_template.json +5 -2
- package/skills/j-init/scripts/apply-scaffold-visibility.sh +9 -7
- package/skills/j-init/scripts/init.sh +4 -4
- package/skills/j-jbp/SKILL.md +3 -4
- package/skills/j-lgtm/SKILL.md +3 -4
- package/skills/j-pi-plan/SKILL.md +3 -4
- package/skills/j-playbook/SKILL.md +1 -1
- package/skills/j-proceed/SKILL.md +3 -4
- package/skills/j-publish/SKILL.md +4 -5
- package/skills/j-publish/adapters/npm-ci.md +6 -1
- package/skills/j-publish/adapters/npm.md +1 -1
- package/skills/j-publish/scripts/generate_release_notes.sh +1 -1
- package/skills/j-publish/scripts/npm_stage_inspect.sh +61 -0
- package/skills/j-publish/scripts/run_gates.sh +1 -1
- package/skills/j-reconcile/SKILL.md +40 -7
- package/skills/j-reconcile/assets/report_format.md +11 -0
- package/skills/j-reconcile/scripts/detect-unlinked-code.sh +13 -13
- package/skills/j-reconcile-origin/SKILL.md +3 -4
- package/skills/j-redo/SKILL.md +4 -5
- package/skills/j-skillify/SKILL.md +3 -4
- package/skills/j-spinoff/SKILL.md +4 -5
- package/skills/j-status/SKILL.md +18 -4
- package/skills/j-todo/SKILL.md +44 -5
- package/skills/j-todo/scripts/argument-is-not-ranked-list.sh +92 -0
- package/skills/j-todo/scripts/argument-is-ranked-list.sh +78 -0
- package/skills/j-uncharted/SKILL.md +252 -13
- package/skills/j-uncharted/scripts/detect-dependencies.sh +80 -22
- package/skills/j-uncharted/scripts/detect-tests.sh +1 -1
- package/skills/j-uncharted/scripts/diff-since-baseline.sh +600 -0
- package/skills/j-uncharted/scripts/elicitation-state.sh +1 -1
- package/skills/j-uncharted/scripts/find-scan-baseline.sh +545 -0
- package/skills/j-uncharted/scripts/run-engine.sh +36 -2
- package/skills/j-uncharted/scripts/validate-proposed-items.sh +1 -1
- package/skills/j-uncharted/scripts/write-scan-record.sh +361 -0
- package/skills/j-wtf/SKILL.md +4 -5
- package/skills/jenga/SKILL.md +106 -11
- package/skills/jenga/playbooks/board-hygiene.json +32 -0
- package/skills/jenga/playbooks/schema.json +73 -6
- package/skills/jenga/playbooks/understand-then-commit.json +19 -0
- package/skills/jenga/scripts/load-nl-catalog.js +5 -2
- package/skills/jenga/scripts/load-nl-catalog.sh +1 -1
- package/skills/jenga/scripts/load-playbooks.sh +290 -5
- package/skills/jenga/scripts/match-playbook.sh +4 -4
- package/skills/jenga/scripts/run-playbook-step.sh +267 -1
- package/templates/SCRUM_BOARD_SCHEMA.md +14 -1
- package/templates/SKILL_TEMPLATE.md +12 -0
- package/templates/permission-levels/level-1-locked.json +1 -1
- package/templates/permission-levels/level-2-guarded.json +1 -1
- package/templates/permission-levels/level-3-standard.json +1 -1
- package/templates/permission-levels/level-4-elevated.json +2 -2
- package/templates/permission-levels/level-5-unrestricted.json +2 -2
- package/templates/playbook-types.json +40 -6
- package/project/app/ui/dist/assets/index-7fj-vllY.js +0 -104
- package/project/app/ui/dist/assets/index-CdK3Qrep.css +0 -1
- package/scripts/audit-twin-divergence.sh +0 -625
- package/scripts/generate-j-alias.sh +0 -333
- package/skills/j-dev-done/SKILL.md +0 -53
- 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"
|
|
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"
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/skills/j-btw/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.btw
|
|
3
|
-
description:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
25
|
-
#
|
|
26
|
-
#
|
|
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="$(
|
|
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
|
|
package/skills/j-commit/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.commit
|
|
3
|
-
description:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|