mia-code 0.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 (103) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.coaia/pde/d77620fc-1cd9-47e2-ba00-c03e114e42e9.jsonl +16 -0
  3. package/.coaia/pde/de44d838-b58b-4e91-b791-dd3b0f940ed1.jsonl +60 -0
  4. package/.gemini/settings.json +8 -0
  5. package/.hch/issue_.env +4 -0
  6. package/.hch/issue_add__2601211715.json +77 -0
  7. package/.hch/issue_add__2601211715.md +4 -0
  8. package/.hch/issue_add__2602242020.json +78 -0
  9. package/.hch/issue_add__2602242020.md +7 -0
  10. package/.hch/issues.json +2312 -0
  11. package/.hch/issues.md +30 -0
  12. package/260123084839.coaia-narrative.autoRevisionOfInitial_NewStructuralTensionChart-to-initiate-HierarchicalThinking.txt +5 -0
  13. package/2602010101.issue.txt +31 -0
  14. package/BUGS.md +242 -0
  15. package/CLAUDE.md +2 -0
  16. package/ENHANCEMENTS.md +129 -0
  17. package/FEATURES_ENDING_SESSIONS.md +21 -0
  18. package/FIXES.md +114 -0
  19. package/GUILLAUME.md +77 -0
  20. package/KINSHIP.md +50 -0
  21. package/LAUNCH__session_id__MiaCodeNextWorkReviewAndCommits_2601312020.sh +7 -0
  22. package/PHASE_2.md +153 -0
  23. package/PHASE_2_IMPLEMENTATION.md +134 -0
  24. package/README.md +203 -0
  25. package/RESUME__issueMaker__540244c2-b096-40d8-8c3f-398408d3e0eb.2602041757.sh +1 -0
  26. package/RUN_COPILOT_with_related_folders__260130.sh +2 -0
  27. package/WS__mia-code__260214__IAIP_PDE.code-workspace +29 -0
  28. package/WS__mia-code__src332__260122.code-workspace +23 -0
  29. package/_env.sh +12 -0
  30. package/dist/cli.d.ts +11 -0
  31. package/dist/cli.js +679 -0
  32. package/dist/commands.d.ts +43 -0
  33. package/dist/commands.js +108 -0
  34. package/dist/config.d.ts +8 -0
  35. package/dist/config.js +57 -0
  36. package/dist/formatting.d.ts +12 -0
  37. package/dist/formatting.js +133 -0
  38. package/dist/geminiHeadless.d.ts +25 -0
  39. package/dist/geminiHeadless.js +246 -0
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.js +186 -0
  42. package/dist/mcp/config-generator.d.ts +23 -0
  43. package/dist/mcp/config-generator.js +116 -0
  44. package/dist/mcp/index.d.ts +18 -0
  45. package/dist/mcp/index.js +43 -0
  46. package/dist/mcp/miaco-server.d.ts +15 -0
  47. package/dist/mcp/miaco-server.js +161 -0
  48. package/dist/mcp/miatel-server.d.ts +15 -0
  49. package/dist/mcp/miatel-server.js +123 -0
  50. package/dist/mcp/miawa-server.d.ts +15 -0
  51. package/dist/mcp/miawa-server.js +125 -0
  52. package/dist/mcp/utils.d.ts +51 -0
  53. package/dist/mcp/utils.js +76 -0
  54. package/dist/multiline-input.d.ts +98 -0
  55. package/dist/multiline-input.js +630 -0
  56. package/dist/narrative/index.d.ts +9 -0
  57. package/dist/narrative/index.js +11 -0
  58. package/dist/narrative/router.d.ts +89 -0
  59. package/dist/narrative/router.js +186 -0
  60. package/dist/narrative/tracer.d.ts +75 -0
  61. package/dist/narrative/tracer.js +180 -0
  62. package/dist/sessionStore.d.ts +10 -0
  63. package/dist/sessionStore.js +93 -0
  64. package/dist/types.d.ts +44 -0
  65. package/dist/types.js +1 -0
  66. package/dist/unifier.d.ts +6 -0
  67. package/dist/unifier.js +147 -0
  68. package/issue-358--architecture/ARCHITECTURE_OVERVIEW.md +60 -0
  69. package/issue-358--architecture/CLI_INTEGRATION.md +61 -0
  70. package/issue-358--architecture/COVER_ART_BRIEF.md +68 -0
  71. package/issue-358--architecture/MEMORY_SYSTEM.md +89 -0
  72. package/issue-358--architecture/PERSONA_REGISTRY.md +97 -0
  73. package/issue-358--architecture/PODCAST_PRODUCTION_PLAN.md +61 -0
  74. package/issue-358--architecture/PODCAST_SCRIPT_FINAL.md +109 -0
  75. package/issue-358--architecture/PROTOTYPE_CHARACTER_SPEC.md +59 -0
  76. package/issue-358--architecture/RESOURCES.md +41 -0
  77. package/issue-358--architecture/TEAM_LISTENING_GUIDE.md +53 -0
  78. package/llms-gemini-cli.txt +145 -0
  79. package/package.json +39 -0
  80. package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/checkpoints/index.md +6 -0
  81. package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/events.jsonl +213 -0
  82. package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/plan.md +243 -0
  83. package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/workspace.yaml +5 -0
  84. package/src/cli.ts +742 -0
  85. package/src/commands.ts +127 -0
  86. package/src/config.ts +67 -0
  87. package/src/formatting.ts +157 -0
  88. package/src/geminiHeadless.ts +300 -0
  89. package/src/index.ts +194 -0
  90. package/src/mcp/config-generator.ts +141 -0
  91. package/src/mcp/index.ts +55 -0
  92. package/src/mcp/miaco-server.ts +199 -0
  93. package/src/mcp/miatel-server.ts +138 -0
  94. package/src/mcp/miawa-server.ts +158 -0
  95. package/src/mcp/utils.ts +121 -0
  96. package/src/multiline-input.ts +739 -0
  97. package/src/narrative/index.ts +33 -0
  98. package/src/narrative/router.ts +260 -0
  99. package/src/narrative/tracer.ts +249 -0
  100. package/src/sessionStore.ts +111 -0
  101. package/src/types.ts +49 -0
  102. package/src/unifier.ts +171 -0
  103. package/tsconfig.json +15 -0
package/src/index.ts ADDED
@@ -0,0 +1,194 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { createInterface } from "readline";
4
+ import { runInteractiveCli, runSinglePrompt } from "./cli.js";
5
+ import { getConfigPath, loadConfig, saveConfig, ENGINE_MODELS, ENGINES } from "./config.js";
6
+ import { listSessions, clearSessions } from "./sessionStore.js";
7
+ import { generateClaudeConfig, generateToolManifest, generateServerInfo } from "./mcp/index.js";
8
+ import { Engine } from "./types.js";
9
+ import chalk from "chalk";
10
+ import { readFileSync } from "fs";
11
+ import { fileURLToPath } from "url";
12
+ import path from "path";
13
+
14
+ const program = new Command();
15
+
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = path.dirname(__filename);
18
+ const pkg = JSON.parse(readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8'));
19
+
20
+ program
21
+ .name("mia-code")
22
+ .description("Mia/Miette/Miawa terminal coding agent wrapping Gemini CLI headless mode.")
23
+ .version(pkg.version);
24
+
25
+ program
26
+ .command("chat", { isDefault: true })
27
+ .description("Start interactive terminal session (default)")
28
+ .option("-p, --project <path>", "Project root directory (default: cwd)")
29
+ .option("-r, --resume [sessionId]", "Resume a session (interactive picker if no ID provided)")
30
+ .option("-y, --yolo", "Enable YOLO mode (auto-approve all actions)")
31
+ .option("--raw", "Skip unifier, show raw agent output")
32
+ .option("--claude", "Use Claude engine instead of Gemini")
33
+ .option("--copilot", "Use Copilot engine")
34
+ .option("--gemini", "Use Gemini engine (default)")
35
+ .option("--add-dir <dirs...>", "Additional directories to allow tool access to")
36
+ .action(async (opts) => {
37
+ await runInteractiveCli({
38
+ projectRoot: opts.project,
39
+ resume: opts.resume,
40
+ yolo: opts.yolo,
41
+ raw: opts.raw,
42
+ engine: opts.claude ? "claude" : opts.copilot ? "copilot" : opts.gemini ? "gemini" : undefined,
43
+ addDirs: opts.addDir
44
+ });
45
+ });
46
+
47
+ program
48
+ .command("prompt <text>")
49
+ .description("Run a single prompt and exit")
50
+ .option("-p, --project <path>", "Project root directory")
51
+ .option("-r, --resume <sessionId>", "Resume a specific session")
52
+ .option("-y, --yolo", "Enable YOLO mode")
53
+ .option("--raw", "Skip unifier, show raw agent output")
54
+ .option("--claude", "Use Claude engine instead of Gemini")
55
+ .option("--copilot", "Use Copilot engine")
56
+ .option("--gemini", "Use Gemini engine (default)")
57
+ .option("--add-dir <dirs...>", "Additional directories to allow tool access to")
58
+ .action(async (text, opts) => {
59
+ await runSinglePrompt(text, {
60
+ projectRoot: opts.project,
61
+ resume: opts.resume,
62
+ yolo: opts.yolo,
63
+ raw: opts.raw,
64
+ engine: opts.claude ? "claude" : opts.copilot ? "copilot" : opts.gemini ? "gemini" : undefined,
65
+ addDirs: opts.addDir
66
+ });
67
+ });
68
+
69
+ program
70
+ .command("config")
71
+ .description("View or update mia-code configuration")
72
+ .option("--set-engine <engine>", "Set default engine (gemini or claude)")
73
+ .option("--set-gemini-bin <path>", "Set path to gemini binary")
74
+ .option("--set-claude-bin <path>", "Set path to claude binary")
75
+ .option("--set-model <model>", "Set default model")
76
+ .option("--set-yolo <bool>", "Set default YOLO mode (true/false)")
77
+ .action(async (opts) => {
78
+ if (opts.setEngine || opts.setGeminiBin || opts.setClaudeBin || opts.setModel || opts.setYolo !== undefined) {
79
+ const partial: Record<string, unknown> = {};
80
+ if (opts.setEngine) partial.engine = opts.setEngine;
81
+ if (opts.setGeminiBin) partial.geminiBinary = opts.setGeminiBin;
82
+ if (opts.setClaudeBin) partial.claudeBinary = opts.setClaudeBin;
83
+ if (opts.setModel) partial.model = opts.setModel;
84
+ if (opts.setYolo !== undefined) partial.yoloMode = opts.setYolo === "true";
85
+ saveConfig(partial);
86
+ console.log(chalk.green("✓ config updated"));
87
+ console.log(chalk.dim(`config file: ${getConfigPath()}`));
88
+ console.log(JSON.stringify(loadConfig(), null, 2));
89
+ } else if (process.stdin.isTTY) {
90
+ // Interactive mode: pick engine → pick model
91
+ const config = loadConfig();
92
+ console.log(chalk.dim(`config file: ${getConfigPath()}`));
93
+ console.log(chalk.dim(`current: engine=${config.engine}, model=${config.model}\n`));
94
+
95
+ const ask = (question: string): Promise<string> => {
96
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
97
+ return new Promise(resolve => {
98
+ rl.question(question, (answer) => { rl.close(); resolve(answer.trim()); });
99
+ });
100
+ };
101
+
102
+ // Pick engine
103
+ console.log(chalk.bold("Select engine:"));
104
+ ENGINES.forEach((e, i) => {
105
+ const marker = e === config.engine ? chalk.green(" ◀ current") : "";
106
+ console.log(chalk.dim(` ${i + 1}. ${e}${marker}`));
107
+ });
108
+ const engineAnswer = await ask(chalk.cyan(` select (1-${ENGINES.length}): `));
109
+ const engineIdx = parseInt(engineAnswer, 10) - 1;
110
+ if (isNaN(engineIdx) || engineIdx < 0 || engineIdx >= ENGINES.length) {
111
+ console.log(chalk.yellow("cancelled"));
112
+ return;
113
+ }
114
+ const engine = ENGINES[engineIdx];
115
+
116
+ // Pick model
117
+ const models = ENGINE_MODELS[engine];
118
+ console.log(chalk.bold(`\nSelect model for ${engine}:`));
119
+ models.forEach((m, i) => {
120
+ const marker = m === config.model ? chalk.green(" ◀ current") : "";
121
+ console.log(chalk.dim(` ${i + 1}. ${m}${marker}`));
122
+ });
123
+ const modelAnswer = await ask(chalk.cyan(` select (1-${models.length}): `));
124
+ const modelIdx = parseInt(modelAnswer, 10) - 1;
125
+ if (isNaN(modelIdx) || modelIdx < 0 || modelIdx >= models.length) {
126
+ console.log(chalk.yellow("cancelled"));
127
+ return;
128
+ }
129
+ const model = models[modelIdx];
130
+
131
+ saveConfig({ engine, model });
132
+ console.log(chalk.green(`\n✓ config updated → engine: ${engine}, model: ${model}`));
133
+ } else {
134
+ console.log(chalk.dim(`config file: ${getConfigPath()}`));
135
+ console.log(JSON.stringify(loadConfig(), null, 2));
136
+ }
137
+ });
138
+
139
+ program
140
+ .command("sessions")
141
+ .description("List saved sessions")
142
+ .option("--clear", "Clear all saved sessions")
143
+ .action((opts) => {
144
+ if (opts.clear) {
145
+ clearSessions();
146
+ console.log(chalk.green("✓ sessions cleared"));
147
+ return;
148
+ }
149
+ const sessions = listSessions();
150
+ if (sessions.length === 0) {
151
+ console.log(chalk.dim("no saved sessions"));
152
+ return;
153
+ }
154
+ console.log(chalk.dim(`saved sessions (${sessions.length}):`));
155
+ for (const s of sessions) {
156
+ console.log(chalk.dim(` ${s.id.slice(0, 12)}... | ${s.projectRoot || "unknown"} | ${s.startedAt}`));
157
+ }
158
+ });
159
+
160
+ program
161
+ .command("where-config")
162
+ .description("Show path to mia-code config file")
163
+ .action(() => {
164
+ console.log(getConfigPath());
165
+ });
166
+
167
+ program
168
+ .command("mcp-config")
169
+ .description("Generate MCP configuration for external engines")
170
+ .option("--miatel", "Include miatel (Story World) server")
171
+ .option("--miawa", "Include miawa (Ceremony World) server")
172
+ .option("--miaco", "Include miaco (Engineering World) server")
173
+ .option("--tools", "Output tool manifest instead of config")
174
+ .option("--info", "Output detailed server info")
175
+ .action((opts) => {
176
+ // If no specific server selected, enable all
177
+ const enableAll = !opts.miatel && !opts.miawa && !opts.miaco;
178
+
179
+ const options = {
180
+ enableMiatel: enableAll || opts.miatel,
181
+ enableMiawa: enableAll || opts.miawa,
182
+ enableMiaco: enableAll || opts.miaco
183
+ };
184
+
185
+ if (opts.tools) {
186
+ console.log(JSON.stringify(generateToolManifest(options), null, 2));
187
+ } else if (opts.info) {
188
+ console.log(JSON.stringify(generateServerInfo(options), null, 2));
189
+ } else {
190
+ console.log(JSON.stringify(generateClaudeConfig(options), null, 2));
191
+ }
192
+ });
193
+
194
+ program.parseAsync(process.argv);
@@ -0,0 +1,141 @@
1
+ /**
2
+ * MCP Config Generator
3
+ *
4
+ * Generates MCP configuration JSON for external engines (Claude Code, etc.)
5
+ */
6
+
7
+ import { dirname, resolve } from "path";
8
+ import { fileURLToPath } from "url";
9
+ import { miacoServerConfig, miacoTools } from "./miaco-server.js";
10
+ import { miatelServerConfig, miatelTools } from "./miatel-server.js";
11
+ import { miawaServerConfig, miawaTools } from "./miawa-server.js";
12
+
13
+ const __dirname = dirname(fileURLToPath(import.meta.url));
14
+
15
+ export interface MCPConfigOptions {
16
+ enableMiatel?: boolean;
17
+ enableMiawa?: boolean;
18
+ enableMiaco?: boolean;
19
+ outputFormat?: "claude" | "generic";
20
+ }
21
+
22
+ /**
23
+ * Generate MCP configuration for Claude Desktop / Claude Code
24
+ */
25
+ export function generateClaudeConfig(options: MCPConfigOptions = {}): object {
26
+ const servers: Record<string, object> = {};
27
+ const basePath = resolve(__dirname, "..");
28
+
29
+ if (options.enableMiatel !== false) {
30
+ servers["miatel"] = {
31
+ command: "node",
32
+ args: [resolve(basePath, "mcp/miatel-server.js")],
33
+ env: {}
34
+ };
35
+ }
36
+
37
+ if (options.enableMiawa !== false) {
38
+ servers["miawa"] = {
39
+ command: "node",
40
+ args: [resolve(basePath, "mcp/miawa-server.js")],
41
+ env: {}
42
+ };
43
+ }
44
+
45
+ if (options.enableMiaco !== false) {
46
+ servers["miaco"] = {
47
+ command: "node",
48
+ args: [resolve(basePath, "mcp/miaco-server.js")],
49
+ env: {}
50
+ };
51
+ }
52
+
53
+ return {
54
+ mcpServers: servers
55
+ };
56
+ }
57
+
58
+ /**
59
+ * Generate tool manifest for all enabled servers
60
+ */
61
+ export function generateToolManifest(options: MCPConfigOptions = {}): object[] {
62
+ const tools: object[] = [];
63
+
64
+ if (options.enableMiatel !== false) {
65
+ tools.push(...miatelTools.map(t => ({
66
+ ...t,
67
+ server: "miatel"
68
+ })));
69
+ }
70
+
71
+ if (options.enableMiawa !== false) {
72
+ tools.push(...miawaTools.map(t => ({
73
+ ...t,
74
+ server: "miawa"
75
+ })));
76
+ }
77
+
78
+ if (options.enableMiaco !== false) {
79
+ tools.push(...miacoTools.map(t => ({
80
+ ...t,
81
+ server: "miaco"
82
+ })));
83
+ }
84
+
85
+ return tools;
86
+ }
87
+
88
+ /**
89
+ * Generate full MCP server info
90
+ */
91
+ export function generateServerInfo(options: MCPConfigOptions = {}): object {
92
+ const servers: object[] = [];
93
+
94
+ if (options.enableMiatel !== false) {
95
+ servers.push({
96
+ ...miatelServerConfig,
97
+ tools: miatelTools
98
+ });
99
+ }
100
+
101
+ if (options.enableMiawa !== false) {
102
+ servers.push({
103
+ ...miawaServerConfig,
104
+ tools: miawaTools
105
+ });
106
+ }
107
+
108
+ if (options.enableMiaco !== false) {
109
+ servers.push({
110
+ ...miacoServerConfig,
111
+ tools: miacoTools
112
+ });
113
+ }
114
+
115
+ return {
116
+ servers,
117
+ totalTools: servers.reduce((acc, s: any) => acc + s.tools.length, 0)
118
+ };
119
+ }
120
+
121
+ // CLI usage: node config-generator.js [--miatel] [--miawa] [--miaco] [--format claude|generic]
122
+ if (process.argv[1]?.endsWith("config-generator.js")) {
123
+ const args = process.argv.slice(2);
124
+
125
+ const options: MCPConfigOptions = {
126
+ enableMiatel: args.includes("--miatel") || !args.some(a => a.startsWith("--mia")),
127
+ enableMiawa: args.includes("--miawa") || !args.some(a => a.startsWith("--mia")),
128
+ enableMiaco: args.includes("--miaco") || !args.some(a => a.startsWith("--mia")),
129
+ outputFormat: args.includes("--format")
130
+ ? args[args.indexOf("--format") + 1] as "claude" | "generic"
131
+ : "claude"
132
+ };
133
+
134
+ if (args.includes("--tools")) {
135
+ console.log(JSON.stringify(generateToolManifest(options), null, 2));
136
+ } else if (args.includes("--info")) {
137
+ console.log(JSON.stringify(generateServerInfo(options), null, 2));
138
+ } else {
139
+ console.log(JSON.stringify(generateClaudeConfig(options), null, 2));
140
+ }
141
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * MCP Server Registry for mia-code
3
+ *
4
+ * Exports all MCP servers and utilities
5
+ */
6
+
7
+ export { miacoTools, handleMiacoTool, miacoServerConfig } from "./miaco-server.js";
8
+ export { miatelTools, handleMiatelTool, miatelServerConfig } from "./miatel-server.js";
9
+ export { miawaTools, handleMiawaTool, miawaServerConfig } from "./miawa-server.js";
10
+ export {
11
+ generateClaudeConfig,
12
+ generateToolManifest,
13
+ generateServerInfo
14
+ } from "./config-generator.js";
15
+ export type { MCPTool, MCPToolResult } from "./utils.js";
16
+
17
+ /**
18
+ * All available MCP tools across all servers
19
+ */
20
+ export function getAllTools() {
21
+ const { miacoTools } = require("./miaco-server.js");
22
+ const { miatelTools } = require("./miatel-server.js");
23
+ const { miawaTools } = require("./miawa-server.js");
24
+
25
+ return [
26
+ ...miacoTools.map((t: any) => ({ ...t, server: "miaco" })),
27
+ ...miatelTools.map((t: any) => ({ ...t, server: "miatel" })),
28
+ ...miawaTools.map((t: any) => ({ ...t, server: "miawa" }))
29
+ ];
30
+ }
31
+
32
+ /**
33
+ * Handle a tool call by routing to the appropriate server
34
+ */
35
+ export async function handleTool(name: string, args: Record<string, any>) {
36
+ if (name.startsWith("miaco_")) {
37
+ const { handleMiacoTool } = await import("./miaco-server.js");
38
+ return handleMiacoTool(name, args);
39
+ }
40
+
41
+ if (name.startsWith("miatel_")) {
42
+ const { handleMiatelTool } = await import("./miatel-server.js");
43
+ return handleMiatelTool(name, args);
44
+ }
45
+
46
+ if (name.startsWith("miawa_")) {
47
+ const { handleMiawaTool } = await import("./miawa-server.js");
48
+ return handleMiawaTool(name, args);
49
+ }
50
+
51
+ return {
52
+ content: [{ type: "text" as const, text: JSON.stringify({ error: `Unknown tool: ${name}` }) }],
53
+ isError: true
54
+ };
55
+ }
@@ -0,0 +1,199 @@
1
+ /**
2
+ * MCP Server for miaco - Engineering World CLI
3
+ *
4
+ * Exposes chart/schema/validate tools as MCP tools
5
+ */
6
+
7
+ import { runCLI, parseJSONOutput, createToolResult, buildArgs, MCPTool, MCPToolResult } from "./utils.js";
8
+ import { dirname, join } from "path";
9
+ import { fileURLToPath } from "url";
10
+
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const CLI_PATH = join(__dirname, "../../miaco/dist/index.js");
13
+
14
+ export const miacoTools: MCPTool[] = [
15
+ {
16
+ name: "miaco_chart_create",
17
+ description: "Create a structural tension chart with desired outcome and current reality",
18
+ inputSchema: {
19
+ type: "object",
20
+ properties: {
21
+ outcome: { type: "string", description: "Desired outcome (what you want to CREATE, not fix)" },
22
+ reality: { type: "string", description: "Current reality (factual assessment, not readiness)" },
23
+ due: { type: "string", description: "Due date (ISO format)" },
24
+ session: { type: "string", description: "Session ID" }
25
+ },
26
+ required: ["outcome", "reality"]
27
+ }
28
+ },
29
+ {
30
+ name: "miaco_chart_list",
31
+ description: "List active structural tension charts",
32
+ inputSchema: {
33
+ type: "object",
34
+ properties: {
35
+ session: { type: "string", description: "Session ID" }
36
+ }
37
+ }
38
+ },
39
+ {
40
+ name: "miaco_chart_add_step",
41
+ description: "Add an action step to an existing chart",
42
+ inputSchema: {
43
+ type: "object",
44
+ properties: {
45
+ chart: { type: "string", description: "Chart ID" },
46
+ title: { type: "string", description: "Action step title" },
47
+ reality: { type: "string", description: "Current reality for this step" },
48
+ session: { type: "string", description: "Session ID" }
49
+ },
50
+ required: ["chart", "title", "reality"]
51
+ }
52
+ },
53
+ {
54
+ name: "miaco_chart_complete",
55
+ description: "Mark an action step as complete",
56
+ inputSchema: {
57
+ type: "object",
58
+ properties: {
59
+ step: { type: "string", description: "Action step name or ID" },
60
+ session: { type: "string", description: "Session ID" }
61
+ },
62
+ required: ["step"]
63
+ }
64
+ },
65
+ {
66
+ name: "miaco_chart_review",
67
+ description: "Review chart progress using Creator Moment of Truth",
68
+ inputSchema: {
69
+ type: "object",
70
+ properties: {
71
+ chart: { type: "string", description: "Chart ID to review" },
72
+ session: { type: "string", description: "Session ID" }
73
+ },
74
+ required: ["chart"]
75
+ }
76
+ },
77
+ // PDE — Multi-engine Prompt Decomposition
78
+ {
79
+ name: "miaco_decompose",
80
+ description: "Decompose a prompt into structured Four Directions analysis using any engine (gemini, claude, copilot)",
81
+ inputSchema: {
82
+ type: "object",
83
+ properties: {
84
+ prompt: { type: "string", description: "The prompt to decompose" },
85
+ engine: { type: "string", description: "Engine: gemini | claude | copilot", enum: ["gemini", "claude", "copilot"] },
86
+ model: { type: "string", description: "Model override (e.g. gpt-5-mini, sonnet, gemini-2.5-flash)" },
87
+ workdir: { type: "string", description: "Working directory for .pde/ storage (default: cwd)" }
88
+ },
89
+ required: ["prompt"]
90
+ }
91
+ },
92
+ {
93
+ name: "miaco_decompose_list",
94
+ description: "List stored decompositions from .pde/ folder",
95
+ inputSchema: {
96
+ type: "object",
97
+ properties: {
98
+ workdir: { type: "string", description: "Working directory" },
99
+ limit: { type: "string", description: "Max results (default: 10)" }
100
+ }
101
+ }
102
+ },
103
+ {
104
+ name: "miaco_decompose_get",
105
+ description: "Retrieve a stored decomposition by ID",
106
+ inputSchema: {
107
+ type: "object",
108
+ properties: {
109
+ id: { type: "string", description: "Decomposition UUID" },
110
+ workdir: { type: "string", description: "Working directory" }
111
+ },
112
+ required: ["id"]
113
+ }
114
+ }
115
+ ];
116
+
117
+ export async function handleMiacoTool(name: string, args: Record<string, any>): Promise<MCPToolResult> {
118
+ try {
119
+ let cliArgs: string[];
120
+
121
+ switch (name) {
122
+ case "miaco_chart_create":
123
+ cliArgs = buildArgs(
124
+ ["chart", "create"],
125
+ args,
126
+ { outcome: "--outcome", reality: "--reality", due: "--due" }
127
+ );
128
+ break;
129
+
130
+ case "miaco_chart_list":
131
+ cliArgs = buildArgs(["chart", "list"], args, {});
132
+ break;
133
+
134
+ case "miaco_chart_add_step":
135
+ cliArgs = buildArgs(
136
+ ["chart", "add-step"],
137
+ args,
138
+ { chart: "--chart", title: "--title", reality: "--reality" }
139
+ );
140
+ break;
141
+
142
+ case "miaco_chart_complete":
143
+ cliArgs = buildArgs(
144
+ ["chart", "complete"],
145
+ args,
146
+ { step: "--step" }
147
+ );
148
+ break;
149
+
150
+ case "miaco_chart_review":
151
+ cliArgs = buildArgs(
152
+ ["chart", "review"],
153
+ args,
154
+ { chart: "--chart" }
155
+ );
156
+ break;
157
+
158
+ // PDE tools — use CLI with --json flag
159
+ case "miaco_decompose":
160
+ cliArgs = buildArgs(
161
+ ["decompose", "run"],
162
+ args,
163
+ { prompt: "--prompt", engine: "--engine", model: "--model", workdir: "--workdir" }
164
+ );
165
+ break;
166
+
167
+ case "miaco_decompose_list":
168
+ cliArgs = buildArgs(
169
+ ["decompose", "list"],
170
+ args,
171
+ { workdir: "--workdir", limit: "--limit" }
172
+ );
173
+ break;
174
+
175
+ case "miaco_decompose_get":
176
+ cliArgs = ["decompose", "get", args.id || ""];
177
+ if (args.workdir) cliArgs.push("--workdir", args.workdir);
178
+ break;
179
+
180
+ default:
181
+ return createToolResult({ error: `Unknown tool: ${name}` }, true);
182
+ }
183
+
184
+ const output = await runCLI(CLI_PATH, cliArgs);
185
+ const result = parseJSONOutput(output);
186
+ return createToolResult(result);
187
+
188
+ } catch (err: any) {
189
+ return createToolResult({ error: err.message }, true);
190
+ }
191
+ }
192
+
193
+ export const miacoServerConfig = {
194
+ name: "miaco",
195
+ version: "0.1.0",
196
+ description: "Engineering World MCP Server - Structural tension charts, schemas, validation",
197
+ tools: miacoTools,
198
+ handleTool: handleMiacoTool
199
+ };