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.
- package/README.md +42 -0
- package/dist/api/agent.d.ts +84 -0
- package/dist/api/agent.js +92 -0
- package/dist/api/agent.js.map +1 -0
- package/dist/api/client.d.ts +3 -0
- package/dist/api/client.js +2 -0
- package/dist/api/client.js.map +1 -1
- package/dist/api/commit.js +1 -0
- package/dist/api/commit.js.map +1 -1
- package/dist/api/objects.d.ts +12 -0
- package/dist/api/objects.js +2 -0
- package/dist/api/objects.js.map +1 -1
- package/dist/api/txPlan.d.ts +15 -0
- package/dist/api/txPlan.js +196 -0
- package/dist/api/txPlan.js.map +1 -0
- package/dist/commands/agent.d.ts +2 -0
- package/dist/commands/agent.js +76 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/create.js +1 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/impl/adoptImpl.js +3 -0
- package/dist/commands/impl/adoptImpl.js.map +1 -1
- package/dist/commands/impl/agentImpl.d.ts +10 -0
- package/dist/commands/impl/agentImpl.js +349 -0
- package/dist/commands/impl/agentImpl.js.map +1 -0
- package/dist/commands/impl/createImpl.js +19 -0
- package/dist/commands/impl/createImpl.js.map +1 -1
- package/dist/commands/impl/initImpl.js +19 -0
- package/dist/commands/impl/initImpl.js.map +1 -1
- package/dist/commands/impl/syncImpl.js +9 -3
- package/dist/commands/impl/syncImpl.js.map +1 -1
- package/dist/commands/init.js +1 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/merge/applyOps.d.ts +4 -1
- package/dist/merge/applyOps.js +42 -30
- package/dist/merge/applyOps.js.map +1 -1
- package/dist/merge/childrenOrder.d.ts +13 -0
- package/dist/merge/childrenOrder.js +51 -0
- package/dist/merge/childrenOrder.js.map +1 -0
- package/dist/project/agentState.d.ts +24 -0
- package/dist/project/agentState.js +42 -0
- package/dist/project/agentState.js.map +1 -0
- package/dist/project/secret.d.ts +6 -2
- package/dist/project/secret.js +11 -5
- package/dist/project/secret.js.map +1 -1
- package/dist/services/adoptService.js +11 -0
- package/dist/services/adoptService.js.map +1 -1
- package/dist/services/agentInstall.d.ts +35 -0
- package/dist/services/agentInstall.js +180 -0
- package/dist/services/agentInstall.js.map +1 -0
- package/dist/services/agentLease.d.ts +2 -0
- package/dist/services/agentLease.js +32 -0
- package/dist/services/agentLease.js.map +1 -0
- package/dist/services/clientFactory.d.ts +2 -0
- package/dist/services/clientFactory.js +16 -1
- package/dist/services/clientFactory.js.map +1 -1
- package/dist/services/scaffold.js +4 -0
- package/dist/services/scaffold.js.map +1 -1
- package/dist/services/syncEngine.js +91 -42
- package/dist/services/syncEngine.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.js.map +1 -1
- package/dist/ui/report.d.ts +7 -0
- package/dist/ui/report.js +8 -0
- package/dist/ui/report.js.map +1 -1
- package/package.json +3 -3
- package/templates/claude/CLAUDE.md +7 -0
- package/templates/claude/mapples.md +118 -0
- package/templates/claude/mcp.json +11 -0
- package/templates/claude/skills/mapples-conventions/SKILL.md +136 -0
- package/templates/claude/skills/mapples-design/SKILL.md +218 -0
- package/templates/claude/skills/mapples-design/reference/component-library.md +128 -0
- package/templates/claude/skills/mapples-design/reference/design-tokens.md +132 -0
- package/templates/claude/skills/mapples-design/reference/layout-contract.md +227 -0
- package/templates/claude/skills/mapples-design/reference/lint-checklist.md +51 -0
- package/templates/claude/skills/mapples-design/reference/plan.md +95 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/empty-states.md +14 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/forms-and-auth.md +22 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/home-dashboard.md +14 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/list-and-detail.md +18 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/microcopy.md +20 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/navigation-chrome.md +21 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/onboarding-flow.md +15 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/screen-flow-wiring.md +37 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/settings-profile.md +16 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/stats-and-progress.md +17 -0
- package/templates/claude/skills/mapples-design/reference/playbooks/visual-hierarchy.md +18 -0
- package/templates/claude/skills/mapples-design/reference/style-guides.md +92 -0
- package/templates/claude/skills/mapples-sync/SKILL.md +92 -0
- package/templates/gitignore +2 -0
- package/templates/package.json +1 -0
|
@@ -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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"}
|
package/dist/commands/create.js
CHANGED
|
@@ -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;
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
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
|