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
@@ -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
- appDir: 'mapples/pages',
42
- routesDir: 'app/(mapples)',
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":"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"}
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
- appDir: 'mapples/pages',
29
- routesDir: 'app/(mapples)',
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":"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"}
1
+ {"version":3,"file":"initImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/initImpl.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,47 @@
1
1
  import chalk from 'chalk';
2
2
  import { runSyncEngine } from '../../services/syncEngine.js';
3
+ import { touchAgentLease } from '../../services/agentLease.js';
3
4
  import { clientForApp } from '../../services/clientFactory.js';
4
- import { renderReport } from '../../ui/report.js';
5
+ import { readHead } from '../../project/head.js';
6
+ import { emptyReport, isAlreadyRemoved, renderReport } from '../../ui/report.js';
5
7
  export async function runSync(opts) {
6
8
  const root = process.cwd();
7
9
  const client = clientForApp(root, opts);
10
+ const adopt = opts.adopt !== false;
11
+ const leaseNotes = emptyReport();
12
+ await touchAgentLease(root, leaseNotes, opts);
13
+ // Adoption goes first once the project has a base: a new component file
14
+ // and the managed page that already uses it then link in the same run
15
+ // (the merge tags the usage as an instance of the component just adopted).
16
+ // The very first sync bootstraps before anything can be adopted.
17
+ let adoption = null;
18
+ if (adopt && readHead(root)) {
19
+ const { proposeAdoptions } = await import('../../services/adoptService.js');
20
+ adoption = emptyReport();
21
+ await proposeAdoptions({ root, client, report: adoption, yes: opts.yes === true });
22
+ }
8
23
  const report = await runSyncEngine({ root, client });
9
- if (opts.adopt !== false) {
24
+ if (adoption) {
25
+ report.files.unshift(...adoption.files);
26
+ report.notes.unshift(...adoption.notes);
27
+ report.warnings.unshift(...adoption.warnings);
28
+ report.pushedOps += adoption.pushedOps;
29
+ }
30
+ else if (adopt) {
10
31
  const { proposeAdoptions } = await import('../../services/adoptService.js');
11
32
  await proposeAdoptions({ root, client, report, yes: opts.yes === true });
12
33
  }
34
+ await touchAgentLease(root, leaseNotes, opts);
35
+ report.notes.push(...leaseNotes.notes);
36
+ const exitCode = report.conflicts.length > 0 ? 2 : 0;
37
+ if (exitCode !== 0)
38
+ process.exitCode = exitCode;
13
39
  if (opts.json === true) {
14
- console.log(JSON.stringify(report, null, 2));
40
+ const dropped = report.dropped.map((d) => isAlreadyRemoved(d) ? { ...d, alreadyRemoved: true } : d);
41
+ console.log(JSON.stringify({ ...report, dropped, exitCode }, null, 2));
15
42
  return;
16
43
  }
17
44
  console.log(chalk.bold('\nmapples sync'));
18
45
  console.log(renderReport(report));
19
- if (report.conflicts.length > 0)
20
- process.exitCode = 2;
21
46
  }
22
47
  //# sourceMappingURL=syncImpl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"syncImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/syncImpl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAA6B;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAErD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAC5E,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,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,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"syncImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/syncImpl.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export function registerInit(program) {
5
5
  .description('Link an existing Expo app to a Mapples project')
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) | cursor | codex (ChatGPT) — skills, instructions, MCP entry')
8
9
  .addOption(new Option('--denv <env>').hideHelp()) // internal: dev|staging|prod
9
10
  .option('--json', 'machine-readable output')
10
11
  .action(async (opts) => {
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gDAAgD,CAAC;SAC7D,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,IAA6B,EAAE,EAAE;QAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,MAAM,CACL,gBAAgB,EAChB,4GAA4G,CAC7G;SACA,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,IAA6B,EAAE,EAAE;QAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/index.js CHANGED
@@ -6,16 +6,27 @@ import { registerInit } from './commands/init.js';
6
6
  import { registerSync } from './commands/sync.js';
7
7
  import { registerAdopt } from './commands/adopt.js';
8
8
  import { registerDoctor } from './commands/doctor.js';
9
+ import { registerAgent } from './commands/agent.js';
9
10
  const program = new Command();
10
11
  program
11
12
  .name('mapples')
12
13
  .description('Mapples CLI — two-way code sync between Mapples Creator and your Expo project')
13
- .version(cliVersion());
14
+ .version(cliVersion())
15
+ .addHelpText('after', [
16
+ '',
17
+ 'Exit codes:',
18
+ ' 0 ok',
19
+ ' 1 error',
20
+ ' 2 sync finished with conflicts (files deprecated, never overwritten)',
21
+ ' 3 agent lease gone (session expired, released or disconnected in Creator)',
22
+ ' 4 project busy (another agent session holds it — `agent start --takeover`)',
23
+ ].join('\n'));
14
24
  registerCreate(program);
15
25
  registerInit(program);
16
26
  registerSync(program);
17
27
  registerAdopt(program);
18
28
  registerDoctor(program);
29
+ registerAgent(program);
19
30
  program.parseAsync(process.argv).catch((err) => {
20
31
  // Top-level failure surface: print and exit non-zero. Never swallow.
21
32
  console.error(err instanceof Error ? err.message : String(err));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,+EAA+E,CAAC;KAC5F,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;AAEzB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,qEAAqE;IACrE,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,+EAA+E,CAAC;KAC5F,OAAO,CAAC,UAAU,EAAE,CAAC;KACrB,WAAW,CACV,OAAO,EACP;IACE,EAAE;IACF,aAAa;IACb,SAAS;IACT,YAAY;IACZ,yEAAyE;IACzE,8EAA8E;IAC9E,+EAA+E;CAChF,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AAEJ,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AAEvB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,qEAAqE;IACrE,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -1,11 +1,14 @@
1
- import type { JpatchOp, RenderDomNode } from '../types.js';
1
+ import { type JpatchOp, type RenderDomNode } from '../types.js';
2
2
  /**
3
3
  * Apply RenderNode ops to one page tree. Ops whose target is not in this tree
4
4
  * are ignored (they belong to another page) and returned in `skipped` so the
5
- * caller can route them; nothing is dropped silently.
5
+ * caller can route them; nothing is dropped silently. `warnings` carries
6
+ * CHILDREN_REBASED when a directive resolved differently from its literal
7
+ * intent, exactly when the server flags it.
6
8
  */
7
9
  export declare function applyNodeOps(root: RenderDomNode | null, ops: JpatchOp[]): {
8
10
  root: RenderDomNode | null;
9
11
  skipped: JpatchOp[];
10
12
  orphans: Map<string, RenderDomNode>;
13
+ warnings: string[];
11
14
  };
@@ -1,5 +1,7 @@
1
1
  // Apply RenderNode ops to a page tree (the pull direction). The inverse of
2
2
  // diffTree: applyNodeOps(base, diffTree(base, x)) ≡ x.
3
+ import { sidecarFilled, sidecarOf, } from '../types.js';
4
+ import { resolveChildOrder } from './childrenOrder.js';
3
5
  import { applyMergePatch } from './mergePatch.js';
4
6
  function buildState(root) {
5
7
  const index = new Map();
@@ -19,13 +21,16 @@ function buildState(root) {
19
21
  /**
20
22
  * Apply RenderNode ops to one page tree. Ops whose target is not in this tree
21
23
  * are ignored (they belong to another page) and returned in `skipped` so the
22
- * caller can route them; nothing is dropped silently.
24
+ * caller can route them; nothing is dropped silently. `warnings` carries
25
+ * CHILDREN_REBASED when a directive resolved differently from its literal
26
+ * intent, exactly when the server flags it.
23
27
  */
24
28
  export function applyNodeOps(root, ops) {
25
29
  const state = buildState(root);
26
30
  const skipped = [];
27
31
  // Created-but-not-yet-linked nodes park here until a children directive links them.
28
32
  const orphans = new Map();
33
+ let rebased = false;
29
34
  for (const op of ops) {
30
35
  if (op.entity !== 'RenderNode') {
31
36
  skipped.push(op);
@@ -42,9 +47,26 @@ export function applyNodeOps(root, ops) {
42
47
  type: data.type,
43
48
  props: data.props ?? {},
44
49
  children: [],
50
+ ...sidecarOf(op.data),
45
51
  };
46
52
  state.index.set(id, node);
47
- orphans.set(id, node);
53
+ // A create may link itself under its parent (RFC-0001 §5 create.data.parent/index).
54
+ const parent = typeof data.parent === 'string' ? state.index.get(data.parent) : undefined;
55
+ if (parent) {
56
+ const at = typeof data.index === 'number'
57
+ ? Math.max(0, Math.min(data.index, parent.children.length))
58
+ : parent.children.length;
59
+ parent.children.splice(at, 0, node);
60
+ state.parents.set(id, parent.sid);
61
+ }
62
+ else {
63
+ if (typeof data.parent === 'string') {
64
+ skipped.push(op); // parent lives in another tree — route it there
65
+ state.index.delete(id);
66
+ continue;
67
+ }
68
+ orphans.set(id, node);
69
+ }
48
70
  continue;
49
71
  }
50
72
  const id = op.id;
@@ -79,12 +101,25 @@ export function applyNodeOps(root, ops) {
79
101
  }
80
102
  // update
81
103
  if (op.patch) {
82
- const patched = applyMergePatch({ type: node.type, props: node.props }, op.patch);
104
+ const patched = applyMergePatch({ type: node.type, props: node.props, ...sidecarFilled(node) }, op.patch);
83
105
  node.type = patched.type;
84
106
  node.props = patched.props ?? {};
107
+ const sidecar = sidecarOf(patched);
108
+ if (sidecar.refProps)
109
+ node.refProps = sidecar.refProps;
110
+ else
111
+ delete node.refProps;
112
+ if (sidecar.dataProps)
113
+ node.dataProps = sidecar.dataProps;
114
+ else
115
+ delete node.dataProps;
116
+ if (sidecar.actionProps)
117
+ node.actionProps = sidecar.actionProps;
118
+ else
119
+ delete node.actionProps;
85
120
  }
86
- if (op.children) {
87
- applyChildrenDirective(state, node, op.children, orphans);
121
+ if (op.children && applyChildrenDirective(state, node, op.children, orphans)) {
122
+ rebased = true;
88
123
  }
89
124
  }
90
125
  // Root replacement: the old root was deleted and a new tree created with no
@@ -96,39 +131,47 @@ export function applyNodeOps(root, ops) {
96
131
  orphans.clear();
97
132
  }
98
133
  }
99
- return { root: state.root, skipped, orphans };
134
+ return { root: state.root, skipped, orphans, warnings: rebased ? ['CHILDREN_REBASED'] : [] };
100
135
  }
136
+ /**
137
+ * Resolve a children directive the way the server does (RFC-0001 §5.2,
138
+ * service--mapplesorg #724/#725): order via resolveChildOrder, then every ref
139
+ * must resolve in this tree and must not be the target or one of its
140
+ * ancestors — such a ref is skipped. A ref linked elsewhere is reparented; a
141
+ * child left out parks in `orphans`. Returns whether the result was rebased.
142
+ */
101
143
  function applyChildrenDirective(state, node, directive, orphans) {
102
- if (directive.remove) {
103
- for (const ref of directive.remove) {
104
- const removed = node.children.find((c) => c.sid === ref);
105
- node.children = node.children.filter((c) => c.sid !== ref);
106
- if (removed) {
107
- state.parents.delete(ref);
108
- orphans.set(ref, removed); // may be re-linked under a new parent
109
- }
110
- }
144
+ const current = node.children.map((c) => c.sid);
145
+ const resolved = resolveChildOrder(current, directive);
146
+ let rebased = resolved.rebased;
147
+ const lineage = new Set();
148
+ for (let sid = node.sid; sid !== undefined; sid = state.parents.get(sid)) {
149
+ lineage.add(sid);
111
150
  }
112
- if (directive.insert) {
113
- for (const ins of directive.insert) {
114
- const child = state.index.get(ins.ref) ?? orphans.get(ins.ref);
115
- if (!child)
116
- throw new Error(`children.insert references unknown node ${ins.ref}`);
117
- orphans.delete(ins.ref);
118
- const at = Math.max(0, Math.min(ins.at, node.children.length));
119
- node.children.splice(at, 0, child);
120
- state.parents.set(ins.ref, node.sid);
151
+ const kept = [];
152
+ for (const sid of resolved.order) {
153
+ const child = state.index.get(sid) ?? orphans.get(sid);
154
+ if (!child || lineage.has(sid)) {
155
+ rebased = true;
156
+ continue;
157
+ }
158
+ if (!current.includes(sid)) {
159
+ const oldParent = state.parents.get(sid);
160
+ const parent = oldParent === undefined ? undefined : state.index.get(oldParent);
161
+ if (parent)
162
+ parent.children = parent.children.filter((c) => c.sid !== sid);
163
+ orphans.delete(sid);
121
164
  }
165
+ state.parents.set(sid, node.sid);
166
+ kept.push(child);
122
167
  }
123
- if (directive.move) {
124
- for (const mv of directive.move) {
125
- const from = node.children.findIndex((c) => c.sid === mv.ref);
126
- if (from === -1)
127
- continue; // clamped server-side; mirror the tolerance
128
- const [child] = node.children.splice(from, 1);
129
- const to = Math.max(0, Math.min(mv.to, node.children.length));
130
- node.children.splice(to, 0, child);
168
+ for (const child of node.children) {
169
+ if (!kept.includes(child)) {
170
+ state.parents.delete(child.sid);
171
+ orphans.set(child.sid, child); // may be re-linked under a new parent
131
172
  }
132
173
  }
174
+ node.children = kept;
175
+ return rebased;
133
176
  }
134
177
  //# sourceMappingURL=applyOps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"applyOps.js","sourceRoot":"","sources":["../../src/merge/applyOps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"applyOps.js","sourceRoot":"","sources":["../../src/merge/applyOps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ChildrenDirective } from '../types.js';
2
+ export interface ChildOrder {
3
+ order: string[];
4
+ /** The result diverges from the directive's literal intent (CHILDREN_REBASED). */
5
+ rebased: boolean;
6
+ }
7
+ /**
8
+ * `set` is wholesale and exclusive; the first occurrence of each ref wins.
9
+ * Otherwise remove → move → insert: a missing remove/move ref is skipped,
10
+ * `move.to` and `insert.at` clamp to bounds, and inserting a present ref moves
11
+ * it. Ref resolution (unknown refs, cycles) is the caller's second pass.
12
+ */
13
+ export declare function resolveChildOrder(children: string[], directive: ChildrenDirective): ChildOrder;
@@ -0,0 +1,51 @@
1
+ // Child-order directive resolution, identical to the backend's
2
+ // `api/canvas/tree.py` apply_children (service--mapplesorg #724, #725).
3
+ // Pull replay and the mock server both resolve directives through here, so a
4
+ // replayed tree lands exactly on HEAD.
5
+ /**
6
+ * `set` is wholesale and exclusive; the first occurrence of each ref wins.
7
+ * Otherwise remove → move → insert: a missing remove/move ref is skipped,
8
+ * `move.to` and `insert.at` clamp to bounds, and inserting a present ref moves
9
+ * it. Ref resolution (unknown refs, cycles) is the caller's second pass.
10
+ */
11
+ export function resolveChildOrder(children, directive) {
12
+ if (directive.set !== undefined) {
13
+ const order = [...new Set(directive.set)];
14
+ return { order, rebased: order.length !== directive.set.length };
15
+ }
16
+ const out = [...children];
17
+ let rebased = false;
18
+ for (const ref of directive.remove ?? []) {
19
+ const at = out.indexOf(ref);
20
+ if (at === -1) {
21
+ rebased = true;
22
+ continue;
23
+ }
24
+ out.splice(at, 1);
25
+ }
26
+ for (const mv of directive.move ?? []) {
27
+ const from = out.indexOf(mv.ref);
28
+ if (from === -1) {
29
+ rebased = true;
30
+ continue;
31
+ }
32
+ out.splice(from, 1);
33
+ const to = Math.min(mv.to, out.length);
34
+ if (to !== mv.to)
35
+ rebased = true;
36
+ out.splice(to, 0, mv.ref);
37
+ }
38
+ for (const ins of directive.insert ?? []) {
39
+ const present = out.indexOf(ins.ref);
40
+ if (present !== -1) {
41
+ out.splice(present, 1);
42
+ rebased = true;
43
+ }
44
+ const at = Math.min(ins.at, out.length);
45
+ if (at !== ins.at)
46
+ rebased = true;
47
+ out.splice(at, 0, ins.ref);
48
+ }
49
+ return { order: out, rebased };
50
+ }
51
+ //# sourceMappingURL=childrenOrder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"childrenOrder.js","sourceRoot":"","sources":["../../src/merge/childrenOrder.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wEAAwE;AACxE,6EAA6E;AAC7E,uCAAuC;AAUvC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAkB,EAAE,SAA4B;IAChF,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACnE,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC1B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACd,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YAChB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;YAAE,OAAO,GAAG,IAAI,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACvB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE;YAAE,OAAO,GAAG,IAAI,CAAC;QAClC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { JpatchOp, RenderDomNode } from '../types.js';
1
+ import { type JpatchOp, type RenderDomNode } from '../types.js';
2
2
  interface Indexed {
3
3
  node: RenderDomNode;
4
4
  parentSid: string | null;
@@ -12,4 +12,23 @@ export declare function indexTree(root: RenderDomNode | null): Map<string, Index
12
12
  * `c_` sids for genuinely new nodes before diffing).
13
13
  */
14
14
  export declare function diffTree(base: RenderDomNode | null, next: RenderDomNode | null): JpatchOp[];
15
+ export interface StagedDiff {
16
+ /** Everything but the moves into new containers — one push. */
17
+ ops: JpatchOp[];
18
+ /**
19
+ * The moves into containers `ops` creates. They target those containers by
20
+ * id, and the server resolves a cid only as a reference, never as the
21
+ * target of an update — so they go in a LATER transaction, once the
22
+ * earlier one has minted the ids (the push resolves cids per transaction).
23
+ * Each move's remove and insert stay together, so no node is ever orphaned.
24
+ */
25
+ deferred: JpatchOp[];
26
+ }
27
+ /**
28
+ * `diffTree`, staged so an existing element can move into a container created
29
+ * in the same change (wrapping, grouping). Stage one creates the containers
30
+ * and applies every other change with the moved elements still under a
31
+ * surviving ancestor from `base`; stage two moves them into place.
32
+ */
33
+ export declare function diffTreeStaged(base: RenderDomNode | null, next: RenderDomNode | null): StagedDiff;
15
34
  export {};