@jenga-ai/agent 1.1.0 → 1.2.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 (91) hide show
  1. package/README.md +7 -3
  2. package/agents/developer.md +82 -2
  3. package/agents/scrum-master.md +140 -21
  4. package/agents/tester.md +90 -8
  5. package/hooks/on_session_end.sh +171 -20
  6. package/package.json +1 -1
  7. package/scripts/check-permission-level.sh +107 -0
  8. package/scripts/check-publicignore-match.sh +122 -0
  9. package/scripts/check-worktree-liveness.sh +193 -0
  10. package/scripts/generate-rapport-manifest.sh +43 -0
  11. package/scripts/idea_manager.sh +47 -0
  12. package/scripts/install-worktree-commit-guard.sh +134 -0
  13. package/scripts/jenga-permission-level-switch.sh +109 -0
  14. package/scripts/smoke-harness.sh +139 -0
  15. package/scripts/validate-board.sh +62 -0
  16. package/scripts/with-lock.sh +158 -0
  17. package/scripts/worktree-remove-guard.sh +204 -0
  18. package/skills/clearify/SKILL.md +52 -0
  19. package/skills/commit/SKILL.md +13 -4
  20. package/skills/distribute/CONFIG_SCHEMA.md +60 -2
  21. package/skills/do/SKILL.md +48 -11
  22. package/skills/doc-sync/SKILL.md +16 -0
  23. package/skills/doc-sync/assets/doc_targets.md +11 -0
  24. package/skills/idea/SKILL.md +56 -0
  25. package/skills/idea/assets/idea_handoff_template.md +26 -0
  26. package/skills/idea/assets/idea_template.md +3 -0
  27. package/skills/init/SKILL.md +100 -7
  28. package/skills/init/assets/directory_structure.txt +1 -0
  29. package/skills/init/assets/workflow_template.json +1 -1
  30. package/skills/init/scripts/apply-project-visibility.sh +176 -0
  31. package/skills/init/scripts/detect-existing-codebase.sh +166 -0
  32. package/skills/init/scripts/init.sh +30 -1
  33. package/skills/jenga/SKILL.md +160 -17
  34. package/skills/jenga/scripts/board-scan.sh +238 -0
  35. package/skills/jenga/scripts/cascade-resolve.sh +297 -0
  36. package/skills/jenga/scripts/render-confirmation.sh +679 -0
  37. package/skills/jenga/scripts/render-picker.sh +439 -0
  38. package/skills/jenga/scripts/resolve-id.sh +367 -0
  39. package/skills/jenga-permission-level/SKILL.md +81 -0
  40. package/skills/proceed/SKILL.md +1 -1
  41. package/skills/publish/SKILL.md +8 -5
  42. package/skills/publish/assets/ci-contract.md +2 -2
  43. package/skills/publish/assets/ownership-matrix.md +1 -1
  44. package/skills/publish/scripts/finalize_changelog.sh +115 -0
  45. package/skills/publish/scripts/generate_release_notes.sh +475 -28
  46. package/skills/publish/scripts/npm_ci_pipeline.sh +44 -6
  47. package/skills/publish/scripts/publish_deploy.sh +38 -8
  48. package/skills/publish/scripts/run_gates.sh +2 -2
  49. package/skills/reconcile/SKILL.md +117 -5
  50. package/skills/reconcile/scripts/detect-unlinked-code.sh +741 -0
  51. package/skills/skillify/assets/init-new/assets/directory_structure.txt +5 -1
  52. package/skills/spinoff/SKILL.md +12 -7
  53. package/skills/todo/SKILL.md +2 -0
  54. package/skills/uncharted/SKILL.md +711 -0
  55. package/skills/uncharted/assets/SEGMENT_PROPOSAL_TEMPLATE.md +129 -0
  56. package/skills/uncharted/assets/UNDERSTANDING_DOC_TEMPLATE.md +160 -0
  57. package/skills/uncharted/scripts/apply-subsystem-cap.sh +573 -0
  58. package/skills/uncharted/scripts/detect-dependencies.sh +732 -0
  59. package/skills/uncharted/scripts/detect-tests.sh +553 -0
  60. package/skills/uncharted/scripts/discover-subsystems.sh +1029 -0
  61. package/skills/uncharted/scripts/enumerate-target.sh +470 -0
  62. package/skills/uncharted/scripts/import-source.sh +517 -0
  63. package/skills/uncharted/scripts/inspect-provenance.sh +573 -0
  64. package/skills/uncharted/scripts/resolve-segment-target.sh +640 -0
  65. package/skills/uncharted/scripts/run-engine.sh +655 -0
  66. package/skills/uncharted/scripts/validate-proposed-items.sh +125 -0
  67. package/skills/uncharted/scripts/write-backfilled-epics.sh +498 -0
  68. package/skills/wtf/SKILL.md +20 -0
  69. package/templates/CHANGELOG_TEMPLATE.md +13 -0
  70. package/templates/PROBLEM_RAPPORT_TEMPLATE.md +4 -1
  71. package/templates/SCRUM_BOARD_SCHEMA.md +157 -10
  72. package/templates/permission-levels/README.md +73 -0
  73. package/templates/permission-levels/level-1-locked.json +71 -0
  74. package/templates/permission-levels/level-2-guarded.json +64 -0
  75. package/templates/permission-levels/level-3-standard.json +62 -0
  76. package/templates/permission-levels/level-4-elevated.json +60 -0
  77. package/templates/permission-levels/level-5-unrestricted.json +58 -0
  78. package/skills/convert/SKILL.md +0 -124
  79. package/skills/convert/convert_cli.py +0 -235
  80. package/skills/convert/tests/sample.csv +0 -4
  81. package/skills/convert/tests/sample.json +0 -5
  82. package/skills/convert/tests/sample.jsonl +0 -3
  83. package/skills/convert/tests/sample.yaml +0 -18
  84. package/skills/convert/tests/sample_obj.csv +0 -2
  85. package/skills/convert/tests/sample_obj.json +0 -9
  86. package/skills/mirror-public/SKILL.md +0 -237
  87. package/skills/mirror-public/assets/config.json +0 -5
  88. package/skills/mirror-public/scripts/mirror.sh +0 -374
  89. package/skills/self-sync/SKILL.md +0 -73
  90. package/skills/self-sync/scripts/run.js +0 -136
  91. package/skills/strategy/SKILL.md +0 -312
@@ -1,73 +0,0 @@
1
- ---
2
- name: self-sync
3
- description: Mirror this repo's root-level framework directories into its own `.claude/` and `.agents/` sub-trees so edits to `/skills/*`, `/agents/*`, `/hooks/*`, `/scripts/*`, `/templates/*`, and `settings.json` take effect in the current Claude Code (and non-Claude) agent session — the in-repo replacement for the retired `/distribute` self-sync loop.
4
- keywords:
5
- - "self sync"
6
- - "mirror skills"
7
- - "sync .claude"
8
- - "sync .agents"
9
- - "in-repo distribute"
10
- examples:
11
- - "self-sync the mirrors"
12
- - "/self-sync --dry-run"
13
- - "refresh .claude/skills from root"
14
- ---
15
-
16
- # Self-Sync
17
-
18
- Copies the framework's root-level entries into this repo's own `.claude/` and `.agents/` mirrors so agent tooling (Claude Code, Copilot, custom) picks up local edits without reinstalling or running `/distribute`.
19
-
20
- Delegates the actual filesystem work to `lib/mirror.js`, the same helper used by `scripts/postinstall.js` on consumer installs. Two-directory mirror + delete reconciliation are the only differences from that consumer path.
21
-
22
- ## Instructions
23
-
24
- 1. If the user passed `--dry-run` (or asked for a preview), invoke:
25
- ```
26
- node skills/self-sync/scripts/run.js --dry-run
27
- ```
28
- Report the printed plan (added / overwritten / deleted) verbatim.
29
-
30
- 2. Otherwise, invoke:
31
- ```
32
- node skills/self-sync/scripts/run.js
33
- ```
34
- Report the printed summary. Do not run any inline `cp`, `rsync`, or `fs` commands — all mirroring goes through the script.
35
-
36
- 3. If the summary shows `+0 ~0 -0` on a second consecutive real run, the mirrors are already in sync — surface that as confirmation of idempotency.
37
-
38
- ## Copy Set
39
-
40
- The script mirrors exactly these root-level entries:
41
-
42
- ```
43
- bin/ lib/ scripts/ agents/ hooks/ mcp/ skills/ templates/ settings.json
44
- ```
45
-
46
- This is an **explicit constant** in `scripts/run.js`, deliberately not derived at runtime from `package.json` `files`. Two reasons:
47
-
48
- - `package.json` `files` includes `README.md` and `LICENSE`, which should not appear in the agent mirrors.
49
- - `settings.json` is required in the mirrors but is intentionally not shipped in the npm tarball, so it does not appear in `files`.
50
-
51
- The list is kept aligned with `package.json` `files` by convention. If a new top-level framework directory is added, update both.
52
-
53
- ## Invocation Model
54
-
55
- **Manual invocation only.** The user runs `/self-sync` (or `node skills/self-sync/scripts/run.js`) after making framework edits and before expecting them to be visible to the current agent session.
56
-
57
- Rationale: an on-`/commit` or file-watch trigger would fire on every edit — including drafts that shouldn't leak into the mirrors — and would obscure the write footprint (delete reconciliation prunes orphans, so accidental deletes on the source side propagate). Making the sync explicit keeps the human in the loop for a destructive-by-default operation, which matches the framework's boundary-checked, dry-runnable posture.
58
-
59
- ## Dry-Run Behavior
60
-
61
- `--dry-run` computes the full plan (added / overwritten / deleted / unchanged) via `lib/mirror.js` without touching the filesystem. Use it before every real run when the mirror state is uncertain, or when running in a repo where uncommitted mirror edits might exist.
62
-
63
- ## Safety Guarantees
64
-
65
- - **Never writes outside the repo root.** `lib/mirror.js` boundary-checks every destination path with `assertInside(destRoot, target)`; the helper throws if a resolved child escapes its destination root.
66
- - **Additive helper + explicit reconciliation.** The mirror helper is additive by default; delete reconciliation is enabled only because this skill passes `reconcileDeletes: true`.
67
- - **No shell out.** Pure Node built-ins (`node:fs`, `node:path`) — no `cp`, `rsync`, or subprocess calls.
68
- - **Idempotent.** A second consecutive run reports `+0 ~0 -0` because the byte-comparison in `filesEqual` classifies unchanged files as `skipped`.
69
-
70
- ## Guard Rails
71
-
72
- - Do not inline mirroring logic in this skill body — all filesystem work goes through `scripts/run.js` → `lib/mirror.js`.
73
- - Do not run this skill from a directory other than a checkout of the framework repo itself. `scripts/postinstall.js` handles consumer installs; this skill handles the framework's own repo.
@@ -1,136 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * skills/self-sync/scripts/run.js — In-repo mirror runner
4
- *
5
- * Mirrors this repo's root-level framework directories into its own
6
- * `.claude/` and `.agents/` sub-trees so edits to `/skills/*`, `/agents/*`,
7
- * `/hooks/*`, etc. take effect in the current Claude Code / non-Claude agent
8
- * session without a `/distribute` cycle.
9
- *
10
- * Wraps lib/mirror.js — same helper used by scripts/postinstall.js — but
11
- * with `reconcileDeletes: true` so orphans in the mirrors are pruned.
12
- *
13
- * Flags:
14
- * --dry-run Print the plan without writing.
15
- */
16
- import fs from 'node:fs';
17
- import path from 'node:path';
18
- import { fileURLToPath } from 'node:url';
19
-
20
- import { mirror } from '../../../lib/mirror.js';
21
-
22
- const __filename = fileURLToPath(import.meta.url);
23
- const __dirname = path.dirname(__filename);
24
-
25
- // Repo root is four levels up: run.js → scripts → self-sync → skills → repo
26
- const REPO_ROOT = path.resolve(__dirname, '..', '..', '..');
27
-
28
- // Explicit copy set — documented in SKILL.md.
29
- // Aligned with package.json `files`, plus `settings.json` (not shipped in
30
- // the npm tarball but required in-repo so Claude Code picks it up locally).
31
- const COPY_SET = [
32
- 'bin',
33
- 'lib',
34
- 'scripts',
35
- 'agents',
36
- 'hooks',
37
- 'mcp',
38
- 'skills',
39
- 'templates',
40
- 'settings.json',
41
- ];
42
-
43
- const DEST_ROOTS = ['.claude', '.agents'];
44
-
45
- // Basenames to skip anywhere in the walk. These are recursive mirror
46
- // artifacts, dev caches, or scm dirs that must never propagate into the
47
- // agent-visible mirror. `.agents` and `.claude` in particular can appear
48
- // nested inside `agents/` and `skills/` from legacy distribute runs.
49
- const EXCLUDE = [
50
- '.agents',
51
- '.claude',
52
- '.git',
53
- '.tmp',
54
- '.training',
55
- 'node_modules',
56
- '.DS_Store',
57
- ];
58
-
59
- function parseArgs(argv) {
60
- const dryRun = argv.includes('--dry-run');
61
- return { dryRun };
62
- }
63
-
64
- function short(p) {
65
- return path.relative(REPO_ROOT, p) || '.';
66
- }
67
-
68
- function printSection(label, items) {
69
- if (items.length === 0) return;
70
- console.log(` ${label} (${items.length}):`);
71
- for (const item of items) {
72
- console.log(` - ${short(item)}`);
73
- }
74
- }
75
-
76
- function main() {
77
- const { dryRun } = parseArgs(process.argv.slice(2));
78
-
79
- console.log('');
80
- console.log('╔══════════════════════════════════════════════════════╗');
81
- console.log(`║ /self-sync — mirror root → .claude/ + .agents/ ║`);
82
- console.log('╚══════════════════════════════════════════════════════╝');
83
- console.log(` Repo root : ${REPO_ROOT}`);
84
- console.log(` Copy set : ${COPY_SET.join(', ')}`);
85
- console.log(` Dry-run : ${dryRun ? 'YES (no writes)' : 'no'}`);
86
- console.log('');
87
-
88
- const missing = COPY_SET.filter(
89
- (entry) => !fs.existsSync(path.join(REPO_ROOT, entry))
90
- );
91
- if (missing.length > 0) {
92
- console.log(` ⚠ Missing from repo root — skipped: ${missing.join(', ')}`);
93
- console.log('');
94
- }
95
-
96
- const totals = { added: 0, overwritten: 0, deleted: 0, skipped: 0 };
97
-
98
- for (const targetRoot of DEST_ROOTS) {
99
- const destRoot = path.join(REPO_ROOT, targetRoot);
100
- console.log(`→ ${targetRoot}/`);
101
-
102
- const result = mirror({
103
- sourceRoot: REPO_ROOT,
104
- destRoot,
105
- copySet: COPY_SET,
106
- dryRun,
107
- reconcileDeletes: true,
108
- exclude: EXCLUDE,
109
- });
110
-
111
- printSection('added', result.added);
112
- printSection('overwritten', result.overwritten);
113
- printSection('deleted', result.deleted);
114
- console.log(
115
- ` summary: +${result.added.length} ~${result.overwritten.length} -${result.deleted.length} =${result.skipped.length}`
116
- );
117
- console.log('');
118
-
119
- totals.added += result.added.length;
120
- totals.overwritten += result.overwritten.length;
121
- totals.deleted += result.deleted.length;
122
- totals.skipped += result.skipped.length;
123
- }
124
-
125
- console.log('──────────────────────────────────────────────────────');
126
- console.log(
127
- ` Total: +${totals.added} added ~${totals.overwritten} overwritten -${totals.deleted} deleted =${totals.skipped} unchanged`
128
- );
129
- if (dryRun) {
130
- console.log(' (dry-run — nothing was written)');
131
- }
132
- console.log('──────────────────────────────────────────────────────');
133
- console.log('');
134
- }
135
-
136
- main();
@@ -1,312 +0,0 @@
1
- ---
2
- name: strategy
3
- description: Walk through a guided conversation to capture or update docs/STRATEGY.md — covering Vision, Value Proposition, Scope, and Target Audience — one section at a time.
4
- metadata:
5
- prefered_agent: developer
6
- keywords:
7
- - strategy
8
- - strategic brief
9
- - vision
10
- - value proposition
11
- - target audience
12
- examples:
13
- - "/strategy"
14
- - "let's capture the strategy"
15
- - "update the strategy brief"
16
- - "write the strategy doc"
17
- ---
18
-
19
- # Strategy — Guided Capture of docs/STRATEGY.md
20
-
21
- ## Entry Point
22
-
23
- Check whether `docs/STRATEGY.md` exists before proceeding.
24
-
25
- - If the file does **not** exist → run **Phase A — New Capture Flow** below.
26
- - If the file **does** exist → run **Phase B — Update Existing File** below.
27
-
28
- ---
29
-
30
- ## Phase A — New Capture Flow
31
-
32
- Walk the user through four sections in order. Ask **one focused question per section**. Do not present a list of questions up front. Wait for the user's answer before moving to the next section.
33
-
34
- ### Step 1 — Vision
35
-
36
- Ask the user exactly:
37
-
38
- > "What is the long-term direction or ambition for this project? Describe where you want it to be in 3–5 years, or what success ultimately looks like."
39
-
40
- Wait for the answer. Record it as the **Vision** content.
41
-
42
- ### Step 2 — Value Proposition
43
-
44
- Ask the user exactly:
45
-
46
- > "What makes this project uniquely valuable? What would users or teams miss most if it didn't exist?"
47
-
48
- Wait for the answer. Record it as the **Value Proposition** content.
49
-
50
- ### Step 3 — Scope: In Scope
51
-
52
- Ask the user exactly:
53
-
54
- > "What does this project explicitly cover? List the main capabilities or areas of responsibility."
55
-
56
- Wait for the answer. Record it as the **In Scope** content.
57
-
58
- ### Step 4 — Scope: Out of Scope
59
-
60
- Ask the user exactly:
61
-
62
- > "What does this project explicitly NOT cover? (Do not include revenue models, pricing, or competitive analysis — those are always out of scope.)"
63
-
64
- Wait for the answer. Record it as the **Out of Scope** content. The model must also always append to the Out of Scope section (regardless of whether the user mentions them):
65
-
66
- - Revenue model, pricing strategy, or monetisation plans
67
- - Competitive analysis or feature comparison with other tools
68
-
69
- Do not ask the user for these — include them silently.
70
-
71
- ### Step 5 — Target Audience
72
-
73
- Ask the user exactly:
74
-
75
- > "Who is this built for? Describe the primary user personas or teams."
76
-
77
- Wait for the answer. Record it as the **Target Audience** content.
78
-
79
- ---
80
-
81
- ## Pre-Write Summary and Confirmation
82
-
83
- After collecting all five pieces of content (Vision, Value Proposition, In Scope, Out of Scope, Target Audience), surface a formatted summary. Use exactly this shape:
84
-
85
- ```
86
- Here is what will be written to docs/STRATEGY.md:
87
-
88
- ## Vision
89
- <vision content>
90
-
91
- ## Value Proposition
92
- <value proposition content>
93
-
94
- ## Scope
95
-
96
- ### In Scope
97
- <in-scope content>
98
-
99
- ### Out of Scope
100
- <out-of-scope content (user answer + always-excluded items)>
101
-
102
- ## Target Audience
103
- <target audience content>
104
-
105
- ---
106
-
107
- Does this look right? Type **yes** to write `docs/STRATEGY.md`, or tell me what to change.
108
- ```
109
-
110
- - If the user says **yes** (or any clear affirmative) → proceed to the Write step.
111
- - If the user requests a change → re-ask the relevant question(s) using the same prompts from Phase A, collect the updated answer(s), then loop back to this summary step. Do not write the file until the user explicitly confirms.
112
-
113
- ---
114
-
115
- ## Write the File
116
-
117
- Generate `docs/STRATEGY.md` using **only the content collected in the conversation**. Do not invent facts, add filler text, or leave any placeholder text in the output.
118
-
119
- The file must follow this exact structure:
120
-
121
- ```markdown
122
- # Strategy Brief
123
-
124
- > **Audience:** Investors and strategic partners. This document does not include revenue models, pricing, or competitive analysis.
125
-
126
- ---
127
-
128
- ## Vision
129
-
130
- <vision content>
131
-
132
- ---
133
-
134
- ## Value Proposition
135
-
136
- <value proposition content>
137
-
138
- ---
139
-
140
- ## Scope
141
-
142
- ### In Scope
143
-
144
- <in-scope content>
145
-
146
- ### Out of Scope
147
-
148
- <out-of-scope content>
149
-
150
- ---
151
-
152
- ## Target Audience
153
-
154
- <target audience content>
155
- ```
156
-
157
- Write the file to `docs/STRATEGY.md`. After writing, print exactly:
158
-
159
- ```
160
- Written to `docs/STRATEGY.md` — captured Vision, Value Proposition, Scope, and Target Audience.
161
- ```
162
-
163
- ---
164
-
165
- ## Phase B — Update Existing File
166
-
167
- `docs/STRATEGY.md` already exists. Do **not** run the new-capture flow. Instead, walk the user through each section so they can decide what to keep and what to replace.
168
-
169
- ### Step 1 — Read the Existing File
170
-
171
- Read `docs/STRATEGY.md` in full. Parse out the content under each of the four sections:
172
-
173
- - **Vision** — content under `## Vision`
174
- - **Value Proposition** — content under `## Value Proposition`
175
- - **In Scope** — content under `### In Scope`
176
- - **Out of Scope** — content under `### Out of Scope`
177
- - **Target Audience** — content under `## Target Audience`
178
-
179
- Store these as the current values for each section. They will be used as defaults unless the user explicitly chooses to update them.
180
-
181
- ### Step 2 — Surface Each Section One at a Time
182
-
183
- Work through the sections in this order: Vision, Value Proposition, Scope (In + Out together), Target Audience.
184
-
185
- For **Vision**, present exactly:
186
-
187
- > "Here is the current Vision:
188
- >
189
- > ---
190
- > <existing vision content>
191
- > ---
192
- >
193
- > Do you want to keep this or update it? (keep / update)"
194
-
195
- - If "keep" → store the existing Vision content unchanged and move on.
196
- - If "update" → ask exactly:
197
- > "What is the long-term direction or ambition for this project? Describe where you want it to be in 3–5 years, or what success ultimately looks like."
198
- Wait for the answer. Store it as the new Vision content.
199
-
200
- For **Value Proposition**, present exactly:
201
-
202
- > "Here is the current Value Proposition:
203
- >
204
- > ---
205
- > <existing value proposition content>
206
- > ---
207
- >
208
- > Do you want to keep this or update it? (keep / update)"
209
-
210
- - If "keep" → store the existing Value Proposition content unchanged and move on.
211
- - If "update" → ask exactly:
212
- > "What makes this project uniquely valuable? What would users or teams miss most if it didn't exist?"
213
- Wait for the answer. Store it as the new Value Proposition content.
214
-
215
- For **Scope**, present the In Scope and Out of Scope content together:
216
-
217
- > "Here is the current Scope:
218
- >
219
- > **In Scope**
220
- > ---
221
- > <existing in-scope content>
222
- > ---
223
- >
224
- > **Out of Scope**
225
- > ---
226
- > <existing out-of-scope content>
227
- > ---
228
- >
229
- > Do you want to keep this or update it? (keep / update)"
230
-
231
- - If "keep" → store the existing In Scope and Out of Scope content unchanged and move on.
232
- - If "update" → ask the two focused scope questions from Phase A in sequence:
233
- 1. > "What does this project explicitly cover? List the main capabilities or areas of responsibility."
234
- Wait for the answer. Store as the new In Scope content.
235
- 2. > "What does this project explicitly NOT cover? (Do not include revenue models, pricing, or competitive analysis — those are always out of scope.)"
236
- Wait for the answer. Store as the new Out of Scope content. Silently append the always-excluded items (revenue model, pricing strategy, competitive analysis) as in Phase A — do not ask the user for these.
237
-
238
- For **Target Audience**, present exactly:
239
-
240
- > "Here is the current Target Audience:
241
- >
242
- > ---
243
- > <existing target audience content>
244
- > ---
245
- >
246
- > Do you want to keep this or update it? (keep / update)"
247
-
248
- - If "keep" → store the existing Target Audience content unchanged and move on.
249
- - If "update" → ask exactly:
250
- > "Who is this built for? Describe the primary user personas or teams."
251
- Wait for the answer. Store it as the new Target Audience content.
252
-
253
- ### Step 3 — Pre-Write Summary and Confirmation
254
-
255
- After all four sections have been decided (either kept or updated), surface a full formatted preview of the final document. Use exactly this shape:
256
-
257
- ```
258
- Here is what will be written to docs/STRATEGY.md:
259
-
260
- ## Vision
261
- <vision content>
262
-
263
- ## Value Proposition
264
- <value proposition content>
265
-
266
- ## Scope
267
-
268
- ### In Scope
269
- <in-scope content>
270
-
271
- ### Out of Scope
272
- <out-of-scope content>
273
-
274
- ## Target Audience
275
- <target audience content>
276
-
277
- ---
278
-
279
- Does this look right? Type **yes** to overwrite `docs/STRATEGY.md`, or tell me what to change.
280
- ```
281
-
282
- - If the user says **yes** (or any clear affirmative) → proceed to the Write step.
283
- - If the user requests a change → re-surface only the relevant section(s) using the same keep/update flow above, collect the updated answer(s), then loop back to this preview step. Do not write the file until the user explicitly confirms.
284
-
285
- ### Step 4 — Write the File
286
-
287
- Overwrite `docs/STRATEGY.md` using exactly the same format as Phase A output — only real content from the conversation, no placeholder text. Apply all hard constraints from the Hard Constraints block below.
288
-
289
- After writing, print exactly:
290
-
291
- ```
292
- Written to `docs/STRATEGY.md` — updated Vision, Value Proposition, Scope, and Target Audience.
293
- ```
294
-
295
- If some sections were kept unchanged and others were updated, list only the updated sections:
296
-
297
- ```
298
- Written to `docs/STRATEGY.md` — updated <list of updated sections>.
299
- ```
300
-
301
- ---
302
-
303
- ## Hard Constraints
304
-
305
- Enforce these rules throughout the entire skill session — at every step, in every question, and in the written output:
306
-
307
- 1. **Never ask about** revenue model, pricing, monetisation, competitive analysis, market positioning, financial projections, or any topic outside Vision, Value Proposition, Scope, and Target Audience.
308
- 2. **Never write the file** without receiving explicit user confirmation ("yes" or a clear affirmative) at the pre-write summary step.
309
- 3. **Never include placeholder text** in the written output. Every section must contain real content from the conversation.
310
- 4. **Never add sections** beyond the four defined ones (Vision, Value Proposition, Scope, Target Audience) and their required sub-sections.
311
- 5. **Always include** the audience callout block at the top of the written file, verbatim.
312
- 6. **Always include** the always-excluded Out of Scope items (revenue model, pricing, competitive analysis) even if the user omits them.