mapples 0.2.0-beta.0 → 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.
Files changed (171) hide show
  1. package/README.md +133 -22
  2. package/dist/adopt/scan.d.ts +8 -2
  3. package/dist/adopt/scan.js +31 -13
  4. package/dist/adopt/scan.js.map +1 -1
  5. package/dist/api/agent.d.ts +85 -0
  6. package/dist/api/agent.js +92 -0
  7. package/dist/api/agent.js.map +1 -0
  8. package/dist/api/auth.d.ts +2 -0
  9. package/dist/api/auth.js +28 -6
  10. package/dist/api/auth.js.map +1 -1
  11. package/dist/api/client.d.ts +13 -1
  12. package/dist/api/client.js +26 -4
  13. package/dist/api/client.js.map +1 -1
  14. package/dist/api/commit.d.ts +9 -0
  15. package/dist/api/commit.js +36 -0
  16. package/dist/api/commit.js.map +1 -1
  17. package/dist/api/errors.js +12 -2
  18. package/dist/api/errors.js.map +1 -1
  19. package/dist/api/objects.d.ts +36 -5
  20. package/dist/api/objects.js +176 -10
  21. package/dist/api/objects.js.map +1 -1
  22. package/dist/api/poll.d.ts +5 -3
  23. package/dist/api/poll.js +17 -6
  24. package/dist/api/poll.js.map +1 -1
  25. package/dist/api/txPlan.d.ts +15 -0
  26. package/dist/api/txPlan.js +196 -0
  27. package/dist/api/txPlan.js.map +1 -0
  28. package/dist/assets/assets.d.ts +9 -0
  29. package/dist/assets/assets.js +33 -4
  30. package/dist/assets/assets.js.map +1 -1
  31. package/dist/codegen/emit.d.ts +4 -7
  32. package/dist/codegen/emit.js +10 -29
  33. package/dist/codegen/emit.js.map +1 -1
  34. package/dist/codegen/imports.d.ts +8 -15
  35. package/dist/codegen/imports.js +27 -72
  36. package/dist/codegen/imports.js.map +1 -1
  37. package/dist/codegen/instances.d.ts +5 -0
  38. package/dist/codegen/instances.js +30 -0
  39. package/dist/codegen/instances.js.map +1 -0
  40. package/dist/codegen/styles.d.ts +1 -0
  41. package/dist/codegen/styles.js +3 -0
  42. package/dist/codegen/styles.js.map +1 -0
  43. package/dist/commands/agent.d.ts +2 -0
  44. package/dist/commands/agent.js +87 -0
  45. package/dist/commands/agent.js.map +1 -0
  46. package/dist/commands/create.js +1 -0
  47. package/dist/commands/create.js.map +1 -1
  48. package/dist/commands/impl/adoptImpl.js +3 -0
  49. package/dist/commands/impl/adoptImpl.js.map +1 -1
  50. package/dist/commands/impl/agentImpl.d.ts +23 -0
  51. package/dist/commands/impl/agentImpl.js +426 -0
  52. package/dist/commands/impl/agentImpl.js.map +1 -0
  53. package/dist/commands/impl/createImpl.js +31 -4
  54. package/dist/commands/impl/createImpl.js.map +1 -1
  55. package/dist/commands/impl/initImpl.js +28 -4
  56. package/dist/commands/impl/initImpl.js.map +1 -1
  57. package/dist/commands/impl/syncImpl.js +30 -5
  58. package/dist/commands/impl/syncImpl.js.map +1 -1
  59. package/dist/commands/init.js +1 -0
  60. package/dist/commands/init.js.map +1 -1
  61. package/dist/index.js +12 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/merge/applyOps.d.ts +5 -2
  64. package/dist/merge/applyOps.js +75 -32
  65. package/dist/merge/applyOps.js.map +1 -1
  66. package/dist/merge/childrenOrder.d.ts +13 -0
  67. package/dist/merge/childrenOrder.js +51 -0
  68. package/dist/merge/childrenOrder.js.map +1 -0
  69. package/dist/merge/diff.d.ts +20 -1
  70. package/dist/merge/diff.js +77 -17
  71. package/dist/merge/diff.js.map +1 -1
  72. package/dist/merge/threeWay.d.ts +2 -2
  73. package/dist/merge/threeWay.js +74 -10
  74. package/dist/merge/threeWay.js.map +1 -1
  75. package/dist/merge/toEdits.d.ts +1 -3
  76. package/dist/merge/toEdits.js +3 -91
  77. package/dist/merge/toEdits.js.map +1 -1
  78. package/dist/nav/navigatorTree.d.ts +78 -0
  79. package/dist/nav/navigatorTree.js +410 -0
  80. package/dist/nav/navigatorTree.js.map +1 -0
  81. package/dist/nav/placement.d.ts +53 -0
  82. package/dist/nav/placement.js +260 -0
  83. package/dist/nav/placement.js.map +1 -0
  84. package/dist/nav/routeTree.d.ts +8 -2
  85. package/dist/nav/routeTree.js +79 -151
  86. package/dist/nav/routeTree.js.map +1 -1
  87. package/dist/nav/screenOptions.d.ts +15 -0
  88. package/dist/nav/screenOptions.js +213 -0
  89. package/dist/nav/screenOptions.js.map +1 -0
  90. package/dist/project/agentState.d.ts +30 -0
  91. package/dist/project/agentState.js +42 -0
  92. package/dist/project/agentState.js.map +1 -0
  93. package/dist/project/baseStore.d.ts +19 -1
  94. package/dist/project/baseStore.js +28 -0
  95. package/dist/project/baseStore.js.map +1 -1
  96. package/dist/project/componentsMap.d.ts +7 -0
  97. package/dist/project/componentsMap.js +21 -0
  98. package/dist/project/componentsMap.js.map +1 -0
  99. package/dist/project/config.d.ts +12 -3
  100. package/dist/project/config.js +11 -2
  101. package/dist/project/config.js.map +1 -1
  102. package/dist/project/env.d.ts +10 -3
  103. package/dist/project/env.js +23 -5
  104. package/dist/project/env.js.map +1 -1
  105. package/dist/project/pagesMap.d.ts +2 -0
  106. package/dist/project/pagesMap.js.map +1 -1
  107. package/dist/project/secret.d.ts +6 -2
  108. package/dist/project/secret.js +11 -5
  109. package/dist/project/secret.js.map +1 -1
  110. package/dist/services/adoptService.d.ts +3 -0
  111. package/dist/services/adoptService.js +357 -38
  112. package/dist/services/adoptService.js.map +1 -1
  113. package/dist/services/agentInstall.d.ts +80 -0
  114. package/dist/services/agentInstall.js +309 -0
  115. package/dist/services/agentInstall.js.map +1 -0
  116. package/dist/services/agentLease.d.ts +2 -0
  117. package/dist/services/agentLease.js +32 -0
  118. package/dist/services/agentLease.js.map +1 -0
  119. package/dist/services/clientFactory.d.ts +2 -0
  120. package/dist/services/clientFactory.js +20 -3
  121. package/dist/services/clientFactory.js.map +1 -1
  122. package/dist/services/doctorService.js +77 -66
  123. package/dist/services/doctorService.js.map +1 -1
  124. package/dist/services/scaffold.js +4 -0
  125. package/dist/services/scaffold.js.map +1 -1
  126. package/dist/services/syncEngine.d.ts +7 -0
  127. package/dist/services/syncEngine.js +719 -306
  128. package/dist/services/syncEngine.js.map +1 -1
  129. package/dist/style/theme.js +17 -1
  130. package/dist/style/theme.js.map +1 -1
  131. package/dist/types.d.ts +51 -2
  132. package/dist/types.js +25 -0
  133. package/dist/types.js.map +1 -1
  134. package/dist/ui/report.d.ts +15 -0
  135. package/dist/ui/report.js +30 -0
  136. package/dist/ui/report.js.map +1 -1
  137. package/package.json +3 -2
  138. package/templates/agent/agents-md/AGENTS.md +8 -0
  139. package/templates/agent/claude/CLAUDE.md +7 -0
  140. package/templates/agent/claude/mcp.json +11 -0
  141. package/templates/agent/claude/settings.json +26 -0
  142. package/templates/agent/codex/config.toml +6 -0
  143. package/templates/agent/codex/hooks.json +26 -0
  144. package/templates/agent/cursor/hooks.json +9 -0
  145. package/templates/agent/cursor/mcp.json +10 -0
  146. package/templates/agent/mapples.md +124 -0
  147. package/templates/agent/skills/mapples-conventions/SKILL.md +137 -0
  148. package/templates/agent/skills/mapples-design/SKILL.md +235 -0
  149. package/templates/agent/skills/mapples-design/reference/component-library.md +128 -0
  150. package/templates/agent/skills/mapples-design/reference/design-tokens.md +132 -0
  151. package/templates/agent/skills/mapples-design/reference/layout-contract.md +227 -0
  152. package/templates/agent/skills/mapples-design/reference/lint-checklist.md +51 -0
  153. package/templates/agent/skills/mapples-design/reference/plan.md +95 -0
  154. package/templates/agent/skills/mapples-design/reference/playbooks/empty-states.md +14 -0
  155. package/templates/agent/skills/mapples-design/reference/playbooks/forms-and-auth.md +22 -0
  156. package/templates/agent/skills/mapples-design/reference/playbooks/home-dashboard.md +14 -0
  157. package/templates/agent/skills/mapples-design/reference/playbooks/list-and-detail.md +18 -0
  158. package/templates/agent/skills/mapples-design/reference/playbooks/microcopy.md +20 -0
  159. package/templates/agent/skills/mapples-design/reference/playbooks/navigation-chrome.md +21 -0
  160. package/templates/agent/skills/mapples-design/reference/playbooks/onboarding-flow.md +15 -0
  161. package/templates/agent/skills/mapples-design/reference/playbooks/screen-flow-wiring.md +37 -0
  162. package/templates/agent/skills/mapples-design/reference/playbooks/settings-profile.md +16 -0
  163. package/templates/agent/skills/mapples-design/reference/playbooks/stats-and-progress.md +17 -0
  164. package/templates/agent/skills/mapples-design/reference/playbooks/visual-hierarchy.md +18 -0
  165. package/templates/agent/skills/mapples-design/reference/style-guides.md +92 -0
  166. package/templates/agent/skills/mapples-sync/SKILL.md +93 -0
  167. package/templates/app/_layout.tsx +3 -0
  168. package/templates/app.json +0 -1
  169. package/templates/gitignore +2 -0
  170. package/templates/mapples/sid.d.ts +6 -0
  171. package/templates/package.json +12 -10
@@ -0,0 +1,80 @@
1
+ export declare const SUPPORTED_AGENTS: readonly ["claude", "cursor", "codex"];
2
+ export type AgentName = (typeof SUPPORTED_AGENTS)[number];
3
+ /** The `agent` a lease is started with, per installed agent (Creator labels sessions by it). */
4
+ export declare const SESSION_AGENTS: readonly ["claude-code", "cursor", "codex"];
5
+ export type SessionAgent = (typeof SESSION_AGENTS)[number];
6
+ export interface AgentProfile {
7
+ name: AgentName;
8
+ /** Shown in Creator (session label, commit summaries) and in the printed next steps. */
9
+ label: string;
10
+ sessionAgent: SessionAgent;
11
+ skillsDir: string;
12
+ conventionsPath: string;
13
+ /** How the user runs the design skill in this agent. */
14
+ designCommand: string;
15
+ instructions: {
16
+ file: string;
17
+ template: string;
18
+ /** The line that makes the agent read the conventions; appended to an existing file once. */
19
+ pointer: string;
20
+ };
21
+ mcp: {
22
+ file: string;
23
+ template: string;
24
+ /** Present in the file once the Mapples server is configured. */
25
+ marker: string;
26
+ };
27
+ /** Prompt/stop hooks that hold the lease while the agent works on a request. */
28
+ hooks: {
29
+ file: string;
30
+ template: string;
31
+ marker: string;
32
+ };
33
+ /** The shell line that starts the agent with the key in its environment (MCP reads it). */
34
+ restart: string;
35
+ }
36
+ export declare const AGENT_PROFILES: Record<AgentName, AgentProfile>;
37
+ /** Validates the `--agent` option; undefined when not given. */
38
+ export declare function parseAgentName(value: unknown): AgentName | undefined;
39
+ /** Validates `agent start --agent`; the session agent recorded for Creator. */
40
+ export declare function parseSessionAgent(value: unknown): SessionAgent;
41
+ /** The default session label for a session agent. */
42
+ export declare function sessionAgentLabel(agent: SessionAgent): string;
43
+ /** The marker every generated Markdown file carries (line 1, or right after its frontmatter). */
44
+ export declare const GENERATED_HEADER: RegExp;
45
+ /**
46
+ * Whether the CLI generated this file: the header opens the file, or — for
47
+ * skills, whose YAML frontmatter must be the first thing the agent reads —
48
+ * it is the first line after the frontmatter block.
49
+ */
50
+ export declare function isGeneratedFile(content: string): boolean;
51
+ export interface InstallOptions {
52
+ apiUrl: string;
53
+ force?: boolean;
54
+ routesDir?: string;
55
+ pagesDir?: string;
56
+ componentsDir?: string;
57
+ }
58
+ export interface InstallOutcome {
59
+ file: string;
60
+ action: 'created' | 'updated' | 'unchanged' | 'skipped' | 'appended' | 'deprecated';
61
+ detail?: string;
62
+ }
63
+ export interface InstallResult {
64
+ agent: AgentName;
65
+ outcomes: InstallOutcome[];
66
+ /** The MCP entry the user has to merge by hand when the agent's MCP config already existed. */
67
+ mcpSnippet: string | null;
68
+ /** The lease hooks the user has to merge by hand when the agent's hook file already existed. */
69
+ hooksSnippet: string | null;
70
+ }
71
+ export declare function agentTemplatesDir(): string;
72
+ /** The agent's MCP config for this API, as the installer writes it. */
73
+ export declare function mcpConfigFor(agent: AgentName, apiUrl: string): string;
74
+ export declare function installAgentIntegration(root: string, agent: AgentName, options: InstallOptions): InstallResult;
75
+ /** The lines printed after create/init/install with `--agent <name>`. */
76
+ export declare function agentNextSteps(agent: AgentName, appDir: string | null): string[];
77
+ /** The line that introduces a printed MCP snippet. */
78
+ export declare function mcpSnippetHeading(agent: AgentName): string;
79
+ /** The line that introduces a printed hooks snippet. */
80
+ export declare function hooksSnippetHeading(agent: AgentName): string;
@@ -0,0 +1,309 @@
1
+ // `--agent <name>` / `mapples agent install`: puts the agent bundle
2
+ // (templates/agent) into an app — project-local skills, the conventions
3
+ // file, a pointer in the agent's instructions file, and the read-only MCP
4
+ // entry — in the places each agent reads them:
5
+ //
6
+ // claude .claude/skills, .claude/mapples.md, CLAUDE.md, .mcp.json
7
+ // cursor .cursor/skills, .cursor/mapples.md, AGENTS.md, .cursor/mcp.json
8
+ // codex .agents/skills, .agents/mapples.md, AGENTS.md, .codex/config.toml
9
+ //
10
+ // Files the CLI generated are refreshed in place (recognised by their
11
+ // GENERATED header); a file the user edited is never overwritten — it is
12
+ // skipped, or with --force deprecated (`_depr_<ts>_…old`) and regenerated.
13
+ // An instructions file or MCP config the user already has is never rewritten:
14
+ // the pointer line is appended once, the MCP entry is printed for them to add.
15
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
16
+ import { dirname, join } from 'node:path';
17
+ import { deprecateFile } from '../merge/deprecate.js';
18
+ import { AGENT_STATE_GITIGNORE } from '../project/agentState.js';
19
+ import { DEFAULT_COMPONENTS_DIR, DEFAULT_PAGES_DIR, DEFAULT_ROUTES_DIR, } from '../project/config.js';
20
+ import { ensureGitignored } from '../project/secret.js';
21
+ import { cliVersion } from '../version.js';
22
+ import { templatesDir } from './scaffold.js';
23
+ export const SUPPORTED_AGENTS = ['claude', 'cursor', 'codex'];
24
+ /** `--agent` spellings that name the same agent (ChatGPT's coding agent is Codex). */
25
+ const AGENT_ALIASES = { chatgpt: 'codex' };
26
+ /** The `agent` a lease is started with, per installed agent (Creator labels sessions by it). */
27
+ export const SESSION_AGENTS = ['claude-code', 'cursor', 'codex'];
28
+ export const AGENT_PROFILES = {
29
+ claude: {
30
+ name: 'claude',
31
+ label: 'Claude Code',
32
+ sessionAgent: 'claude-code',
33
+ skillsDir: '.claude/skills',
34
+ conventionsPath: '.claude/mapples.md',
35
+ designCommand: '/mapples-design',
36
+ instructions: {
37
+ file: 'CLAUDE.md',
38
+ template: 'claude/CLAUDE.md',
39
+ pointer: '@.claude/mapples.md',
40
+ },
41
+ mcp: { file: '.mcp.json', template: 'claude/mcp.json', marker: '"mapples"' },
42
+ hooks: {
43
+ file: '.claude/settings.json',
44
+ template: 'claude/settings.json',
45
+ marker: 'agent hook prompt',
46
+ },
47
+ restart: 'MAPPLES_SECRET=$(cat .mapples/secret) claude',
48
+ },
49
+ cursor: {
50
+ name: 'cursor',
51
+ label: 'Cursor',
52
+ sessionAgent: 'cursor',
53
+ skillsDir: '.cursor/skills',
54
+ conventionsPath: '.cursor/mapples.md',
55
+ designCommand: '/mapples-design',
56
+ instructions: {
57
+ file: 'AGENTS.md',
58
+ template: 'agents-md/AGENTS.md',
59
+ pointer: '- Cursor: read `.cursor/mapples.md`.',
60
+ },
61
+ mcp: { file: '.cursor/mcp.json', template: 'cursor/mcp.json', marker: '"mapples"' },
62
+ hooks: {
63
+ file: '.cursor/hooks.json',
64
+ template: 'cursor/hooks.json',
65
+ marker: 'agent hook prompt',
66
+ },
67
+ restart: 'MAPPLES_SECRET=$(cat .mapples/secret) cursor .',
68
+ },
69
+ codex: {
70
+ name: 'codex',
71
+ label: 'Codex',
72
+ sessionAgent: 'codex',
73
+ skillsDir: '.agents/skills',
74
+ conventionsPath: '.agents/mapples.md',
75
+ designCommand: '$mapples-design',
76
+ instructions: {
77
+ file: 'AGENTS.md',
78
+ template: 'agents-md/AGENTS.md',
79
+ pointer: '- Codex: read `.agents/mapples.md`.',
80
+ },
81
+ mcp: {
82
+ file: '.codex/config.toml',
83
+ template: 'codex/config.toml',
84
+ marker: '[mcp_servers.mapples]',
85
+ },
86
+ hooks: { file: '.codex/hooks.json', template: 'codex/hooks.json', marker: 'agent hook prompt' },
87
+ restart: 'MAPPLES_SECRET=$(cat .mapples/secret) codex',
88
+ },
89
+ };
90
+ /** The agent a `--agent` spelling names (aliases resolved), or null. */
91
+ function agentNameOf(value) {
92
+ if (typeof value !== 'string')
93
+ return null;
94
+ const name = value.toLowerCase();
95
+ if (SUPPORTED_AGENTS.includes(name))
96
+ return name;
97
+ return AGENT_ALIASES[name] ?? null;
98
+ }
99
+ /** Validates the `--agent` option; undefined when not given. */
100
+ export function parseAgentName(value) {
101
+ if (value === undefined)
102
+ return undefined;
103
+ const name = agentNameOf(value);
104
+ if (name)
105
+ return name;
106
+ throw new Error(`unknown --agent "${String(value)}" — supported: ${SUPPORTED_AGENTS.join(', ')} (chatgpt = codex)`);
107
+ }
108
+ /** Validates `agent start --agent`; the session agent recorded for Creator. */
109
+ export function parseSessionAgent(value) {
110
+ if (value === undefined)
111
+ return 'claude-code';
112
+ if (typeof value === 'string' && SESSION_AGENTS.includes(value)) {
113
+ return value;
114
+ }
115
+ const installed = agentNameOf(value);
116
+ if (installed)
117
+ return AGENT_PROFILES[installed].sessionAgent;
118
+ throw new Error(`unknown session agent "${String(value)}" — supported: ${SESSION_AGENTS.join(', ')}`);
119
+ }
120
+ /** The default session label for a session agent. */
121
+ export function sessionAgentLabel(agent) {
122
+ return Object.values(AGENT_PROFILES).find((p) => p.sessionAgent === agent).label;
123
+ }
124
+ /** The marker every generated Markdown file carries (line 1, or right after its frontmatter). */
125
+ export const GENERATED_HEADER = /^<!--\s*GENERATED by Mapples\b/;
126
+ /**
127
+ * Whether the CLI generated this file: the header opens the file, or — for
128
+ * skills, whose YAML frontmatter must be the first thing the agent reads —
129
+ * it is the first line after the frontmatter block.
130
+ */
131
+ export function isGeneratedFile(content) {
132
+ const lines = content.split('\n');
133
+ if (GENERATED_HEADER.test(lines[0] ?? ''))
134
+ return true;
135
+ if (lines[0]?.trim() !== '---')
136
+ return false;
137
+ const close = lines.findIndex((line, i) => i > 0 && line.trim() === '---');
138
+ if (close < 0)
139
+ return false;
140
+ const afterFrontmatter = lines.slice(close + 1).find((line) => line.trim() !== '');
141
+ return GENERATED_HEADER.test(afterFrontmatter ?? '');
142
+ }
143
+ export function agentTemplatesDir() {
144
+ return join(templatesDir(), 'agent');
145
+ }
146
+ function substitute(content, profile, opts) {
147
+ return content
148
+ .replaceAll('__CLI_VERSION__', cliVersion())
149
+ .replaceAll('__API_URL__', opts.apiUrl.replace(/\/+$/, ''))
150
+ .replaceAll('__ROUTES_DIR__', opts.routesDir)
151
+ .replaceAll('__PAGES_DIR__', opts.pagesDir)
152
+ .replaceAll('__COMPONENTS_DIR__', opts.componentsDir)
153
+ .replaceAll('__SKILLS_DIR__', profile.skillsDir)
154
+ .replaceAll('__CONVENTIONS_PATH__', profile.conventionsPath)
155
+ .replaceAll('__DESIGN_COMMAND__', profile.designCommand)
156
+ .replaceAll('__AGENT_LABEL__', profile.label)
157
+ .replaceAll('__AGENT_ID__', profile.sessionAgent)
158
+ .replaceAll('__AGENT_FLAG__', profile.name)
159
+ .replaceAll('__AGENT_RESTART__', profile.restart)
160
+ .replaceAll('__AGENTS_MD_POINTER__', profile.instructions.pointer);
161
+ }
162
+ function resolveOptions(options) {
163
+ return {
164
+ apiUrl: options.apiUrl,
165
+ force: options.force === true,
166
+ routesDir: options.routesDir ?? DEFAULT_ROUTES_DIR,
167
+ pagesDir: options.pagesDir ?? DEFAULT_PAGES_DIR,
168
+ componentsDir: options.componentsDir ?? DEFAULT_COMPONENTS_DIR,
169
+ };
170
+ }
171
+ /** The agent's MCP config for this API, as the installer writes it. */
172
+ export function mcpConfigFor(agent, apiUrl) {
173
+ const profile = AGENT_PROFILES[agent];
174
+ return substitute(readFileSync(join(agentTemplatesDir(), profile.mcp.template), 'utf8'), profile, resolveOptions({ apiUrl }));
175
+ }
176
+ /** Write a generated file, honouring the header handshake. */
177
+ function placeGenerated(root, rel, content, force, outcomes) {
178
+ const abs = join(root, rel);
179
+ if (existsSync(abs)) {
180
+ const current = readFileSync(abs, 'utf8');
181
+ if (current === content) {
182
+ outcomes.push({ file: rel, action: 'unchanged' });
183
+ return;
184
+ }
185
+ if (!isGeneratedFile(current)) {
186
+ if (!force) {
187
+ outcomes.push({
188
+ file: rel,
189
+ action: 'skipped',
190
+ detail: 'edited by you — kept (re-run with --force to regenerate)',
191
+ });
192
+ return;
193
+ }
194
+ const kept = deprecateFile(abs);
195
+ outcomes.push({
196
+ file: rel,
197
+ action: 'deprecated',
198
+ detail: `your version is kept at ${kept.slice(root.length + 1)}`,
199
+ });
200
+ writeFileSync(abs, content);
201
+ return;
202
+ }
203
+ writeFileSync(abs, content);
204
+ outcomes.push({ file: rel, action: 'updated' });
205
+ return;
206
+ }
207
+ mkdirSync(dirname(abs), { recursive: true });
208
+ writeFileSync(abs, content);
209
+ outcomes.push({ file: rel, action: 'created' });
210
+ }
211
+ /**
212
+ * A config file the agent reads whole (MCP servers, hooks): created when
213
+ * absent, left alone when it already carries our entry, and otherwise never
214
+ * rewritten — the snippet comes back for the user to merge.
215
+ */
216
+ function placeConfigOnce(root, target, content, outcomes, what) {
217
+ const abs = join(root, target.file);
218
+ if (!existsSync(abs)) {
219
+ mkdirSync(dirname(abs), { recursive: true });
220
+ writeFileSync(abs, content);
221
+ outcomes.push({ file: target.file, action: 'created' });
222
+ return null;
223
+ }
224
+ if (readFileSync(abs, 'utf8').includes(target.marker)) {
225
+ outcomes.push({ file: target.file, action: 'unchanged' });
226
+ return null;
227
+ }
228
+ outcomes.push({
229
+ file: target.file,
230
+ action: 'skipped',
231
+ detail: `exists — add ${what} yourself (snippet printed below)`,
232
+ });
233
+ return content;
234
+ }
235
+ function walk(dir, rel = '') {
236
+ const out = [];
237
+ for (const entry of readdirSync(join(dir, rel), { withFileTypes: true })) {
238
+ const relPath = rel ? join(rel, entry.name) : entry.name;
239
+ if (entry.isDirectory())
240
+ out.push(...walk(dir, relPath));
241
+ else
242
+ out.push(relPath);
243
+ }
244
+ return out.sort();
245
+ }
246
+ export function installAgentIntegration(root, agent, options) {
247
+ const profile = AGENT_PROFILES[agent];
248
+ const opts = resolveOptions(options);
249
+ const src = agentTemplatesDir();
250
+ const outcomes = [];
251
+ const read = (rel) => substitute(readFileSync(join(src, rel), 'utf8'), profile, opts);
252
+ // Skills: templates/agent/skills/** -> <skillsDir>/**
253
+ for (const rel of walk(join(src, 'skills'))) {
254
+ placeGenerated(root, join(profile.skillsDir, rel), read(join('skills', rel)), opts.force, outcomes);
255
+ }
256
+ // Conventions: templates/agent/mapples.md -> <conventionsPath>
257
+ placeGenerated(root, profile.conventionsPath, read('mapples.md'), opts.force, outcomes);
258
+ // Instructions file: created from the template when absent; otherwise only
259
+ // the pointer line is appended — the user's instructions are theirs.
260
+ const instructions = join(root, profile.instructions.file);
261
+ const pointer = profile.instructions.pointer;
262
+ if (!existsSync(instructions)) {
263
+ writeFileSync(instructions, read(profile.instructions.template));
264
+ outcomes.push({ file: profile.instructions.file, action: 'created' });
265
+ }
266
+ else {
267
+ const current = readFileSync(instructions, 'utf8');
268
+ if (current.split('\n').some((line) => line.trim() === pointer)) {
269
+ outcomes.push({ file: profile.instructions.file, action: 'unchanged' });
270
+ }
271
+ else {
272
+ writeFileSync(instructions, current + (current.endsWith('\n') || current === '' ? '' : '\n') + `\n${pointer}\n`);
273
+ outcomes.push({ file: profile.instructions.file, action: 'appended', detail: pointer });
274
+ }
275
+ }
276
+ // MCP config and lease hooks: written once; an existing file is never
277
+ // touched (the user may have other servers or hooks there) — the snippet
278
+ // is returned for them to merge.
279
+ const mcpSnippet = placeConfigOnce(root, profile.mcp, read(profile.mcp.template), outcomes, 'the "mapples" server');
280
+ const hooksSnippet = placeConfigOnce(root, profile.hooks, read(profile.hooks.template), outcomes, 'the Mapples lease hooks');
281
+ if (ensureGitignored(root, [AGENT_STATE_GITIGNORE])) {
282
+ outcomes.push({ file: '.gitignore', action: 'appended', detail: AGENT_STATE_GITIGNORE });
283
+ }
284
+ return { agent, outcomes, mcpSnippet, hooksSnippet };
285
+ }
286
+ /** The lines printed after create/init/install with `--agent <name>`. */
287
+ export function agentNextSteps(agent, appDir) {
288
+ const profile = AGENT_PROFILES[agent];
289
+ const cd = appDir ? `cd ${appDir} && ` : '';
290
+ const where = {
291
+ claude: 'then type',
292
+ cursor: 'then in Agent chat type',
293
+ codex: 'trust the project when Codex asks and approve its hooks with /hooks (they load from .codex/), then type',
294
+ };
295
+ return [
296
+ `${profile.label} is set up. Start it with the project key in the environment:`,
297
+ ` ${cd}${profile.restart}`,
298
+ `${where[agent]} ${profile.designCommand} and describe your app.`,
299
+ ];
300
+ }
301
+ /** The line that introduces a printed MCP snippet. */
302
+ export function mcpSnippetHeading(agent) {
303
+ return `Add this to your ${AGENT_PROFILES[agent].mcp.file}:`;
304
+ }
305
+ /** The line that introduces a printed hooks snippet. */
306
+ export function hooksSnippetHeading(agent) {
307
+ return `Add these hooks to your ${AGENT_PROFILES[agent].hooks.file} (they show the agent as working in Creator):`;
308
+ }
309
+ //# sourceMappingURL=agentInstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentInstall.js","sourceRoot":"","sources":["../../src/services/agentInstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { SyncReport } from '../ui/report.js';
2
+ export declare function touchAgentLease(root: string, report: SyncReport, opts?: Record<string, unknown>): Promise<'touched' | 'none' | 'missed'>;
@@ -0,0 +1,32 @@
1
+ // Belt and braces for the agent lease: every `mapples sync` / `mapples adopt`
2
+ // run inside an agent session heartbeats the lease before and after its
3
+ // work, so a long push cannot let the 90 s lease lapse even if the daemon
4
+ // died. Never fatal — a sync must not fail because a keep-alive did not
5
+ // land — but every miss is written into the report.
6
+ import { AgentSessionError } from '../api/agent.js';
7
+ import { isNetworkError } from '../api/client.js';
8
+ import { readAgentState } from '../project/agentState.js';
9
+ import { agentClientForApp } from './clientFactory.js';
10
+ export async function touchAgentLease(root, report, opts = {}) {
11
+ const state = readAgentState(root);
12
+ if (!state)
13
+ return 'none';
14
+ try {
15
+ await agentClientForApp(root, opts).heartbeat(state.uuid);
16
+ return 'touched';
17
+ }
18
+ catch (err) {
19
+ if (err instanceof AgentSessionError) {
20
+ report.notes.push(err.code === 'SESSION_GONE'
21
+ ? `agent session ${state.uuid} is no longer active (${err.message}) — run \`mapples agent stop\``
22
+ : `agent session heartbeat refused (${err.code}: ${err.message})`);
23
+ return 'missed';
24
+ }
25
+ if (isNetworkError(err)) {
26
+ report.notes.push(`agent session heartbeat did not reach ${state.apiUrl} (network error)`);
27
+ return 'missed';
28
+ }
29
+ throw err;
30
+ }
31
+ }
32
+ //# sourceMappingURL=agentLease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentLease.js","sourceRoot":"","sources":["../../src/services/agentLease.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wEAAwE;AACxE,0EAA0E;AAC1E,wEAAwE;AACxE,oDAAoD;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,MAAkB,EAClB,OAAgC,EAAE;IAElC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,iBAAiB,EAAE,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,GAAG,CAAC,IAAI,KAAK,cAAc;gBACzB,CAAC,CAAC,iBAAiB,KAAK,CAAC,IAAI,yBAAyB,GAAG,CAAC,OAAO,gCAAgC;gBACjG,CAAC,CAAC,oCAAoC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,GAAG,CACpE,CAAC;YACF,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;YAC3F,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1,2 +1,4 @@
1
+ import { AgentSessionClient } from '../api/agent.js';
1
2
  import { JpatchClient } from '../api/client.js';
2
3
  export declare function clientForApp(root: string, opts: Record<string, unknown>): JpatchClient;
4
+ export declare function agentClientForApp(root: string, opts: Record<string, unknown>): AgentSessionClient;
@@ -1,18 +1,35 @@
1
- // Builds the JPATCH client for commands running inside a linked app: config
1
+ // Builds the API clients for commands running inside a linked app: config
2
2
  // gives the project id, .mapples/secret (or MAPPLES_SECRET) authenticates, and
3
3
  // the internal --denv flag can point a single run at another stage.
4
+ import { AgentSessionClient } from '../api/agent.js';
4
5
  import { JpatchClient } from '../api/client.js';
6
+ import { agentCommitSummary, readAgentState } from '../project/agentState.js';
5
7
  import { readConfig } from '../project/config.js';
6
- import { resolveApiUrl } from '../project/env.js';
8
+ import { assetUrlFor, resolveApiUrl } from '../project/env.js';
7
9
  import { readSecret } from '../project/secret.js';
8
10
  import { cliOrigin } from '../version.js';
9
11
  export function clientForApp(root, opts) {
10
12
  const config = readConfig(root);
13
+ const baseUrl = resolveApiUrl({ denv: opts.denv, configuredUrl: config.apiUrl });
14
+ // While an agent session holds the project, its commits are attributed to
15
+ // the agent's current step in Creator's history (RFC-0001 §5.1 meta.summary).
16
+ const agent = readAgentState(root);
11
17
  return new JpatchClient({
12
- baseUrl: resolveApiUrl({ denv: opts.denv, configuredUrl: config.apiUrl }),
18
+ baseUrl,
19
+ assetsBaseUrl: assetUrlFor(baseUrl),
13
20
  projectId: config.projectId,
14
21
  token: readSecret(root),
15
22
  origin: cliOrigin(),
23
+ ...(agent ? { summary: agentCommitSummary(agent) } : {}),
24
+ });
25
+ }
26
+ export function agentClientForApp(root, opts) {
27
+ const config = readConfig(root);
28
+ const baseUrl = resolveApiUrl({ denv: opts.denv, configuredUrl: config.apiUrl });
29
+ return new AgentSessionClient({
30
+ baseUrl,
31
+ projectId: config.projectId,
32
+ token: readSecret(root),
16
33
  });
17
34
  }
18
35
  //# sourceMappingURL=clientFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clientFactory.js","sourceRoot":"","sources":["../../src/services/clientFactory.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+EAA+E;AAC/E,oEAAoE;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAA6B;IACtE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,IAAI,YAAY,CAAC;QACtB,OAAO,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACzE,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC;QACvB,MAAM,EAAE,SAAS,EAAE;KACpB,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"clientFactory.js","sourceRoot":"","sources":["../../src/services/clientFactory.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,+EAA+E;AAC/E,oEAAoE;AAEpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAA6B;IACtE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACjF,0EAA0E;IAC1E,8EAA8E;IAC9E,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,IAAI,YAAY,CAAC;QACtB,OAAO;QACP,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC;QACnC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC;QACvB,MAAM,EAAE,SAAS,EAAE;QACnB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAA6B;IAC3E,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACjF,OAAO,IAAI,kBAAkB,CAAC;QAC5B,OAAO;QACP,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC;KACxB,CAAC,CAAC;AACL,CAAC"}