@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.
- package/LICENSE +201 -0
- package/README.md +340 -0
- package/agents/ai_engineer.md +113 -0
- package/agents/developer.md +236 -0
- package/agents/scrum-master.md +349 -0
- package/agents/scrutiny-agent.md +137 -0
- package/agents/solution-assessor.md +185 -0
- package/agents/tester.md +339 -0
- package/bin/jenga.js +70 -0
- package/hooks/copilot_session_end.sh +29 -0
- package/hooks/on_session_end.sh +238 -0
- package/hooks/prompt_router.sh +11 -0
- package/hooks/prompt_router_helper.js +52 -0
- package/hooks/session_end_helper.js +29 -0
- package/hooks/session_end_watcher.sh +24 -0
- package/lib/commands/attach.js +47 -0
- package/lib/commands/init.js +207 -0
- package/lib/commands/start.js +16 -0
- package/lib/commands/status.js +53 -0
- package/lib/config-schema.js +72 -0
- package/lib/inject-settings.js +61 -0
- package/lib/mirror.js +244 -0
- package/lib/resolve-project-dir.sh +47 -0
- package/mcp/execute-ticket/index.js +10 -0
- package/mcp/execute-ticket/package.json +5 -0
- package/mcp/help/index.js +79 -0
- package/mcp/help/package.json +14 -0
- package/mcp/router/README.md +19 -0
- package/mcp/router/embedder.js +23 -0
- package/mcp/router/index.js +204 -0
- package/mcp/router/matcher.js +87 -0
- package/mcp/router/package-lock.json +1048 -0
- package/mcp/router/package.json +11 -0
- package/mcp/router/skill-index.js +104 -0
- package/package.json +47 -0
- package/scripts/board_resolver.sh +46 -0
- package/scripts/e25_s01_extract_board_graph.py +292 -0
- package/scripts/e25_s01_generate_synthetic_board.py +90 -0
- package/scripts/measurement-10x.json +50 -0
- package/scripts/measurement-10x.txt +4 -0
- package/scripts/measurement-real.json +50 -0
- package/scripts/measurement-real.txt +4 -0
- package/scripts/postinstall.js +165 -0
- package/scripts/todo_cleanup.sh +22 -0
- package/scripts/todo_manager.sh +86 -0
- package/scripts/validate-board.sh +190 -0
- package/scripts/validate-story-format.sh +53 -0
- package/skills/brainstorm/SKILL.md +47 -0
- package/skills/btw/SKILL.md +42 -0
- package/skills/commit/SKILL.md +29 -0
- package/skills/commit/assets/user_instructions_template.md +22 -0
- package/skills/continue/SKILL.md +29 -0
- package/skills/convert/SKILL.md +124 -0
- package/skills/convert/convert_cli.py +235 -0
- package/skills/convert/tests/sample.csv +4 -0
- package/skills/convert/tests/sample.json +5 -0
- package/skills/convert/tests/sample.jsonl +3 -0
- package/skills/convert/tests/sample.yaml +18 -0
- package/skills/convert/tests/sample_obj.csv +2 -0
- package/skills/convert/tests/sample_obj.json +9 -0
- package/skills/deep-dive/SKILL.md +167 -0
- package/skills/do/SKILL.md +88 -0
- package/skills/do/assets/sender_template.json +12 -0
- package/skills/doc/SKILL.md +314 -0
- package/skills/doc/assets/path-objectives.yaml +38 -0
- package/skills/doc-sync/SKILL.md +167 -0
- package/skills/doc-sync/assets/default_excludes.txt +21 -0
- package/skills/doc-sync/assets/doc_targets.md +14 -0
- package/skills/dooo/SKILL.md +60 -0
- package/skills/error/SKILL.md +29 -0
- package/skills/evaluate/SKILL.md +45 -0
- package/skills/evaluate/assets/evaluation_invokation_template.yml +3 -0
- package/skills/evaluate/assets/evaluation_rapport_template.md +24 -0
- package/skills/examplify/SKILL.md +42 -0
- package/skills/help/SKILL.md +36 -0
- package/skills/improve/SKILL.md +55 -0
- package/skills/index/scripts/board-index +4 -0
- package/skills/index/scripts/board_index.py +615 -0
- package/skills/index/scripts/smoke_test.sh +86 -0
- package/skills/init/SKILL.md +44 -0
- package/skills/init/assets/.gitignore_template +15 -0
- package/skills/init/assets/PROJECT_SUMMARY_template.md +13 -0
- package/skills/init/assets/directory_structure.txt +13 -0
- package/skills/init/assets/test-config_template.json +4 -0
- package/skills/init/assets/workflow_template.json +30 -0
- package/skills/init/scripts/init.sh +48 -0
- package/skills/jbp/SKILL.md +25 -0
- package/skills/jenga/SKILL.md +68 -0
- package/skills/lgtm/SKILL.md +21 -0
- package/skills/mirror-public/SKILL.md +237 -0
- package/skills/mirror-public/assets/config.json +5 -0
- package/skills/mirror-public/scripts/mirror.sh +374 -0
- package/skills/pi-plan/SKILL.md +62 -0
- package/skills/pi-plan/assets/epic.json +7 -0
- package/skills/pi-plan/assets/story_template.md +18 -0
- package/skills/proceed/SKILL.md +29 -0
- package/skills/publish/SKILL.md +351 -0
- package/skills/publish/adapters/droplet.md +200 -0
- package/skills/publish/adapters/mobile-ios.md +114 -0
- package/skills/publish/adapters/npm-ci.md +223 -0
- package/skills/publish/adapters/npm.md +121 -0
- package/skills/publish/assets/ExportOptions.plist.template +19 -0
- package/skills/publish/assets/ci-contract.md +111 -0
- package/skills/publish/assets/ownership-matrix.md +17 -0
- package/skills/publish/assets/publish.example.json +85 -0
- package/skills/publish/assets/publish.example.npm-ci.json +40 -0
- package/skills/publish/assets/publish.example.npm.json +41 -0
- package/skills/publish/assets/secrets-guide.md +104 -0
- package/skills/publish/schemas/fixtures/npm-ci-minimal.json +17 -0
- package/skills/publish/schemas/fixtures/npm-ci-with-empty-secrets.json +18 -0
- package/skills/publish/schemas/fixtures/npm-ci-with-workflow-path.json +18 -0
- package/skills/publish/schemas/publish.schema.json +428 -0
- package/skills/publish/scripts/check_target_config.sh +96 -0
- package/skills/publish/scripts/droplet_pipeline.sh +208 -0
- package/skills/publish/scripts/generate_release_notes.sh +200 -0
- package/skills/publish/scripts/ios_pipeline.sh +486 -0
- package/skills/publish/scripts/npm_ci_pipeline.sh +225 -0
- package/skills/publish/scripts/npm_pipeline.sh +249 -0
- package/skills/publish/scripts/publish_common.sh +253 -0
- package/skills/publish/scripts/publish_deploy.sh +538 -0
- package/skills/publish/scripts/reconcile_tags.sh +135 -0
- package/skills/publish/scripts/run_gates.sh +616 -0
- package/skills/publish/scripts/setup_wizard.sh +394 -0
- package/skills/publish/scripts/show_history.sh +95 -0
- package/skills/publish/scripts/suggest_semver_bump.sh +105 -0
- package/skills/publish/scripts/validate_config.sh +163 -0
- package/skills/publish/scripts/validate_droplet_env.sh +45 -0
- package/skills/publish/scripts/validate_ios_env.sh +68 -0
- package/skills/publish/scripts/validate_npm_ci_env.sh +71 -0
- package/skills/publish/scripts/validate_npm_env.sh +22 -0
- package/skills/publish/scripts/write_ledger_entry.sh +126 -0
- package/skills/publish/wizards/droplet.md +275 -0
- package/skills/publish/wizards/mobile-ios.md +157 -0
- package/skills/publish/wizards/npm-ci.md +240 -0
- package/skills/publish/wizards/npm.md +224 -0
- package/skills/reconcile/SKILL.md +93 -0
- package/skills/reconcile/assets/report_format.md +44 -0
- package/skills/reconcile-origin/SKILL.md +75 -0
- package/skills/reconcile-origin/scripts/reconcile-origin.sh +372 -0
- package/skills/redo/SKILL.md +70 -0
- package/skills/route/SKILL.md +180 -0
- package/skills/self-sync/SKILL.md +73 -0
- package/skills/self-sync/scripts/run.js +136 -0
- package/skills/skillify/SKILL.md +68 -0
- package/skills/skillify/assets/init-new/SKILL.md +35 -0
- package/skills/skillify/assets/init-new/assets/.gitignore_template +15 -0
- package/skills/skillify/assets/init-new/assets/PROJECT_SUMMARY_template.md +13 -0
- package/skills/skillify/assets/init-new/assets/directory_structure.txt +10 -0
- package/skills/skillify/assets/init-new/assets/test-config_template.json +4 -0
- package/skills/skillify/assets/init-new/assets/workflow_template.json +17 -0
- package/skills/skillify/assets/init-new/scripts/init.sh +48 -0
- package/skills/skillify/assets/init-old/SKILL.md +124 -0
- package/skills/spinoff/SKILL.md +48 -0
- package/skills/status/SKILL.md +33 -0
- package/skills/status/assets/output_format.md +41 -0
- package/skills/todo/SKILL.md +46 -0
- package/skills/todo/assets/todo_handoff_template.md +22 -0
- package/skills/todo/assets/todo_template.md +3 -0
- package/skills/train/SKILL.md +116 -0
- package/skills/train/assets/dashboard-templates/classifiers.html +106 -0
- package/skills/train/assets/dashboard-templates/nlp.html +102 -0
- package/skills/train/assets/dashboard-templates/transformers.html +98 -0
- package/skills/train/assets/results-parsers/__init__.py +9 -0
- package/skills/train/assets/results-parsers/classifiers.py +84 -0
- package/skills/train/assets/results-parsers/nlp.py +88 -0
- package/skills/train/assets/results-parsers/reporter.py +154 -0
- package/skills/train/assets/results-parsers/transformers.py +120 -0
- package/skills/train/train_cli.py +786 -0
- package/templates/EXECUTION_PLAN_TEMPLATE.md +43 -0
- package/templates/EXECUTION_SUMMARY_TEMPLATE.md +50 -0
- package/templates/JENGA_CONFIG_TEMPLATE.json +23 -0
- package/templates/PROBLEM_RAPPORT_TEMPLATE.md +88 -0
- package/templates/SCRUM_BOARD_SCHEMA.md +311 -0
- package/templates/SKILL.md +16 -0
- package/templates/SKILL_TEMPLATE.md +28 -0
- package/templates/USER_INSTRUCTIONS_TEMPLATE.md +22 -0
- 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 -->
|