@jstn-sdk/ma 0.1.12 → 0.14.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 (198) hide show
  1. package/.codex/agents/Architect.toml +1 -2
  2. package/.codex/agents/Auditor.toml +1 -2
  3. package/.codex/agents/Builder.toml +1 -2
  4. package/.codex/agents/Flow.toml +1 -2
  5. package/.codex/agents/Sage.toml +1 -2
  6. package/.codex/agents/Vibe.toml +1 -2
  7. package/.codex/hooks.json +24 -13
  8. package/.codex/prompts/enforcement.md +4 -0
  9. package/.codex/prompts/onboarding.md +6 -1
  10. package/.codex/prompts/release-rules.md +0 -0
  11. package/.codex/prompts/skill-contract.md +4 -0
  12. package/COVERAGE.md +211 -0
  13. package/DEMO.md +274 -0
  14. package/LICENSE +0 -0
  15. package/README.md +132 -656
  16. package/bin/ma.js +748 -55
  17. package/data/clone-data.ledger.json +41 -0
  18. package/data/clone-data.proof.json +50 -0
  19. package/data/clone-data.rvf +37 -0
  20. package/docs/README.md +10 -1
  21. package/docs/autonomous-tasks.md +46 -0
  22. package/docs/codex-integration.md +16 -0
  23. package/docs/getting-started.md +62 -22
  24. package/docs/mcp-setup.md +64 -0
  25. package/docs/qa/release-issue-gates-0.14.0.json +644 -0
  26. package/docs/qa/release-readiness-0.1.5.md +1 -1
  27. package/docs/qa/{release-readiness-0.1.12.md → release-readiness-0.14.0.md} +25 -9
  28. package/docs/quality.md +24 -0
  29. package/docs/reference/native-security-playbooks.md +6 -0
  30. package/docs/reference/native-source-selection.md +6 -0
  31. package/docs/release-spec.md +39 -10
  32. package/docs/skills.md +14 -1
  33. package/index.js +295 -2
  34. package/mcp/collections.json +23 -6
  35. package/mcp/fallback.json +0 -0
  36. package/mcp/local/code-intel.js +179 -41
  37. package/mcp/local/context.js +180 -0
  38. package/mcp/local/memory.js +17 -6
  39. package/mcp/local/quality.js +39 -0
  40. package/mcp/local/state.js +7 -3
  41. package/mcp/local/team-run.js +56 -4
  42. package/mcp/local-capabilities.json +9 -0
  43. package/mcp/servers.json +24 -0
  44. package/package.json +29 -4
  45. package/plugins/meta-architect/.app.json +1 -1
  46. package/plugins/meta-architect/.codex-plugin/plugin.json +1 -1
  47. package/plugins/meta-architect/.mcp.json +1 -1
  48. package/plugins/meta-architect/README.md +8 -1
  49. package/plugins/meta-architect/obsidian/main.js +534 -0
  50. package/plugins/meta-architect/obsidian/manifest.json +9 -0
  51. package/plugins/meta-architect/obsidian/styles.css +7 -0
  52. package/plugins/meta-architect/skills/arch/SKILL.md +2 -0
  53. package/plugins/meta-architect/skills/build/SKILL.md +3 -0
  54. package/plugins/meta-architect/skills/flow/SKILL.md +2 -0
  55. package/plugins/meta-architect/skills/sage/SKILL.md +2 -0
  56. package/plugins/meta-architect/skills/sage/references/source-selection.md +8 -0
  57. package/plugins/meta-architect/skills/vet/SKILL.md +2 -0
  58. package/plugins/meta-architect/skills/vet/references/security-playbooks.md +7 -0
  59. package/plugins/meta-architect/skills/vibe/SKILL.md +2 -0
  60. package/schemas/autonomous-task-queue.schema.json +56 -0
  61. package/schemas/handoff-packet.schema.json +36 -0
  62. package/schemas/setup-receipt.schema.json +28 -0
  63. package/schemas/skill-frontmatter.schema.json +20 -0
  64. package/schemas/support-bundle.schema.json +37 -0
  65. package/schemas/task-contract.schema.json +31 -0
  66. package/scripts/active-autonomy-hook.mjs +226 -0
  67. package/scripts/build-linux-packages.mjs +7 -3
  68. package/scripts/cleanup-test-fixtures.sh +55 -0
  69. package/scripts/context-hydration-hook.mjs +89 -0
  70. package/scripts/demo-smoke.js +285 -0
  71. package/scripts/doctor.js +27 -12
  72. package/scripts/install.sh +57 -0
  73. package/scripts/install.sh.sha256 +1 -0
  74. package/scripts/linux-package-smoke.mjs +2 -2
  75. package/scripts/package-size-check.mjs +26 -0
  76. package/scripts/plugin-sync.js +83 -17
  77. package/scripts/postinstall.js +17 -10
  78. package/scripts/prepack.js +9 -0
  79. package/scripts/ralph/prompt.md +35 -0
  80. package/scripts/release-sync.js +72 -7
  81. package/scripts/release-verify.js +260 -2
  82. package/scripts/setup-npmrc.js +48 -23
  83. package/scripts/skills-install.js +9 -2
  84. package/scripts/skills-manifest.js +2 -21
  85. package/scripts/skills-pack.js +2 -2
  86. package/scripts/skills-validate.js +5 -55
  87. package/skills/arch/SKILL.md +2 -0
  88. package/skills/build/SKILL.md +3 -0
  89. package/skills/flow/SKILL.md +2 -0
  90. package/skills/index.json +0 -0
  91. package/skills/sage/SKILL.md +2 -0
  92. package/skills/sage/references/source-selection.md +8 -0
  93. package/skills/vet/SKILL.md +2 -0
  94. package/skills/vet/references/security-playbooks.md +7 -0
  95. package/skills/vibe/SKILL.md +2 -0
  96. package/sprint/00-idea.md +0 -0
  97. package/sprint/01-architecture.md +0 -0
  98. package/sprint/02-oss-evidence.md +0 -0
  99. package/sprint/03-logic.md +0 -0
  100. package/sprint/04-security.md +0 -0
  101. package/sprint/05-dx-ux.md +0 -0
  102. package/sprint/06-build-plan.md +0 -0
  103. package/sprint/07-release.md +0 -0
  104. package/src/agents.js +279 -0
  105. package/src/bootstrap.js +268 -62
  106. package/src/build-gate.js +2 -2
  107. package/src/codex-app-server.js +291 -0
  108. package/src/decision-log.js +0 -0
  109. package/src/fs-utils.js +175 -4
  110. package/src/launcher.js +28 -21
  111. package/src/mcp-config.js +9 -1
  112. package/src/mcp-live-client.js +422 -3
  113. package/src/paths.js +10 -1
  114. package/src/policy.js +3 -3
  115. package/src/prelaunch.js +189 -0
  116. package/src/quality/ai-quality-orchestrator.js +328 -0
  117. package/src/release-issue-gates.js +252 -0
  118. package/src/release-operations.js +62 -0
  119. package/src/release-state.js +0 -0
  120. package/src/runtime/active-autonomy-core.js +208 -0
  121. package/src/runtime/agent-compat.js +31 -0
  122. package/src/runtime/alignment-sentinel.js +165 -0
  123. package/src/runtime/architect-review.js +326 -0
  124. package/src/runtime/autonomous-tasks.js +408 -0
  125. package/src/runtime/build-readiness.js +28 -4
  126. package/src/runtime/code-graph-rehearse.js +113 -0
  127. package/src/runtime/codeburn-core.js +112 -0
  128. package/src/runtime/context-authority.js +40 -0
  129. package/src/runtime/context-economy-core.js +316 -0
  130. package/src/runtime/continuity-graph.js +201 -0
  131. package/src/runtime/continuity-notes.js +71 -26
  132. package/src/runtime/core-source-ingest.js +379 -0
  133. package/src/runtime/detached-provider.js +142 -0
  134. package/src/runtime/doctor-report.js +18 -0
  135. package/src/runtime/environment-awareness-core.js +460 -0
  136. package/src/runtime/exposure-catalog.js +276 -0
  137. package/src/runtime/graphify-core.js +167 -0
  138. package/src/runtime/guidance-stack.js +9 -2
  139. package/src/runtime/handoff-packets.js +92 -0
  140. package/src/runtime/headroom-core.js +104 -0
  141. package/src/runtime/helper-orchestration-core.js +307 -0
  142. package/src/runtime/hook-profiles.js +20 -0
  143. package/src/runtime/learning-loop-core.js +344 -0
  144. package/src/runtime/live-agent-verification.js +122 -0
  145. package/src/runtime/maestro-events.js +18 -0
  146. package/src/runtime/maestro-manager.js +19 -0
  147. package/src/runtime/maestro-output.js +58 -0
  148. package/src/runtime/maestro-state.js +125 -0
  149. package/src/runtime/managed-markdown.js +29 -0
  150. package/src/runtime/mcp-authority.js +147 -0
  151. package/src/runtime/mcp-policy.js +192 -0
  152. package/src/runtime/obsidian-integration-core.js +1089 -0
  153. package/src/runtime/obsidian-plugin-bridge.js +1045 -0
  154. package/src/runtime/pi-maestro-core.js +89 -0
  155. package/src/runtime/preferences.js +79 -0
  156. package/src/runtime/project-context.js +636 -0
  157. package/src/runtime/prompt-strategy-core.js +230 -0
  158. package/src/runtime/quorum-review.js +90 -0
  159. package/src/runtime/ralph-execution-core.js +217 -0
  160. package/src/runtime/redaction-gateway.js +373 -0
  161. package/src/runtime/runtime-state.js +935 -2
  162. package/src/runtime/schema-migrations.js +162 -0
  163. package/src/runtime/semantic-recording-core.js +147 -0
  164. package/src/runtime/signal-hooks.js +28 -0
  165. package/src/runtime/skills-registry-export.js +754 -0
  166. package/src/runtime/task-contracts.js +83 -0
  167. package/src/runtime/universal-plugin-broker-core.js +898 -0
  168. package/src/runtime/workspace-intelligence-runtime.js +674 -0
  169. package/src/runtime/workspace-virtualizer.js +102 -0
  170. package/src/runtime-artifacts.js +225 -62
  171. package/src/setup-lifecycle.js +359 -0
  172. package/src/skill-frontmatter.js +78 -0
  173. package/src/skill-installer.js +226 -71
  174. package/src/skills.js +1166 -96
  175. package/src/state-sync.js +0 -0
  176. package/src/test-fixtures.js +543 -0
  177. package/src/tui/grid.js +67 -0
  178. package/src/tui/status-grid.js +23 -0
  179. package/support-bundle.json +114 -0
  180. package/templates/AGENTS.md +6 -2
  181. package/templates/catalog-manifest.json +0 -0
  182. package/templates/model-instructions/core.md +0 -0
  183. package/templates/model-instructions/release.md +0 -0
  184. package/templates/model-instructions/security.md +0 -0
  185. package/templates/quality/ai-quality-rules.yml +37 -0
  186. package/docs/assets/image/Screenshot(1).png +0 -0
  187. package/docs/assets/image/Screenshot(2).png +0 -0
  188. package/docs/assets/image/Screenshot(3).png +0 -0
  189. package/docs/assets/image/Screenshot(4).png +0 -0
  190. package/docs/assets/image/Screenshot(5).png +0 -0
  191. package/docs/assets/image/Screenshot(6).png +0 -0
  192. package/docs/assets/image/Screenshot(7).png +0 -0
  193. package/docs/assets/image/Screenshot(8).png +0 -0
  194. package/docs/assets/image/Screenshot(9).png +0 -0
  195. package/docs/assets/meta-architect-logo.png +0 -0
  196. package/docs/assets/meta-architect-logo.svg +0 -8
  197. package/docs/onboarding.md +0 -65
  198. package/docs/skills-publishing.md +0 -255
@@ -3,31 +3,12 @@
3
3
  import fs from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import process from "node:process";
6
+ import { parseSkillFrontmatter, validateSkillFrontmatter } from "../src/skill-frontmatter.js";
6
7
 
7
8
  const repoRoot = process.cwd();
8
9
  const skillsRoot = path.join(repoRoot, "skills");
9
10
  const manifestPath = path.join(skillsRoot, "index.json");
10
11
 
11
- function parseFrontmatterNameAndDescription(content) {
12
- const match = content.match(/^---\n([\s\S]*?)\n---/);
13
- if (!match) {
14
- throw new Error("Missing SKILL.md frontmatter");
15
- }
16
-
17
- const lines = match[1].split("\n");
18
- let name = "";
19
- let description = "";
20
- for (const line of lines) {
21
- if (line.startsWith("name:")) {
22
- name = line.slice("name:".length).trim();
23
- }
24
- if (line.startsWith("description:")) {
25
- description = line.slice("description:".length).trim().replace(/^"|"$/g, "");
26
- }
27
- }
28
- return { name, description };
29
- }
30
-
31
12
  async function main() {
32
13
  const entries = await fs.readdir(skillsRoot, { withFileTypes: true });
33
14
  const skills = [];
@@ -39,7 +20,7 @@ async function main() {
39
20
 
40
21
  const skillPath = path.join(skillsRoot, entry.name, "SKILL.md");
41
22
  const content = await fs.readFile(skillPath, "utf8");
42
- const meta = parseFrontmatterNameAndDescription(content);
23
+ const meta = validateSkillFrontmatter(parseSkillFrontmatter(content), entry.name);
43
24
  skills.push({
44
25
  name: meta.name,
45
26
  path: `skills/${entry.name}`,
@@ -2,9 +2,9 @@
2
2
 
3
3
  import { spawnSync } from "node:child_process";
4
4
  import fs from "node:fs/promises";
5
- import os from "node:os";
6
5
  import path from "node:path";
7
6
  import process from "node:process";
7
+ import { createTestNamespace } from "../src/test-fixtures.js";
8
8
 
9
9
  const repoRoot = process.cwd();
10
10
  const distRoot = path.join(repoRoot, "dist");
@@ -28,7 +28,7 @@ async function copyDir(src, dest) {
28
28
  async function main() {
29
29
  await fs.mkdir(distRoot, { recursive: true });
30
30
  await fs.rm(bundlePath, { force: true });
31
- const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "meta-architect-skills-"));
31
+ const tempRoot = createTestNamespace("meta-architect-skills");
32
32
  const frozenSkillsRoot = path.join(tempRoot, "skills");
33
33
  await copyDir(skillsRoot, frozenSkillsRoot);
34
34
 
@@ -3,6 +3,7 @@
3
3
  import fs from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import process from "node:process";
6
+ import { parseSkillFrontmatter, validateSkillFrontmatter } from "../src/skill-frontmatter.js";
6
7
 
7
8
  const repoRoot = process.cwd();
8
9
  const skillsRoot = path.join(repoRoot, "skills");
@@ -12,42 +13,6 @@ function fail(message) {
12
13
  process.exitCode = 1;
13
14
  }
14
15
 
15
- function extractFrontmatter(content) {
16
- const match = content.match(/^---\n([\s\S]*?)\n---\n?/);
17
- if (!match) {
18
- return null;
19
- }
20
-
21
- const yaml = match[1];
22
- const result = {};
23
-
24
- for (const rawLine of yaml.split("\n")) {
25
- const line = rawLine.trim();
26
- if (!line || line.startsWith("#")) {
27
- continue;
28
- }
29
-
30
- const separator = line.indexOf(":");
31
- if (separator === -1) {
32
- continue;
33
- }
34
-
35
- const key = line.slice(0, separator).trim();
36
- let value = line.slice(separator + 1).trim();
37
-
38
- if (
39
- (value.startsWith('"') && value.endsWith('"')) ||
40
- (value.startsWith("'") && value.endsWith("'"))
41
- ) {
42
- value = value.slice(1, -1);
43
- }
44
-
45
- result[key] = value;
46
- }
47
-
48
- return result;
49
- }
50
-
51
16
  async function validateSkillDir(skillDir) {
52
17
  const skillName = path.basename(skillDir);
53
18
  const skillPath = path.join(skillDir, "SKILL.md");
@@ -58,25 +23,10 @@ async function validateSkillDir(skillDir) {
58
23
  throw new Error(`${skillName}: missing SKILL.md`);
59
24
  }
60
25
 
61
- const frontmatter = extractFrontmatter(skillContent);
62
- if (!frontmatter) {
63
- throw new Error(`${skillName}: SKILL.md missing frontmatter`);
64
- }
65
-
66
- if (!frontmatter.name) {
67
- throw new Error(`${skillName}: frontmatter missing name`);
68
- }
69
-
70
- if (frontmatter.name !== skillName) {
71
- throw new Error(`${skillName}: frontmatter name must match directory name`);
72
- }
73
-
74
- if (!/^[a-z0-9-]+$/.test(frontmatter.name)) {
75
- throw new Error(`${skillName}: frontmatter name must be lowercase kebab-case`);
76
- }
77
-
78
- if (!frontmatter.description || frontmatter.description.length < 10) {
79
- throw new Error(`${skillName}: frontmatter description is missing or too short`);
26
+ try {
27
+ validateSkillFrontmatter(parseSkillFrontmatter(skillContent), skillName);
28
+ } catch (error) {
29
+ throw new Error(`${skillName}: ${error.message}`);
80
30
  }
81
31
 
82
32
  const agentContent = await fs.readFile(agentPath, "utf8").catch(() => null);
@@ -11,9 +11,11 @@ Use this skill inside Codex to turn a product idea into a concrete architecture
11
11
 
12
12
  Produce:
13
13
  - problem framing
14
+ - `decision`, `status`, `evidence`, `blockers`, `next_allowed_triggers`
14
15
  - user and workload assumptions
15
16
  - system architecture and subsystem boundaries
16
17
  - stack recommendation with tradeoffs
18
+ - rejected alternatives with rationale
17
19
  - data model and storage choices
18
20
  - auth, security, and operational concerns
19
21
  - phased delivery plan
@@ -14,11 +14,14 @@ Produce:
14
14
  - blockers that still prevent implementation
15
15
  - the narrowest viable build slice
16
16
  - branch or worktree suggestions when relevant
17
+ - bounded execution state when the build lane is already in progress
17
18
  - test and verification expectations
19
+ - repair path when the bounded slice needs another pass
18
20
  - the exact next implementation step
19
21
 
20
22
  ## Rules
21
23
 
22
24
  - Do not claim readiness if architecture, evidence, logic, security, or DX/UX gaps remain unresolved.
23
25
  - Keep the recommended build slice small, testable, and reversible.
26
+ - Treat `$build` as the sole owner of `.ma/plans/build.md` and `build_status`.
24
27
  - If the user wants code immediately and the path is clear, end with a concrete implementation plan rather than more review prose.
@@ -10,7 +10,9 @@ Use this skill inside Codex to pressure-test how the system behaves, not just ho
10
10
  ## Output
11
11
 
12
12
  Produce:
13
+ - `decision`, `status`, `evidence`, `blockers`, `next_allowed_triggers`
13
14
  - key actors and system states
15
+ - state map and failure flows
14
16
  - main flows and failure flows
15
17
  - invariants and state transitions
16
18
  - race conditions, dead ends, and consistency risks
package/skills/index.json CHANGED
File without changes
@@ -11,8 +11,10 @@ Use this skill inside Codex to verify or challenge stack choices with real sourc
11
11
 
12
12
  Produce:
13
13
  - candidate tools, libraries, or services
14
+ - `decision`, `status`, `evidence`, `blockers`, `next_allowed_triggers`
14
15
  - why each option fits or fails the architecture
15
16
  - source-backed evidence from official docs, upstream repos, or approved GitMCP sources
17
+ - evidence grade and exact upstream mapping
16
18
  - recommendation with tradeoffs
17
19
  - unresolved gaps or missing evidence
18
20
  - exact next trigger, usually `$flow`
@@ -23,6 +23,14 @@ Use this reference pack inside `$sage` when the repo needs evidence-backed selec
23
23
  - Claimed capability verified from a primary source
24
24
  - Maturity caveats called out when evidence is weak
25
25
 
26
+ ## Evidence grades
27
+
28
+ - `VERIFIED`: exact upstream mapping plus primary-source confirmation
29
+ - `PARTIAL`: candidate is mapped, but live proof or maturity proof is incomplete
30
+ - `MISSING`: no trustworthy exact upstream mapping yet
31
+
32
+ Always expose the evidence grade and the exact upstream mapping in user-facing `$sage` output.
33
+
26
34
  ## Native posture
27
35
 
28
36
  Meta-Architect ships curated guidance and playbooks. It does not ship a raw mirror of external catalogs. External sources remain evidence inputs, not user-facing skill identities.
@@ -10,11 +10,13 @@ Use this skill inside Codex to review security posture before the build lane. `$
10
10
  ## Output
11
11
 
12
12
  Produce:
13
+ - `decision`, `status`, `evidence`, `blockers`, `next_allowed_triggers`
13
14
  - trust boundaries
14
15
  - authn/authz expectations
15
16
  - sensitive data paths
16
17
  - abuse cases and likely failure modes
17
18
  - concrete mitigations
19
+ - accepted risks
18
20
  - release blockers vs acceptable risks
19
21
  - exact next trigger, usually `$vibe`
20
22
 
@@ -18,6 +18,13 @@ Use this reference pack inside `$vet` for repeatable trust-boundary reviews that
18
18
  - Distinguish blockers from accepted risk.
19
19
  - Route remediation back to the owning lane rather than creating a parallel security workflow.
20
20
 
21
+ ## Adversarial hardening
22
+
23
+ - For higher-risk changes, run a bounded adversarial hardening pass before final approval.
24
+ - Keep the hardening work inside the private scratchpad/runtime layer.
25
+ - Return structured findings, not direct gate mutations.
26
+ - If the hardening pass cannot resolve or clearly classify the risk, keep `$vet` in a non-terminal state instead of over-approving.
27
+
21
28
  ## Product boundary
22
29
 
23
30
  This pack deepens `$vet`; it does not create a new security skill family. Security patterns are packaged as Meta-Architect guidance, not as mirrored external catalogs or branded upstream surfaces.
@@ -10,8 +10,10 @@ Use this skill inside Codex to review whether the system will feel coherent for
10
10
  ## Output
11
11
 
12
12
  Produce:
13
+ - `decision`, `status`, `evidence`, `blockers`, `next_allowed_triggers`
13
14
  - developer workflow risks
14
15
  - user workflow risks
16
+ - operator friction and user friction
15
17
  - complexity hotspots
16
18
  - onboarding or operability friction
17
19
  - simplifications that improve clarity
package/sprint/00-idea.md CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/src/agents.js ADDED
@@ -0,0 +1,279 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import path from "node:path";
3
+
4
+ const definitions = {
5
+ codex: {
6
+ id: "codex",
7
+ displayName: "Codex CLI",
8
+ skillsDir: ".agents/skills",
9
+ globalSkillsDir: "~/.agents/skills",
10
+ isUniversal: true,
11
+ command: "codex",
12
+ surface: "cli",
13
+ vendor: "openai",
14
+ probeable: true,
15
+ },
16
+ "claude-code": {
17
+ id: "claude-code",
18
+ displayName: "Claude Code",
19
+ skillsDir: ".claude/skills",
20
+ globalSkillsDir: "~/.claude/skills",
21
+ isUniversal: false,
22
+ command: "claude",
23
+ surface: "cli",
24
+ vendor: "anthropic",
25
+ probeable: true,
26
+ },
27
+ cursor: {
28
+ id: "cursor",
29
+ displayName: "Cursor",
30
+ skillsDir: ".agents/skills",
31
+ globalSkillsDir: "~/.agents/skills",
32
+ isUniversal: true,
33
+ command: "cursor",
34
+ surface: "ide",
35
+ vendor: "cursor",
36
+ probeable: true,
37
+ },
38
+ opencode: {
39
+ id: "opencode",
40
+ displayName: "OpenCode",
41
+ skillsDir: ".agents/skills",
42
+ globalSkillsDir: "~/.config/opencode/skills",
43
+ isUniversal: true,
44
+ command: "opencode",
45
+ surface: "cli",
46
+ vendor: "sst",
47
+ probeable: true,
48
+ },
49
+ "gemini-cli": {
50
+ id: "gemini-cli",
51
+ displayName: "Gemini CLI",
52
+ skillsDir: ".agents/skills",
53
+ globalSkillsDir: "~/.gemini/skills",
54
+ isUniversal: true,
55
+ command: "gemini",
56
+ surface: "cli",
57
+ vendor: "google",
58
+ probeable: true,
59
+ },
60
+ amp: {
61
+ id: "amp",
62
+ displayName: "Amp",
63
+ skillsDir: ".agents/skills",
64
+ globalSkillsDir: "~/.config/agents/skills",
65
+ isUniversal: true,
66
+ command: "amp",
67
+ surface: "cli",
68
+ vendor: "sourcegraph",
69
+ probeable: true,
70
+ },
71
+ goose: {
72
+ id: "goose",
73
+ displayName: "Goose",
74
+ skillsDir: ".goose/skills",
75
+ globalSkillsDir: "~/.config/goose/skills",
76
+ isUniversal: false,
77
+ command: "goose",
78
+ surface: "cli",
79
+ vendor: "block",
80
+ probeable: true,
81
+ },
82
+ "hermes-agent": {
83
+ id: "hermes-agent",
84
+ displayName: "Hermes Agent",
85
+ skillsDir: ".hermes/skills",
86
+ globalSkillsDir: "~/.hermes/skills",
87
+ isUniversal: false,
88
+ command: "hermes",
89
+ surface: "cli",
90
+ vendor: "nous-research",
91
+ probeable: true,
92
+ },
93
+ pi: {
94
+ id: "pi",
95
+ displayName: "Pi Coding Agent",
96
+ skillsDir: ".pi/skills",
97
+ globalSkillsDir: "~/.pi/agent/skills",
98
+ isUniversal: false,
99
+ command: "pi",
100
+ surface: "cli",
101
+ vendor: "pi",
102
+ probeable: true,
103
+ },
104
+ windsurf: {
105
+ id: "windsurf",
106
+ displayName: "Windsurf",
107
+ skillsDir: ".windsurf/skills",
108
+ globalSkillsDir: "~/.codeium/windsurf/skills",
109
+ isUniversal: false,
110
+ command: null,
111
+ surface: "ide",
112
+ vendor: "windsurf",
113
+ probeable: false,
114
+ },
115
+ cline: {
116
+ id: "cline",
117
+ displayName: "Cline",
118
+ skillsDir: ".agents/skills",
119
+ globalSkillsDir: "~/.agents/skills",
120
+ isUniversal: true,
121
+ command: null,
122
+ surface: "ide",
123
+ vendor: "cline",
124
+ probeable: false,
125
+ },
126
+ continue: {
127
+ id: "continue",
128
+ displayName: "Continue",
129
+ skillsDir: ".continue/skills",
130
+ globalSkillsDir: "~/.continue/skills",
131
+ isUniversal: false,
132
+ command: "continue",
133
+ surface: "ide",
134
+ vendor: "continue",
135
+ probeable: true,
136
+ },
137
+ roo: {
138
+ id: "roo",
139
+ displayName: "Roo Code",
140
+ skillsDir: ".roo/skills",
141
+ globalSkillsDir: "~/.roo/skills",
142
+ isUniversal: false,
143
+ command: null,
144
+ surface: "ide",
145
+ vendor: "roo-code",
146
+ probeable: false,
147
+ },
148
+ "kiro-cli": {
149
+ id: "kiro-cli",
150
+ displayName: "Kiro CLI",
151
+ skillsDir: ".kiro/skills",
152
+ globalSkillsDir: "~/.kiro/skills",
153
+ isUniversal: false,
154
+ command: "kiro",
155
+ surface: "ide",
156
+ vendor: "amazon",
157
+ probeable: true,
158
+ },
159
+ junie: {
160
+ id: "junie",
161
+ displayName: "Junie",
162
+ skillsDir: ".junie/skills",
163
+ globalSkillsDir: "~/.junie/skills",
164
+ isUniversal: false,
165
+ command: null,
166
+ surface: "ide",
167
+ vendor: "jetbrains",
168
+ probeable: false,
169
+ },
170
+ "github-copilot": {
171
+ id: "github-copilot",
172
+ displayName: "GitHub Copilot",
173
+ skillsDir: ".agents/skills",
174
+ globalSkillsDir: "~/.copilot/skills",
175
+ isUniversal: true,
176
+ command: null,
177
+ surface: "ide",
178
+ vendor: "github",
179
+ probeable: false,
180
+ },
181
+ antigravity: {
182
+ id: "antigravity",
183
+ displayName: "Antigravity",
184
+ skillsDir: ".agents/skills",
185
+ globalSkillsDir: "~/.gemini/antigravity/skills",
186
+ isUniversal: true,
187
+ command: null,
188
+ surface: "ide",
189
+ vendor: "google",
190
+ probeable: false,
191
+ },
192
+ universal: {
193
+ id: "universal",
194
+ displayName: "Universal Agent Skills",
195
+ skillsDir: ".agents/skills",
196
+ globalSkillsDir: "~/.agents/skills",
197
+ isUniversal: true,
198
+ command: null,
199
+ surface: "generic",
200
+ vendor: "universal",
201
+ probeable: false,
202
+ },
203
+ };
204
+
205
+ export const agentRegistry = Object.freeze(
206
+ Object.fromEntries(
207
+ Object.entries(definitions).map(([id, definition]) => [id, Object.freeze(definition)]),
208
+ ),
209
+ );
210
+
211
+ export function getAgent(type = process.env.MA_AGENT || "codex") {
212
+ return agentRegistry[type] ?? agentRegistry.codex;
213
+ }
214
+
215
+ export function getNonUniversalAgents() {
216
+ return Object.values(agentRegistry).filter((agent) => !agent.isUniversal);
217
+ }
218
+
219
+ export function isUniversalAgent(type) {
220
+ return getAgent(type).isUniversal;
221
+ }
222
+
223
+ export function resolveAgentCommand(type = process.env.MA_AGENT || "codex") {
224
+ const agent = getAgent(type);
225
+ if (!agent.command) return null;
226
+ const envKey = `MA_${agent.id.replaceAll("-", "_").toUpperCase()}_BIN`;
227
+ return process.env[envKey]?.trim() || agent.command;
228
+ }
229
+
230
+ export function detectInstalled(type = process.env.MA_AGENT || "codex") {
231
+ const agent = getAgent(type);
232
+ const command = resolveAgentCommand(agent.id);
233
+ if (!command || !agent.probeable) {
234
+ return {
235
+ ...agent,
236
+ installed: false,
237
+ command: command ?? null,
238
+ version: "",
239
+ probe: "unsupported",
240
+ };
241
+ }
242
+ const script = [".js", ".mjs", ".cjs"].includes(path.extname(command));
243
+ const result = spawnSync(
244
+ script ? process.execPath : command,
245
+ script ? [command, "--version"] : ["--version"],
246
+ {
247
+ encoding: "utf8",
248
+ },
249
+ );
250
+ return {
251
+ ...agent,
252
+ command,
253
+ installed: result.status === 0,
254
+ version: result.status === 0 ? result.stdout.trim() : "",
255
+ error: result.error?.message || result.stderr?.trim() || "",
256
+ };
257
+ }
258
+
259
+ export function listAgents() {
260
+ return Object.values(agentRegistry);
261
+ }
262
+
263
+ const slashInvocationAgents = new Set([
264
+ "cursor",
265
+ "windsurf",
266
+ "cline",
267
+ "continue",
268
+ "roo",
269
+ "kiro-cli",
270
+ "junie",
271
+ "github-copilot",
272
+ "antigravity",
273
+ ]);
274
+
275
+ export function getAgentInvocation(type, command = "maestro") {
276
+ if (type === "codex") return `$${command}`;
277
+ if (slashInvocationAgents.has(type)) return `/${command}`;
278
+ return command;
279
+ }