@jenga-ai/agent 3.1.1 → 3.4.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 (92) hide show
  1. package/README.md +52 -12
  2. package/agents/developer.md +31 -16
  3. package/agents/scrum-master.md +18 -17
  4. package/agents/tester.md +25 -15
  5. package/bin/jenga.js +10 -0
  6. package/lib/commands/dashboard.js +92 -0
  7. package/lib/skill-allow-list.json +7 -2
  8. package/package.json +21 -2
  9. package/project/app/api/lib/resolve-project-root.js +120 -0
  10. package/project/app/api/package.json +16 -0
  11. package/project/app/api/parsers/architecture.js +72 -0
  12. package/project/app/api/parsers/board.js +141 -0
  13. package/project/app/api/parsers/documentation.js +125 -0
  14. package/project/app/api/parsers/git-log.js +52 -0
  15. package/project/app/api/parsers/ideas.js +62 -0
  16. package/project/app/api/parsers/knowledge-graph.js +73 -0
  17. package/project/app/api/parsers/lib/markdown-dir-reader.js +163 -0
  18. package/project/app/api/parsers/rapports.js +148 -0
  19. package/project/app/api/parsers/todo.js +179 -0
  20. package/project/app/api/response.js +47 -0
  21. package/project/app/api/routes/architecture.js +23 -0
  22. package/project/app/api/routes/board.js +46 -0
  23. package/project/app/api/routes/documentation.js +24 -0
  24. package/project/app/api/routes/health.js +25 -0
  25. package/project/app/api/routes/history.js +55 -0
  26. package/project/app/api/routes/rapports.js +24 -0
  27. package/project/app/api/scripts/capture-snapshot.js +294 -0
  28. package/project/app/api/server.js +112 -0
  29. package/project/app/api/types.js +40 -0
  30. package/project/app/package.json +21 -0
  31. package/project/app/ui/dist/assets/index-7fj-vllY.js +104 -0
  32. package/project/app/ui/dist/assets/index-CdK3Qrep.css +1 -0
  33. package/project/app/ui/dist/index.html +13 -0
  34. package/project/app/ui/package.json +23 -0
  35. package/project/app/ui/scripts/build-snapshot-html.cjs +214 -0
  36. package/project/app/ui/scripts/dashboard-open.cjs +88 -0
  37. package/project/app/ui/scripts/dashboard-start.cjs +87 -0
  38. package/scripts/acquire-concurrency-slot.sh +220 -0
  39. package/scripts/audit-twin-divergence.sh +625 -0
  40. package/scripts/check-public-playbook-steps.sh +136 -0
  41. package/scripts/compute-deploy-reconcile.sh +439 -0
  42. package/scripts/jenga-permission-level-switch.sh +19 -3
  43. package/scripts/mark-deployed.sh +532 -0
  44. package/scripts/populate-knowledge-graph.js +429 -0
  45. package/scripts/release-concurrency-slot.sh +129 -0
  46. package/scripts/validate-board.sh +60 -2
  47. package/scripts/verify-consumer-install.sh +470 -0
  48. package/skills/j-close-story/SKILL.md +1 -1
  49. package/skills/j-cloud-connect/SKILL.md +95 -0
  50. package/skills/j-cloud-connect/scripts/configure-backend.sh +267 -0
  51. package/skills/j-cloud-connect/scripts/install-rclone.sh +153 -0
  52. package/skills/j-dashboard/SKILL.md +144 -0
  53. package/skills/j-dashboard/scripts/launch.sh +121 -0
  54. package/skills/j-dashboard/scripts/resolve-app-dir.sh +164 -0
  55. package/skills/j-dashboard/scripts/snapshot.sh +267 -0
  56. package/skills/j-dashboard-share/SKILL.md +96 -0
  57. package/skills/j-dashboard-share/scripts/upload-snapshot.sh +173 -0
  58. package/skills/j-do/SKILL.md +19 -19
  59. package/skills/j-doc-sync/SKILL.md +12 -1
  60. package/skills/j-idea/SKILL.md +1 -1
  61. package/skills/j-init/SKILL.md +5 -4
  62. package/skills/j-init/assets/directory_structure.txt +1 -0
  63. package/skills/j-init/scripts/detect-existing-codebase.sh +2 -2
  64. package/skills/j-init/scripts/init.sh +13 -2
  65. package/skills/j-playbook/SKILL.md +93 -0
  66. package/skills/j-playbook-new/SKILL.md +155 -0
  67. package/skills/j-playbook-new/scripts/playbook-new.sh +332 -0
  68. package/skills/j-proceed/SKILL.md +1 -1
  69. package/skills/j-publish/SKILL.md +1 -1
  70. package/skills/j-publish/adapters/npm-ci.md +29 -0
  71. package/skills/j-publish/scripts/npm_ci_pipeline.sh +9 -0
  72. package/skills/j-publish/scripts/npm_pipeline.sh +18 -0
  73. package/skills/j-publish/scripts/npm_stage_pipeline.sh +81 -41
  74. package/skills/j-reconcile/SKILL.md +1 -0
  75. package/skills/j-redo/SKILL.md +1 -1
  76. package/skills/j-status/SKILL.md +12 -0
  77. package/skills/j-todo/SKILL.md +2 -2
  78. package/skills/j-uncharted/SKILL.md +8 -7
  79. package/skills/j-uncharted/scripts/validate-proposed-items.sh +18 -2
  80. package/skills/jenga/SKILL.md +55 -16
  81. package/skills/jenga/playbooks/idea-to-committed.json +20 -0
  82. package/skills/jenga/playbooks/schema.json +1 -1
  83. package/skills/jenga/scripts/load-nl-catalog.js +22 -6
  84. package/skills/jenga/scripts/load-playbooks.sh +968 -41
  85. package/skills/jenga/scripts/match-playbook.sh +1 -1
  86. package/skills/jenga/scripts/render-playbook-confirmation.sh +162 -8
  87. package/skills/jenga/scripts/run-playbook-step.sh +535 -42
  88. package/skills/jenga-permission-level/SKILL.md +4 -4
  89. package/templates/KNOWLEDGE_GRAPH_STUB_SCHEMA_TEMPLATE.md +128 -0
  90. package/templates/SCRUM_BOARD_SCHEMA.md +18 -6
  91. package/templates/playbook-types.json +8 -0
  92. package/skills/jenga/playbooks/brainstorm-to-mirror.json +0 -22
@@ -28,7 +28,7 @@ examples:
28
28
  | 4 | Elevated | |
29
29
  | 5 | Unrestricted | |
30
30
 
31
- `defaultMode` stays `acceptEdits` at every level; only the `permissions` block changes. Levels are backed by template files at `templates/permission-levels/level-<n>-<name>.json`, e.g. `templates/permission-levels/level-4-elevated.json` (naming convention: `<name>` is the lowercase level name from the table above — Locked/Guarded/Standard/Elevated/Unrestricted). Those templates are owned by story E33_S01 and are the input the switch script (see below) copies from.
31
+ `defaultMode` stays `acceptEdits` at every level; only the `permissions` block changes. Levels are backed by template files at `$([ -f templates/permission-levels/level-<n>-<name>.json ] && echo templates/permission-levels/level-<n>-<name>.json || echo node_modules/@jenga-ai/agent/templates/permission-levels/level-<n>-<name>.json)`, e.g. `$([ -f templates/permission-levels/level-4-elevated.json ] && echo templates/permission-levels/level-4-elevated.json || echo node_modules/@jenga-ai/agent/templates/permission-levels/level-4-elevated.json)` (naming convention: `<name>` is the lowercase level name from the table above — Locked/Guarded/Standard/Elevated/Unrestricted). Those templates are owned by story E33_S01 and are the input the switch script (see below) copies from.
32
32
 
33
33
  ---
34
34
 
@@ -59,18 +59,18 @@ Before doing anything else, validate the argument:
59
59
  Do not inline the copy/update logic here — per this repo's scripts-over-inline-logic convention, the switch is owned entirely by a dedicated script:
60
60
 
61
61
  ```bash
62
- bash scripts/jenga-permission-level-switch.sh <n>
62
+ bash "$([ -f scripts/jenga-permission-level-switch.sh ] && echo scripts/jenga-permission-level-switch.sh || echo node_modules/@jenga-ai/agent/scripts/jenga-permission-level-switch.sh)" <n>
63
63
  ```
64
64
 
65
65
  This script (created by a separate task, E33_S02_T02) is responsible for:
66
- - Copying `templates/permission-levels/level-<n>-<name>.json` over both `.claude/settings.json` and `.agents/settings.json` as a **whole-file overwrite** — not a merge of the `permissions` block alone. Two fields vary by level and are expected to change on a switch: `permissions.deny` and `autoMode.allow`. All 5 templates carry byte-identical `defaultMode`, `env`, `hooks`, and `permissions.allow`; that invariant is what keeps the overwrite safe. Two consequences follow: any top-level key present in a destination file but absent from the templates is **silently dropped** by a switch, and any future per-level difference in `defaultMode`/`env`/`hooks` would take effect without warning. Keep the templates in sync with root `settings.json` for everything except those two varying fields.
66
+ - Copying `$([ -f templates/permission-levels/level-<n>-<name>.json ] && echo templates/permission-levels/level-<n>-<name>.json || echo node_modules/@jenga-ai/agent/templates/permission-levels/level-<n>-<name>.json)` over both `.claude/settings.json` and `.agents/settings.json` as a **whole-file overwrite** — not a merge of the `permissions` block alone. Two fields vary by level and are expected to change on a switch: `permissions.deny` and `autoMode.allow`. All 5 templates carry byte-identical `defaultMode`, `env`, `hooks`, and `permissions.allow`; that invariant is what keeps the overwrite safe. Two consequences follow: any top-level key present in a destination file but absent from the templates is **silently dropped** by a switch, and any future per-level difference in `defaultMode`/`env`/`hooks` would take effect without warning. Keep the templates in sync with root `settings.json` for everything except those two varying fields.
67
67
  - Creating or updating `.jenga-permission-level.json` at the repo root to `{"session_level": <n>}`.
68
68
 
69
69
  Relay the script's stdout to the user and honor its exit code:
70
70
  - Exit code `0` — report success, e.g. `Switched to level <n> (<name>).`
71
71
  - Non-zero exit code — report the script's error output verbatim and treat the switch as failed; do not claim success.
72
72
 
73
- If `scripts/jenga-permission-level-switch.sh` does not exist yet (e.g. E33_S02_T02 has not landed), report that clearly as a missing dependency rather than attempting to reimplement its logic inline.
73
+ If neither `scripts/jenga-permission-level-switch.sh` nor `node_modules/@jenga-ai/agent/scripts/jenga-permission-level-switch.sh` exists yet (e.g. E33_S02_T02 has not landed), report that clearly as a missing dependency rather than attempting to reimplement its logic inline.
74
74
 
75
75
  ### Session End
76
76
 
@@ -0,0 +1,128 @@
1
+ # Knowledge Graph — Coarse Graph STUB Schema
2
+
3
+ > **STUB — this is not E20_S01's schema.**
4
+ >
5
+ > This file defines a minimal, intentionally throwaway coarse-graph node/edge schema so that
6
+ > **E20_S08** ("Interactive Architecture Elicitation — Uncharted Integration") can be prototyped
7
+ > without waiting on **E20_S01** (the epic's real, eventual node/edge schema and JSON Schema
8
+ > publication under `project/knowledge-graph/graph.json`). E20_S01 has no committed landing
9
+ > schedule; this stub exists purely to unblock E20_S08's other tasks in the meantime.
10
+ >
11
+ > **This schema will be replaced wholesale once E20_S01 lands.** Nothing that depends on this file
12
+ > should assume field stability, forward compatibility, or migration support — when E20_S01's real
13
+ > schema is published, this file should be deleted (or reduced to a pointer at the real schema) and
14
+ > every consumer of it re-pointed. Do not extend this stub with new fields expecting them to survive
15
+ > the swap; keep it minimal.
16
+
17
+ ---
18
+
19
+ ## Node Schema
20
+
21
+ | Field | Type | Required | Description |
22
+ |---------------|---------------------|----------|-------------------------------------------------------------------------------|
23
+ | `id` | string | yes | Unique node identifier within the coarse graph. |
24
+ | `type` | string | yes | Node kind (e.g. `service`, `module`, `function`, `data-type`). Free-text in the stub — E20_S01 may formalize an enum. |
25
+ | `label` | string | yes | Short human-readable name for the node. |
26
+ | `description` | string | yes | Free-text description of what the node represents. |
27
+ | `source` | `human` \| `ast` | yes | Provenance of this node — see **Provenance Field** below. |
28
+ | `status` | `active` \| `superseded` | no | Present only once a conflict has been resolved against this node — see **Evidence-Wins Conflict Rule** below. Absence means `active`. |
29
+ | `superseded_by` | string (node `id`) | no | Required when `status: superseded`. Points at the node that superseded this one. |
30
+
31
+ ## Edge Schema
32
+
33
+ | Field | Type | Required | Description |
34
+ |---------------|--------|----------|----------------------------------------------------------|
35
+ | `id` | string | yes | Unique edge identifier within the coarse graph. |
36
+ | `from` | string | yes | Source node `id`. |
37
+ | `to` | string | yes | Target node `id`. |
38
+ | `type` | string | yes | Edge kind (e.g. `depends-on`, `calls`, `flows-to`). Free-text in the stub. |
39
+ | `description` | string | yes | Free-text description of the relationship. |
40
+
41
+ ---
42
+
43
+ ## Provenance Field — `source: human | ast`
44
+
45
+ Every stub node declares how it came to exist:
46
+
47
+ - **`human`** — written by a human-in-the-loop conversational elicitation session (the flow E20_S08
48
+ is building: propose understanding, ask the user to confirm or correct, write the resulting node).
49
+ This is a **coarse** node: it reflects a person's understanding of the code, not mechanical
50
+ extraction.
51
+ - **`ast`** — written by an automated, AST-derived extraction pipeline. This is a **fine-grained**
52
+ node: it reflects what the code mechanically, verifiably does. No such pipeline exists yet as of
53
+ this stub (it is scoped to E20_S02's prospective AST-diff maintenance work); the `ast` value is
54
+ defined here so the conflict rule below has both sides of the conflict to refer to from day one.
55
+
56
+ There is no third value. A node's `source` is fixed at creation time and is not itself mutated by
57
+ conflict resolution — conflict resolution only ever adds `status`/`superseded_by` to a `human` node
58
+ (see below); it never rewrites a node's `source`.
59
+
60
+ ## Evidence-Wins Conflict Rule
61
+
62
+ **Trigger:** a `human`-sourced coarse node and a (future) `ast`-sourced fine node both describe the
63
+ same underlying code, and they disagree — e.g. a human described a module's purpose one way during
64
+ elicitation, and a later AST-derived extraction of the same code area produces a materially
65
+ different description or classification.
66
+
67
+ **Rule:** the AST-derived (`source: ast`) entry takes precedence as the authoritative description.
68
+ The human-authored (`source: human`) entry is **not deleted**. Instead:
69
+
70
+ 1. The human node's `status` field is set to `superseded`.
71
+ 2. The human node's `superseded_by` field is set to the `id` of the AST-derived node that
72
+ superseded it.
73
+ 3. The AST-derived node is written normally (`source: ast`, no `status` field — it is the new
74
+ active, authoritative entry for that piece of code).
75
+
76
+ This preserves the human node as a retained, annotated rationale/history layer rather than silently
77
+ discarding a person's prior understanding — useful for later review of *why* a human once believed
78
+ something different, and for detecting elicitation sessions that were confidently wrong.
79
+
80
+ **Worked example:**
81
+
82
+ Before conflict resolution — a human-authored coarse node:
83
+
84
+ ```json
85
+ {
86
+ "id": "node-042",
87
+ "type": "module",
88
+ "label": "billing-worker",
89
+ "description": "Background job that retries failed charges.",
90
+ "source": "human"
91
+ }
92
+ ```
93
+
94
+ After a later AST-derived extraction disagrees (the module actually reconciles ledger entries, it
95
+ does not retry charges) and the conflict is resolved:
96
+
97
+ ```json
98
+ {
99
+ "id": "node-042",
100
+ "type": "module",
101
+ "label": "billing-worker",
102
+ "description": "Background job that retries failed charges.",
103
+ "source": "human",
104
+ "status": "superseded",
105
+ "superseded_by": "node-091"
106
+ }
107
+ ```
108
+
109
+ ```json
110
+ {
111
+ "id": "node-091",
112
+ "type": "module",
113
+ "label": "billing-worker",
114
+ "description": "Background job that reconciles ledger entries against the payment provider.",
115
+ "source": "ast"
116
+ }
117
+ ```
118
+
119
+ `node-042` remains in the graph, readable, and traceable to what replaced it — it is superseded, not
120
+ gone.
121
+
122
+ ---
123
+
124
+ ## Relationship to `[ARCH]` Board Tagging
125
+
126
+ Board items generated by the E20_S08 elicitation flow that populate this stub schema are tagged
127
+ `[ARCH]` (see `templates/SCRUM_BOARD_SCHEMA.md`'s "Board Item Tag Conventions" section) rather than
128
+ `[SPIKE]` — this is durable architectural-inventory record-keeping, not bounded research.
@@ -105,7 +105,9 @@ date_started:
105
105
  date_completed:
106
106
  dates_previously_completed: # comma-separated list, e.g. 2026-01-15, 2026-03-22
107
107
  reopened_on: # comma-separated list, e.g. 2026-02-01, 2026-04-10
108
- reopened_reason: # comma-separated list, e.g. "Scope expanded", "Bug found post-release"
108
+ reopened_reason: # YAML list, one entry per reopen cycle; see Reopen Tracking Fields
109
+ - "Scope expanded"
110
+ - "Bug found post-release"
109
111
  docs: [] # optional list of repo-relative documentation paths, e.g. ["README.md", "docs/API.md"]
110
112
  epic_scope_approval: false # set to true by the human operator only when any task in this epic has execution_scope: epic
111
113
  provenance: # optional; only valid value is `backfilled` (epic reverse-engineered from pre-existing code by `/uncharted onboard`). Omit for normally-authored epics.
@@ -139,7 +141,9 @@ date_started:
139
141
  date_completed:
140
142
  dates_previously_completed: # comma-separated list, e.g. 2026-01-15, 2026-03-22
141
143
  reopened_on: # comma-separated list, e.g. 2026-02-01, 2026-04-10
142
- reopened_reason: # comma-separated list, e.g. "Scope expanded", "Bug found post-release"
144
+ reopened_reason: # YAML list, one entry per reopen cycle; see Reopen Tracking Fields
145
+ - "Scope expanded"
146
+ - "Bug found post-release"
143
147
  docs: [] # optional list of repo-relative documentation paths, e.g. ["README.md", "docs/API.md"]
144
148
  crucial_level: # optional; advisory | gated | locked; absence means no elevated caution
145
149
  crucial_set_by: # required when crucial_level is set; user | scrum-master | <agent>-escalation
@@ -177,7 +181,9 @@ date_started:
177
181
  date_completed:
178
182
  dates_previously_completed: # comma-separated list, e.g. 2026-01-15, 2026-03-22
179
183
  reopened_on: # comma-separated list, e.g. 2026-02-01, 2026-04-10
180
- reopened_reason: # comma-separated list, e.g. "Scope expanded", "Bug found post-release"
184
+ reopened_reason: # YAML list, one entry per reopen cycle; see Reopen Tracking Fields
185
+ - "Scope expanded"
186
+ - "Bug found post-release"
181
187
  assigned_to: developer | tester | scrum-master
182
188
  docs: [] # optional list of repo-relative documentation paths, e.g. ["README.md", "docs/API.md"]
183
189
  execution_scope: task # task | story | epic | inline | light; omit for legacy tasks (defaults to task)
@@ -209,7 +215,7 @@ crucial_declined_note: # required when crucial_declined: true; free-te
209
215
 
210
216
  ### Runtime-written task fields
211
217
 
212
- These four fields are **not authored by hand**. They are appended to a task's frontmatter after execution and are absent from any task that has not yet run. They are listed here so that tooling — in particular `scripts/validate-board.sh` — recognises them as valid rather than unknown.
218
+ These five fields are **not authored by hand**. They are appended to a task's frontmatter after execution and are absent from any task that has not yet run. They are listed here so that tooling — in particular `scripts/validate-board.sh` — recognises them as valid rather than unknown.
213
219
 
214
220
  | Field | Written by | Meaning |
215
221
  |---|---|---|
@@ -217,8 +223,9 @@ These four fields are **not authored by hand**. They are appended to a task's fr
217
223
  | `actual_lines_delta` | `/close-story` | Net line delta for the task, from the same extraction |
218
224
  | `scope_divergence_flag` | `/close-story` | Set when actual diff stats exceed the thresholds that justified the assigned `execution_scope` |
219
225
  | `divergence_flag` | `/do` | Set to `true` by the intent-vs-diff check when a `needs_docs: false` task touched unregistered files |
226
+ | `date_deployed_prod` | `scripts/mark-deployed.sh` | ISO 8601 date (e.g. `2026-09-12`) written in the same locked write window a ticket is set to `status: Deployed to Prod`. Never written on a `Deployed to Stage`-only write. |
220
227
 
221
- All four are advisory and non-blocking — they record evidence for later review and never change a task's Passed/Failed outcome.
228
+ All five are advisory and non-blocking — they record evidence for later review and never change a task's Passed/Failed outcome. `date_deployed_prod` is allow-listed in `scripts/validate-board.sh`'s `ALLOWED_KEYS` for `epic`, `story`, and `task` (a new `DEPLOY_KEYS` group), even though in practice only tasks (and occasionally stories) are expected to ever carry it — `mark-deployed.sh` only ever writes it to a task/story board file, never to an epic.
222
229
 
223
230
  > `task_changed_files` is **not** a frontmatter field despite the similar name. It lives in the bundle manifest at `project/queue/bundle-<E##_S##>.json`, keyed by task ID.
224
231
 
@@ -228,7 +235,12 @@ All four are advisory and non-blocking — they record evidence for later review
228
235
 
229
236
  ## Reopen Tracking Fields
230
237
 
231
- **`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.
238
+ **`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. All three support multiple reopen cycles, but they are **not written the same way**:
239
+
240
+ - `dates_previously_completed` and `reopened_on` hold a plain comma-separated string, e.g. `reopened_on: 2026-02-01, 2026-04-10`. Bare dates need no quoting, so this parses fine.
241
+ - `reopened_reason` **must be a YAML list** (a block sequence, one `- "reason"` per line). It cannot be comma-separated, because reopen reasons are free text that routinely contains colons and commas and therefore has to be quoted — and a run of comma-separated quoted strings (`reopened_reason: "A", "B"`) is not valid YAML. This schema previously documented exactly that invalid form, and every board file that followed it became unparseable: the board parser skipped those files silently, so the board under-reported itself with no error surfaced anywhere. 14 files were repaired on 2026-09-13; do not reintroduce the comma-separated form here.
242
+
243
+ Note the resulting asymmetry is deliberate and load-bearing, not an oversight: the first two fields stay strings because migrating them would churn every existing file for no parsing benefit.
232
244
 
233
245
  ## Planning Fields
234
246
 
@@ -0,0 +1,8 @@
1
+ {
2
+ "_comment": "Canonical playbook output-type vocabulary for Epic E53's Playbooks v2 StepObject/output_types contract (E53_S03_T02). Extend this vocabulary by adding entries to the 'types' array below -- NEVER by code changes; skills/jenga/scripts/load-playbooks.sh references this file by name in its own header contract (see that script's 'TYPE REGISTRY' section). Governed by the Scrum Master: registry additions/changes route through the normal board-item process rather than an ungoverned edit to this file -- see docs/skill-authoring.md's 'Playbook Type Registry Governance' section for the full policy.",
3
+ "types": [
4
+ "text",
5
+ "id_list",
6
+ "file_list"
7
+ ]
8
+ }
@@ -1,22 +0,0 @@
1
- {
2
- "id": "brainstorm-to-mirror",
3
- "name": "Idea to Public Release",
4
- "description": "Takes a rough idea all the way from planning through implementation, committing, and a public mirror release -- the canonical end-to-end Jenga workflow chain.",
5
- "keywords": [
6
- "idea to release",
7
- "plan and ship",
8
- "idea to done",
9
- "full workflow",
10
- "end to end",
11
- "plan build ship",
12
- "idea to production"
13
- ],
14
- "examples": [
15
- "I have an idea, help me plan it, build it, and ship it",
16
- "take this feature from idea to committed and published",
17
- "let's go from a rough idea all the way to a public release",
18
- "plan this out, implement it, commit it, and push it to the public mirror",
19
- "walk this through the whole pipeline from brainstorm to release"
20
- ],
21
- "steps": ["brainstorm", "todo", "do", "dev-done", "mirror-public"]
22
- }