mapples 0.2.0-beta.1 → 0.2.0-beta.10
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 +133 -22
- package/dist/adopt/scan.d.ts +8 -2
- package/dist/adopt/scan.js +31 -13
- package/dist/adopt/scan.js.map +1 -1
- package/dist/api/agent.d.ts +85 -0
- package/dist/api/agent.js +92 -0
- package/dist/api/agent.js.map +1 -0
- package/dist/api/client.d.ts +12 -1
- package/dist/api/client.js +23 -2
- package/dist/api/client.js.map +1 -1
- package/dist/api/commit.d.ts +9 -0
- package/dist/api/commit.js +33 -2
- package/dist/api/commit.js.map +1 -1
- package/dist/api/errors.js +12 -2
- package/dist/api/errors.js.map +1 -1
- package/dist/api/objects.d.ts +36 -5
- package/dist/api/objects.js +176 -10
- package/dist/api/objects.js.map +1 -1
- package/dist/api/poll.d.ts +5 -3
- package/dist/api/poll.js +17 -6
- package/dist/api/poll.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/assets/assets.d.ts +9 -0
- package/dist/assets/assets.js +33 -4
- package/dist/assets/assets.js.map +1 -1
- package/dist/codegen/emit.d.ts +4 -7
- package/dist/codegen/emit.js +10 -29
- package/dist/codegen/emit.js.map +1 -1
- package/dist/codegen/imports.d.ts +8 -15
- package/dist/codegen/imports.js +27 -72
- package/dist/codegen/imports.js.map +1 -1
- package/dist/codegen/instances.d.ts +5 -0
- package/dist/codegen/instances.js +30 -0
- package/dist/codegen/instances.js.map +1 -0
- package/dist/codegen/styles.d.ts +1 -0
- package/dist/codegen/styles.js +3 -0
- package/dist/codegen/styles.js.map +1 -0
- package/dist/commands/agent.d.ts +2 -0
- package/dist/commands/agent.js +87 -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 +23 -0
- package/dist/commands/impl/agentImpl.js +426 -0
- package/dist/commands/impl/agentImpl.js.map +1 -0
- package/dist/commands/impl/createImpl.js +31 -4
- package/dist/commands/impl/createImpl.js.map +1 -1
- package/dist/commands/impl/initImpl.js +28 -4
- package/dist/commands/impl/initImpl.js.map +1 -1
- package/dist/commands/impl/syncImpl.js +30 -5
- 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 +5 -2
- package/dist/merge/applyOps.js +75 -32
- 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/merge/diff.d.ts +20 -1
- package/dist/merge/diff.js +77 -17
- package/dist/merge/diff.js.map +1 -1
- package/dist/merge/threeWay.d.ts +2 -2
- package/dist/merge/threeWay.js +74 -10
- package/dist/merge/threeWay.js.map +1 -1
- package/dist/merge/toEdits.d.ts +1 -3
- package/dist/merge/toEdits.js +3 -91
- package/dist/merge/toEdits.js.map +1 -1
- package/dist/nav/navigatorTree.d.ts +78 -0
- package/dist/nav/navigatorTree.js +410 -0
- package/dist/nav/navigatorTree.js.map +1 -0
- package/dist/nav/placement.d.ts +53 -0
- package/dist/nav/placement.js +260 -0
- package/dist/nav/placement.js.map +1 -0
- package/dist/nav/routeTree.d.ts +8 -2
- package/dist/nav/routeTree.js +79 -151
- package/dist/nav/routeTree.js.map +1 -1
- package/dist/nav/screenOptions.d.ts +15 -0
- package/dist/nav/screenOptions.js +213 -0
- package/dist/nav/screenOptions.js.map +1 -0
- package/dist/project/agentState.d.ts +30 -0
- package/dist/project/agentState.js +42 -0
- package/dist/project/agentState.js.map +1 -0
- package/dist/project/baseStore.d.ts +19 -1
- package/dist/project/baseStore.js +28 -0
- package/dist/project/baseStore.js.map +1 -1
- package/dist/project/componentsMap.d.ts +7 -0
- package/dist/project/componentsMap.js +21 -0
- package/dist/project/componentsMap.js.map +1 -0
- package/dist/project/config.d.ts +12 -3
- package/dist/project/config.js +11 -2
- package/dist/project/config.js.map +1 -1
- package/dist/project/env.d.ts +10 -3
- package/dist/project/env.js +23 -5
- package/dist/project/env.js.map +1 -1
- package/dist/project/pagesMap.d.ts +2 -0
- package/dist/project/pagesMap.js.map +1 -1
- 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.d.ts +3 -0
- package/dist/services/adoptService.js +357 -38
- package/dist/services/adoptService.js.map +1 -1
- package/dist/services/agentInstall.d.ts +80 -0
- package/dist/services/agentInstall.js +309 -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 +20 -3
- package/dist/services/clientFactory.js.map +1 -1
- package/dist/services/doctorService.js +77 -66
- package/dist/services/doctorService.js.map +1 -1
- package/dist/services/scaffold.js +4 -0
- package/dist/services/scaffold.js.map +1 -1
- package/dist/services/syncEngine.d.ts +7 -0
- package/dist/services/syncEngine.js +719 -306
- package/dist/services/syncEngine.js.map +1 -1
- package/dist/style/theme.js +17 -1
- package/dist/style/theme.js.map +1 -1
- package/dist/types.d.ts +51 -2
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -1
- package/dist/ui/report.d.ts +15 -0
- package/dist/ui/report.js +30 -0
- package/dist/ui/report.js.map +1 -1
- package/package.json +3 -2
- package/templates/agent/agents-md/AGENTS.md +8 -0
- package/templates/agent/claude/CLAUDE.md +7 -0
- package/templates/agent/claude/mcp.json +11 -0
- package/templates/agent/claude/settings.json +26 -0
- package/templates/agent/codex/config.toml +6 -0
- package/templates/agent/codex/hooks.json +26 -0
- package/templates/agent/cursor/hooks.json +9 -0
- package/templates/agent/cursor/mcp.json +10 -0
- package/templates/agent/mapples.md +124 -0
- package/templates/agent/skills/mapples-conventions/SKILL.md +137 -0
- package/templates/agent/skills/mapples-design/SKILL.md +235 -0
- package/templates/agent/skills/mapples-design/reference/component-library.md +128 -0
- package/templates/agent/skills/mapples-design/reference/design-tokens.md +132 -0
- package/templates/agent/skills/mapples-design/reference/layout-contract.md +227 -0
- package/templates/agent/skills/mapples-design/reference/lint-checklist.md +51 -0
- package/templates/agent/skills/mapples-design/reference/plan.md +95 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/empty-states.md +14 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/forms-and-auth.md +22 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/home-dashboard.md +14 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/list-and-detail.md +18 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/microcopy.md +20 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/navigation-chrome.md +21 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/onboarding-flow.md +15 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/screen-flow-wiring.md +37 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/settings-profile.md +16 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/stats-and-progress.md +17 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/visual-hierarchy.md +18 -0
- package/templates/agent/skills/mapples-design/reference/style-guides.md +92 -0
- package/templates/agent/skills/mapples-sync/SKILL.md +93 -0
- package/templates/app/_layout.tsx +3 -0
- package/templates/app.json +0 -1
- package/templates/gitignore +2 -0
- package/templates/mapples/sid.d.ts +6 -0
- package/templates/package.json +12 -10
|
@@ -0,0 +1,426 @@
|
|
|
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 { AGENT_PROFILES, agentNextSteps, installAgentIntegration, hooksSnippetHeading, mcpSnippetHeading, parseAgentName, parseSessionAgent, sessionAgentLabel, } 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
|
+
// Hooks run the lease quietly: their stdout belongs to the agent's hook protocol.
|
|
23
|
+
if (opts.quiet === true)
|
|
24
|
+
return;
|
|
25
|
+
if (opts.json === true) {
|
|
26
|
+
console.log(JSON.stringify(json, null, 2));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
for (const line of lines)
|
|
30
|
+
console.log(line);
|
|
31
|
+
}
|
|
32
|
+
function requireState(root) {
|
|
33
|
+
const state = readAgentState(root);
|
|
34
|
+
if (!state) {
|
|
35
|
+
throw new Error('no agent session in this checkout — run `mapples agent start` first');
|
|
36
|
+
}
|
|
37
|
+
return state;
|
|
38
|
+
}
|
|
39
|
+
function isAlive(pid) {
|
|
40
|
+
if (!pid)
|
|
41
|
+
return false;
|
|
42
|
+
try {
|
|
43
|
+
process.kill(pid, 0);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
// ESRCH: the daemon is gone. EPERM: a process exists but is not ours — alive.
|
|
48
|
+
return err.code === 'EPERM';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function killDaemon(pid) {
|
|
52
|
+
if (!pid)
|
|
53
|
+
return 'absent';
|
|
54
|
+
try {
|
|
55
|
+
process.kill(pid, 'SIGTERM');
|
|
56
|
+
return 'stopped';
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (err.code === 'ESRCH')
|
|
60
|
+
return 'absent';
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** The detached keep-alive: `mapples agent heartbeat --loop` in this checkout. */
|
|
65
|
+
function spawnDaemon(root, opts) {
|
|
66
|
+
const entry = process.argv[1];
|
|
67
|
+
if (!entry)
|
|
68
|
+
throw new Error('cannot locate the CLI entry point to spawn the heartbeat daemon');
|
|
69
|
+
const args = [entry, 'agent', 'heartbeat', '--loop'];
|
|
70
|
+
if (typeof opts.denv === 'string')
|
|
71
|
+
args.push('--denv', opts.denv);
|
|
72
|
+
const child = spawn(process.execPath, args, { cwd: root, detached: true, stdio: 'ignore' });
|
|
73
|
+
child.unref();
|
|
74
|
+
if (child.pid === undefined)
|
|
75
|
+
throw new Error('the heartbeat daemon did not start (no pid)');
|
|
76
|
+
return child.pid;
|
|
77
|
+
}
|
|
78
|
+
function describe(session) {
|
|
79
|
+
const done = session.steps.filter((s) => s.status === 'done').length;
|
|
80
|
+
return [
|
|
81
|
+
` session ${session.uuid} (${session.status})`,
|
|
82
|
+
` label ${session.label ?? '—'}${session.apiKey?.name ? chalk.gray(` · key ${session.apiKey.name}`) : ''}`,
|
|
83
|
+
` since ${session.startedAt}`,
|
|
84
|
+
` heartbeat ${session.lastHeartbeatAt} (expires ${session.expiresAt})`,
|
|
85
|
+
` step ${session.currentStep ?? '—'} · ${done}/${session.steps.length} done`,
|
|
86
|
+
...(session.error ? [` error ${session.error}`] : []),
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
// ---- install ----
|
|
90
|
+
export async function runAgentInstall(opts) {
|
|
91
|
+
const root = process.cwd();
|
|
92
|
+
const agent = parseAgentName(opts.agent ?? 'claude');
|
|
93
|
+
const config = readConfig(root);
|
|
94
|
+
const apiUrl = resolveApiUrl({ denv: opts.denv, configuredUrl: config.apiUrl });
|
|
95
|
+
const result = installAgentIntegration(root, agent, {
|
|
96
|
+
apiUrl,
|
|
97
|
+
force: opts.force === true,
|
|
98
|
+
routesDir: config.routesDir,
|
|
99
|
+
pagesDir: config.pagesDir,
|
|
100
|
+
componentsDir: config.componentsDir,
|
|
101
|
+
});
|
|
102
|
+
emit(opts, result, [
|
|
103
|
+
chalk.bold('\nmapples agent install'),
|
|
104
|
+
...renderInstallOutcomes(result.outcomes),
|
|
105
|
+
...(result.mcpSnippet ? ['', mcpSnippetHeading(agent), result.mcpSnippet] : []),
|
|
106
|
+
...(result.hooksSnippet ? ['', hooksSnippetHeading(agent), result.hooksSnippet] : []),
|
|
107
|
+
'',
|
|
108
|
+
...agentNextSteps(agent, null),
|
|
109
|
+
]);
|
|
110
|
+
}
|
|
111
|
+
export function renderInstallOutcomes(outcomes) {
|
|
112
|
+
const icon = {
|
|
113
|
+
created: chalk.green('A'),
|
|
114
|
+
updated: chalk.cyan('M'),
|
|
115
|
+
unchanged: chalk.gray('·'),
|
|
116
|
+
skipped: chalk.yellow('S'),
|
|
117
|
+
appended: chalk.cyan('+'),
|
|
118
|
+
deprecated: chalk.red('D'),
|
|
119
|
+
};
|
|
120
|
+
return outcomes
|
|
121
|
+
.filter((o) => o.action !== 'unchanged')
|
|
122
|
+
.map((o) => ` ${icon[o.action]} ${o.file}${o.detail ? chalk.gray(` — ${o.detail}`) : ''}`);
|
|
123
|
+
}
|
|
124
|
+
// ---- start ----
|
|
125
|
+
export async function runAgentStart(opts) {
|
|
126
|
+
const root = process.cwd();
|
|
127
|
+
const config = readConfig(root);
|
|
128
|
+
const client = agentClientForApp(root, opts);
|
|
129
|
+
const sessionAgent = parseSessionAgent(opts.agent);
|
|
130
|
+
const label = typeof opts.label === 'string' && opts.label.length > 0
|
|
131
|
+
? opts.label
|
|
132
|
+
: sessionAgentLabel(sessionAgent);
|
|
133
|
+
const steps = typeof opts.steps === 'string'
|
|
134
|
+
? opts.steps
|
|
135
|
+
.split(',')
|
|
136
|
+
.map((title) => title.trim())
|
|
137
|
+
.filter((title) => title.length > 0)
|
|
138
|
+
.map((title) => ({ title }))
|
|
139
|
+
: undefined;
|
|
140
|
+
const wantDaemon = opts.daemon !== false;
|
|
141
|
+
const auto = opts.auto === true;
|
|
142
|
+
// Idempotent re-run: this checkout already holds the live session.
|
|
143
|
+
const existing = readAgentState(root);
|
|
144
|
+
if (existing) {
|
|
145
|
+
let live = await client.current();
|
|
146
|
+
if (live && live.uuid === existing.uuid && live.status === 'active') {
|
|
147
|
+
let pid = existing.heartbeatPid;
|
|
148
|
+
if (wantDaemon && !isAlive(pid))
|
|
149
|
+
pid = spawnDaemon(root, opts);
|
|
150
|
+
// An explicit start pins a hook's lease and declares its steps on it;
|
|
151
|
+
// a hook's start never unpins an explicit one.
|
|
152
|
+
const next = { ...existing, ...(pid !== undefined ? { heartbeatPid: pid } : {}) };
|
|
153
|
+
if (!auto) {
|
|
154
|
+
delete next.auto;
|
|
155
|
+
for (const [index, step] of (steps ?? []).entries()) {
|
|
156
|
+
if (index < live.steps.length)
|
|
157
|
+
continue;
|
|
158
|
+
live = await client.heartbeat(existing.uuid, {
|
|
159
|
+
step: { index, title: step.title, status: 'pending' },
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
writeAgentState(root, next);
|
|
164
|
+
emit(opts, { session: live, state: readAgentState(root), resumed: true }, [
|
|
165
|
+
chalk.bold('\nmapples agent start') + chalk.gray(' — already running'),
|
|
166
|
+
...describe(live),
|
|
167
|
+
]);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
clearAgentState(root);
|
|
171
|
+
}
|
|
172
|
+
let session;
|
|
173
|
+
try {
|
|
174
|
+
session = await client.start({
|
|
175
|
+
agent: sessionAgent,
|
|
176
|
+
label,
|
|
177
|
+
...(steps && steps.length > 0 ? { steps } : {}),
|
|
178
|
+
...(opts.takeover === true ? { force: true } : {}),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
if (err instanceof AgentSessionError && err.code === 'SESSION_ACTIVE') {
|
|
183
|
+
const busy = err.session;
|
|
184
|
+
process.exitCode = EXIT_BUSY;
|
|
185
|
+
emit(opts, { busy: true, session: busy, exitCode: EXIT_BUSY }, [
|
|
186
|
+
chalk.yellow.bold('\nproject busy — another agent session holds it'),
|
|
187
|
+
...(busy ? describe(busy) : [` ${err.message}`]),
|
|
188
|
+
chalk.gray(' re-run with --takeover to disconnect it and take the lease'),
|
|
189
|
+
]);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
throw err;
|
|
193
|
+
}
|
|
194
|
+
const state = {
|
|
195
|
+
schema: 1,
|
|
196
|
+
uuid: session.uuid,
|
|
197
|
+
label,
|
|
198
|
+
startedAt: session.startedAt,
|
|
199
|
+
apiUrl: resolveApiUrl({ denv: opts.denv, configuredUrl: config.apiUrl }),
|
|
200
|
+
projectId: config.projectId,
|
|
201
|
+
heartbeatSeconds: session.heartbeatSeconds,
|
|
202
|
+
...(auto ? { auto: true } : {}),
|
|
203
|
+
};
|
|
204
|
+
writeAgentState(root, state);
|
|
205
|
+
if (wantDaemon) {
|
|
206
|
+
state.heartbeatPid = spawnDaemon(root, opts);
|
|
207
|
+
writeAgentState(root, state);
|
|
208
|
+
}
|
|
209
|
+
emit(opts, { session, state, resumed: false }, [
|
|
210
|
+
chalk.bold('\nmapples agent start'),
|
|
211
|
+
...describe(session),
|
|
212
|
+
chalk.gray(wantDaemon
|
|
213
|
+
? ` heartbeat daemon pid ${state.heartbeatPid} every ${session.heartbeatSeconds} s`
|
|
214
|
+
: ' no heartbeat daemon (--no-daemon) — keep the lease alive with `mapples agent heartbeat`'),
|
|
215
|
+
]);
|
|
216
|
+
}
|
|
217
|
+
// ---- step ----
|
|
218
|
+
export async function runAgentStep(opts) {
|
|
219
|
+
const root = process.cwd();
|
|
220
|
+
const state = requireState(root);
|
|
221
|
+
const index = Number(opts.index);
|
|
222
|
+
if (!Number.isInteger(index) || index < 0)
|
|
223
|
+
throw new Error(`--index must be a non-negative integer`);
|
|
224
|
+
const status = opts.status;
|
|
225
|
+
if (!STEP_STATUSES.includes(status)) {
|
|
226
|
+
throw new Error(`--status must be one of ${STEP_STATUSES.join(', ')}`);
|
|
227
|
+
}
|
|
228
|
+
const title = typeof opts.title === 'string' ? opts.title : undefined;
|
|
229
|
+
const detail = typeof opts.detail === 'string' ? opts.detail : undefined;
|
|
230
|
+
const client = agentClientForApp(root, opts);
|
|
231
|
+
let session;
|
|
232
|
+
try {
|
|
233
|
+
session = await client.heartbeat(state.uuid, {
|
|
234
|
+
step: { index, ...(title ? { title } : {}), status, ...(detail ? { detail } : {}) },
|
|
235
|
+
...(status === 'running' && title ? { currentStep: title } : {}),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
if (leaseGone(err, root, state, opts))
|
|
240
|
+
return;
|
|
241
|
+
throw err;
|
|
242
|
+
}
|
|
243
|
+
const reported = session.steps.find((s) => s.index === index);
|
|
244
|
+
writeAgentState(root, {
|
|
245
|
+
...state,
|
|
246
|
+
lastStep: { index, title: reported?.title ?? title ?? `step ${index}`, status },
|
|
247
|
+
});
|
|
248
|
+
emit(opts, { session, step: reported ?? null }, [
|
|
249
|
+
`${chalk.bold('mapples agent step')} ${index} ${reported?.title ?? title ?? ''} → ${status}`,
|
|
250
|
+
]);
|
|
251
|
+
}
|
|
252
|
+
/** SESSION_GONE handling shared by step/heartbeat/stop: exit 3, clear local state, stop the daemon. */
|
|
253
|
+
function leaseGone(err, root, state, opts) {
|
|
254
|
+
if (!(err instanceof AgentSessionError) || err.code !== 'SESSION_GONE')
|
|
255
|
+
return false;
|
|
256
|
+
killDaemon(state.heartbeatPid);
|
|
257
|
+
clearAgentState(root);
|
|
258
|
+
process.exitCode = EXIT_LEASE_GONE;
|
|
259
|
+
emit(opts, { leaseGone: true, session: state.uuid, reason: err.message, exitCode: EXIT_LEASE_GONE }, [
|
|
260
|
+
chalk.red(`agent session ${state.uuid} is no longer active (${err.message}) — local state cleared`),
|
|
261
|
+
]);
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
// ---- heartbeat ----
|
|
265
|
+
export async function runAgentHeartbeat(opts) {
|
|
266
|
+
const root = process.cwd();
|
|
267
|
+
if (opts.loop === true) {
|
|
268
|
+
process.exitCode = await heartbeatLoop(root, opts);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const state = requireState(root);
|
|
272
|
+
const client = agentClientForApp(root, opts);
|
|
273
|
+
try {
|
|
274
|
+
const session = await client.heartbeat(state.uuid);
|
|
275
|
+
emit(opts, { session }, [
|
|
276
|
+
`${chalk.bold('mapples agent heartbeat')} ok (${session.lastHeartbeatAt})`,
|
|
277
|
+
]);
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
if (leaseGone(err, root, state, opts))
|
|
281
|
+
return;
|
|
282
|
+
throw err;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
286
|
+
/**
|
|
287
|
+
* The daemon body. Stops (exit 0) when the state file is gone or names
|
|
288
|
+
* another session, after --max-minutes; exit 3 when the server says the
|
|
289
|
+
* lease is gone. Network errors are retried on the next tick.
|
|
290
|
+
*/
|
|
291
|
+
async function heartbeatLoop(root, opts) {
|
|
292
|
+
const initial = readAgentState(root);
|
|
293
|
+
if (!initial)
|
|
294
|
+
return 0;
|
|
295
|
+
const maxMinutes = Number(opts.maxMinutes ?? 180);
|
|
296
|
+
const deadline = Date.now() + maxMinutes * 60_000;
|
|
297
|
+
let client = agentClientForApp(root, opts);
|
|
298
|
+
let intervalMs = Math.max(1, initial.heartbeatSeconds) * 1000;
|
|
299
|
+
while (Date.now() < deadline) {
|
|
300
|
+
const state = readAgentState(root);
|
|
301
|
+
if (!state || state.uuid !== initial.uuid)
|
|
302
|
+
return 0;
|
|
303
|
+
try {
|
|
304
|
+
const session = await client.heartbeat(state.uuid);
|
|
305
|
+
intervalMs = Math.max(1, session.heartbeatSeconds) * 1000;
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
if (err instanceof AgentSessionError && err.code === 'SESSION_GONE')
|
|
309
|
+
return EXIT_LEASE_GONE;
|
|
310
|
+
if (!(err instanceof AgentSessionError) && !isNetworkError(err))
|
|
311
|
+
throw err;
|
|
312
|
+
// Refused for another reason or unreachable: keep trying — the lease
|
|
313
|
+
// has 90 s and the next tick may land.
|
|
314
|
+
client = agentClientForApp(root, opts);
|
|
315
|
+
}
|
|
316
|
+
await sleep(intervalMs);
|
|
317
|
+
}
|
|
318
|
+
return 0;
|
|
319
|
+
}
|
|
320
|
+
// ---- stop ----
|
|
321
|
+
export async function runAgentStop(opts) {
|
|
322
|
+
const root = process.cwd();
|
|
323
|
+
const state = readAgentState(root);
|
|
324
|
+
if (!state) {
|
|
325
|
+
emit(opts, { released: false, reason: 'no local agent session' }, [
|
|
326
|
+
chalk.gray('no agent session in this checkout — nothing to stop'),
|
|
327
|
+
]);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
if (opts.auto === true && state.auto !== true) {
|
|
331
|
+
// A request ended inside a pinned run (e.g. the design skill asking the
|
|
332
|
+
// user a question): the run releases its own lease.
|
|
333
|
+
emit(opts, { released: false, reason: 'pinned by an explicit agent start' }, [
|
|
334
|
+
chalk.gray('the lease is pinned by a running skill — left held'),
|
|
335
|
+
]);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const status = opts.status === 'failed' ? 'failed' : 'done';
|
|
339
|
+
if (opts.status !== undefined && opts.status !== 'done' && opts.status !== 'failed') {
|
|
340
|
+
throw new Error('--status must be done or failed');
|
|
341
|
+
}
|
|
342
|
+
const error = typeof opts.error === 'string' ? opts.error : undefined;
|
|
343
|
+
const client = agentClientForApp(root, opts);
|
|
344
|
+
let session = null;
|
|
345
|
+
let note = null;
|
|
346
|
+
try {
|
|
347
|
+
session = await client.release(state.uuid, { status, ...(error ? { error } : {}) });
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
if (!(err instanceof AgentSessionError) || err.code !== 'SESSION_GONE')
|
|
351
|
+
throw err;
|
|
352
|
+
note = `session ${state.uuid} was already gone (${err.message})`;
|
|
353
|
+
}
|
|
354
|
+
const daemon = killDaemon(state.heartbeatPid);
|
|
355
|
+
clearAgentState(root);
|
|
356
|
+
emit(opts, { released: session !== null, session, daemon, note }, [
|
|
357
|
+
chalk.bold('\nmapples agent stop'),
|
|
358
|
+
...(session ? describe(session) : [` ${note}`]),
|
|
359
|
+
chalk.gray(` heartbeat daemon ${daemon}; ${agentStatePath(root).slice(root.length + 1)} removed`),
|
|
360
|
+
]);
|
|
361
|
+
}
|
|
362
|
+
// ---- hook ----
|
|
363
|
+
export const HOOK_EVENTS = ['prompt', 'stop'];
|
|
364
|
+
/** What the agent is told when another session already holds the project. */
|
|
365
|
+
export const BUSY_HOOK_MESSAGE = 'Another agent session holds this Mapples project (see `mapples agent status`). Do not sync or edit Mapples files until it is released — ask the user whether to take over with `mapples agent start --takeover`.';
|
|
366
|
+
/**
|
|
367
|
+
* `mapples agent hook prompt|stop --agent <name>` — wired into the agent's
|
|
368
|
+
* hook file by `agent install`. A prompt takes the lease for the request
|
|
369
|
+
* (Creator shows the agent working even when it changes nothing); the end of
|
|
370
|
+
* the request releases a lease the hook took, never one a skill pinned.
|
|
371
|
+
* Stdout follows each agent's hook protocol: Claude Code reads plain text as
|
|
372
|
+
* context, Cursor and Codex expect JSON.
|
|
373
|
+
*/
|
|
374
|
+
export async function runAgentHook(event, opts) {
|
|
375
|
+
if (!HOOK_EVENTS.includes(event)) {
|
|
376
|
+
throw new Error(`unknown hook event "${String(event)}" — expected ${HOOK_EVENTS.join(' or ')}`);
|
|
377
|
+
}
|
|
378
|
+
const agent = parseAgentName(opts.agent ?? 'claude');
|
|
379
|
+
const lease = {
|
|
380
|
+
...opts,
|
|
381
|
+
agent: AGENT_PROFILES[agent].sessionAgent,
|
|
382
|
+
auto: true,
|
|
383
|
+
quiet: true,
|
|
384
|
+
json: false,
|
|
385
|
+
};
|
|
386
|
+
let busy = false;
|
|
387
|
+
if (event === 'prompt') {
|
|
388
|
+
await runAgentStart(lease);
|
|
389
|
+
if (process.exitCode === EXIT_BUSY) {
|
|
390
|
+
// Surfaced to the agent, not a failed prompt: the user may still want an answer.
|
|
391
|
+
process.exitCode = 0;
|
|
392
|
+
busy = true;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
await runAgentStop(lease);
|
|
397
|
+
}
|
|
398
|
+
writeHookOutput(agent, event, busy ? BUSY_HOOK_MESSAGE : null);
|
|
399
|
+
}
|
|
400
|
+
function writeHookOutput(agent, event, message) {
|
|
401
|
+
if (agent === 'claude') {
|
|
402
|
+
if (message)
|
|
403
|
+
console.log(message);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (message)
|
|
407
|
+
console.error(message);
|
|
408
|
+
console.log(JSON.stringify(agent === 'cursor' && event === 'prompt' ? { continue: true } : {}));
|
|
409
|
+
}
|
|
410
|
+
// ---- status ----
|
|
411
|
+
export async function runAgentStatus(opts) {
|
|
412
|
+
const root = process.cwd();
|
|
413
|
+
readConfig(root);
|
|
414
|
+
const state = readAgentState(root);
|
|
415
|
+
const session = await agentClientForApp(root, opts).current();
|
|
416
|
+
const daemonAlive = state ? isAlive(state.heartbeatPid) : false;
|
|
417
|
+
const holdsLease = state !== null && session !== null && session.uuid === state.uuid;
|
|
418
|
+
emit(opts, { session, state, holdsLease, daemonAlive }, [
|
|
419
|
+
chalk.bold('\nmapples agent status'),
|
|
420
|
+
...(session ? describe(session) : [' no agent session on this project']),
|
|
421
|
+
state
|
|
422
|
+
? chalk.gray(` local ${state.uuid}${holdsLease ? ' (this checkout holds the lease)' : ' (stale — run `mapples agent stop`)'}; daemon ${daemonAlive ? `alive (pid ${state.heartbeatPid})` : 'not running'}`)
|
|
423
|
+
: chalk.gray(' local no session state in this checkout'),
|
|
424
|
+
]);
|
|
425
|
+
}
|
|
426
|
+
//# 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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"}
|
|
@@ -4,13 +4,15 @@ import chalk from 'chalk';
|
|
|
4
4
|
import prompts from 'prompts';
|
|
5
5
|
import { JpatchClient, isNetworkError } from '../../api/client.js';
|
|
6
6
|
import { resolveProject } from '../../api/auth.js';
|
|
7
|
-
import { writeConfig } from '../../project/config.js';
|
|
8
|
-
import { resolveApiUrl } from '../../project/env.js';
|
|
7
|
+
import { DEFAULT_PAGES_DIR, writeConfig } from '../../project/config.js';
|
|
8
|
+
import { assetUrlFor, resolveApiUrl } from '../../project/env.js';
|
|
9
9
|
import { writeSecret } from '../../project/secret.js';
|
|
10
|
+
import { agentNextSteps, installAgentIntegration, hooksSnippetHeading, mcpSnippetHeading, 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);
|
|
@@ -38,8 +41,11 @@ export async function runCreate(app, opts) {
|
|
|
38
41
|
writeConfig(target, {
|
|
39
42
|
projectId,
|
|
40
43
|
apiUrl,
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
pagesDir: DEFAULT_PAGES_DIR,
|
|
45
|
+
// Apps born from `mapples create` get a NATIVE expo-router tree: the
|
|
46
|
+
// navigation document owns app/ from the root _layout.tsx down. Linked
|
|
47
|
+
// existing apps (init) use the app/(mapples) group instead.
|
|
48
|
+
routesDir: 'app',
|
|
43
49
|
schema: 1,
|
|
44
50
|
});
|
|
45
51
|
writeSecret(target, secret);
|
|
@@ -47,9 +53,23 @@ export async function runCreate(app, opts) {
|
|
|
47
53
|
for (const file of written)
|
|
48
54
|
console.log(` ${chalk.green('A')} ${file}`);
|
|
49
55
|
console.log(` ${chalk.green('A')} .mapples/secret ${chalk.gray('(gitignored)')}`);
|
|
56
|
+
let mcpSnippet = null;
|
|
57
|
+
let hooksSnippet = null;
|
|
58
|
+
if (agent) {
|
|
59
|
+
const install = installAgentIntegration(target, agent, {
|
|
60
|
+
apiUrl,
|
|
61
|
+
routesDir: 'app',
|
|
62
|
+
pagesDir: DEFAULT_PAGES_DIR,
|
|
63
|
+
});
|
|
64
|
+
for (const line of renderInstallOutcomes(install.outcomes))
|
|
65
|
+
console.log(line);
|
|
66
|
+
mcpSnippet = install.mcpSnippet;
|
|
67
|
+
hooksSnippet = install.hooksSnippet;
|
|
68
|
+
}
|
|
50
69
|
// First sync pulls the whole project (tolerates being offline).
|
|
51
70
|
const client = new JpatchClient({
|
|
52
71
|
baseUrl: apiUrl,
|
|
72
|
+
assetsBaseUrl: assetUrlFor(apiUrl),
|
|
53
73
|
projectId,
|
|
54
74
|
token: secret,
|
|
55
75
|
origin: cliOrigin(),
|
|
@@ -70,5 +90,12 @@ export async function runCreate(app, opts) {
|
|
|
70
90
|
' yarn install (or npm install)',
|
|
71
91
|
' npx expo start',
|
|
72
92
|
].join('\n'));
|
|
93
|
+
if (agent) {
|
|
94
|
+
if (mcpSnippet)
|
|
95
|
+
console.log(['', mcpSnippetHeading(agent), mcpSnippet].join('\n'));
|
|
96
|
+
if (hooksSnippet)
|
|
97
|
+
console.log(['', hooksSnippetHeading(agent), hooksSnippet].join('\n'));
|
|
98
|
+
console.log(['', ...agentNextSteps(agent, app)].join('\n'));
|
|
99
|
+
}
|
|
73
100
|
}
|
|
74
101
|
//# 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,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"createImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/createImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,13 +3,15 @@ import { join } from 'node:path';
|
|
|
3
3
|
import chalk from 'chalk';
|
|
4
4
|
import { JpatchClient, isNetworkError } from '../../api/client.js';
|
|
5
5
|
import { resolveProject } from '../../api/auth.js';
|
|
6
|
-
import { writeConfig, configPath } from '../../project/config.js';
|
|
7
|
-
import { resolveApiUrl } from '../../project/env.js';
|
|
6
|
+
import { DEFAULT_PAGES_DIR, DEFAULT_ROUTES_DIR, writeConfig, configPath, } from '../../project/config.js';
|
|
7
|
+
import { assetUrlFor, resolveApiUrl } from '../../project/env.js';
|
|
8
8
|
import { writeSecret } from '../../project/secret.js';
|
|
9
|
+
import { agentNextSteps, installAgentIntegration, hooksSnippetHeading, mcpSnippetHeading, 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,14 +21,15 @@ 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);
|
|
25
28
|
writeConfig(root, {
|
|
26
29
|
projectId,
|
|
27
30
|
apiUrl,
|
|
28
|
-
|
|
29
|
-
routesDir:
|
|
31
|
+
pagesDir: DEFAULT_PAGES_DIR,
|
|
32
|
+
routesDir: DEFAULT_ROUTES_DIR,
|
|
30
33
|
schema: 1,
|
|
31
34
|
});
|
|
32
35
|
writeSecret(root, secret);
|
|
@@ -42,8 +45,22 @@ 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
|
+
let hooksSnippet = null;
|
|
50
|
+
if (agent) {
|
|
51
|
+
const install = installAgentIntegration(root, agent, {
|
|
52
|
+
apiUrl,
|
|
53
|
+
routesDir: DEFAULT_ROUTES_DIR,
|
|
54
|
+
pagesDir: DEFAULT_PAGES_DIR,
|
|
55
|
+
});
|
|
56
|
+
for (const line of renderInstallOutcomes(install.outcomes))
|
|
57
|
+
console.log(line);
|
|
58
|
+
mcpSnippet = install.mcpSnippet;
|
|
59
|
+
hooksSnippet = install.hooksSnippet;
|
|
60
|
+
}
|
|
45
61
|
const client = new JpatchClient({
|
|
46
62
|
baseUrl: apiUrl,
|
|
63
|
+
assetsBaseUrl: assetUrlFor(apiUrl),
|
|
47
64
|
projectId,
|
|
48
65
|
token: secret,
|
|
49
66
|
origin: cliOrigin(),
|
|
@@ -57,5 +74,12 @@ export async function runInit(opts) {
|
|
|
57
74
|
throw err;
|
|
58
75
|
console.log(chalk.yellow(' offline — run `mapples sync` once you are online'));
|
|
59
76
|
}
|
|
77
|
+
if (agent) {
|
|
78
|
+
if (mcpSnippet)
|
|
79
|
+
console.log(['', mcpSnippetHeading(agent), mcpSnippet].join('\n'));
|
|
80
|
+
if (hooksSnippet)
|
|
81
|
+
console.log(['', hooksSnippetHeading(agent), hooksSnippet].join('\n'));
|
|
82
|
+
console.log(['', ...agentNextSteps(agent, null)].join('\n'));
|
|
83
|
+
}
|
|
60
84
|
}
|
|
61
85
|
//# sourceMappingURL=initImpl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/initImpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"initImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/initImpl.ts"],"names":[],"mappings":"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"}
|