mapples 0.2.0-beta.4 → 0.2.0-beta.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.
Files changed (93) hide show
  1. package/README.md +42 -0
  2. package/dist/api/agent.d.ts +84 -0
  3. package/dist/api/agent.js +92 -0
  4. package/dist/api/agent.js.map +1 -0
  5. package/dist/api/client.d.ts +3 -0
  6. package/dist/api/client.js +2 -0
  7. package/dist/api/client.js.map +1 -1
  8. package/dist/api/commit.js +1 -0
  9. package/dist/api/commit.js.map +1 -1
  10. package/dist/api/objects.d.ts +12 -0
  11. package/dist/api/objects.js +2 -0
  12. package/dist/api/objects.js.map +1 -1
  13. package/dist/api/txPlan.d.ts +15 -0
  14. package/dist/api/txPlan.js +196 -0
  15. package/dist/api/txPlan.js.map +1 -0
  16. package/dist/commands/agent.d.ts +2 -0
  17. package/dist/commands/agent.js +76 -0
  18. package/dist/commands/agent.js.map +1 -0
  19. package/dist/commands/create.js +1 -0
  20. package/dist/commands/create.js.map +1 -1
  21. package/dist/commands/impl/adoptImpl.js +3 -0
  22. package/dist/commands/impl/adoptImpl.js.map +1 -1
  23. package/dist/commands/impl/agentImpl.d.ts +10 -0
  24. package/dist/commands/impl/agentImpl.js +349 -0
  25. package/dist/commands/impl/agentImpl.js.map +1 -0
  26. package/dist/commands/impl/createImpl.js +19 -0
  27. package/dist/commands/impl/createImpl.js.map +1 -1
  28. package/dist/commands/impl/initImpl.js +19 -0
  29. package/dist/commands/impl/initImpl.js.map +1 -1
  30. package/dist/commands/impl/syncImpl.js +9 -3
  31. package/dist/commands/impl/syncImpl.js.map +1 -1
  32. package/dist/commands/init.js +1 -0
  33. package/dist/commands/init.js.map +1 -1
  34. package/dist/index.js +12 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/merge/applyOps.d.ts +4 -1
  37. package/dist/merge/applyOps.js +42 -30
  38. package/dist/merge/applyOps.js.map +1 -1
  39. package/dist/merge/childrenOrder.d.ts +13 -0
  40. package/dist/merge/childrenOrder.js +51 -0
  41. package/dist/merge/childrenOrder.js.map +1 -0
  42. package/dist/project/agentState.d.ts +24 -0
  43. package/dist/project/agentState.js +42 -0
  44. package/dist/project/agentState.js.map +1 -0
  45. package/dist/project/secret.d.ts +6 -2
  46. package/dist/project/secret.js +11 -5
  47. package/dist/project/secret.js.map +1 -1
  48. package/dist/services/adoptService.js +11 -0
  49. package/dist/services/adoptService.js.map +1 -1
  50. package/dist/services/agentInstall.d.ts +35 -0
  51. package/dist/services/agentInstall.js +180 -0
  52. package/dist/services/agentInstall.js.map +1 -0
  53. package/dist/services/agentLease.d.ts +2 -0
  54. package/dist/services/agentLease.js +32 -0
  55. package/dist/services/agentLease.js.map +1 -0
  56. package/dist/services/clientFactory.d.ts +2 -0
  57. package/dist/services/clientFactory.js +16 -1
  58. package/dist/services/clientFactory.js.map +1 -1
  59. package/dist/services/scaffold.js +4 -0
  60. package/dist/services/scaffold.js.map +1 -1
  61. package/dist/services/syncEngine.js +91 -42
  62. package/dist/services/syncEngine.js.map +1 -1
  63. package/dist/types.d.ts +11 -0
  64. package/dist/types.js.map +1 -1
  65. package/dist/ui/report.d.ts +7 -0
  66. package/dist/ui/report.js +8 -0
  67. package/dist/ui/report.js.map +1 -1
  68. package/package.json +3 -3
  69. package/templates/claude/CLAUDE.md +7 -0
  70. package/templates/claude/mapples.md +118 -0
  71. package/templates/claude/mcp.json +11 -0
  72. package/templates/claude/skills/mapples-conventions/SKILL.md +136 -0
  73. package/templates/claude/skills/mapples-design/SKILL.md +218 -0
  74. package/templates/claude/skills/mapples-design/reference/component-library.md +128 -0
  75. package/templates/claude/skills/mapples-design/reference/design-tokens.md +132 -0
  76. package/templates/claude/skills/mapples-design/reference/layout-contract.md +227 -0
  77. package/templates/claude/skills/mapples-design/reference/lint-checklist.md +51 -0
  78. package/templates/claude/skills/mapples-design/reference/plan.md +95 -0
  79. package/templates/claude/skills/mapples-design/reference/playbooks/empty-states.md +14 -0
  80. package/templates/claude/skills/mapples-design/reference/playbooks/forms-and-auth.md +22 -0
  81. package/templates/claude/skills/mapples-design/reference/playbooks/home-dashboard.md +14 -0
  82. package/templates/claude/skills/mapples-design/reference/playbooks/list-and-detail.md +18 -0
  83. package/templates/claude/skills/mapples-design/reference/playbooks/microcopy.md +20 -0
  84. package/templates/claude/skills/mapples-design/reference/playbooks/navigation-chrome.md +21 -0
  85. package/templates/claude/skills/mapples-design/reference/playbooks/onboarding-flow.md +15 -0
  86. package/templates/claude/skills/mapples-design/reference/playbooks/screen-flow-wiring.md +37 -0
  87. package/templates/claude/skills/mapples-design/reference/playbooks/settings-profile.md +16 -0
  88. package/templates/claude/skills/mapples-design/reference/playbooks/stats-and-progress.md +17 -0
  89. package/templates/claude/skills/mapples-design/reference/playbooks/visual-hierarchy.md +18 -0
  90. package/templates/claude/skills/mapples-design/reference/style-guides.md +92 -0
  91. package/templates/claude/skills/mapples-sync/SKILL.md +92 -0
  92. package/templates/gitignore +2 -0
  93. package/templates/package.json +1 -0
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAgent(program: Command): void;
@@ -0,0 +1,76 @@
1
+ import { Option } from 'commander';
2
+ const denv = () => new Option('--denv <env>').hideHelp(); // internal: dev|staging|prod
3
+ export function registerAgent(program) {
4
+ const agent = program
5
+ .command('agent')
6
+ .description('Agent-session lease: tell Creator an AI agent is working on this project');
7
+ agent
8
+ .command('install')
9
+ .description('Write the Claude Code skills bundle (.claude/, .mcp.json, CLAUDE.md) into a linked app')
10
+ .option('--agent <name>', 'agent to set up (claude)', 'claude')
11
+ .option('--force', 'regenerate files you edited (your version is kept as _depr_…old)')
12
+ .addOption(denv())
13
+ .option('--json', 'machine-readable output')
14
+ .action(async (opts) => {
15
+ const { runAgentInstall } = await import('./impl/agentImpl.js');
16
+ await runAgentInstall(opts);
17
+ });
18
+ agent
19
+ .command('start')
20
+ .description('Take the project lease (exit 4 when another agent session is live)')
21
+ .option('--label <label>', 'session label shown in Creator', 'Claude Code')
22
+ .option('--steps <titles>', 'comma-separated step titles to pre-declare')
23
+ .option('--takeover', 'disconnect a live session and take the lease')
24
+ .option('--no-daemon', 'do not spawn the heartbeat daemon')
25
+ .addOption(denv())
26
+ .option('--json', 'machine-readable output')
27
+ .action(async (opts) => {
28
+ const { runAgentStart } = await import('./impl/agentImpl.js');
29
+ await runAgentStart(opts);
30
+ });
31
+ agent
32
+ .command('step')
33
+ .description('Report a step (exit 3 when the lease is gone)')
34
+ .requiredOption('--index <n>', 'step index (0-based)')
35
+ .option('--title <title>', 'step title (required for a new index)')
36
+ .requiredOption('--status <status>', 'running | done | failed | skipped | pending')
37
+ .option('--detail <text>', 'one line of detail')
38
+ .addOption(denv())
39
+ .option('--json', 'machine-readable output')
40
+ .action(async (opts) => {
41
+ const { runAgentStep } = await import('./impl/agentImpl.js');
42
+ await runAgentStep(opts);
43
+ });
44
+ agent
45
+ .command('heartbeat')
46
+ .description('Keep the lease alive once (exit 3 when the lease is gone)')
47
+ .addOption(new Option('--loop').hideHelp()) // the daemon
48
+ .addOption(new Option('--max-minutes <n>').hideHelp().default('180'))
49
+ .addOption(denv())
50
+ .option('--json', 'machine-readable output')
51
+ .action(async (opts) => {
52
+ const { runAgentHeartbeat } = await import('./impl/agentImpl.js');
53
+ await runAgentHeartbeat(opts);
54
+ });
55
+ agent
56
+ .command('stop')
57
+ .description('Release the lease and stop the heartbeat daemon')
58
+ .option('--status <status>', 'done | failed', 'done')
59
+ .option('--error <text>', 'why the run failed')
60
+ .addOption(denv())
61
+ .option('--json', 'machine-readable output')
62
+ .action(async (opts) => {
63
+ const { runAgentStop } = await import('./impl/agentImpl.js');
64
+ await runAgentStop(opts);
65
+ });
66
+ agent
67
+ .command('status')
68
+ .description("Show the project's live agent session and this checkout's local state")
69
+ .addOption(denv())
70
+ .option('--json', 'machine-readable output')
71
+ .action(async (opts) => {
72
+ const { runAgentStatus } = await import('./impl/agentImpl.js');
73
+ await runAgentStatus(opts);
74
+ });
75
+ }
76
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export function registerCreate(program) {
5
5
  .description('Scaffold a new Mapples-connected Expo app')
6
6
  .option('--secret <secret>', 'project API secret (Creator: Project → Settings)')
7
7
  .option('--api-url <url>', 'Mapples API base URL')
8
+ .option('--agent <name>', 'also set up an AI agent (claude = Claude Code skills + .mcp.json)')
8
9
  .addOption(new Option('--denv <env>').hideHelp()) // internal: dev|staging|prod
9
10
  .option('--json', 'machine-readable output')
10
11
  .action(async (app, opts) => {
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,6BAA6B;SAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAA6B,EAAE,EAAE;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,MAAM,CAAC,gBAAgB,EAAE,mEAAmE,CAAC;SAC7F,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,6BAA6B;SAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAA6B,EAAE,EAAE;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,12 +1,15 @@
1
1
  import chalk from 'chalk';
2
2
  import { proposeAdoptions } from '../../services/adoptService.js';
3
+ import { touchAgentLease } from '../../services/agentLease.js';
3
4
  import { clientForApp } from '../../services/clientFactory.js';
4
5
  import { emptyReport, renderReport } from '../../ui/report.js';
5
6
  export async function runAdopt(file, opts) {
6
7
  const root = process.cwd();
7
8
  const client = clientForApp(root, opts);
8
9
  const report = emptyReport();
10
+ await touchAgentLease(root, report, opts);
9
11
  await proposeAdoptions({ root, client, report, yes: true, file });
12
+ await touchAgentLease(root, report, opts);
10
13
  if (opts.json === true) {
11
14
  console.log(JSON.stringify(report, null, 2));
12
15
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"adoptImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/adoptImpl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAA6B;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"adoptImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/adoptImpl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAA6B;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAE1C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type InstallOutcome } from '../../services/agentInstall.js';
2
+ export declare const EXIT_LEASE_GONE = 3;
3
+ export declare const EXIT_BUSY = 4;
4
+ export declare function runAgentInstall(opts: Record<string, unknown>): Promise<void>;
5
+ export declare function renderInstallOutcomes(outcomes: InstallOutcome[]): string[];
6
+ export declare function runAgentStart(opts: Record<string, unknown>): Promise<void>;
7
+ export declare function runAgentStep(opts: Record<string, unknown>): Promise<void>;
8
+ export declare function runAgentHeartbeat(opts: Record<string, unknown>): Promise<void>;
9
+ export declare function runAgentStop(opts: Record<string, unknown>): Promise<void>;
10
+ export declare function runAgentStatus(opts: Record<string, unknown>): Promise<void>;
@@ -0,0 +1,349 @@
1
+ // `mapples agent …` — the lease driver a Claude Code run calls between its
2
+ // phases. Exit codes: 0 ok · 1 error · 3 lease gone · 4 project busy.
3
+ import { spawn } from 'node:child_process';
4
+ import chalk from 'chalk';
5
+ import { AgentSessionError, } from '../../api/agent.js';
6
+ import { isNetworkError } from '../../api/client.js';
7
+ import { agentStatePath, clearAgentState, readAgentState, writeAgentState, } from '../../project/agentState.js';
8
+ import { readConfig } from '../../project/config.js';
9
+ import { resolveApiUrl } from '../../project/env.js';
10
+ import { claudeNextSteps, installClaudeIntegration, parseAgentName, } from '../../services/agentInstall.js';
11
+ import { agentClientForApp } from '../../services/clientFactory.js';
12
+ export const EXIT_LEASE_GONE = 3;
13
+ export const EXIT_BUSY = 4;
14
+ const STEP_STATUSES = [
15
+ 'pending',
16
+ 'running',
17
+ 'done',
18
+ 'failed',
19
+ 'skipped',
20
+ ];
21
+ function emit(opts, json, lines) {
22
+ if (opts.json === true) {
23
+ console.log(JSON.stringify(json, null, 2));
24
+ return;
25
+ }
26
+ for (const line of lines)
27
+ console.log(line);
28
+ }
29
+ function requireState(root) {
30
+ const state = readAgentState(root);
31
+ if (!state) {
32
+ throw new Error('no agent session in this checkout — run `mapples agent start` first');
33
+ }
34
+ return state;
35
+ }
36
+ function isAlive(pid) {
37
+ if (!pid)
38
+ return false;
39
+ try {
40
+ process.kill(pid, 0);
41
+ return true;
42
+ }
43
+ catch (err) {
44
+ // ESRCH: the daemon is gone. EPERM: a process exists but is not ours — alive.
45
+ return err.code === 'EPERM';
46
+ }
47
+ }
48
+ function killDaemon(pid) {
49
+ if (!pid)
50
+ return 'absent';
51
+ try {
52
+ process.kill(pid, 'SIGTERM');
53
+ return 'stopped';
54
+ }
55
+ catch (err) {
56
+ if (err.code === 'ESRCH')
57
+ return 'absent';
58
+ throw err;
59
+ }
60
+ }
61
+ /** The detached keep-alive: `mapples agent heartbeat --loop` in this checkout. */
62
+ function spawnDaemon(root, opts) {
63
+ const entry = process.argv[1];
64
+ if (!entry)
65
+ throw new Error('cannot locate the CLI entry point to spawn the heartbeat daemon');
66
+ const args = [entry, 'agent', 'heartbeat', '--loop'];
67
+ if (typeof opts.denv === 'string')
68
+ args.push('--denv', opts.denv);
69
+ const child = spawn(process.execPath, args, { cwd: root, detached: true, stdio: 'ignore' });
70
+ child.unref();
71
+ if (child.pid === undefined)
72
+ throw new Error('the heartbeat daemon did not start (no pid)');
73
+ return child.pid;
74
+ }
75
+ function describe(session) {
76
+ const done = session.steps.filter((s) => s.status === 'done').length;
77
+ return [
78
+ ` session ${session.uuid} (${session.status})`,
79
+ ` label ${session.label ?? '—'}${session.apiKey?.name ? chalk.gray(` · key ${session.apiKey.name}`) : ''}`,
80
+ ` since ${session.startedAt}`,
81
+ ` heartbeat ${session.lastHeartbeatAt} (expires ${session.expiresAt})`,
82
+ ` step ${session.currentStep ?? '—'} · ${done}/${session.steps.length} done`,
83
+ ...(session.error ? [` error ${session.error}`] : []),
84
+ ];
85
+ }
86
+ // ---- install ----
87
+ export async function runAgentInstall(opts) {
88
+ const root = process.cwd();
89
+ parseAgentName(opts.agent ?? 'claude');
90
+ const config = readConfig(root);
91
+ const apiUrl = resolveApiUrl({ denv: opts.denv, configuredUrl: config.apiUrl });
92
+ const result = installClaudeIntegration(root, {
93
+ apiUrl,
94
+ force: opts.force === true,
95
+ routesDir: config.routesDir,
96
+ pagesDir: config.pagesDir,
97
+ componentsDir: config.componentsDir,
98
+ });
99
+ emit(opts, { agent: 'claude', ...result }, [
100
+ chalk.bold('\nmapples agent install'),
101
+ ...renderInstallOutcomes(result.outcomes),
102
+ ...(result.mcpSnippet ? ['', 'Add this to your .mcp.json:', result.mcpSnippet] : []),
103
+ '',
104
+ ...claudeNextSteps(null),
105
+ ]);
106
+ }
107
+ export function renderInstallOutcomes(outcomes) {
108
+ const icon = {
109
+ created: chalk.green('A'),
110
+ updated: chalk.cyan('M'),
111
+ unchanged: chalk.gray('·'),
112
+ skipped: chalk.yellow('S'),
113
+ appended: chalk.cyan('+'),
114
+ deprecated: chalk.red('D'),
115
+ };
116
+ return outcomes
117
+ .filter((o) => o.action !== 'unchanged')
118
+ .map((o) => ` ${icon[o.action]} ${o.file}${o.detail ? chalk.gray(` — ${o.detail}`) : ''}`);
119
+ }
120
+ // ---- start ----
121
+ export async function runAgentStart(opts) {
122
+ const root = process.cwd();
123
+ const config = readConfig(root);
124
+ const client = agentClientForApp(root, opts);
125
+ const label = typeof opts.label === 'string' && opts.label.length > 0 ? opts.label : 'Claude Code';
126
+ const steps = typeof opts.steps === 'string'
127
+ ? opts.steps
128
+ .split(',')
129
+ .map((title) => title.trim())
130
+ .filter((title) => title.length > 0)
131
+ .map((title) => ({ title }))
132
+ : undefined;
133
+ const wantDaemon = opts.daemon !== false;
134
+ // Idempotent re-run: this checkout already holds the live session.
135
+ const existing = readAgentState(root);
136
+ if (existing) {
137
+ const live = await client.current();
138
+ if (live && live.uuid === existing.uuid && live.status === 'active') {
139
+ let pid = existing.heartbeatPid;
140
+ if (wantDaemon && !isAlive(pid)) {
141
+ pid = spawnDaemon(root, opts);
142
+ writeAgentState(root, { ...existing, heartbeatPid: pid });
143
+ }
144
+ emit(opts, { session: live, state: readAgentState(root), resumed: true }, [
145
+ chalk.bold('\nmapples agent start') + chalk.gray(' — already running'),
146
+ ...describe(live),
147
+ ]);
148
+ return;
149
+ }
150
+ clearAgentState(root);
151
+ }
152
+ let session;
153
+ try {
154
+ session = await client.start({
155
+ agent: 'claude-code',
156
+ label,
157
+ ...(steps && steps.length > 0 ? { steps } : {}),
158
+ ...(opts.takeover === true ? { force: true } : {}),
159
+ });
160
+ }
161
+ catch (err) {
162
+ if (err instanceof AgentSessionError && err.code === 'SESSION_ACTIVE') {
163
+ const busy = err.session;
164
+ process.exitCode = EXIT_BUSY;
165
+ emit(opts, { busy: true, session: busy, exitCode: EXIT_BUSY }, [
166
+ chalk.yellow.bold('\nproject busy — another agent session holds it'),
167
+ ...(busy ? describe(busy) : [` ${err.message}`]),
168
+ chalk.gray(' re-run with --takeover to disconnect it and take the lease'),
169
+ ]);
170
+ return;
171
+ }
172
+ throw err;
173
+ }
174
+ const state = {
175
+ schema: 1,
176
+ uuid: session.uuid,
177
+ label,
178
+ startedAt: session.startedAt,
179
+ apiUrl: resolveApiUrl({ denv: opts.denv, configuredUrl: config.apiUrl }),
180
+ projectId: config.projectId,
181
+ heartbeatSeconds: session.heartbeatSeconds,
182
+ };
183
+ writeAgentState(root, state);
184
+ if (wantDaemon) {
185
+ state.heartbeatPid = spawnDaemon(root, opts);
186
+ writeAgentState(root, state);
187
+ }
188
+ emit(opts, { session, state, resumed: false }, [
189
+ chalk.bold('\nmapples agent start'),
190
+ ...describe(session),
191
+ chalk.gray(wantDaemon
192
+ ? ` heartbeat daemon pid ${state.heartbeatPid} every ${session.heartbeatSeconds} s`
193
+ : ' no heartbeat daemon (--no-daemon) — keep the lease alive with `mapples agent heartbeat`'),
194
+ ]);
195
+ }
196
+ // ---- step ----
197
+ export async function runAgentStep(opts) {
198
+ const root = process.cwd();
199
+ const state = requireState(root);
200
+ const index = Number(opts.index);
201
+ if (!Number.isInteger(index) || index < 0)
202
+ throw new Error(`--index must be a non-negative integer`);
203
+ const status = opts.status;
204
+ if (!STEP_STATUSES.includes(status)) {
205
+ throw new Error(`--status must be one of ${STEP_STATUSES.join(', ')}`);
206
+ }
207
+ const title = typeof opts.title === 'string' ? opts.title : undefined;
208
+ const detail = typeof opts.detail === 'string' ? opts.detail : undefined;
209
+ const client = agentClientForApp(root, opts);
210
+ let session;
211
+ try {
212
+ session = await client.heartbeat(state.uuid, {
213
+ step: { index, ...(title ? { title } : {}), status, ...(detail ? { detail } : {}) },
214
+ ...(status === 'running' && title ? { currentStep: title } : {}),
215
+ });
216
+ }
217
+ catch (err) {
218
+ if (leaseGone(err, root, state, opts))
219
+ return;
220
+ throw err;
221
+ }
222
+ const reported = session.steps.find((s) => s.index === index);
223
+ writeAgentState(root, {
224
+ ...state,
225
+ lastStep: { index, title: reported?.title ?? title ?? `step ${index}`, status },
226
+ });
227
+ emit(opts, { session, step: reported ?? null }, [
228
+ `${chalk.bold('mapples agent step')} ${index} ${reported?.title ?? title ?? ''} → ${status}`,
229
+ ]);
230
+ }
231
+ /** SESSION_GONE handling shared by step/heartbeat/stop: exit 3, clear local state, stop the daemon. */
232
+ function leaseGone(err, root, state, opts) {
233
+ if (!(err instanceof AgentSessionError) || err.code !== 'SESSION_GONE')
234
+ return false;
235
+ killDaemon(state.heartbeatPid);
236
+ clearAgentState(root);
237
+ process.exitCode = EXIT_LEASE_GONE;
238
+ emit(opts, { leaseGone: true, session: state.uuid, reason: err.message, exitCode: EXIT_LEASE_GONE }, [
239
+ chalk.red(`agent session ${state.uuid} is no longer active (${err.message}) — local state cleared`),
240
+ ]);
241
+ return true;
242
+ }
243
+ // ---- heartbeat ----
244
+ export async function runAgentHeartbeat(opts) {
245
+ const root = process.cwd();
246
+ if (opts.loop === true) {
247
+ process.exitCode = await heartbeatLoop(root, opts);
248
+ return;
249
+ }
250
+ const state = requireState(root);
251
+ const client = agentClientForApp(root, opts);
252
+ try {
253
+ const session = await client.heartbeat(state.uuid);
254
+ emit(opts, { session }, [
255
+ `${chalk.bold('mapples agent heartbeat')} ok (${session.lastHeartbeatAt})`,
256
+ ]);
257
+ }
258
+ catch (err) {
259
+ if (leaseGone(err, root, state, opts))
260
+ return;
261
+ throw err;
262
+ }
263
+ }
264
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
265
+ /**
266
+ * The daemon body. Stops (exit 0) when the state file is gone or names
267
+ * another session, after --max-minutes; exit 3 when the server says the
268
+ * lease is gone. Network errors are retried on the next tick.
269
+ */
270
+ async function heartbeatLoop(root, opts) {
271
+ const initial = readAgentState(root);
272
+ if (!initial)
273
+ return 0;
274
+ const maxMinutes = Number(opts.maxMinutes ?? 180);
275
+ const deadline = Date.now() + maxMinutes * 60_000;
276
+ let client = agentClientForApp(root, opts);
277
+ let intervalMs = Math.max(1, initial.heartbeatSeconds) * 1000;
278
+ while (Date.now() < deadline) {
279
+ const state = readAgentState(root);
280
+ if (!state || state.uuid !== initial.uuid)
281
+ return 0;
282
+ try {
283
+ const session = await client.heartbeat(state.uuid);
284
+ intervalMs = Math.max(1, session.heartbeatSeconds) * 1000;
285
+ }
286
+ catch (err) {
287
+ if (err instanceof AgentSessionError && err.code === 'SESSION_GONE')
288
+ return EXIT_LEASE_GONE;
289
+ if (!(err instanceof AgentSessionError) && !isNetworkError(err))
290
+ throw err;
291
+ // Refused for another reason or unreachable: keep trying — the lease
292
+ // has 90 s and the next tick may land.
293
+ client = agentClientForApp(root, opts);
294
+ }
295
+ await sleep(intervalMs);
296
+ }
297
+ return 0;
298
+ }
299
+ // ---- stop ----
300
+ export async function runAgentStop(opts) {
301
+ const root = process.cwd();
302
+ const state = readAgentState(root);
303
+ if (!state) {
304
+ emit(opts, { released: false, reason: 'no local agent session' }, [
305
+ chalk.gray('no agent session in this checkout — nothing to stop'),
306
+ ]);
307
+ return;
308
+ }
309
+ const status = opts.status === 'failed' ? 'failed' : 'done';
310
+ if (opts.status !== undefined && opts.status !== 'done' && opts.status !== 'failed') {
311
+ throw new Error('--status must be done or failed');
312
+ }
313
+ const error = typeof opts.error === 'string' ? opts.error : undefined;
314
+ const client = agentClientForApp(root, opts);
315
+ let session = null;
316
+ let note = null;
317
+ try {
318
+ session = await client.release(state.uuid, { status, ...(error ? { error } : {}) });
319
+ }
320
+ catch (err) {
321
+ if (!(err instanceof AgentSessionError) || err.code !== 'SESSION_GONE')
322
+ throw err;
323
+ note = `session ${state.uuid} was already gone (${err.message})`;
324
+ }
325
+ const daemon = killDaemon(state.heartbeatPid);
326
+ clearAgentState(root);
327
+ emit(opts, { released: session !== null, session, daemon, note }, [
328
+ chalk.bold('\nmapples agent stop'),
329
+ ...(session ? describe(session) : [` ${note}`]),
330
+ chalk.gray(` heartbeat daemon ${daemon}; ${agentStatePath(root).slice(root.length + 1)} removed`),
331
+ ]);
332
+ }
333
+ // ---- status ----
334
+ export async function runAgentStatus(opts) {
335
+ const root = process.cwd();
336
+ readConfig(root);
337
+ const state = readAgentState(root);
338
+ const session = await agentClientForApp(root, opts).current();
339
+ const daemonAlive = state ? isAlive(state.heartbeatPid) : false;
340
+ const holdsLease = state !== null && session !== null && session.uuid === state.uuid;
341
+ emit(opts, { session, state, holdsLease, daemonAlive }, [
342
+ chalk.bold('\nmapples agent status'),
343
+ ...(session ? describe(session) : [' no agent session on this project']),
344
+ state
345
+ ? chalk.gray(` local ${state.uuid}${holdsLease ? ' (this checkout holds the lease)' : ' (stale — run `mapples agent stop`)'}; daemon ${daemonAlive ? `alive (pid ${state.heartbeatPid})` : 'not running'}`)
346
+ : chalk.gray(' local no session state in this checkout'),
347
+ ]);
348
+ }
349
+ //# sourceMappingURL=agentImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/agentImpl.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,12 @@ import { resolveProject } from '../../api/auth.js';
7
7
  import { DEFAULT_PAGES_DIR, writeConfig } from '../../project/config.js';
8
8
  import { assetUrlFor, resolveApiUrl } from '../../project/env.js';
9
9
  import { writeSecret } from '../../project/secret.js';
10
+ import { claudeNextSteps, installClaudeIntegration, parseAgentName, } from '../../services/agentInstall.js';
10
11
  import { scaffoldApp } from '../../services/scaffold.js';
11
12
  import { runSyncEngine } from '../../services/syncEngine.js';
12
13
  import { renderReport } from '../../ui/report.js';
13
14
  import { cliOrigin } from '../../version.js';
15
+ import { renderInstallOutcomes } from './agentImpl.js';
14
16
  export async function askSecret(opts) {
15
17
  if (typeof opts.secret === 'string' && opts.secret.length > 0)
16
18
  return opts.secret;
@@ -29,6 +31,7 @@ export async function runCreate(app, opts) {
29
31
  if (existsSync(target) && readdirSync(target).length > 0) {
30
32
  throw new Error(`${target} already exists and is not empty`);
31
33
  }
34
+ const agent = parseAgentName(opts.agent);
32
35
  const secret = await askSecret(opts);
33
36
  const apiUrl = resolveApiUrl({ apiUrl: opts.apiUrl, denv: opts.denv });
34
37
  const { projectId, name } = await resolveProject(apiUrl, secret);
@@ -50,6 +53,17 @@ export async function runCreate(app, opts) {
50
53
  for (const file of written)
51
54
  console.log(` ${chalk.green('A')} ${file}`);
52
55
  console.log(` ${chalk.green('A')} .mapples/secret ${chalk.gray('(gitignored)')}`);
56
+ let mcpSnippet = null;
57
+ if (agent === 'claude') {
58
+ const install = installClaudeIntegration(target, {
59
+ apiUrl,
60
+ routesDir: 'app',
61
+ pagesDir: DEFAULT_PAGES_DIR,
62
+ });
63
+ for (const line of renderInstallOutcomes(install.outcomes))
64
+ console.log(line);
65
+ mcpSnippet = install.mcpSnippet;
66
+ }
53
67
  // First sync pulls the whole project (tolerates being offline).
54
68
  const client = new JpatchClient({
55
69
  baseUrl: apiUrl,
@@ -74,5 +88,10 @@ export async function runCreate(app, opts) {
74
88
  ' yarn install (or npm install)',
75
89
  ' npx expo start',
76
90
  ].join('\n'));
91
+ if (agent === 'claude') {
92
+ if (mcpSnippet)
93
+ console.log(['', 'Add this to your .mcp.json:', mcpSnippet].join('\n'));
94
+ console.log(['', ...claudeNextSteps(app)].join('\n'));
95
+ }
77
96
  }
78
97
  //# sourceMappingURL=createImpl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/createImpl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/createImpl.ts"],"names":[],"mappings":"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"}
@@ -6,10 +6,12 @@ import { resolveProject } from '../../api/auth.js';
6
6
  import { DEFAULT_PAGES_DIR, DEFAULT_ROUTES_DIR, writeConfig, configPath, } from '../../project/config.js';
7
7
  import { assetUrlFor, resolveApiUrl } from '../../project/env.js';
8
8
  import { writeSecret } from '../../project/secret.js';
9
+ import { claudeNextSteps, installClaudeIntegration, parseAgentName, } from '../../services/agentInstall.js';
9
10
  import { ensureBabelPlugin, writeSidTypes } from '../../services/scaffold.js';
10
11
  import { runSyncEngine } from '../../services/syncEngine.js';
11
12
  import { renderReport } from '../../ui/report.js';
12
13
  import { cliOrigin } from '../../version.js';
14
+ import { renderInstallOutcomes } from './agentImpl.js';
13
15
  import { askSecret } from './createImpl.js';
14
16
  export async function runInit(opts) {
15
17
  const root = process.cwd();
@@ -19,6 +21,7 @@ export async function runInit(opts) {
19
21
  if (existsSync(configPath(root))) {
20
22
  throw new Error('this app is already linked (.mapples/config.json exists) — run `mapples sync`');
21
23
  }
24
+ const agent = parseAgentName(opts.agent);
22
25
  const secret = await askSecret(opts);
23
26
  const apiUrl = resolveApiUrl({ apiUrl: opts.apiUrl, denv: opts.denv });
24
27
  const { projectId, name } = await resolveProject(apiUrl, secret);
@@ -42,6 +45,17 @@ export async function runInit(opts) {
42
45
  console.log(chalk.yellow(` ⚠ add 'babel-plugin-mapples-sid' to the plugins of your babel.config.js (not edited automatically)`));
43
46
  }
44
47
  console.log(chalk.gray(` ℹ ensure mapples/sid.d.ts is included by your tsconfig (add it to "include" if needed)`));
48
+ let mcpSnippet = null;
49
+ if (agent === 'claude') {
50
+ const install = installClaudeIntegration(root, {
51
+ apiUrl,
52
+ routesDir: DEFAULT_ROUTES_DIR,
53
+ pagesDir: DEFAULT_PAGES_DIR,
54
+ });
55
+ for (const line of renderInstallOutcomes(install.outcomes))
56
+ console.log(line);
57
+ mcpSnippet = install.mcpSnippet;
58
+ }
45
59
  const client = new JpatchClient({
46
60
  baseUrl: apiUrl,
47
61
  assetsBaseUrl: assetUrlFor(apiUrl),
@@ -58,5 +72,10 @@ export async function runInit(opts) {
58
72
  throw err;
59
73
  console.log(chalk.yellow(' offline — run `mapples sync` once you are online'));
60
74
  }
75
+ if (agent === 'claude') {
76
+ if (mcpSnippet)
77
+ console.log(['', 'Add this to your .mcp.json:', mcpSnippet].join('\n'));
78
+ console.log(['', ...claudeNextSteps(null)].join('\n'));
79
+ }
61
80
  }
62
81
  //# sourceMappingURL=initImpl.js.map