@jenga-ai/agent 1.3.0 → 3.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 +93 -256
- package/agents/developer.md +9 -8
- package/agents/scrum-master.md +57 -23
- package/agents/tester.md +51 -5
- package/hooks/on_session_end.sh +13 -1
- package/lib/generate-agent-context.js +18 -1
- package/lib/generate-copilot-instructions.js +18 -1
- package/lib/generate-skill-allow-list.js +197 -0
- package/lib/skill-allow-list.json +42 -0
- package/package.json +17 -13
- package/scripts/apply-j-prefix.sh +243 -0
- package/scripts/consume-context-digest.sh +103 -0
- package/scripts/generate-j-alias.sh +333 -0
- package/scripts/postinstall.js +25 -0
- package/scripts/sweep-stale-context-digests.sh +132 -0
- package/scripts/validate-board.sh +5 -0
- package/scripts/write-context-digest.sh +230 -0
- package/skills/{brainstorm → j-brainstorm}/SKILL.md +9 -2
- package/skills/{btw → j-btw}/SKILL.md +9 -2
- package/skills/{clearify → j-clearify}/SKILL.md +9 -2
- package/skills/{close-story → j-close-story}/SKILL.md +92 -13
- package/skills/j-close-story/scripts/check-privatized.sh +345 -0
- package/skills/{close-story → j-close-story}/scripts/check-story-closeable.sh +1 -1
- package/skills/{close-story → j-close-story}/scripts/extract-task-diff-stats.sh +1 -1
- package/skills/{commit → j-commit}/SKILL.md +9 -2
- package/skills/j-continue/SKILL.md +36 -0
- package/skills/{deep-dive → j-deep-dive}/SKILL.md +9 -8
- package/skills/{dev-done → j-dev-done}/SKILL.md +11 -4
- package/skills/{dev-done → j-dev-done}/scripts/classify-commit-outcome.sh +4 -4
- package/skills/{distribute → j-distribute}/SKILL.md +17 -10
- package/skills/{distribute → j-distribute}/scripts/distribute-changes.sh +1 -1
- package/skills/{do → j-do}/SKILL.md +111 -14
- package/skills/j-doc/README.md +155 -0
- package/skills/{doc → j-doc}/SKILL.md +55 -18
- package/skills/j-doc/authoring-notes.md +72 -0
- package/skills/j-doc/scripts/resolve_last_update.py +149 -0
- package/skills/{doc-sync → j-doc-sync}/SKILL.md +9 -2
- package/skills/{dooo → j-dooo}/SKILL.md +9 -2
- package/skills/j-error/SKILL.md +36 -0
- package/skills/{evaluate → j-evaluate}/SKILL.md +9 -2
- package/skills/j-examplify/SKILL.md +49 -0
- package/skills/{help → j-help}/SKILL.md +9 -2
- package/skills/{idea → j-idea}/SKILL.md +10 -3
- package/skills/{idea → j-idea}/assets/idea_handoff_template.md +1 -1
- package/skills/{improve → j-improve}/SKILL.md +9 -2
- package/skills/{init → j-init}/SKILL.md +21 -8
- package/skills/j-init/assets/scope-thresholds_template.json +7 -0
- package/skills/j-jbp/SKILL.md +32 -0
- package/skills/j-lgtm/SKILL.md +28 -0
- package/skills/{pi-plan → j-pi-plan}/SKILL.md +10 -3
- package/skills/{proceed → j-proceed}/SKILL.md +9 -2
- package/skills/{publish → j-publish}/SKILL.md +47 -40
- package/skills/{publish → j-publish}/adapters/droplet.md +1 -1
- package/skills/{publish → j-publish}/adapters/mobile-ios.md +3 -3
- package/skills/{publish → j-publish}/adapters/npm-ci.md +29 -7
- package/skills/{publish → j-publish}/adapters/npm.md +8 -8
- package/skills/{publish → j-publish}/assets/ci-contract.md +2 -2
- package/skills/{publish → j-publish}/schemas/publish.schema.json +1 -1
- package/skills/{publish → j-publish}/scripts/npm_ci_pipeline.sh +21 -1
- package/skills/{publish → j-publish}/scripts/npm_stage_inspect.sh +34 -1
- package/skills/{publish → j-publish}/scripts/npm_stage_pipeline.sh +9 -4
- package/skills/{publish → j-publish}/scripts/publish_deploy.sh +4 -4
- package/skills/{publish → j-publish}/scripts/validate_npm_stage_env.sh +1 -1
- package/skills/{publish → j-publish}/wizards/droplet.md +1 -1
- package/skills/{publish → j-publish}/wizards/mobile-ios.md +1 -1
- package/skills/{publish → j-publish}/wizards/npm-ci.md +1 -1
- package/skills/{publish → j-publish}/wizards/npm.md +1 -1
- package/skills/{reconcile → j-reconcile}/SKILL.md +12 -5
- package/skills/{reconcile → j-reconcile}/scripts/detect-unlinked-code.sh +2 -2
- package/skills/{reconcile → j-reconcile}/scripts/resolve-reconcile-scope.sh +3 -3
- package/skills/{reconcile-origin → j-reconcile-origin}/SKILL.md +13 -6
- package/skills/{redo → j-redo}/SKILL.md +9 -2
- package/skills/{skillify → j-skillify}/SKILL.md +10 -3
- package/skills/{spinoff → j-spinoff}/SKILL.md +9 -2
- package/skills/{status → j-status}/SKILL.md +9 -2
- package/skills/j-todo/SKILL.md +92 -0
- package/skills/{todo → j-todo}/assets/todo_handoff_template.md +1 -1
- package/skills/j-todo/scripts/add_trivial_task.sh +216 -0
- package/skills/j-todo/scripts/update_story_tasks.py +87 -0
- package/skills/{uncharted → j-uncharted}/SKILL.md +35 -28
- package/skills/{uncharted → j-uncharted}/assets/UNDERSTANDING_DOC_TEMPLATE.md +2 -2
- package/skills/{uncharted → j-uncharted}/scripts/detect-dependencies.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/detect-tests.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/directory-triage.sh +3 -3
- package/skills/{uncharted → j-uncharted}/scripts/elicitation-state.sh +3 -3
- package/skills/{uncharted → j-uncharted}/scripts/enumerate-target.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/import-source.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/inspect-provenance.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/resolve-segment-target.sh +5 -5
- package/skills/{uncharted → j-uncharted}/scripts/run-engine.sh +1 -1
- package/skills/{uncharted → j-uncharted}/scripts/validate-proposed-items.sh +2 -2
- package/skills/{uncharted → j-uncharted}/scripts/write-backfilled-epics.sh +1 -1
- package/skills/j-wtf/SKILL.md +27 -0
- package/skills/jenga/SKILL.md +1 -1
- package/skills/jenga/scripts/render-confirmation.sh +55 -18
- package/skills/jenga-permission-level/SKILL.md +1 -1
- package/templates/SCRUM_BOARD_SCHEMA.md +33 -2
- package/templates/agent-context.md.tpl +32 -9
- package/templates/copilot-instructions.md.tpl +66 -11
- package/skills/continue/SKILL.md +0 -29
- package/skills/error/SKILL.md +0 -29
- package/skills/examplify/SKILL.md +0 -42
- package/skills/init/assets/scope-thresholds_template.json +0 -7
- package/skills/jbp/SKILL.md +0 -25
- package/skills/lgtm/SKILL.md +0 -21
- package/skills/todo/SKILL.md +0 -48
- package/skills/wtf/SKILL.md +0 -20
- /package/skills/{close-story → j-close-story}/scripts/compute-scope-divergence.sh +0 -0
- /package/skills/{close-story → j-close-story}/scripts/extract-diff-stats.sh +0 -0
- /package/skills/{close-story → j-close-story}/scripts/update-task-frontmatter.sh +0 -0
- /package/skills/{commit → j-commit}/assets/user_instructions_template.md +0 -0
- /package/skills/{distribute → j-distribute}/CONFIG_SCHEMA.md +0 -0
- /package/skills/{distribute → j-distribute}/scripts/check-version.sh +0 -0
- /package/skills/{distribute → j-distribute}/scripts/commit-version-bump.sh +0 -0
- /package/skills/{do → j-do}/assets/intent-vs-diff-prompt.md +0 -0
- /package/skills/{do → j-do}/assets/sender_template.json +0 -0
- /package/skills/{doc → j-doc}/assets/path-objectives.yaml +0 -0
- /package/skills/{doc-sync → j-doc-sync}/assets/default_excludes.txt +0 -0
- /package/skills/{doc-sync → j-doc-sync}/assets/doc_targets.md +0 -0
- /package/skills/{evaluate → j-evaluate}/assets/evaluation_invokation_template.yml +0 -0
- /package/skills/{evaluate → j-evaluate}/assets/evaluation_rapport_template.md +0 -0
- /package/skills/{idea → j-idea}/assets/idea_template.md +0 -0
- /package/skills/{init → j-init}/assets/.gitignore_template +0 -0
- /package/skills/{init → j-init}/assets/PROJECT_SUMMARY_template.md +0 -0
- /package/skills/{init → j-init}/assets/directory_structure.txt +0 -0
- /package/skills/{init → j-init}/assets/strategy_stub_template.md +0 -0
- /package/skills/{init → j-init}/assets/test-config_template.json +0 -0
- /package/skills/{init → j-init}/assets/workflow_template.json +0 -0
- /package/skills/{init → j-init}/scripts/apply-project-visibility.sh +0 -0
- /package/skills/{init → j-init}/scripts/detect-existing-codebase.sh +0 -0
- /package/skills/{init → j-init}/scripts/init.sh +0 -0
- /package/skills/{pi-plan → j-pi-plan}/assets/epic.json +0 -0
- /package/skills/{pi-plan → j-pi-plan}/assets/story_template.md +0 -0
- /package/skills/{publish → j-publish}/assets/ExportOptions.plist.template +0 -0
- /package/skills/{publish → j-publish}/assets/ownership-matrix.md +0 -0
- /package/skills/{publish → j-publish}/assets/publish.example.json +0 -0
- /package/skills/{publish → j-publish}/assets/publish.example.npm-ci.json +0 -0
- /package/skills/{publish → j-publish}/assets/publish.example.npm.json +0 -0
- /package/skills/{publish → j-publish}/assets/secrets-guide.md +0 -0
- /package/skills/{publish → j-publish}/schemas/fixtures/npm-ci-minimal.json +0 -0
- /package/skills/{publish → j-publish}/schemas/fixtures/npm-ci-with-empty-secrets.json +0 -0
- /package/skills/{publish → j-publish}/schemas/fixtures/npm-ci-with-workflow-path.json +0 -0
- /package/skills/{publish → j-publish}/scripts/check_target_config.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/droplet_pipeline.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/finalize_changelog.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/generate_release_notes.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/ios_pipeline.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/npm_pipeline.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/publish_common.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/reconcile_tags.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/run_gates.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/setup_wizard.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/show_history.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/suggest_semver_bump.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/validate_config.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/validate_droplet_env.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/validate_ios_env.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/validate_npm_ci_env.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/validate_npm_env.sh +0 -0
- /package/skills/{publish → j-publish}/scripts/write_ledger_entry.sh +0 -0
- /package/skills/{reconcile → j-reconcile}/assets/report_format.md +0 -0
- /package/skills/{reconcile-origin → j-reconcile-origin}/scripts/reconcile-origin.sh +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/SKILL.md +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/assets/.gitignore_template +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/assets/PROJECT_SUMMARY_template.md +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/assets/directory_structure.txt +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/assets/test-config_template.json +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/assets/workflow_template.json +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-new/scripts/init.sh +0 -0
- /package/skills/{skillify → j-skillify}/assets/init-old/SKILL.md +0 -0
- /package/skills/{status → j-status}/assets/output_format.md +0 -0
- /package/skills/{todo → j-todo}/assets/todo_template.md +0 -0
- /package/skills/{uncharted → j-uncharted}/assets/SEGMENT_PROPOSAL_TEMPLATE.md +0 -0
- /package/skills/{uncharted → j-uncharted}/scripts/apply-subsystem-cap.sh +0 -0
- /package/skills/{uncharted → j-uncharted}/scripts/discover-subsystems.sh +0 -0
|
@@ -97,12 +97,18 @@
|
|
|
97
97
|
# ENTIRE turn is rejected as an error turn (state left untouched) — there
|
|
98
98
|
# is no partial application of the valid numbers in a mixed-validity reply.
|
|
99
99
|
#
|
|
100
|
-
# Toggling
|
|
101
|
-
#
|
|
102
|
-
#
|
|
103
|
-
#
|
|
104
|
-
#
|
|
105
|
-
#
|
|
100
|
+
# Toggling CASCADES downward (E45_S02_T03): checking or unchecking a
|
|
101
|
+
# story applies the same resulting state to all of its tasks; checking or
|
|
102
|
+
# unchecking an epic applies the same resulting state to all of its
|
|
103
|
+
# stories and their tasks. This is a deliberate, explicit reversal of the
|
|
104
|
+
# original non-cascading design (see this story's 2026-08-27 close-out) —
|
|
105
|
+
# the user hit a real case where unchecking a parent epic left its child
|
|
106
|
+
# story/tasks checked, requiring a manual follow-up uncheck command.
|
|
107
|
+
# Cascade is STRICTLY DOWNWARD (parent -> descendants) only: checking a
|
|
108
|
+
# leaf task does NOT imply its ancestors should also be checked, so a
|
|
109
|
+
# checked child under an unchecked parent is a valid (if visually
|
|
110
|
+
# inconsistent) state. Toggling a leaf task (no children) behaves exactly
|
|
111
|
+
# as it always has — no descendants to cascade into.
|
|
106
112
|
#
|
|
107
113
|
# ---------------------------------------------------------------------------
|
|
108
114
|
# OUTPUT CONTRACT (deliberately NOT uniform JSON — see rationale below)
|
|
@@ -165,8 +171,15 @@
|
|
|
165
171
|
# STATE FILE
|
|
166
172
|
# ---------------------------------------------------------------------------
|
|
167
173
|
# Created under `mktemp -t jenga-confirm-XXXXXX.json`. Stores:
|
|
168
|
-
# - `numbering`: displayed number -> {item, level, checked} —
|
|
169
|
-
#
|
|
174
|
+
# - `numbering`: displayed number -> {item, level, checked, children} —
|
|
175
|
+
# `children` is a fixed list of the item's direct descendant numbers
|
|
176
|
+
# (a story's task numbers; an epic's story numbers), computed once at
|
|
177
|
+
# build time so continue-mode can cascade a toggle without
|
|
178
|
+
# re-deriving parent/child relationships from `item_id`/`epic_id`/
|
|
179
|
+
# `story_id` at toggle time. `children` is always `[]` for a leaf
|
|
180
|
+
# task. The only fields that mutate across turns are `checked` values
|
|
181
|
+
# (potentially many at once, via cascade — see TOGGLE COMMAND GRAMMAR
|
|
182
|
+
# above).
|
|
170
183
|
# - `layout`: the fixed print order (item lines + header markers),
|
|
171
184
|
# computed once at start. Continue mode never recomputes tree shape —
|
|
172
185
|
# it only re-renders from `layout` + the live `checked` flags in
|
|
@@ -305,15 +318,17 @@ def pluralize_task(n):
|
|
|
305
318
|
return f"{n} task{'' if n == 1 else 's'}"
|
|
306
319
|
|
|
307
320
|
|
|
308
|
-
def add_item(item, level, indent):
|
|
321
|
+
def add_item(item, level, indent, parent_number=None):
|
|
309
322
|
global counter
|
|
310
323
|
n = str(counter)
|
|
311
324
|
counter += 1
|
|
312
325
|
suffix = ""
|
|
313
326
|
if item.get("id") in undecomposed_ids:
|
|
314
327
|
suffix = " [needs decomposition -- no children on the board yet]"
|
|
315
|
-
numbering[n] = {"item": item, "level": level, "checked": True}
|
|
328
|
+
numbering[n] = {"item": item, "level": level, "checked": True, "children": []}
|
|
316
329
|
layout.append({"kind": "item", "number": n, "level": level, "indent": indent, "suffix": suffix})
|
|
330
|
+
if parent_number is not None:
|
|
331
|
+
numbering[parent_number]["children"].append(n)
|
|
317
332
|
return n
|
|
318
333
|
|
|
319
334
|
|
|
@@ -328,7 +343,7 @@ def append_suffix(extra):
|
|
|
328
343
|
|
|
329
344
|
|
|
330
345
|
for e in epics:
|
|
331
|
-
add_item(e, "epic", INDENT["epic"])
|
|
346
|
+
e_num = add_item(e, "epic", INDENT["epic"])
|
|
332
347
|
child_stories = stories_by_epic.get(e["id"], [])
|
|
333
348
|
story_count = len(child_stories)
|
|
334
349
|
task_count = sum(len(tasks_by_story.get(s["id"], [])) for s in child_stories)
|
|
@@ -340,23 +355,23 @@ for e in epics:
|
|
|
340
355
|
append_suffix(", ".join(parts))
|
|
341
356
|
|
|
342
357
|
for s in child_stories:
|
|
343
|
-
add_item(s, "story", INDENT["story"])
|
|
358
|
+
s_num = add_item(s, "story", INDENT["story"], parent_number=e_num)
|
|
344
359
|
child_tasks = tasks_by_story.get(s["id"], [])
|
|
345
360
|
if child_tasks:
|
|
346
361
|
append_suffix(pluralize_task(len(child_tasks)))
|
|
347
362
|
for t in child_tasks:
|
|
348
|
-
add_item(t, "task", INDENT["task"])
|
|
363
|
+
add_item(t, "task", INDENT["task"], parent_number=s_num)
|
|
349
364
|
|
|
350
365
|
if orphan_stories:
|
|
351
366
|
layout.append({"kind": "header", "text": ""})
|
|
352
367
|
layout.append({"kind": "header", "text": "-- Directly Selected Stories (no epic in this selection) --"})
|
|
353
368
|
for s in orphan_stories:
|
|
354
|
-
add_item(s, "story", INDENT["story"])
|
|
369
|
+
s_num = add_item(s, "story", INDENT["story"])
|
|
355
370
|
child_tasks = tasks_by_story.get(s["id"], [])
|
|
356
371
|
if child_tasks:
|
|
357
372
|
append_suffix(pluralize_task(len(child_tasks)))
|
|
358
373
|
for t in child_tasks:
|
|
359
|
-
add_item(t, "task", INDENT["task"])
|
|
374
|
+
add_item(t, "task", INDENT["task"], parent_number=s_num)
|
|
360
375
|
|
|
361
376
|
if orphan_tasks:
|
|
362
377
|
layout.append({"kind": "header", "text": ""})
|
|
@@ -644,18 +659,40 @@ if invalid:
|
|
|
644
659
|
print(f"STATE_FILE: {state_file_path}", file=sys.stderr)
|
|
645
660
|
sys.exit(1)
|
|
646
661
|
|
|
662
|
+
def apply_cascade(num, value):
|
|
663
|
+
"""Set `num`'s checked state to `value`, then recurse into every
|
|
664
|
+
number in its `children` list (a story's tasks; an epic's stories,
|
|
665
|
+
which recurse further into their own tasks). Strictly downward —
|
|
666
|
+
never touches a parent. A leaf task has an empty `children` list, so
|
|
667
|
+
this degenerates to exactly the old single-flag assignment for the
|
|
668
|
+
non-cascading base case."""
|
|
669
|
+
numbering[num]["checked"] = value
|
|
670
|
+
for child in numbering[num].get("children", []):
|
|
671
|
+
apply_cascade(child, value)
|
|
672
|
+
|
|
673
|
+
|
|
647
674
|
# All-or-nothing application, de-duplicated (first-seen wins on dupes).
|
|
675
|
+
# Resulting values are computed from PRE-mutation state in a first pass,
|
|
676
|
+
# then applied (with cascade) in a second pass -- this avoids a
|
|
677
|
+
# parent-then-child (or child-then-parent) double-toggle artifact when a
|
|
678
|
+
# single reply lists both a parent and one of its own descendants, e.g.
|
|
679
|
+
# bare-number toggle "5,6" where 6 is a child of 5.
|
|
648
680
|
seen = set()
|
|
681
|
+
pending = []
|
|
649
682
|
for tok in valid_tokens:
|
|
650
683
|
if tok in seen:
|
|
651
684
|
continue
|
|
652
685
|
seen.add(tok)
|
|
653
686
|
if action == "check":
|
|
654
|
-
|
|
687
|
+
value = True
|
|
655
688
|
elif action == "uncheck":
|
|
656
|
-
|
|
689
|
+
value = False
|
|
657
690
|
else:
|
|
658
|
-
|
|
691
|
+
value = not numbering[tok]["checked"]
|
|
692
|
+
pending.append((tok, value))
|
|
693
|
+
|
|
694
|
+
for tok, value in pending:
|
|
695
|
+
apply_cascade(tok, value)
|
|
659
696
|
|
|
660
697
|
state["numbering"] = numbering
|
|
661
698
|
with open(state_file_path, "w", encoding="utf-8") as f:
|
|
@@ -67,9 +67,28 @@ All status fields must use one of the following exact strings:
|
|
|
67
67
|
| `Blocked` | Cannot proceed; human intervention required |
|
|
68
68
|
| `Backlog` | Epic-level only; queued but not yet prioritized for work |
|
|
69
69
|
| `Done` | Epic-level only; all child stories/tasks closed out |
|
|
70
|
+
| `Merged` | Set after a successful `/self-sync` run's file diff shows the ticket's recorded files were touched |
|
|
71
|
+
| `Publicized` | Set after a successful `/mirror-public` run's file diff shows the ticket's recorded files were touched |
|
|
72
|
+
| `Privatized` | Set at ticket-close time via a static `.publicignore` blocklist membership check (no run dependency) |
|
|
73
|
+
| `Deployed to Stage` | Set when the public `jenga-npm` repo's CI tags a `vX.Y.Z-stage` tag that resolves back (via the `Source-Commit:` trailer) to this ticket's commit |
|
|
74
|
+
| `Deployed to Prod` | Set when the public `jenga-npm` repo's CI tags a `vX.Y.Z` (prod) tag that resolves back to this ticket's commit |
|
|
70
75
|
|
|
71
76
|
Only the **tester agent** may write status values to story and task files. Only the **scrum master** may write status values to epic files and may update story status as part of rollup.
|
|
72
77
|
|
|
78
|
+
All five statuses above are **script-set, never agent-judged** — no agent decides when a ticket becomes `Merged`, `Publicized`, `Privatized`, `Deployed to Stage`, or `Deployed to Prod`; a deterministic script observation sets them, per the mechanisms described below.
|
|
79
|
+
|
|
80
|
+
### Static vs. Reactive Status Setting
|
|
81
|
+
|
|
82
|
+
`Privatized` is set **statically**: at ticket-close time, a script checks whether the ticket's recorded files match the `.publicignore` blocklist. This check has no dependency on any particular run having occurred — it is a pure membership test.
|
|
83
|
+
|
|
84
|
+
The other four — `Merged`, `Publicized`, `Deployed to Stage`, `Deployed to Prod` — are set **reactively**: a script observes the outcome of a specific run (a `/self-sync` or `/mirror-public` file diff, or a public-repo CI tag event) and sets the status only when that run's evidence confirms the ticket was affected. Absent a qualifying run, the status is not set.
|
|
85
|
+
|
|
86
|
+
### Publicized / Privatized / Deployed Lifecycle Relationship
|
|
87
|
+
|
|
88
|
+
`Publicized` and `Privatized` are **mutually exclusive** — a ticket is one or the other, never both. A ticket's files either pass the `.publicignore` blocklist check (making it eligible for `Publicized`) or match it (making it `Privatized`); it cannot satisfy both conditions at once.
|
|
89
|
+
|
|
90
|
+
Only **`Publicized`** tickets are eligible to progress further down the deploy lifecycle, from `Deployed to Stage` to `Deployed to Prod`. A `Privatized` ticket's files never reach the public `jenga-npm` repo, so it can never acquire a CI tag there and therefore can never reach either deploy status.
|
|
91
|
+
|
|
73
92
|
---
|
|
74
93
|
|
|
75
94
|
## File Formats
|
|
@@ -161,7 +180,7 @@ reopened_on: # comma-separated list, e.g. 2026-02-01, 2026-04-10
|
|
|
161
180
|
reopened_reason: # comma-separated list, e.g. "Scope expanded", "Bug found post-release"
|
|
162
181
|
assigned_to: developer | tester | scrum-master
|
|
163
182
|
docs: [] # optional list of repo-relative documentation paths, e.g. ["README.md", "docs/API.md"]
|
|
164
|
-
execution_scope: task # task | story | epic | inline; omit for legacy tasks (defaults to task)
|
|
183
|
+
execution_scope: task # task | story | epic | inline | light; omit for legacy tasks (defaults to task)
|
|
165
184
|
needs_docs: true # boolean; omit for legacy tasks (defaults to true)
|
|
166
185
|
scope_rationale: "" # required when execution_scope is set; must contain a numeric/file-count claim
|
|
167
186
|
jenga_assigned: true # boolean; true = machine-assigned, false = human override
|
|
@@ -315,13 +334,14 @@ level.
|
|
|
315
334
|
These six fields control the execution footprint of a task within the `/jenga` and `/do` workflows. They are **optional** — omitting all six is valid and equivalent to `execution_scope: task` / `needs_docs: true`.
|
|
316
335
|
|
|
317
336
|
**`execution_scope`**
|
|
318
|
-
- Valid values: `task` | `story` | `epic` | `inline`
|
|
337
|
+
- Valid values: `task` | `story` | `epic` | `inline` | `light`
|
|
319
338
|
- When required: optional; omit for legacy tasks (runtime default: `task`)
|
|
320
339
|
- Description: defines how broadly this task's implementation touches the codebase.
|
|
321
340
|
- `task` — standard single-task scope (default)
|
|
322
341
|
- `story` — task may touch files across multiple tasks in the same story
|
|
323
342
|
- `epic` — task may touch files across stories; requires `epic_scope_approval: true` on the parent epic
|
|
324
343
|
- `inline` — trivial change (e.g. config tweak, comment, schema doc); no execution plan or summary document is needed
|
|
344
|
+
- `light` — sits between `inline` and `task` in scope: a single developer subagent pass with no worktree, self-verified via `scripts/smoke-harness.sh` in lieu of a separate tester invocation; if the smoke harness fails, execution falls back to `task` scope
|
|
325
345
|
|
|
326
346
|
**`needs_docs`**
|
|
327
347
|
- Valid values: `true` | `false`
|
|
@@ -528,6 +548,7 @@ Each file is written by an agent as the **last action** of its session, and is s
|
|
|
528
548
|
| `worktree` | developer, tester | Absolute path |
|
|
529
549
|
| `paths` | developer, tester | Commit SHAs |
|
|
530
550
|
| `rapport_file`| tester only | Path to rapport if status is failed/error |
|
|
551
|
+
| `resolved_context` | all, optional | Digest of context the sending agent already resolved; see below |
|
|
531
552
|
| `date` | all | ISO 8601 UTC |
|
|
532
553
|
|
|
533
554
|
**Status values per agent:**
|
|
@@ -535,6 +556,16 @@ Each file is written by an agent as the **last action** of its session, and is s
|
|
|
535
556
|
- `developer`: `implementation_complete`
|
|
536
557
|
- `tester`: `passed`, `passed_with_remarks`, `failed`, `error`
|
|
537
558
|
|
|
559
|
+
**`resolved_context` — digest, not a dump (E49).** An optional field a sending agent populates with a short digest of conclusions it already reached while navigating source documents (e.g. which schema fields apply, which skill precedent governs, which decisions are already made) — so the receiving subagent doesn't have to cold-re-read the same files from scratch. It must stay under a size cap of roughly 100 lines (a few hundred tokens), mirroring `scope_rationale`'s "must contain a measurable claim" discipline: a `resolved_context` value that is a raw file dump or exceeds the cap is not valid. The digest is a starting point only — it never restricts the receiving agent from reading full source files when the digest is insufficient or needs verification. The digest body itself lives in a per-task file at `project/queue/context/<agent>-<session_id>-<task_id>.json`, following the same unique-path, single-use, session-scoped convention as `handoffs/` above (not a shared, clobber-prone slot); this handoff's `resolved_context` field holds a reference to (or the inline content of) that file.
|
|
560
|
+
|
|
561
|
+
**`project/queue/context/` — physical digest files (E49_S01_T02).** The directory itself is kept via `.gitkeep`; individual digest files (`*.json`) are git-ignored for the same reason `handoffs/*.json` is — a committed one can no longer be told apart from a live pending digest by inspection alone. Three scripts implement the convention end to end:
|
|
562
|
+
|
|
563
|
+
- `scripts/write-context-digest.sh` — the sending agent's write path. Takes `--agent`, `--session-id`, `--task-id`, and digest content (`--content`, `--content-file`, or stdin); enforces the ~100-line cap above by **rejecting** (not truncating) an oversized digest, since a silently-truncated digest could cut off mid-thought and mislead the receiver — the sender is the only party that actually knows what's safe to cut. Writes atomically (tmp file in the same directory, then `mv`) and prints the resulting absolute path to stdout for the caller to place in the handoff's `resolved_context` field.
|
|
564
|
+
- `scripts/consume-context-digest.sh <path>` — the receiving agent's read path. Atomically claims the file (rename to a `.claimed.$$` sibling, same TOCTOU-safe pattern `on_session_end.sh` section 4 uses for `handoffs/`), prints its content (full JSON envelope, or just the `digest` field with `--raw`), and deletes it — single-use, like `handoffs/`.
|
|
565
|
+
- `scripts/sweep-stale-context-digests.sh` — an age-based backstop (default 24h, overridable), invoked from `hooks/on_session_end.sh` on every session end regardless of agent, for a digest whose intended receiver never calls the consume script (abandoned dispatch, or a receiver that read the raw file directly and forgot to clean up). Age-based rather than routed-and-deleted-immediately like `handoffs/`, because a digest's consumer is a later session that may not have started yet when some unrelated session's `SessionEnd` hook fires.
|
|
566
|
+
|
|
567
|
+
Populating `resolved_context` when dispatching (scrum-master → developer, developer → tester) is wired into both `agents/scrum-master.md`'s dispatch-to-developer step and `agents/developer.md`'s call-to-tester step (E49_S01_T03).
|
|
568
|
+
|
|
538
569
|
|
|
539
570
|
|
|
540
571
|
Located at `project/configs/workflow.json`. Scaffolded by `/init` and owned by the scrum master.
|
|
@@ -10,20 +10,30 @@ This project uses **Jenga** — a skill-based AI agent framework. Jenga organise
|
|
|
10
10
|
### How Jenga Works
|
|
11
11
|
|
|
12
12
|
- Each **skill** is a self-contained instruction set stored under `{{SKILL_DISCOVERY_PATH}}<skill-name>/`.
|
|
13
|
-
- Skills are invoked by typing
|
|
13
|
+
- Skills are invoked by typing `j.skill-name` in the chat prompt (e.g. `j.status`, `j.commit`). The
|
|
14
|
+
older bare `/skill-name` form (e.g. `/status`, `/commit`) is a **permanent alias** — it keeps
|
|
15
|
+
resolving indefinitely, with no deprecation warning and no removal planned — so treat a message in
|
|
16
|
+
either form as the exact same invocation.
|
|
14
17
|
- The active project directory is available via the `JENGA_PROJECT_DIR` environment variable. **Use `JENGA_PROJECT_DIR` — not `CLAUDE_PROJECT_DIR` or any other agent-specific variable** — as the canonical path to the project folder.
|
|
15
18
|
|
|
16
19
|
### Skill Routing
|
|
17
20
|
|
|
18
|
-
If you are Claude Code,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
If you are Claude Code, both `j.skill-name` (the canonical form) and the older bare `/skill-name`
|
|
22
|
+
(a permanent alias) are native harness-level mechanisms: the harness itself intercepts the literal
|
|
23
|
+
command and loads the skill for you, independent of anything written here. If you are any other agent
|
|
24
|
+
(Codex, or a generic `AGENTS.md` consumer) with no equivalent native interception, you depend entirely
|
|
25
|
+
on the instructions below to know what "invoking a skill" concretely means — for either the
|
|
26
|
+
`j.skill-name` form or the older bare `/skill-name` form, both of which route to the same skill. Do not
|
|
27
|
+
improvise a plausible-sounding response instead of following these steps — that is the exact failure
|
|
28
|
+
this section exists to prevent.
|
|
24
29
|
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
**Old bare-form alias.** `j.skill-name` is the canonical invocation form. A message using the older
|
|
31
|
+
bare `/skill-name` form is not deprecated and must not be treated as an error, a warning case, or a
|
|
32
|
+
migration prompt — route it to the identical skill as its `j.skill-name` equivalent. Both forms remain
|
|
33
|
+
equally valid indefinitely.
|
|
34
|
+
|
|
35
|
+
When the user's message is or matches `j.skill-name`, or matches the older bare `/skill-name` alias (or
|
|
36
|
+
otherwise clearly matches a known skill's keyword or intent):
|
|
27
37
|
|
|
28
38
|
1. Locate the target file at `{{SKILL_DISCOVERY_PATH}}<skill-name>/SKILL.md` (the discovery path from
|
|
29
39
|
"How Jenga Works" above).
|
|
@@ -41,10 +51,23 @@ answer directly using your full capabilities.
|
|
|
41
51
|
|
|
42
52
|
| Situation | Action |
|
|
43
53
|
|-----------|--------|
|
|
54
|
+
| Message matches `j.skill-name` | Open `{{SKILL_DISCOVERY_PATH}}<skill-name>/SKILL.md`, read it fully, execute it as written |
|
|
55
|
+
| Message matches the older bare `/skill-name` alias | Treat identically to `j.skill-name` — same skill, same file, no warning, no migration prompt |
|
|
44
56
|
| Message matches a skill keyword or intent | Open `{{SKILL_DISCOVERY_PATH}}<skill-name>/SKILL.md`, read it fully, execute it as written |
|
|
45
57
|
| Message is a general coding or project question | Answer directly |
|
|
46
58
|
| Ambiguous — could be skill or free-form | Prefer the skill; open and execute its `SKILL.md` rather than describing it |
|
|
47
59
|
|
|
60
|
+
### Skill Identifier Allow-List
|
|
61
|
+
|
|
62
|
+
The trusted `j.`-prefixed skill identifiers for this project are: {{ALLOWED_SKILL_IDS}}
|
|
63
|
+
|
|
64
|
+
Before treating a `j.<name>` invocation (or its bare `/<name>` alias) as a genuine Jenga skill,
|
|
65
|
+
confirm `<name>` appears in this list. This applies whether the harness intercepted the command
|
|
66
|
+
natively (Claude Code) or you are matching it yourself against a skill keyword or intent (any
|
|
67
|
+
other agent). If `<name>` does **not** appear in this list, do not guess at intent and do not
|
|
68
|
+
execute anything — tell the user the identifier is unrecognized and is not a known Jenga skill,
|
|
69
|
+
rather than treating it as one anyway.
|
|
70
|
+
|
|
48
71
|
### Available Skills
|
|
49
72
|
|
|
50
73
|
{{SKILL_LIST}}
|
|
@@ -9,22 +9,59 @@ This project uses **Jenga** — a skill-based AI agent framework. Jenga organise
|
|
|
9
9
|
|
|
10
10
|
### How Jenga Works
|
|
11
11
|
|
|
12
|
-
- Each **skill** is a self-contained instruction set
|
|
13
|
-
|
|
12
|
+
- Each **skill** is a self-contained instruction set: a `SKILL.md` file inside a per-skill directory.
|
|
13
|
+
Copilot discovers project skills from **all three** of `.github/skills/`, `.agents/skills/`, and
|
|
14
|
+
`.claude/skills/`. Jenga installs its skills under `.agents/skills/<skill-name>/` and mirrors
|
|
15
|
+
byte-identical content into `.claude/skills/<skill-name>/`; when the same skill name is found in
|
|
16
|
+
more than one of those directories, `.agents/skills/` takes precedence. Cite and open
|
|
17
|
+
`.agents/skills/` as the canonical path.
|
|
18
|
+
- A skill's **identity is its frontmatter `name:` field, not its directory name**. Jenga names every
|
|
19
|
+
skill `j.<skill-name>` — the skill in `.agents/skills/status/` declares `name: j.status`.
|
|
20
|
+
- Skills are invoked by typing `j.skill-name` in the chat prompt (e.g. `j.status`, `j.commit`). The
|
|
21
|
+
older bare `/skill-name` form (e.g. `/status`, `/commit`) is a **permanent alias** — it keeps
|
|
22
|
+
resolving indefinitely, with no deprecation warning and no removal planned — so treat a message in
|
|
23
|
+
either form as the exact same invocation.
|
|
14
24
|
- The active project directory is available via the `JENGA_PROJECT_DIR` environment variable. **Use `JENGA_PROJECT_DIR` — not `CLAUDE_PROJECT_DIR` or any other agent-specific variable** — as the canonical path to the project folder.
|
|
15
25
|
|
|
16
26
|
### Skill Routing
|
|
17
27
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
below to know what "invoking a skill" concretely means. Do not improvise a plausible-sounding response
|
|
21
|
-
instead of following these steps — that is the exact failure this section exists to prevent.
|
|
28
|
+
**Copilot loads these skills natively.** Copilot has a real, validating skill loader. It reads every
|
|
29
|
+
`SKILL.md` under the discovery paths above and validates each one's frontmatter `name:` against:
|
|
22
30
|
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
```
|
|
32
|
+
Skill name must start with an ASCII letter or number and contain only
|
|
33
|
+
ASCII letters (a-z, A-Z), numbers, hyphens, underscores, dots, and spaces
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
A skill whose name fails that rule **does not load at all** — it is reported under "failed to load"
|
|
37
|
+
by `copilot skill list` and is simply absent from the session. Every skill that does load is
|
|
38
|
+
registered as a **native slash command named after its frontmatter `name`**, matched
|
|
39
|
+
case-insensitively: `j.status` is invocable as `/j.status` and appears in the slash-command picker.
|
|
40
|
+
That native path loads and applies the skill on its own — you do not need to locate or open the file
|
|
41
|
+
yourself when the user types it.
|
|
42
|
+
|
|
43
|
+
**What still depends on these instructions.** Native registration covers only the exact
|
|
44
|
+
`/j.skill-name` form. These forms have **no** native handler and are routed entirely by the steps
|
|
45
|
+
below:
|
|
46
|
+
|
|
47
|
+
- the no-slash `j.skill-name` form, which is Jenga's documented invocation style;
|
|
48
|
+
- the older bare `/skill-name` alias (`/status`, `/commit`);
|
|
49
|
+
- a message that matches a skill by keyword or intent rather than by a literal command.
|
|
50
|
+
|
|
51
|
+
For those, do not improvise a plausible-sounding response instead of following these steps — that is
|
|
52
|
+
the exact failure this section exists to prevent.
|
|
53
|
+
|
|
54
|
+
**Old bare-form alias.** `j.skill-name` is the canonical invocation form. A message using the older
|
|
55
|
+
bare `/skill-name` form is not deprecated and must not be treated as an error, a warning case, or a
|
|
56
|
+
migration prompt — route it to the identical skill as its `j.skill-name` equivalent. Both forms remain
|
|
57
|
+
equally valid indefinitely.
|
|
58
|
+
|
|
59
|
+
When the user's message is or matches `j.skill-name`, or matches the older bare `/skill-name` alias (or
|
|
60
|
+
otherwise clearly matches a known skill's keyword or intent):
|
|
25
61
|
|
|
26
62
|
1. Locate the target file at `.agents/skills/<skill-name>/SKILL.md` (the discovery path from "How
|
|
27
|
-
Jenga Works" above
|
|
63
|
+
Jenga Works" above; `.claude/skills/<skill-name>/SKILL.md` holds identical content if the first
|
|
64
|
+
is absent). Note the directory is the **unprefixed** name — `j.status` lives in `status/`.
|
|
28
65
|
2. Open and read that file **in full** before doing anything else.
|
|
29
66
|
3. Execute its instructions exactly as written, for the rest of this turn — including running any
|
|
30
67
|
shell scripts or commands it references (e.g. via a terminal/shell tool).
|
|
@@ -37,9 +74,26 @@ answer directly using your full capabilities.
|
|
|
37
74
|
|
|
38
75
|
#### Routing decision table
|
|
39
76
|
|
|
77
|
+
Before acting on any row below that opens a `SKILL.md` file yourself, check the identifier against
|
|
78
|
+
the trusted allow-list: {{ALLOWED_SKILL_IDS}}.
|
|
79
|
+
|
|
80
|
+
There are two enforcement layers, and they cover different inputs:
|
|
81
|
+
|
|
82
|
+
1. **Copilot's own loader** handles the native `/j.skill-name` form. It only ever registers a skill
|
|
83
|
+
that is actually present under a discovery path and passed name validation.
|
|
84
|
+
2. **This prose allow-list check** is the second layer — and the *only* layer for the forms Copilot
|
|
85
|
+
does not natively intercept: the no-slash `j.skill-name` form, the bare `/skill-name` alias, and
|
|
86
|
+
keyword or intent matches. Apply it whenever you are about to open a `SKILL.md` yourself.
|
|
87
|
+
|
|
88
|
+
Neither layer inspects a skill's *contents*; both defend the invocation-matching layer only.
|
|
89
|
+
|
|
40
90
|
| Situation | Action |
|
|
41
91
|
|-----------|--------|
|
|
42
|
-
|
|
|
92
|
+
| User types the native `/j.skill-name` slash command | Copilot's loader applies the skill; follow the loaded instructions as written |
|
|
93
|
+
| Message matches `j.skill-name` (no slash) and `skill-name` is in the allow-list | Open `.agents/skills/<skill-name>/SKILL.md`, read it fully, execute it as written |
|
|
94
|
+
| Message matches the older bare `/skill-name` alias and `skill-name` is in the allow-list | Treat identically to `j.skill-name` — same skill, same file, no warning, no migration prompt |
|
|
95
|
+
| Message matches a skill keyword or intent and the matched skill is in the allow-list | Open `.agents/skills/<skill-name>/SKILL.md`, read it fully, execute it as written |
|
|
96
|
+
| Message matches `j.skill-name` or `/skill-name`, but `skill-name` is **not** in the allow-list | Do not open or execute anything — tell the user the identifier is unrecognized and is not a known Jenga skill |
|
|
43
97
|
| Message is a general coding or project question | Answer directly |
|
|
44
98
|
| Ambiguous — could be skill or free-form | Prefer the skill; open and execute its `SKILL.md` rather than describing it |
|
|
45
99
|
|
|
@@ -60,6 +114,7 @@ The `hooks/`, `lib/`, `scripts/`, `templates/`, and `mcp/` directories all live
|
|
|
60
114
|
### Notes
|
|
61
115
|
|
|
62
116
|
- Always resolve file paths relative to `JENGA_PROJECT_DIR`.
|
|
63
|
-
- When a skill asks you to read a file such as `SKILL.md` or a task file, look for it inside `JENGA_PROJECT_DIR/.agents/skills/` or `JENGA_PROJECT_DIR/project/board/` respectively.
|
|
117
|
+
- When a skill asks you to read a file such as `SKILL.md` or a task file, look for it inside `JENGA_PROJECT_DIR/.agents/skills/` (or `JENGA_PROJECT_DIR/.claude/skills/`, which mirrors it) or `JENGA_PROJECT_DIR/project/board/` respectively.
|
|
118
|
+
- If a Jenga skill seems to be missing entirely, run `copilot skill list` and check the "failed to load" section before assuming it does not exist — a name that fails validation is absent rather than broken.
|
|
64
119
|
- Commit messages and branch names follow the EST naming convention (`E<n>_S<n>_T<n>`).
|
|
65
120
|
<!-- JENGA:END -->
|
package/skills/continue/SKILL.md
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: continue
|
|
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
|
-
keywords:
|
|
5
|
-
- continue
|
|
6
|
-
- next
|
|
7
|
-
- proceed
|
|
8
|
-
- what's next
|
|
9
|
-
- status
|
|
10
|
-
examples:
|
|
11
|
-
- "what should I do next?"
|
|
12
|
-
- "continue with the project"
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# Continue — Pick Up the Next Work Item
|
|
16
|
-
|
|
17
|
-
## Instructions
|
|
18
|
-
|
|
19
|
-
1. **Check `project/PROJECT_SUMMARY.md`** — Determine if there is outstanding work at the project level.
|
|
20
|
-
|
|
21
|
-
2. **Check `project/epics/`** — If the project summary is done, check if any epics have remaining work.
|
|
22
|
-
|
|
23
|
-
3. **Check `project/stories/`** — If epics are done, check if any stories have remaining work.
|
|
24
|
-
|
|
25
|
-
**Important:** Always check story status within an epic even if the epic itself is marked as done.
|
|
26
|
-
|
|
27
|
-
4. **If everything is complete** — Respond with: "All done! 🎉"
|
|
28
|
-
|
|
29
|
-
5. **Otherwise** — Begin work on the next incomplete item.
|
package/skills/error/SKILL.md
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: error
|
|
3
|
-
description: Guided troubleshooting flow that gathers context about an error — where it occurs, what was attempted, what went wrong, and what was expected.
|
|
4
|
-
keywords:
|
|
5
|
-
- error
|
|
6
|
-
- bug
|
|
7
|
-
- fix
|
|
8
|
-
- troubleshoot
|
|
9
|
-
- debug
|
|
10
|
-
- broken
|
|
11
|
-
examples:
|
|
12
|
-
- "I'm getting an error"
|
|
13
|
-
- "help me fix this bug"
|
|
14
|
-
metadata:
|
|
15
|
-
prefered_agent: tester
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
# Error — Guided Troubleshooting
|
|
19
|
-
|
|
20
|
-
## Instructions
|
|
21
|
-
|
|
22
|
-
Ask the following questions to understand the background of the error:
|
|
23
|
-
|
|
24
|
-
1. Where does the error occur?
|
|
25
|
-
2. What are you trying to do?
|
|
26
|
-
3. What went wrong?
|
|
27
|
-
4. What was the expected outcome?
|
|
28
|
-
|
|
29
|
-
Then use the answers to investigate and resolve the issue by creating a issue using the /todo skill.
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: examplify
|
|
3
|
-
description: Explains concepts, features, use cases, and patterns based on provided context — a description, scenario, code snippet, or file. Use when the user wants to understand what something is, how it works, when to use it, or wants a concrete example.
|
|
4
|
-
keywords:
|
|
5
|
-
- examplify
|
|
6
|
-
- explain
|
|
7
|
-
- example
|
|
8
|
-
- how does
|
|
9
|
-
- understand
|
|
10
|
-
examples:
|
|
11
|
-
- "explain how this works"
|
|
12
|
-
- "give me an example of X"
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# Concept Explainer
|
|
16
|
-
|
|
17
|
-
## Instructions
|
|
18
|
-
|
|
19
|
-
If the context is unclear or too broad, ask one focused clarifying question before proceeding. Otherwise, infer and proceed.
|
|
20
|
-
|
|
21
|
-
Explain the concept by covering:
|
|
22
|
-
|
|
23
|
-
1. **What it is** — a plain-language definition
|
|
24
|
-
2. **Why it exists** — the problem it solves
|
|
25
|
-
3. **How it works** — core mechanics
|
|
26
|
-
4. **When to use it** — and when not to
|
|
27
|
-
5. **Example(s)** — grounded in the user's context; show a before/after when relevant
|
|
28
|
-
|
|
29
|
-
After delivering the explanation, save a copy to:
|
|
30
|
-
`project/documentation/examples/<concept_and_context>.md`
|
|
31
|
-
|
|
32
|
-
Derive the filename from the concept + context (lowercased, hyphenated). Tell the user where the file was saved.
|
|
33
|
-
|
|
34
|
-
## Follow-up
|
|
35
|
-
|
|
36
|
-
If further discussion reveals new information about the topic — a new use case, correction, or better example — ask the user:
|
|
37
|
-
|
|
38
|
-
> "That adds something new to what we covered — want me to update the saved file?"
|
|
39
|
-
1. Yes
|
|
40
|
-
2. No
|
|
41
|
-
|
|
42
|
-
If yes, append the new content under an `## Additional Notes` section. Do not overwrite the original.
|
package/skills/jbp/SKILL.md
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: jbp
|
|
3
|
-
description: Scaffold the project using the JengaBasePlate boilerplate repo template from https://github.com/samwelmunga/JengaBasePlate.git
|
|
4
|
-
keywords:
|
|
5
|
-
- jbp
|
|
6
|
-
- boilerplate
|
|
7
|
-
- scaffold
|
|
8
|
-
- template
|
|
9
|
-
- jenga base
|
|
10
|
-
examples:
|
|
11
|
-
- "scaffold with JengaBasePlate"
|
|
12
|
-
- "set up the base template"
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# JBP — JengaBasePlate Scaffold
|
|
16
|
-
|
|
17
|
-
## Instructions
|
|
18
|
-
|
|
19
|
-
Use the following repo as the boilerplate framework for this project:
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
https://github.com/samwelmunga/JengaBasePlate.git
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Clone or pull the template and apply its structure to the current project.
|
package/skills/lgtm/SKILL.md
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: lgtm
|
|
3
|
-
description: Approve and commit the current work, then continue to the next task. Shortcut that chains /commit followed by /continue.
|
|
4
|
-
keywords:
|
|
5
|
-
- lgtm
|
|
6
|
-
- approve
|
|
7
|
-
- looks good
|
|
8
|
-
- done
|
|
9
|
-
- commit and continue
|
|
10
|
-
examples:
|
|
11
|
-
- "lgtm, commit this"
|
|
12
|
-
- "looks good, move on"
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# LGTM — Approve, Commit, and Continue
|
|
16
|
-
|
|
17
|
-
## Instructions
|
|
18
|
-
|
|
19
|
-
1. Invoke the `/commit` skill and wait for it to finish.
|
|
20
|
-
|
|
21
|
-
2. If the current workflow is part of a `/do` execution, return to that workflow. Otherwise, invoke the `/continue` skill.
|
package/skills/todo/SKILL.md
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: todo
|
|
3
|
-
description: Add missions to the project todo list (project/todo.md), optionally linking them to epics and stories. Loops until the user is done, then optionally executes the list.
|
|
4
|
-
keywords:
|
|
5
|
-
- todo
|
|
6
|
-
- add task
|
|
7
|
-
- queue work
|
|
8
|
-
- backlog
|
|
9
|
-
- add to list
|
|
10
|
-
examples:
|
|
11
|
-
- "add this to the todo list"
|
|
12
|
-
- "queue this as a task"
|
|
13
|
-
metadata:
|
|
14
|
-
prefered_agent: scrum-master
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
# Todo — Add Missions to the Todo List
|
|
18
|
-
|
|
19
|
-
## Instructions
|
|
20
|
-
|
|
21
|
-
1. **Ensure `project/todo.md` exists** — If it doesn't exist, it will be auto-created by `todo_manager.sh` — no manual action needed.
|
|
22
|
-
|
|
23
|
-
2. **Ask the user about the mission:**
|
|
24
|
-
- Where do you want to do this?
|
|
25
|
-
- What would you like to do?
|
|
26
|
-
- What is the goal?
|
|
27
|
-
|
|
28
|
-
3. **Classify the mission** — Check if it fits into:
|
|
29
|
-
- An existing story
|
|
30
|
-
- A new story inside an existing Epic
|
|
31
|
-
- A new story inside a new Epic
|
|
32
|
-
- None of the above
|
|
33
|
-
|
|
34
|
-
4. **Update project documentation** — Add the mission to the appropriate files under `project/board/epics/` and `project/board/stories/` if applicable.
|
|
35
|
-
- If the mission involves implementing or modifying a skill, apply the **Skill Implementation Principle — Scripts Over Inline Logic** (see `CLAUDE.md` / `AGENTS.md`): note in the story/task's acceptance criteria that deterministic, repeatable steps must be offloaded to scripts under `skills/<name>/scripts/` (or `scripts/`) rather than encoded as inline agent instructions in `SKILL.md`.
|
|
36
|
-
- If the user indicates the mission is high-risk, or explicitly asks to flag it, set an elevated caution tier directly on the story or task frontmatter: `crucial_level` (one of `advisory`, `gated`, `locked` — see `templates/SCRUM_BOARD_SCHEMA.md` for valid values and their meaning), `crucial_set_by: user`, and `crucial_note` capturing the user's stated reason. This user-initiated flag is written immediately — it does not require the confirm-before-write gate, which applies only to scrum-master-*proposed* caution tiers (a separate, heuristic-driven path).
|
|
37
|
-
|
|
38
|
-
5. **Add to `project/todo.md`** by running:
|
|
39
|
-
```
|
|
40
|
-
bash scripts/todo_manager.sh add '<mission title>: <Epic no.>_<Story no.>'
|
|
41
|
-
```
|
|
42
|
-
The epic and story reference is only required if the mission is assigned to one.
|
|
43
|
-
|
|
44
|
-
6. **Ask the user**: "Add another todo" or "Done"?
|
|
45
|
-
- If **add another** — go back to step 2.
|
|
46
|
-
- If **done** — ask if they want to execute the todo list.
|
|
47
|
-
- If **yes** — invoke the `/do` skill.
|
|
48
|
-
- If **no** — exit.
|
package/skills/wtf/SKILL.md
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: wtf
|
|
3
|
-
description: Alias of /clearify — clarifies ambiguous, dense, or under-specified prompts and conversation on request. This folder exists only so the `/wtf` slash command resolves to a skill; behaviour is identical to `/clearify`.
|
|
4
|
-
keywords:
|
|
5
|
-
- wtf
|
|
6
|
-
- confused
|
|
7
|
-
- huh
|
|
8
|
-
- what does this mean
|
|
9
|
-
- I'm lost
|
|
10
|
-
examples:
|
|
11
|
-
- "wtf"
|
|
12
|
-
- "wtf does this mean"
|
|
13
|
-
- "wtf is going on here"
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# WTF — Alias of /clearify
|
|
17
|
-
|
|
18
|
-
## Instructions
|
|
19
|
-
|
|
20
|
-
`/wtf` is an alias of `/clearify`. Follow `skills/clearify/SKILL.md` in full — do not duplicate or reimplement its ambiguity-detection logic here. Read that file's `## Instructions` section and execute it exactly as written, using whatever prompt or conversation context is attached to this `/wtf` invocation.
|
|
File without changes
|