@jenga-ai/agent 1.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 (177) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +340 -0
  3. package/agents/ai_engineer.md +113 -0
  4. package/agents/developer.md +236 -0
  5. package/agents/scrum-master.md +349 -0
  6. package/agents/scrutiny-agent.md +137 -0
  7. package/agents/solution-assessor.md +185 -0
  8. package/agents/tester.md +339 -0
  9. package/bin/jenga.js +70 -0
  10. package/hooks/copilot_session_end.sh +29 -0
  11. package/hooks/on_session_end.sh +238 -0
  12. package/hooks/prompt_router.sh +11 -0
  13. package/hooks/prompt_router_helper.js +52 -0
  14. package/hooks/session_end_helper.js +29 -0
  15. package/hooks/session_end_watcher.sh +24 -0
  16. package/lib/commands/attach.js +47 -0
  17. package/lib/commands/init.js +207 -0
  18. package/lib/commands/start.js +16 -0
  19. package/lib/commands/status.js +53 -0
  20. package/lib/config-schema.js +72 -0
  21. package/lib/inject-settings.js +61 -0
  22. package/lib/mirror.js +244 -0
  23. package/lib/resolve-project-dir.sh +47 -0
  24. package/mcp/execute-ticket/index.js +10 -0
  25. package/mcp/execute-ticket/package.json +5 -0
  26. package/mcp/help/index.js +79 -0
  27. package/mcp/help/package.json +14 -0
  28. package/mcp/router/README.md +19 -0
  29. package/mcp/router/embedder.js +23 -0
  30. package/mcp/router/index.js +204 -0
  31. package/mcp/router/matcher.js +87 -0
  32. package/mcp/router/package-lock.json +1048 -0
  33. package/mcp/router/package.json +11 -0
  34. package/mcp/router/skill-index.js +104 -0
  35. package/package.json +47 -0
  36. package/scripts/board_resolver.sh +46 -0
  37. package/scripts/e25_s01_extract_board_graph.py +292 -0
  38. package/scripts/e25_s01_generate_synthetic_board.py +90 -0
  39. package/scripts/measurement-10x.json +50 -0
  40. package/scripts/measurement-10x.txt +4 -0
  41. package/scripts/measurement-real.json +50 -0
  42. package/scripts/measurement-real.txt +4 -0
  43. package/scripts/postinstall.js +165 -0
  44. package/scripts/todo_cleanup.sh +22 -0
  45. package/scripts/todo_manager.sh +86 -0
  46. package/scripts/validate-board.sh +190 -0
  47. package/scripts/validate-story-format.sh +53 -0
  48. package/skills/brainstorm/SKILL.md +47 -0
  49. package/skills/btw/SKILL.md +42 -0
  50. package/skills/commit/SKILL.md +29 -0
  51. package/skills/commit/assets/user_instructions_template.md +22 -0
  52. package/skills/continue/SKILL.md +29 -0
  53. package/skills/convert/SKILL.md +124 -0
  54. package/skills/convert/convert_cli.py +235 -0
  55. package/skills/convert/tests/sample.csv +4 -0
  56. package/skills/convert/tests/sample.json +5 -0
  57. package/skills/convert/tests/sample.jsonl +3 -0
  58. package/skills/convert/tests/sample.yaml +18 -0
  59. package/skills/convert/tests/sample_obj.csv +2 -0
  60. package/skills/convert/tests/sample_obj.json +9 -0
  61. package/skills/deep-dive/SKILL.md +167 -0
  62. package/skills/do/SKILL.md +88 -0
  63. package/skills/do/assets/sender_template.json +12 -0
  64. package/skills/doc/SKILL.md +314 -0
  65. package/skills/doc/assets/path-objectives.yaml +38 -0
  66. package/skills/doc-sync/SKILL.md +167 -0
  67. package/skills/doc-sync/assets/default_excludes.txt +21 -0
  68. package/skills/doc-sync/assets/doc_targets.md +14 -0
  69. package/skills/dooo/SKILL.md +60 -0
  70. package/skills/error/SKILL.md +29 -0
  71. package/skills/evaluate/SKILL.md +45 -0
  72. package/skills/evaluate/assets/evaluation_invokation_template.yml +3 -0
  73. package/skills/evaluate/assets/evaluation_rapport_template.md +24 -0
  74. package/skills/examplify/SKILL.md +42 -0
  75. package/skills/help/SKILL.md +36 -0
  76. package/skills/improve/SKILL.md +55 -0
  77. package/skills/index/scripts/board-index +4 -0
  78. package/skills/index/scripts/board_index.py +615 -0
  79. package/skills/index/scripts/smoke_test.sh +86 -0
  80. package/skills/init/SKILL.md +44 -0
  81. package/skills/init/assets/.gitignore_template +15 -0
  82. package/skills/init/assets/PROJECT_SUMMARY_template.md +13 -0
  83. package/skills/init/assets/directory_structure.txt +13 -0
  84. package/skills/init/assets/test-config_template.json +4 -0
  85. package/skills/init/assets/workflow_template.json +30 -0
  86. package/skills/init/scripts/init.sh +48 -0
  87. package/skills/jbp/SKILL.md +25 -0
  88. package/skills/jenga/SKILL.md +68 -0
  89. package/skills/lgtm/SKILL.md +21 -0
  90. package/skills/mirror-public/SKILL.md +237 -0
  91. package/skills/mirror-public/assets/config.json +5 -0
  92. package/skills/mirror-public/scripts/mirror.sh +374 -0
  93. package/skills/pi-plan/SKILL.md +62 -0
  94. package/skills/pi-plan/assets/epic.json +7 -0
  95. package/skills/pi-plan/assets/story_template.md +18 -0
  96. package/skills/proceed/SKILL.md +29 -0
  97. package/skills/publish/SKILL.md +351 -0
  98. package/skills/publish/adapters/droplet.md +200 -0
  99. package/skills/publish/adapters/mobile-ios.md +114 -0
  100. package/skills/publish/adapters/npm-ci.md +223 -0
  101. package/skills/publish/adapters/npm.md +121 -0
  102. package/skills/publish/assets/ExportOptions.plist.template +19 -0
  103. package/skills/publish/assets/ci-contract.md +111 -0
  104. package/skills/publish/assets/ownership-matrix.md +17 -0
  105. package/skills/publish/assets/publish.example.json +85 -0
  106. package/skills/publish/assets/publish.example.npm-ci.json +40 -0
  107. package/skills/publish/assets/publish.example.npm.json +41 -0
  108. package/skills/publish/assets/secrets-guide.md +104 -0
  109. package/skills/publish/schemas/fixtures/npm-ci-minimal.json +17 -0
  110. package/skills/publish/schemas/fixtures/npm-ci-with-empty-secrets.json +18 -0
  111. package/skills/publish/schemas/fixtures/npm-ci-with-workflow-path.json +18 -0
  112. package/skills/publish/schemas/publish.schema.json +428 -0
  113. package/skills/publish/scripts/check_target_config.sh +96 -0
  114. package/skills/publish/scripts/droplet_pipeline.sh +208 -0
  115. package/skills/publish/scripts/generate_release_notes.sh +200 -0
  116. package/skills/publish/scripts/ios_pipeline.sh +486 -0
  117. package/skills/publish/scripts/npm_ci_pipeline.sh +225 -0
  118. package/skills/publish/scripts/npm_pipeline.sh +249 -0
  119. package/skills/publish/scripts/publish_common.sh +253 -0
  120. package/skills/publish/scripts/publish_deploy.sh +538 -0
  121. package/skills/publish/scripts/reconcile_tags.sh +135 -0
  122. package/skills/publish/scripts/run_gates.sh +616 -0
  123. package/skills/publish/scripts/setup_wizard.sh +394 -0
  124. package/skills/publish/scripts/show_history.sh +95 -0
  125. package/skills/publish/scripts/suggest_semver_bump.sh +105 -0
  126. package/skills/publish/scripts/validate_config.sh +163 -0
  127. package/skills/publish/scripts/validate_droplet_env.sh +45 -0
  128. package/skills/publish/scripts/validate_ios_env.sh +68 -0
  129. package/skills/publish/scripts/validate_npm_ci_env.sh +71 -0
  130. package/skills/publish/scripts/validate_npm_env.sh +22 -0
  131. package/skills/publish/scripts/write_ledger_entry.sh +126 -0
  132. package/skills/publish/wizards/droplet.md +275 -0
  133. package/skills/publish/wizards/mobile-ios.md +157 -0
  134. package/skills/publish/wizards/npm-ci.md +240 -0
  135. package/skills/publish/wizards/npm.md +224 -0
  136. package/skills/reconcile/SKILL.md +93 -0
  137. package/skills/reconcile/assets/report_format.md +44 -0
  138. package/skills/reconcile-origin/SKILL.md +75 -0
  139. package/skills/reconcile-origin/scripts/reconcile-origin.sh +372 -0
  140. package/skills/redo/SKILL.md +70 -0
  141. package/skills/route/SKILL.md +180 -0
  142. package/skills/self-sync/SKILL.md +73 -0
  143. package/skills/self-sync/scripts/run.js +136 -0
  144. package/skills/skillify/SKILL.md +68 -0
  145. package/skills/skillify/assets/init-new/SKILL.md +35 -0
  146. package/skills/skillify/assets/init-new/assets/.gitignore_template +15 -0
  147. package/skills/skillify/assets/init-new/assets/PROJECT_SUMMARY_template.md +13 -0
  148. package/skills/skillify/assets/init-new/assets/directory_structure.txt +10 -0
  149. package/skills/skillify/assets/init-new/assets/test-config_template.json +4 -0
  150. package/skills/skillify/assets/init-new/assets/workflow_template.json +17 -0
  151. package/skills/skillify/assets/init-new/scripts/init.sh +48 -0
  152. package/skills/skillify/assets/init-old/SKILL.md +124 -0
  153. package/skills/spinoff/SKILL.md +48 -0
  154. package/skills/status/SKILL.md +33 -0
  155. package/skills/status/assets/output_format.md +41 -0
  156. package/skills/todo/SKILL.md +46 -0
  157. package/skills/todo/assets/todo_handoff_template.md +22 -0
  158. package/skills/todo/assets/todo_template.md +3 -0
  159. package/skills/train/SKILL.md +116 -0
  160. package/skills/train/assets/dashboard-templates/classifiers.html +106 -0
  161. package/skills/train/assets/dashboard-templates/nlp.html +102 -0
  162. package/skills/train/assets/dashboard-templates/transformers.html +98 -0
  163. package/skills/train/assets/results-parsers/__init__.py +9 -0
  164. package/skills/train/assets/results-parsers/classifiers.py +84 -0
  165. package/skills/train/assets/results-parsers/nlp.py +88 -0
  166. package/skills/train/assets/results-parsers/reporter.py +154 -0
  167. package/skills/train/assets/results-parsers/transformers.py +120 -0
  168. package/skills/train/train_cli.py +786 -0
  169. package/templates/EXECUTION_PLAN_TEMPLATE.md +43 -0
  170. package/templates/EXECUTION_SUMMARY_TEMPLATE.md +50 -0
  171. package/templates/JENGA_CONFIG_TEMPLATE.json +23 -0
  172. package/templates/PROBLEM_RAPPORT_TEMPLATE.md +88 -0
  173. package/templates/SCRUM_BOARD_SCHEMA.md +311 -0
  174. package/templates/SKILL.md +16 -0
  175. package/templates/SKILL_TEMPLATE.md +28 -0
  176. package/templates/USER_INSTRUCTIONS_TEMPLATE.md +22 -0
  177. package/templates/copilot-instructions.md.tpl +55 -0
@@ -0,0 +1,43 @@
1
+ # Execution Plan: <Title>
2
+
3
+ **Task ID:** E##_S##_T##
4
+ **Story ID:** E##_S##
5
+ **Epic ID:** E##
6
+ **Date:** YYYY-MM-DD (UTC)
7
+ **Agent:** developer
8
+ **Session ID:** <session_id>
9
+
10
+ ---
11
+
12
+ ## Task Summary
13
+ <Brief description of what this task requires, drawn from the scrum board definition.>
14
+
15
+ ---
16
+
17
+ ## Implementation Approach
18
+
19
+ <Step-by-step plan for how this task will be implemented. Be specific enough that the tester can understand the intended design.>
20
+
21
+ 1.
22
+ 2.
23
+ 3.
24
+
25
+ ---
26
+
27
+ ## Files to Change
28
+
29
+ | File | Planned Change |
30
+ |------|----------------|
31
+ | | |
32
+
33
+ ---
34
+
35
+ ## Dependencies & Risks
36
+
37
+ <List any dependencies on other tasks, external libraries, APIs, or services. Note any known risks or areas of uncertainty.>
38
+
39
+ ---
40
+
41
+ ## Notes
42
+
43
+ <Any additional context or considerations relevant to this task.>
@@ -0,0 +1,50 @@
1
+ # Execution Summary: <Title>
2
+
3
+ **Task ID:** E##_S##_T##
4
+ **Story ID:** E##_S##
5
+ **Epic ID:** E##
6
+ **Date Completed:** YYYY-MM-DD (UTC)
7
+ **Agent:** developer
8
+ **Session ID:** <session_id>
9
+
10
+ ---
11
+
12
+ ## What Was Implemented
13
+
14
+ <Brief description of what was built or changed.>
15
+
16
+ ---
17
+
18
+ ## Files Changed
19
+
20
+ | File | Summary of Changes |
21
+ |------|--------------------|
22
+ | | |
23
+
24
+ ---
25
+
26
+ ## Commits
27
+
28
+ | SHA | Message |
29
+ |-----|---------|
30
+ | | |
31
+
32
+ ---
33
+
34
+ ## Acceptance Criteria Coverage
35
+
36
+ | Criterion | Status | Notes |
37
+ |-----------|--------|-------|
38
+ | | | |
39
+
40
+ ---
41
+
42
+ ## Edge Cases & Known Concerns
43
+
44
+ <Describe any edge cases encountered or known concerns that the tester should be aware of.>
45
+
46
+ ---
47
+
48
+ ## Notes for Tester
49
+
50
+ <Any specific guidance, setup steps, or context that will help the tester verify this work.>
@@ -0,0 +1,23 @@
1
+ {
2
+ "_schema": "https://github.com/samwelmunga/agents — jenga.config.json v1",
3
+
4
+ // Required — must be "jenga"
5
+ "workflow": "jenga",
6
+
7
+ // Workflow version installed in this project.
8
+ // Format: MAJOR.MINOR.PATCH — bump this when the workflow is updated.
9
+ "workflow_version": "1.0.0",
10
+
11
+ // Directory inside this project where the workflow files live.
12
+ // Typical values: ".agents" (default) or ".claude"
13
+ "target_dir": ".agents",
14
+
15
+ // Human-readable name for this project (informational only).
16
+ "project_name": "your-project-name",
17
+
18
+ // ISO 8601 date when the workflow was first installed in this project.
19
+ "created_at": "YYYY-MM-DD",
20
+
21
+ // ISO 8601 date of the last workflow sync to this project.
22
+ "updated_at": "YYYY-MM-DD"
23
+ }
@@ -0,0 +1,88 @@
1
+ # Rapport: <Short Problem Description>
2
+
3
+ **Date:** YYYY-MM-DD (UTC)
4
+ **Agent:** Developer | Tester
5
+ **Related Epic:** <Epic name or N/A>
6
+ **Related Story:** <Story name or N/A>
7
+ **Related Task:** <Task name or N/A>
8
+ **Type:** `conflict` | `implementation_blocker` | `security_concern` | `test_failure` | `analysis`
9
+
10
+ ---
11
+
12
+ ## Sender
13
+ ```json
14
+ {
15
+ "sender": {
16
+ "agent": "",
17
+ "session_id": "",
18
+ "task_id": "",
19
+ "story_id": "",
20
+ "epic_id": "",
21
+ "date": "",
22
+ "paths": [],
23
+ "worktree": ""
24
+ }
25
+ }
26
+ ```
27
+
28
+ ---
29
+
30
+ ## Summary
31
+ A one or two sentence description of what the problem is and why it blocked progress or requires attention.
32
+
33
+ ---
34
+
35
+ ## Context
36
+ What was being implemented or tested when this issue was encountered. Include relevant task or story goals.
37
+
38
+ ---
39
+
40
+ ## Problem Description
41
+ A detailed explanation of the issue.
42
+ - **Conflict:** describe both implementations and where they clash
43
+ - **Security concern:** describe the vulnerability or risk
44
+ - **Implementation blocker:** describe what failed and why
45
+ - **Test failure:** describe which tests failed, what was expected, and what was observed
46
+ - **Analysis:** describe the analysis scope, methodology, and findings
47
+
48
+ ---
49
+
50
+ ## Attempts Made
51
+ _Only applicable for `conflict` and `implementation_blocker` types._
52
+
53
+ ### Attempt 1
54
+ What was tried and why it did not work.
55
+
56
+ ### Attempt 2
57
+ What was tried and why it did not work.
58
+
59
+ ### Attempt 3
60
+ What was tried and why it did not work.
61
+
62
+ ---
63
+
64
+ ## Findings
65
+ _Only applicable for `test_failure` and `analysis` types._
66
+
67
+ | # | Finding | Severity | Notes |
68
+ |---|---------|----------|-------|
69
+ | 1 | | | |
70
+
71
+ ---
72
+
73
+ ## Impact
74
+ What cannot proceed until this is resolved. Which tasks, stories, or epics are blocked.
75
+
76
+ ---
77
+
78
+ ## Suggested Next Steps
79
+ Concrete suggestions for how a human or another agent could resolve this. Be specific.
80
+
81
+ ---
82
+
83
+ ## Ignore Log
84
+ _Only populated by the developer when this rapport is marked `.IGNORE.md`._
85
+
86
+ **Ignored by:** Developer
87
+ **Date:** YYYY-MM-DD (UTC)
88
+ **Reason:**
@@ -0,0 +1,311 @@
1
+ # Scrum Board Schema
2
+
3
+ This document is the authoritative reference for all scrum board files. Every agent that creates, reads, or updates board items must follow this schema exactly.
4
+
5
+ ---
6
+
7
+ ## Directory Layout
8
+
9
+ ```
10
+ project/
11
+ board/
12
+ epics/ Epic files: E##_<slug>.md
13
+ stories/ Story files: E##_S##_<slug>.md
14
+ tasks/ Task files: E##_S##_T##_<slug>.md
15
+ instructions/ User-action prerequisite files: E##_S##_T##_INSTRUCTIONS.md
16
+ (created on first use — not pre-provisioned)
17
+ configs/
18
+ workflow.json Shared constants (statuses, paths, rapport types)
19
+ data/
20
+ baselines.json Analytics baselines (owned by tester)
21
+ documentation/
22
+ plans/ Pre-execution plans: E##_S##_T##-plan.md (written by developer before implementation)
23
+ summaries/ Post-execution summaries: E##_S##_T##-summary.md (written by developer before invoking tester)
24
+ queue/
25
+ scrum_triggers.jsonl Trigger queue for scrum master
26
+ developer_triggers.jsonl Trigger queue for developer agent
27
+ tester_triggers.jsonl Trigger queue for tester agent
28
+ project_summary_updates.jsonl Proposed PROJECT_SUMMARY.md edits
29
+ .session_handoff.json Transient inter-session handoff (written by agent, consumed by on_session_end.sh)
30
+ rapports/
31
+ problems/ Problem rapports from developer and tester
32
+ analysis/ Analysis rapports from tester
33
+ logs/
34
+ events.json Append-only inter-agent event log
35
+ ```
36
+
37
+ > **Note:** `project/epics/` and `project/stories/` and `project/tasks/` are legacy paths from earlier skills. All new board items are written under `project/board/`. Skills and agents that reference the legacy paths should migrate to `project/board/` when next touched.
38
+
39
+ ---
40
+
41
+ ## ID & Filename Conventions
42
+
43
+ | Type | ID Format | Filename |
44
+ |-------|---------------|-----------------------------------|
45
+ | Epic | `E##` | `E##_<slug>.md` |
46
+ | Story | `E##_S##` | `E##_S##_<slug>.md` |
47
+ | Task | `E##_S##_T##` | `E##_S##_T##_<slug>.md` |
48
+
49
+ - Numbers are zero-padded to two digits: `E01`, `S03`, `T07`
50
+ - `<slug>` is a short lowercase kebab-case title derived from the item title
51
+ - Example: `E02_S04_T01_add-jwt-middleware.md`
52
+
53
+ ---
54
+
55
+ ## Status Values
56
+
57
+ All status fields must use one of the following exact strings:
58
+
59
+ | Status | Meaning |
60
+ |----------------------|------------------------------------------------------------|
61
+ | `Pending` | Created, not yet started |
62
+ | `In Progress` | Actively being worked on |
63
+ | `Passed` | All tests passed, no findings |
64
+ | `Passed with remarks`| Tests passed but non-blocking findings exist |
65
+ | `Failed` | Tests did not pass |
66
+ | `Rejected` | Deliberately rejected — not a test failure |
67
+ | `Blocked` | Cannot proceed; human intervention required |
68
+
69
+ 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.
70
+
71
+ ---
72
+
73
+ ## File Formats
74
+
75
+ ### Epic — `E##_<slug>.md`
76
+
77
+ ```markdown
78
+ ---
79
+ id: E##
80
+ title: <Title>
81
+ status: Pending
82
+ date_created: YYYY-MM-DD
83
+ date_started:
84
+ date_completed:
85
+ dates_previously_completed: # comma-separated list, e.g. 2026-01-15, 2026-03-22
86
+ reopened_on: # comma-separated list, e.g. 2026-02-01, 2026-04-10
87
+ reopened_reason: # comma-separated list, e.g. "Scope expanded", "Bug found post-release"
88
+ docs: [] # optional list of repo-relative documentation paths, e.g. ["README.md", "docs/API.md"]
89
+ stories:
90
+ - E##_S##
91
+ - E##_S##
92
+ ---
93
+
94
+ # Epic: <Title>
95
+
96
+ ## Purpose
97
+ <What this epic achieves and why.>
98
+
99
+ ## Definition of Done
100
+ - <Concrete, testable criterion>
101
+ - <Concrete, testable criterion>
102
+ ```
103
+
104
+ ### Story — `E##_S##_<slug>.md`
105
+
106
+ ```markdown
107
+ ---
108
+ id: E##_S##
109
+ epic_id: E##
110
+ title: <Title>
111
+ status: Pending
112
+ date_created: YYYY-MM-DD
113
+ date_started:
114
+ date_completed:
115
+ dates_previously_completed: # comma-separated list, e.g. 2026-01-15, 2026-03-22
116
+ reopened_on: # comma-separated list, e.g. 2026-02-01, 2026-04-10
117
+ reopened_reason: # comma-separated list, e.g. "Scope expanded", "Bug found post-release"
118
+ docs: [] # optional list of repo-relative documentation paths, e.g. ["README.md", "docs/API.md"]
119
+ tasks:
120
+ - E##_S##_T##
121
+ - E##_S##_T##
122
+ ---
123
+
124
+ # Story: <Title>
125
+
126
+ As a [type of user], I want [goal] so that [reason/value].
127
+
128
+ ## Acceptance Criteria
129
+ - [ ] <Verifiable criterion — specific enough for a tester to check without asking>
130
+
131
+ ## Definition of Done
132
+ - [ ] <Concrete, testable criterion>
133
+ - [ ] <Concrete, testable criterion>
134
+ ```
135
+
136
+ ### Task — `E##_S##_T##_<slug>.md`
137
+
138
+ ```markdown
139
+ ---
140
+ id: E##_S##_T##
141
+ story_id: E##_S##
142
+ epic_id: E##
143
+ title: <Title>
144
+ status: Pending
145
+ date_created: YYYY-MM-DD
146
+ date_started:
147
+ date_completed:
148
+ dates_previously_completed: # comma-separated list, e.g. 2026-01-15, 2026-03-22
149
+ reopened_on: # comma-separated list, e.g. 2026-02-01, 2026-04-10
150
+ reopened_reason: # comma-separated list, e.g. "Scope expanded", "Bug found post-release"
151
+ assigned_to: developer | tester | scrum-master
152
+ docs: [] # optional list of repo-relative documentation paths, e.g. ["README.md", "docs/API.md"]
153
+ ---
154
+
155
+ # Task: <Title>
156
+
157
+ ## Description
158
+ <What needs to be done and why.>
159
+
160
+ ## Prerequisites
161
+ <List any actions the user must take outside agent scope before or during implementation (e.g. creating accounts, configuring OAuth, provisioning services). Leave blank if none. If prerequisites exist, the developer must create an `_INSTRUCTIONS.md` file at `project/instructions/<E##_S##_T##>_INSTRUCTIONS.md`.>
162
+
163
+ ## Acceptance Criteria
164
+ - [ ] <Verifiable criterion>
165
+ ```
166
+
167
+ ---
168
+
169
+ ## Story Format Standards
170
+
171
+ ## Reopen Tracking Fields
172
+
173
+ **`dates_previously_completed`, `reopened_on`, `reopened_reason`** — These fields are **only populated when a previously completed item is being reopened and modified**. Leave them blank on first-run items. Each value is a comma-separated list to support multiple reopen cycles.
174
+
175
+ ## Documentation Provenance Field
176
+
177
+ **`docs`** — Optional YAML list of documentation files affected by the board item. Use repo-relative paths such as `README.md` or `docs/API.md`.
178
+
179
+ - Purpose: lets documentation workflows such as `/doc` trace which board items most recently affected a documentation file.
180
+ - Scope: may appear on epics, stories, or tasks.
181
+ - Optionality: existing board files remain valid when `docs` is omitted.
182
+ - Format: use a YAML list. Inline (`docs: ["README.md"]`) and expanded list styles are both valid.
183
+
184
+ These rules apply to every story file written or amended by the **Scrum Master**. They are enforced at write time by `scripts/validate-story-format.sh`.
185
+
186
+ ### Acceptance Criteria (`## Acceptance Criteria`)
187
+
188
+ - **Required** — the section must exist in every story file.
189
+ - **Format-agnostic** — may be prose, a numbered list, or checkboxes (`- [ ]`). No structural requirement beyond the section being present.
190
+ - **Owner: Scrum Master** writes the AC when creating or amending the story.
191
+
192
+ ### Definition of Done (`## Definition of Done`)
193
+
194
+ - **Required** — the section must exist in every story file.
195
+ - **Must use `- [ ]` checkboxes** — plain bullet points (`- text`) are **not** valid. Each criterion must be written as an unchecked checkbox so the Tester can tick it during verification.
196
+ - **Owner: Scrum Master** writes the DoD checkboxes when creating or amending the story. **Tester** ticks each `- [ ]` to `- [x]` during the test run, before writing any `Passed` or `Passed with remarks` status.
197
+
198
+ ### Validation script
199
+
200
+ Run `scripts/validate-story-format.sh <path-to-story-file>` to verify a story file meets these requirements. The script exits 0 on success and non-zero with a descriptive error message on failure.
201
+
202
+ Run `scripts/validate-board.sh <path-to-board-file>` to validate epic, story, or task frontmatter keys. The helper accepts optional `docs` annotations and remains backward compatible with existing board files that omit `docs`.
203
+
204
+ ---
205
+
206
+ ## Linking Convention
207
+
208
+ - Every story file must list its parent epic ID in the `epic_id` frontmatter field.
209
+ - Every task file must list both `story_id` and `epic_id`.
210
+ - Every epic file must list all of its constituent story IDs in the `stories` array.
211
+ - Every story file must list all of its constituent task IDs in the `tasks` array.
212
+ - These lists are the authoritative index. The scrum master maintains them; other agents must not modify them.
213
+
214
+ ---
215
+
216
+ ## File Locking (Concurrency Control)
217
+
218
+ Before writing to any board file, agents must:
219
+
220
+ 1. Check for a `<filename>.lock` file adjacent to the target file.
221
+ 2. If the lock file exists and its modification time is less than 60 seconds ago — wait up to 10 seconds and retry once. If still locked, abort and write a problem rapport.
222
+ 3. If no lock exists (or it is stale, older than 60 seconds) — create the lock file, perform the write, then delete the lock file.
223
+ 4. Always delete the lock file in success and failure paths. Use a `trap` or equivalent cleanup.
224
+
225
+ ---
226
+
227
+ ## Rapport Types
228
+
229
+ | Type | Used by | Location |
230
+ |-------------------------|--------------------|-------------------------------------------------|
231
+ | `conflict` | developer | `project/rapports/problems/` |
232
+ | `implementation_blocker`| developer | `project/rapports/problems/` |
233
+ | `security_concern` | developer | `project/rapports/problems/` |
234
+ | `test_failure` | tester | `project/rapports/problems/` |
235
+ | `analysis` | tester | `project/rapports/analysis/` |
236
+
237
+ ---
238
+
239
+ ## Queue Trigger Types
240
+
241
+ ### `scrum_triggers.jsonl` — processed by scrum master at session start
242
+
243
+ | Type | Written by | Purpose |
244
+ |------------------|-------------|--------------------------------------------------------|
245
+ | `rapport_review` | on_session_end.sh | New problem rapport(s) detected; create backlog items or mark Failed |
246
+ | `status_review` | on_session_end.sh | Session ended; review board for stale statuses |
247
+ | `story_rollup` | tester / on_session_end.sh | All tasks under story complete; check rollup |
248
+
249
+ ### `developer_triggers.jsonl` — processed by developer at session start
250
+
251
+ | Type | Written by | Purpose |
252
+ |--------------------------|---------------------|-----------------------------------------------|
253
+ | `implementation_assignment` | on_session_end.sh (from scrum-master handoff) | New tasks ready for implementation |
254
+ | `rework_assignment` | on_session_end.sh (from tester handoff) | Tests failed; address rapport and re-implement |
255
+
256
+ ### `tester_triggers.jsonl` — processed by tester at session start
257
+
258
+ | Type | Written by | Purpose |
259
+ |-------------------|---------------------|-------------------------------------------------|
260
+ | `test_assignment` | on_session_end.sh (from developer handoff) | Implementation complete; run tests against worktree |
261
+
262
+ ### `.session_handoff.json` — transient, consumed by on_session_end.sh
263
+
264
+ Written by an agent as the **last action** of its session. Consumed and deleted by `on_session_end.sh`. The file must not persist across sessions.
265
+
266
+ | Field | Required by | Notes |
267
+ |---------------|----------------------|------------------------------------------|
268
+ | `agent` | all | `scrum-master`, `developer`, or `tester` |
269
+ | `status` | all | See per-agent values below |
270
+ | `session_id` | all | |
271
+ | `task_ids` | scrum-master only | Array of task IDs assigned for implementation |
272
+ | `task_id` | developer, tester | Single task ID |
273
+ | `story_id` | all | |
274
+ | `epic_id` | all | |
275
+ | `worktree` | developer, tester | Absolute path |
276
+ | `paths` | developer, tester | Commit SHAs |
277
+ | `rapport_file`| tester only | Path to rapport if status is failed/error |
278
+ | `date` | all | ISO 8601 UTC |
279
+
280
+ **Status values per agent:**
281
+ - `scrum-master`: `planning_complete`
282
+ - `developer`: `implementation_complete`
283
+ - `tester`: `passed`, `passed_with_remarks`, `failed`, `error`
284
+
285
+
286
+
287
+ Located at `project/configs/workflow.json`. Scaffolded by `/init` and owned by the scrum master.
288
+
289
+ ```json
290
+ {
291
+ "statuses": ["Pending", "In Progress", "Passed", "Passed with remarks", "Failed", "Rejected", "Blocked"],
292
+ "rapport_types": ["conflict", "implementation_blocker", "security_concern", "test_failure", "analysis"],
293
+ "paths": {
294
+ "board": "project/board",
295
+ "epics": "project/board/epics",
296
+ "stories": "project/board/stories",
297
+ "tasks": "project/board/tasks",
298
+ "instructions": "project/instructions",
299
+ "rapports_problems": "project/rapports/problems",
300
+ "rapports_analysis": "project/rapports/analysis",
301
+ "queue": "project/queue",
302
+ "logs": "project/logs",
303
+ "data": "project/data",
304
+ "configs": "project/configs",
305
+ "documentation": "project/documentation",
306
+ "documentation_plans": "project/documentation/plans",
307
+ "documentation_summaries": "project/documentation/summaries"
308
+ },
309
+ "agents": ["developer", "tester", "scrum-master"]
310
+ }
311
+ ```
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: skill-name
3
+ description: One-line description of what this skill does
4
+ keywords:
5
+ # Short words/phrases (1-3 words) strongly associated with this skill
6
+ # Example: - brainstorm
7
+ examples:
8
+ # Natural-language prompts that should trigger this skill
9
+ # Example: - "let's plan a new feature"
10
+ metadata:
11
+ prefered_agent: developer
12
+ ---
13
+
14
+ ## Instructions
15
+
16
+ <!-- Describe the steps the agent should take when this skill is invoked. -->
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: <skill-name>
3
+ description: <One-sentence description of what this skill does and when to use it.>
4
+ metadata:
5
+ prefered_agent: <agent-name> # optional — remove if not applicable
6
+ ---
7
+
8
+ # <Skill Title> — <Short tagline>
9
+
10
+ ## Instructions
11
+
12
+ ### 1. <First step title>
13
+
14
+ <Describe what to do in this step.>
15
+
16
+ ### 2. <Second step title>
17
+
18
+ <Describe what to do in this step.>
19
+
20
+ ### Session End
21
+
22
+ When this skill's session concludes, emit the following signal on its own line so the Jenga Router clears the active session:
23
+
24
+ ```
25
+ [JENGA:SESSION_END:<skill-name>]
26
+ ```
27
+
28
+ Replace `<skill-name>` with the actual skill name from the frontmatter.
@@ -0,0 +1,22 @@
1
+ # <Action Name> — Setup Instructions
2
+
3
+ **Epic**: E## — <epic title>
4
+ **Required before**: <story or task that depends on this>
5
+
6
+ ## Overview
7
+
8
+ <Brief description of what the user needs to set up and why.>
9
+
10
+ ## Steps
11
+
12
+ 1. <Step one>
13
+ 2. <Step two>
14
+ 3. <Step three>
15
+
16
+ ## Verification
17
+
18
+ <How the user can confirm the setup is complete and working.>
19
+
20
+ ## Notes
21
+
22
+ <Any caveats, links to external docs, or environment-specific instructions.>
@@ -0,0 +1,55 @@
1
+ # GitHub Copilot Instructions
2
+
3
+ This file configures GitHub Copilot's behavior for this project. The block between the Jenga markers is managed automatically by `jenga init` — do not edit it manually.
4
+
5
+ <!-- JENGA:START -->
6
+ ## Jenga Agent Framework
7
+
8
+ This project uses **Jenga** — a skill-based AI agent framework. Jenga organises project work into Epics, Stories, and Tasks managed on a scrum board. It routes user messages to specialised **skills** that execute defined workflows.
9
+
10
+ ### How Jenga Works
11
+
12
+ - Each **skill** is a self-contained instruction set stored under `.agents/skills/<skill-name>/` (the non-Claude discovery path; Claude Code reads the same content from `.claude/skills/`).
13
+ - Skills are invoked by typing `/skill-name` in the chat prompt.
14
+ - 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
+
16
+ ### Skill Routing
17
+
18
+ When a user's message matches a known skill keyword or intent, invoke the skill immediately using the slash-command syntax:
19
+
20
+ ```
21
+ /skill-name
22
+ ```
23
+
24
+ Do **not** answer skill-related requests with free-form prose if a matching skill exists — delegate to the skill instead.
25
+
26
+ For free-form questions (architecture, code review, debugging, general Q&A) that do not match a skill, answer directly using your full capabilities.
27
+
28
+ #### Routing decision table
29
+
30
+ | Situation | Action |
31
+ |-----------|--------|
32
+ | Message matches a skill keyword or intent | Invoke `/skill-name` |
33
+ | Message is a general coding or project question | Answer directly |
34
+ | Ambiguous — could be skill or free-form | Prefer the skill; mention it is being invoked |
35
+
36
+ ### Available Skills
37
+
38
+ {{SKILL_LIST}}
39
+
40
+ ### Session End
41
+
42
+ GitHub Copilot CLI does not fire a native session-end hook. To replicate the cleanup logic that Claude Code triggers via its `SessionEnd` hook, run the following script at the end of any Copilot session or after completing a significant skill (e.g. `commit`, `lgtm`):
43
+
44
+ ```bash
45
+ bash "$(node -p "path.dirname(require.resolve('jenga-agent/package.json'))")/hooks/copilot_session_end.sh"
46
+ ```
47
+
48
+ The `hooks/`, `lib/`, `scripts/`, `templates/`, and `mcp/` directories all live inside the installed `jenga-agent` package (`node_modules/jenga-agent/…`) — they are **not** copied into the project. The script above sources `lib/resolve-project-dir.sh` and delegates to `hooks/on_session_end.sh` (both from the same package), which handle queue routing, rapport detection, handoff file processing, and todo cleanup. See [`docs/hook-parity.md`](docs/hook-parity.md) for the full Claude Code ↔ Copilot hook parity reference.
49
+
50
+ ### Notes
51
+
52
+ - Always resolve file paths relative to `JENGA_PROJECT_DIR`.
53
+ - 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.
54
+ - Commit messages and branch names follow the EST naming convention (`E<n>_S<n>_T<n>`).
55
+ <!-- JENGA:END -->