@jstn-sdk/ma 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,12 +7,20 @@
7
7
  <img src="https://img.shields.io/github/v/release/JustineDevs/meta-architect" alt="GitHub release">
8
8
  <img src="https://img.shields.io/badge/license-MIT-16A34A" alt="MIT License">
9
9
  </p>
10
+ <p>
11
+ <a href="https://www.buymeacoffee.com/justinedevs">
12
+ <img src="https://img.shields.io/badge/Buy%20Me%20A%20Coffee-ffdd00?style=flat-square&logo=buy-me-a-coffee&logoColor=black" alt="Buy Me A Coffee">
13
+ </a>
14
+ <a href="https://github.com/sponsors/JustineDevs">
15
+ <img src="https://img.shields.io/badge/GitHub%20Sponsors-JustineDevs-1f6feb?style=flat-square&logo=githubsponsors&logoColor=white" alt="GitHub Sponsors">
16
+ </a>
17
+ </p>
10
18
  </div>
11
19
 
12
20
  > [!IMPORTANT]
13
- > Meta-Architect `v0.1.4` is a production-grade skills line.
21
+ > Meta-Architect `v0.1.6` is a production-grade skills line.
14
22
  > It is not a lightweight demo branch.
15
- > From `v0.1.4` onward, the package is expected to ship with stable skill contracts, deterministic packaging, explicit release gates, and honest install and publish surfaces.
23
+ > From `v0.1.6` onward, the package is expected to ship with stable skill contracts, deterministic packaging, explicit release gates, and honest install and publish surfaces.
16
24
 
17
25
  ## Overview
18
26
 
@@ -29,6 +37,11 @@ It adds:
29
37
  > Meta-Architect does not replace your coding runtime.
30
38
  > It wraps that runtime with architecture, evidence, gate enforcement, and release-sensitive workflow control.
31
39
 
40
+ ## Support
41
+
42
+ - [GitHub Sponsors](https://github.com/sponsors/JustineDevs)
43
+ - [Buy Me A Coffee](https://www.buymeacoffee.com/justinedevs)
44
+
32
45
  <table>
33
46
  <tr>
34
47
  <td><strong>npm package</strong></td>
@@ -44,7 +57,7 @@ It adds:
44
57
  </tr>
45
58
  <tr>
46
59
  <td><strong>Release line</strong></td>
47
- <td><code>v0.1.4</code></td>
60
+ <td><code>v0.1.6</code></td>
48
61
  </tr>
49
62
  <tr>
50
63
  <td><strong>License</strong></td>
@@ -52,6 +65,26 @@ It adds:
52
65
  </tr>
53
66
  </table>
54
67
 
68
+ ## Screenshots
69
+
70
+ <table>
71
+ <tr>
72
+ <td><img src="./docs/assets/image/Screenshot(1).png" alt="Meta-Architect screenshot 1" width="280"></td>
73
+ <td><img src="./docs/assets/image/Screenshot(2).png" alt="Meta-Architect screenshot 2" width="280"></td>
74
+ <td><img src="./docs/assets/image/Screenshot(3).png" alt="Meta-Architect screenshot 3" width="280"></td>
75
+ </tr>
76
+ <tr>
77
+ <td><img src="./docs/assets/image/Screenshot(4).png" alt="Meta-Architect screenshot 4" width="280"></td>
78
+ <td><img src="./docs/assets/image/Screenshot(5).png" alt="Meta-Architect screenshot 5" width="280"></td>
79
+ <td><img src="./docs/assets/image/Screenshot(6).png" alt="Meta-Architect screenshot 6" width="280"></td>
80
+ </tr>
81
+ <tr>
82
+ <td><img src="./docs/assets/image/Screenshot(7).png" alt="Meta-Architect screenshot 7" width="280"></td>
83
+ <td><img src="./docs/assets/image/Screenshot(8).png" alt="Meta-Architect screenshot 8" width="280"></td>
84
+ <td><img src="./docs/assets/image/Screenshot(9).png" alt="Meta-Architect screenshot 9" width="280"></td>
85
+ </tr>
86
+ </table>
87
+
55
88
  ## Prerequisites
56
89
 
57
90
  - Node.js `>=20`
@@ -164,6 +197,10 @@ Use the same operator shape defined in [example/usage-workflow.md](./example/usa
164
197
  Quick-start prompt:
165
198
 
166
199
  ```text
200
+ $maestro
201
+
202
+ Or start directly with:
203
+
167
204
  $arch I want to build: [PROJECT IDEA]
168
205
 
169
206
  Context:
@@ -193,7 +230,7 @@ Required output:
193
230
  5. Data model and storage choices
194
231
  6. Auth/security considerations
195
232
  7. DX/UX considerations
196
- 8. Delivery plan for v0.1.4
233
+ 8. Delivery plan for v0.1.6
197
234
  9. Risks and trade-offs
198
235
  10. Decision log
199
236
  11. Exact next trigger to run after this
@@ -204,6 +241,7 @@ Required output:
204
241
  After `$arch`, continue exactly like the usage workflow:
205
242
 
206
243
  ```text
244
+ $maestro
207
245
  $sage
208
246
  $flow
209
247
  $vet
@@ -327,6 +365,7 @@ ma run '$arch'
327
365
  In-session skills are prompts you use inside the Codex conversation after launch:
328
366
 
329
367
  ```text
368
+ $maestro
330
369
  $arch
331
370
  $sage
332
371
  $flow
@@ -347,6 +386,7 @@ What `ma setup` and `ma init` do:
347
386
 
348
387
  What to use when:
349
388
  - use Codex and run the skills in-session
389
+ - use `$maestro` when you want Meta-Architect to choose the best next step for you
350
390
  - use `$arch -> $sage -> $flow -> $vet -> $vibe -> $build` inside the Codex session
351
391
  - use `ma setup` or `ma init` only when you want local scaffolding or scripted helper automation from the terminal
352
392
  - use `ma sdk-path` when you need the exact installed support-bundle path for packaged prompts, MCP files, sprint files, scripts, plugin metadata, or templates
@@ -523,7 +563,7 @@ Release automation:
523
563
  | [Plugin README](./plugins/meta-architect/README.md) | plugin distribution surface |
524
564
  | [Collaborative Whiteboard Mission](./missions/collaborative-whiteboard/mission.md) | concrete scenario walkthrough |
525
565
  | [Release Spec](./docs/release-spec.md) | release and gate policy |
526
- | [Release Readiness](./docs/qa/release-readiness-0.1.4.md) | QA evidence for the `v0.1.4` line |
566
+ | [Release Readiness](./docs/qa/release-readiness-0.1.6.md) | QA evidence for the `v0.1.6` line |
527
567
 
528
568
  ## Release Hygiene
529
569
 
package/bin/ma.js CHANGED
@@ -26,6 +26,7 @@ import {
26
26
  runFlow,
27
27
  runIdea,
28
28
  runInit,
29
+ runMaestro,
29
30
  runSage,
30
31
  runVet,
31
32
  runVibe,
@@ -41,7 +42,7 @@ function printUsage() {
41
42
  console.error(" ma skills");
42
43
  console.error(" ma sdk-path");
43
44
  console.error(" ma status");
44
- console.error(" ma run $arch|$sage|$flow|$vet|$vibe|$build");
45
+ console.error(" ma run $maestro|$arch|$sage|$flow|$vet|$vibe|$build");
45
46
  console.error(" ma merge <source-branch> <target-branch>");
46
47
  console.error(" ma release <origin-branch> <target-branch>");
47
48
  }
@@ -266,6 +267,12 @@ async function main() {
266
267
  return;
267
268
  }
268
269
 
270
+ if (command === "run" && arg === "$maestro") {
271
+ await runMaestro();
272
+ console.log("$maestro complete");
273
+ return;
274
+ }
275
+
269
276
  if (command === "run" && arg === "$build") {
270
277
  const releaseState = await loadReleaseState();
271
278
  await runBuild(releaseState);
package/docs/README.md CHANGED
@@ -17,7 +17,7 @@ Meta-Architect documentation is organized by operator task.
17
17
 
18
18
  ## QA and readiness
19
19
 
20
- - [Release Readiness 0.1.4](./qa/release-readiness-0.1.4.md)
20
+ - [Release Readiness 0.1.6](./qa/release-readiness-0.1.6.md)
21
21
 
22
22
  ## Repo structure references
23
23
 
@@ -74,7 +74,7 @@ Required output:
74
74
  5. Data model and storage choices
75
75
  6. Auth/security considerations
76
76
  7. DX/UX considerations
77
- 8. Delivery plan for v0.1.4
77
+ 8. Delivery plan for v0.1.6
78
78
  9. Risks and trade-offs
79
79
  10. Decision log
80
80
  11. Exact next trigger to run after this
@@ -163,6 +163,7 @@ ma run '$arch'
163
163
  In-session skills are prompts used after you are already inside Codex:
164
164
 
165
165
  ```text
166
+ $maestro
166
167
  $arch
167
168
  $sage
168
169
  $flow
@@ -222,6 +223,22 @@ If this fails:
222
223
 
223
224
  ## 7. Run the helper skill sequence
224
225
 
226
+ ### 5.0 Workflow manager
227
+
228
+ ```bash
229
+ ma run '$maestro'
230
+ ```
231
+
232
+ Expected effects:
233
+ - reads the current gate state
234
+ - recommends the best next step
235
+ - writes `.ma/plans/maestro.md`
236
+ - records an advisory decision entry
237
+
238
+ Generated or updated:
239
+ - `.ma/decisions.json`
240
+ - `.ma/plans/maestro.md`
241
+
225
242
  ### 5.1 Architecture
226
243
 
227
244
  ```bash
@@ -1,25 +1,25 @@
1
- # Release Readiness 0.1.4
1
+ # Release Readiness 0.1.5
2
2
 
3
3
  ## Production bar
4
4
 
5
- `v0.1.4` is treated as production only when:
5
+ `v0.1.5` is treated as production only when:
6
6
  - the package installs cleanly from the canonical public install command
7
7
  - the Codex-hosted runtime path works end to end
8
8
  - the helper flow remains valid for scripted verification
9
- - release docs, package metadata, and workflows all agree on `0.1.4`
9
+ - release docs, package metadata, and workflows all agree on `0.1.5`
10
10
 
11
11
  Target release state:
12
- - npm package: `@jstn-sdk/ma@0.1.4`
12
+ - npm package: `@jstn-sdk/ma@0.1.5`
13
13
  - npm registry state: pending publish
14
- - publishability note: `0.1.3` is already published, so `0.1.4` is the next publishable package line
15
- - git tag: `v0.1.4`
16
- - GitHub release: pending publish for `v0.1.4`
14
+ - publishability note: `0.1.4` is already published, so `0.1.5` is the next publishable package line
15
+ - git tag: `v0.1.5`
16
+ - GitHub release: pending publish for `v0.1.5`
17
17
 
18
18
  ## Production checklist
19
19
 
20
20
  - skills-first product identity: PASS
21
21
  - package/plugin identity aligned to `@jstn-sdk/ma`: PASS
22
- - version/tag alignment `0.1.4` / `v0.1.4`: PASS
22
+ - version/tag alignment `0.1.5` / `v0.1.5`: PASS
23
23
  - install/uninstall docs aligned: PASS
24
24
  - onboarding is concise and sequential: PASS
25
25
  - helper command documented as secondary: PASS
@@ -0,0 +1,79 @@
1
+ # Release Readiness 0.1.6
2
+
3
+ ## Production bar
4
+
5
+ `v0.1.6` is treated as production only when:
6
+ - the package installs cleanly from the canonical public install command
7
+ - the Codex-hosted runtime path works end to end
8
+ - the helper flow remains valid for scripted verification
9
+ - release docs, package metadata, and workflows all agree on `0.1.6`
10
+
11
+ Target release state:
12
+ - npm package: `@jstn-sdk/ma@0.1.6`
13
+ - npm registry state: pending publish
14
+ - publishability note: `0.1.5` is already published, so `0.1.6` is the next publishable package line
15
+ - git tag: `v0.1.6`
16
+ - GitHub release: pending publish for `v0.1.6`
17
+
18
+ ## Production checklist
19
+
20
+ - skills-first product identity: PASS
21
+ - package/plugin identity aligned to `@jstn-sdk/ma`: PASS
22
+ - version/tag alignment `0.1.6` / `v0.1.6`: PASS
23
+ - install/uninstall docs aligned: PASS
24
+ - onboarding is concise and sequential: PASS
25
+ - helper command documented as secondary: PASS
26
+ - skills/prompts/manifests aligned: PASS
27
+ - packaging includes required assets: PASS
28
+ - tests pass: PASS
29
+ - package dry-run passes: PASS
30
+ - installed-package behavior passes: PASS
31
+ - workflow/release/provenance docs aligned: PASS
32
+ - no stale package names remain in tracked repo surfaces: PASS
33
+ - no conflicting CLI-first product story remains in tracked product docs: PASS
34
+
35
+ ## Automated checks run
36
+
37
+ ```bash
38
+ npm run release:check
39
+ ```
40
+
41
+ That must cover:
42
+ - skills manifest generation
43
+ - skill validation
44
+ - skill bundle packaging
45
+ - repo checks
46
+ - automated tests
47
+ - npm package dry-run inspection
48
+
49
+ ## Manual/behavioral checks run
50
+
51
+ Canonical launch:
52
+
53
+ ```bash
54
+ ma --madmax --high
55
+ ```
56
+
57
+ Helper-path validation:
58
+
59
+ ```bash
60
+ ma setup
61
+ ma idea "Build a demo app"
62
+ ma run '$arch'
63
+ ma run '$sage'
64
+ ma run '$flow'
65
+ ma run '$vet'
66
+ ma run '$vibe'
67
+ ma status
68
+ ma run '$build'
69
+ ```
70
+
71
+ Expected evidence:
72
+ - `.ma/release.json` remains the source of truth
73
+ - `.ma/decisions.json` records the helper-path activity
74
+ - `$build` stays blocked until upstream gates are green, then becomes ready
75
+
76
+ ## Known limitations
77
+
78
+ - interactive Codex conversation quality depends on the installed Codex host
79
+ - release publication still depends on npm ownership/authorization for the target package name
@@ -1,13 +1,13 @@
1
- # v0.1.4 Requirements & Rules
1
+ # v0.1.6 Requirements & Rules
2
2
 
3
3
  ## Production definition
4
4
 
5
- Meta-Architect `v0.1.4` is production only when:
5
+ Meta-Architect `v0.1.6` is production only when:
6
6
  1. the package/install surface works
7
7
  2. the in-session skill workflow from `$arch` through `$build` works
8
8
  3. the release evidence matches the actual package and git tag
9
9
 
10
- ## What `v0.1.4` must have
10
+ ## What `v0.1.6` must have
11
11
 
12
12
  ### 1. Canonical package/runtime path
13
13
 
@@ -49,11 +49,11 @@ Canonical state files:
49
49
 
50
50
  ### 4. Required release evidence
51
51
 
52
- - `package.json` version `0.1.4`
53
- - git tag `v0.1.4`
52
+ - `package.json` version `0.1.6`
53
+ - git tag `v0.1.6`
54
54
  - `RELEASE.md`
55
55
  - `CHANGELOG.md`
56
- - `docs/qa/release-readiness-0.1.4.md`
56
+ - `docs/qa/release-readiness-0.1.6.md`
57
57
  - green `npm run release:check`
58
58
 
59
59
  ### 5. Dist-tag discipline
package/docs/skills.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Skills
2
2
 
3
3
  Meta-Architect’s canonical Codex runtime surface is:
4
+ - `$maestro`
4
5
  - `$arch`
5
6
  - `$sage`
6
7
  - `$flow`
@@ -27,8 +28,9 @@ npm uninstall -g @jstn-sdk/ma @openai/codex
27
28
  ```
28
29
 
29
30
  Then inside the Codex session:
30
- 1. Start with the structured `$arch` prompt
31
- 2. Continue through `$sage -> $flow -> $vet -> $vibe -> $build`
31
+ 1. Start with `$maestro` when you want Meta-Architect to choose the best next step
32
+ 2. Or start with `$arch` when you already know the architecture lane is next
33
+ 3. Continue through `$sage -> $flow -> $vet -> $vibe -> $build`
32
34
 
33
35
  ## Simple difference
34
36
 
@@ -50,6 +52,7 @@ ma run '$arch'
50
52
  In-session skills are used inside the Codex conversation:
51
53
 
52
54
  ```text
55
+ $maestro
53
56
  $arch
54
57
  $sage
55
58
  $flow
@@ -106,6 +109,7 @@ Every skill result must include:
106
109
 
107
110
  ## Status ownership
108
111
 
112
+ - `$maestro` -> next-step recommendation
109
113
  - project brief -> architecture input
110
114
  - `$arch` -> `architecture_status`
111
115
  - `$sage` -> `evidence_status`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jstn-sdk/ma",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Codex-native skills system for architecture, evidence, review, and gated build guidance.",
5
5
  "license": "MIT",
6
6
  "author": "JustineDevs",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "meta-architect",
3
3
  "displayName": "Meta-Architect",
4
- "version": "0.1.4",
4
+ "version": "0.1.6",
5
5
  "description": "Programmatic architecture and verified engineering skills for Codex-native workflows.",
6
6
  "entry": "./README.md",
7
7
  "skillsDir": "./skills"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "meta-architect",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Skills-first workflow layer for Codex with architecture, evidence, review, and gated build guidance.",
5
5
  "author": {
6
6
  "name": "JustineDevs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "meta-architect",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "collections": [
5
5
  "sindresorhus/awesome",
6
6
  "dzharii/awesome-typescript",
@@ -105,7 +105,7 @@ When consuming the plugin:
105
105
  The plugin version should track the release scope of the core repo.
106
106
 
107
107
  For this repository:
108
- - plugin scope is aligned to Meta-Architect `v0.1.4`
108
+ - plugin scope is aligned to Meta-Architect `v0.1.6`
109
109
  - any breaking contract change should be versioned intentionally
110
110
 
111
111
  The plugin is one distribution surface of the same product, not a separate product line.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: maestro
3
+ description: "Use when the user wants Meta-Architect to choose the best next workflow step, explain why, and recommend the right lane or assignment."
4
+ ---
5
+
6
+ # Maestro
7
+
8
+ Use this skill inside Codex when you want Meta-Architect to act like a workflow manager.
9
+
10
+ ## Output
11
+
12
+ Produce:
13
+ - current situation summary
14
+ - best next step
15
+ - why that step is next
16
+ - recommended lane or assignment
17
+ - what to avoid doing yet
18
+ - exact next trigger, command, or handoff
19
+
20
+ ## Rules
21
+
22
+ - Prefer the smallest next step that moves the workflow forward safely.
23
+ - Respect current gate state before recommending implementation or release work.
24
+ - Be explicit when more evidence, planning, or validation is still needed.
25
+ - Route to the in-session skill flow first; use helper commands only when they are the clearest support path.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "$maestro"
3
+ short_description: "Best next step and lane orchestration"
4
+ default_prompt: "Use $maestro to inspect the current Meta-Architect workflow state, choose the best next step, explain why it is next, and recommend the right lane or assignment."
@@ -25,6 +25,7 @@ async function copyDir(src, dest) {
25
25
  await copyDir(srcPath, destPath);
26
26
  } else {
27
27
  await fs.copyFile(srcPath, destPath);
28
+ await fs.chmod(destPath, 0o644);
28
29
  }
29
30
  }
30
31
  }
package/skills/index.json CHANGED
@@ -16,6 +16,11 @@
16
16
  "path": "skills/flow",
17
17
  "description": "Use when the user wants logic validation: states, transitions, invariants, edge cases, dead ends, and blockers before implementation."
18
18
  },
19
+ {
20
+ "name": "maestro",
21
+ "path": "skills/maestro",
22
+ "description": "Use when the user wants Meta-Architect to choose the best next workflow step, explain why, and recommend the right lane or assignment."
23
+ },
19
24
  {
20
25
  "name": "meta-architect",
21
26
  "path": "skills/meta-architect",
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: maestro
3
+ description: "Use when the user wants Meta-Architect to choose the best next workflow step, explain why, and recommend the right lane or assignment."
4
+ ---
5
+
6
+ # Maestro
7
+
8
+ Use this skill inside Codex when you want Meta-Architect to act like a workflow manager.
9
+
10
+ ## Output
11
+
12
+ Produce:
13
+ - current situation summary
14
+ - best next step
15
+ - why that step is next
16
+ - recommended lane or assignment
17
+ - what to avoid doing yet
18
+ - exact next trigger, command, or handoff
19
+
20
+ ## Rules
21
+
22
+ - Prefer the smallest next step that moves the workflow forward safely.
23
+ - Respect current gate state before recommending implementation or release work.
24
+ - Be explicit when more evidence, planning, or validation is still needed.
25
+ - Route to the in-session skill flow first; use helper commands only when they are the clearest support path.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "$maestro"
3
+ short_description: "Best next step and lane orchestration"
4
+ default_prompt: "Use $maestro to inspect the current Meta-Architect workflow state, choose the best next step, explain why it is next, and recommend the right lane or assignment."
@@ -38,7 +38,7 @@ export class McpSseClient {
38
38
  capabilities: {},
39
39
  clientInfo: {
40
40
  name: "meta-architect",
41
- version: "0.1.4",
41
+ version: "0.1.6",
42
42
  },
43
43
  });
44
44
 
@@ -196,6 +196,50 @@ function renderImplementationPlan({ idea, blueprint }) {
196
196
  ].join("\n");
197
197
  }
198
198
 
199
+ function renderMaestroPlan({ releaseState, recommendation }) {
200
+ return [
201
+ "# Maestro Plan",
202
+ "",
203
+ `Updated: ${new Date().toISOString()}`,
204
+ "",
205
+ "## Current Gate State",
206
+ "",
207
+ `- idea: ${releaseState.idea_status}`,
208
+ `- architecture: ${releaseState.architecture_status}`,
209
+ `- evidence: ${releaseState.evidence_status}`,
210
+ `- logic: ${releaseState.logic_status}`,
211
+ `- security: ${releaseState.security_status}`,
212
+ `- experience: ${releaseState.experience_status}`,
213
+ `- build: ${releaseState.build_status}`,
214
+ "",
215
+ "## Best Next Step",
216
+ "",
217
+ recommendation.nextStep,
218
+ "",
219
+ "## Why This Is Next",
220
+ "",
221
+ recommendation.why,
222
+ "",
223
+ "## Recommended Lane",
224
+ "",
225
+ `- primary: ${recommendation.primaryLane}`,
226
+ `- support: ${recommendation.supportLane}`,
227
+ "",
228
+ "## Suggested Assignment",
229
+ "",
230
+ ...recommendation.assignments.map((item) => `- ${item}`),
231
+ "",
232
+ "## Avoid For Now",
233
+ "",
234
+ ...recommendation.avoid.map((item) => `- ${item}`),
235
+ "",
236
+ "## Exact Next Trigger",
237
+ "",
238
+ recommendation.nextTrigger,
239
+ "",
240
+ ].join("\n");
241
+ }
242
+
199
243
  function renderBuildPlan({ allowed, blockers, nextTriggers, suggestedBranches = [] }) {
200
244
  const lines = [
201
245
  "# Build Plan",
@@ -361,3 +405,7 @@ export async function writeBuildPlanArtifact({
361
405
  renderBuildPlan({ allowed, blockers, nextTriggers, suggestedBranches }),
362
406
  );
363
407
  }
408
+
409
+ export async function writeMaestroPlan({ releaseState, recommendation }) {
410
+ await writeArtifact("plans/maestro.md", renderMaestroPlan({ releaseState, recommendation }));
411
+ }
package/src/skills.js CHANGED
@@ -11,13 +11,16 @@ import {
11
11
  writeEvidenceSpec,
12
12
  writeExperienceSpec,
13
13
  writeLogicSpec,
14
+ writeMaestroPlan,
14
15
  writeProjectContext,
15
16
  writeSecuritySpec,
16
17
  } from "./runtime-artifacts.js";
17
18
  import { syncStatusUpdates } from "./state-sync.js";
18
19
 
19
- const skillNames = ["$arch", "$sage", "$flow", "$vet", "$vibe", "$build"];
20
+ const skillNames = ["$maestro", "$arch", "$sage", "$flow", "$vet", "$vibe", "$build"];
20
21
  const workflowTemplates = {
22
+ "maestro.skill.md":
23
+ "# `$maestro`\n\nChooses the best next workflow step and recommends the right lane or assignment.\n",
21
24
  "arch.skill.md":
22
25
  "# `$arch`\n\nProduces blueprint architecture, stack rationale, subsystem design, and tradeoffs.\n",
23
26
  "sage.skill.md":
@@ -35,6 +38,150 @@ export function listSkills() {
35
38
  return skillNames;
36
39
  }
37
40
 
41
+ function chooseMaestroRecommendation(releaseState, idea) {
42
+ if (releaseState.idea_status !== "CLEAR") {
43
+ return {
44
+ nextStep: "Capture or refine the project brief before any design or validation lane starts.",
45
+ why: "The workflow still needs a concrete brief before architecture or build decisions can be trusted.",
46
+ primaryLane: "brief capture",
47
+ supportLane: "none",
48
+ assignments: ['Use `ma idea "..."` or provide the brief before running in-session skills.'],
49
+ avoid: ["Do not start architecture or implementation yet."],
50
+ nextTrigger: "`ma idea`",
51
+ };
52
+ }
53
+
54
+ if (releaseState.architecture_status !== "APPROVED") {
55
+ return {
56
+ nextStep: "Run the architecture lane first.",
57
+ why: "The brief exists, but the workflow still needs a concrete architecture before later gates can be trusted.",
58
+ primaryLane: "$arch",
59
+ supportLane: "$sage",
60
+ assignments: [
61
+ `Use $arch to shape the current brief${idea ? ` for: ${idea}` : ""}.`,
62
+ "After approval, move into $sage for source-backed stack validation.",
63
+ ],
64
+ avoid: ["Do not jump to build or release work yet."],
65
+ nextTrigger: "`$arch`",
66
+ };
67
+ }
68
+
69
+ if (releaseState.evidence_status !== "VERIFIED") {
70
+ return {
71
+ nextStep: "Validate the architecture against approved sources.",
72
+ why: "The architecture exists, but the evidence gate is not yet fully verified.",
73
+ primaryLane: "$sage",
74
+ supportLane: "$flow",
75
+ assignments: [
76
+ "Run $sage using the current architecture as the probe basis.",
77
+ "Prepare to hand off to $flow after evidence is verified.",
78
+ ],
79
+ avoid: ["Do not treat stack choices as settled yet."],
80
+ nextTrigger: "`$sage`",
81
+ };
82
+ }
83
+
84
+ if (releaseState.logic_status !== "GREEN") {
85
+ return {
86
+ nextStep: "Validate system behavior and state transitions.",
87
+ why: "Logic is the next unresolved gate before implementation readiness can be claimed.",
88
+ primaryLane: "$flow",
89
+ supportLane: "$vet",
90
+ assignments: [
91
+ "Run $flow to map actors, states, transitions, and blockers.",
92
+ "Queue $vet after the logic lane confirms behavior is sound.",
93
+ ],
94
+ avoid: ["Do not merge or release yet."],
95
+ nextTrigger: "`$flow`",
96
+ };
97
+ }
98
+
99
+ if (releaseState.security_status !== "GREEN") {
100
+ return {
101
+ nextStep: "Run the security and trust-boundary review.",
102
+ why: "Security is the next unresolved gate before the workflow can unlock implementation readiness.",
103
+ primaryLane: "$vet",
104
+ supportLane: "$vibe",
105
+ assignments: [
106
+ "Run $vet to capture trust boundaries, abuse cases, and mitigations.",
107
+ "Move to $vibe once security is green.",
108
+ ],
109
+ avoid: ["Do not unlock implementation readiness before security review."],
110
+ nextTrigger: "`$vet`",
111
+ };
112
+ }
113
+
114
+ if (!["GREEN", "WAIVED"].includes(releaseState.experience_status)) {
115
+ return {
116
+ nextStep: "Review workflow clarity and friction before build unlock.",
117
+ why: "The experience lane is the final quality gate before the build decision.",
118
+ primaryLane: "$vibe",
119
+ supportLane: "$build",
120
+ assignments: [
121
+ "Run $vibe to capture onboarding and operability friction.",
122
+ "Move to $build only after experience is green or intentionally waived.",
123
+ ],
124
+ avoid: ["Do not start release promotion yet."],
125
+ nextTrigger: "`$vibe`",
126
+ };
127
+ }
128
+
129
+ if (releaseState.build_status === "LOCKED") {
130
+ return {
131
+ nextStep: "Unlock bounded implementation planning.",
132
+ why: "All upstream quality gates are green, so the workflow can now evaluate build readiness.",
133
+ primaryLane: "$build",
134
+ supportLane: "implementation",
135
+ assignments: [
136
+ "Run $build to get the current build-readiness verdict.",
137
+ "Use the resulting narrow build slice as the next execution assignment.",
138
+ ],
139
+ avoid: ["Do not release directly from a task branch."],
140
+ nextTrigger: "`$build`",
141
+ };
142
+ }
143
+
144
+ if (releaseState.merge_status !== "MERGED_TO_DEVELOPMENT") {
145
+ return {
146
+ nextStep: "Finish the implementation slice and merge it into development.",
147
+ why: "The build gate is ready or done, but the branch promotion path has not completed yet.",
148
+ primaryLane: "implementation",
149
+ supportLane: "merge",
150
+ assignments: [
151
+ "Use the current build plan to finish the smallest viable implementation slice.",
152
+ "When ready, merge feature work into development with `ma merge`.",
153
+ ],
154
+ avoid: ["Do not promote directly to prod."],
155
+ nextTrigger: "`ma merge <feature/*> development`",
156
+ };
157
+ }
158
+
159
+ if (releaseState.release_status !== "SHIPPED_TO_PROD") {
160
+ return {
161
+ nextStep: "Promote the approved release line to prod.",
162
+ why: "Implementation and merge gates are complete, so the remaining step is the controlled release promotion.",
163
+ primaryLane: "release",
164
+ supportLane: "verification",
165
+ assignments: [
166
+ "Verify the origin branch is development or an approved release branch.",
167
+ "Run `ma release <origin> prod` when the line is ready.",
168
+ ],
169
+ avoid: ["Do not reopen earlier gates unless a new blocker appears."],
170
+ nextTrigger: "`ma release <development|release/*> prod`",
171
+ };
172
+ }
173
+
174
+ return {
175
+ nextStep: "The workflow is already at the terminal release state.",
176
+ why: "All gates, merge, and release states are complete.",
177
+ primaryLane: "done",
178
+ supportLane: "verification",
179
+ assignments: ["Confirm final release evidence and start a new brief for the next cycle."],
180
+ avoid: ["Do not rerun build or release steps without a new task."],
181
+ nextTrigger: "`ma idea` or `$arch` for the next task",
182
+ };
183
+ }
184
+
38
185
  async function readIdeaText() {
39
186
  const decisions = await readJson(getRuntimeReadPath("decisions.json"));
40
187
  const ideaDecision = [...decisions.decisions].reverse().find((entry) => entry.kind === "idea");
@@ -262,6 +409,23 @@ export async function runVibe() {
262
409
  await syncStatusUpdates({ experience_status: "GREEN" });
263
410
  }
264
411
 
412
+ export async function runMaestro() {
413
+ const releaseState = await readJson(getRuntimeReadPath("release.json"));
414
+ const idea = await readIdeaText();
415
+ const recommendation = chooseMaestroRecommendation(releaseState, idea);
416
+
417
+ await writeMaestroPlan({ releaseState, recommendation });
418
+ await appendDecision({
419
+ kind: "skill",
420
+ skill: "$maestro",
421
+ decision: "Recommended the next workflow step and assignment lane",
422
+ status: "ADVISORY",
423
+ evidence: [recommendation],
424
+ blockers: [],
425
+ next_allowed_triggers: [recommendation.nextTrigger.replaceAll("`", "")],
426
+ });
427
+ }
428
+
265
429
  export async function runInit() {
266
430
  const created = [];
267
431
  const targets = [
@@ -344,8 +508,8 @@ export async function runInit() {
344
508
  path.join(getRepoRoot(), "docs", "release-spec.md"),
345
509
  ],
346
510
  [
347
- path.join(packageRoot, "docs", "qa", "release-readiness-0.1.4.md"),
348
- path.join(getRepoRoot(), "docs", "qa", "release-readiness-0.1.4.md"),
511
+ path.join(packageRoot, "docs", "qa", "release-readiness-0.1.6.md"),
512
+ path.join(getRepoRoot(), "docs", "qa", "release-readiness-0.1.6.md"),
349
513
  ],
350
514
  ];
351
515