mapples 0.2.0-beta.4 → 0.2.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +42 -0
  2. package/dist/api/agent.d.ts +84 -0
  3. package/dist/api/agent.js +92 -0
  4. package/dist/api/agent.js.map +1 -0
  5. package/dist/api/client.d.ts +3 -0
  6. package/dist/api/client.js +2 -0
  7. package/dist/api/client.js.map +1 -1
  8. package/dist/api/commit.js +1 -0
  9. package/dist/api/commit.js.map +1 -1
  10. package/dist/api/objects.d.ts +12 -0
  11. package/dist/api/objects.js +2 -0
  12. package/dist/api/objects.js.map +1 -1
  13. package/dist/api/txPlan.d.ts +15 -0
  14. package/dist/api/txPlan.js +196 -0
  15. package/dist/api/txPlan.js.map +1 -0
  16. package/dist/commands/agent.d.ts +2 -0
  17. package/dist/commands/agent.js +76 -0
  18. package/dist/commands/agent.js.map +1 -0
  19. package/dist/commands/create.js +1 -0
  20. package/dist/commands/create.js.map +1 -1
  21. package/dist/commands/impl/adoptImpl.js +3 -0
  22. package/dist/commands/impl/adoptImpl.js.map +1 -1
  23. package/dist/commands/impl/agentImpl.d.ts +10 -0
  24. package/dist/commands/impl/agentImpl.js +349 -0
  25. package/dist/commands/impl/agentImpl.js.map +1 -0
  26. package/dist/commands/impl/createImpl.js +19 -0
  27. package/dist/commands/impl/createImpl.js.map +1 -1
  28. package/dist/commands/impl/initImpl.js +19 -0
  29. package/dist/commands/impl/initImpl.js.map +1 -1
  30. package/dist/commands/impl/syncImpl.js +9 -3
  31. package/dist/commands/impl/syncImpl.js.map +1 -1
  32. package/dist/commands/init.js +1 -0
  33. package/dist/commands/init.js.map +1 -1
  34. package/dist/index.js +12 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/merge/applyOps.d.ts +4 -1
  37. package/dist/merge/applyOps.js +42 -30
  38. package/dist/merge/applyOps.js.map +1 -1
  39. package/dist/merge/childrenOrder.d.ts +13 -0
  40. package/dist/merge/childrenOrder.js +51 -0
  41. package/dist/merge/childrenOrder.js.map +1 -0
  42. package/dist/project/agentState.d.ts +24 -0
  43. package/dist/project/agentState.js +42 -0
  44. package/dist/project/agentState.js.map +1 -0
  45. package/dist/project/secret.d.ts +6 -2
  46. package/dist/project/secret.js +11 -5
  47. package/dist/project/secret.js.map +1 -1
  48. package/dist/services/adoptService.js +11 -0
  49. package/dist/services/adoptService.js.map +1 -1
  50. package/dist/services/agentInstall.d.ts +35 -0
  51. package/dist/services/agentInstall.js +180 -0
  52. package/dist/services/agentInstall.js.map +1 -0
  53. package/dist/services/agentLease.d.ts +2 -0
  54. package/dist/services/agentLease.js +32 -0
  55. package/dist/services/agentLease.js.map +1 -0
  56. package/dist/services/clientFactory.d.ts +2 -0
  57. package/dist/services/clientFactory.js +16 -1
  58. package/dist/services/clientFactory.js.map +1 -1
  59. package/dist/services/scaffold.js +4 -0
  60. package/dist/services/scaffold.js.map +1 -1
  61. package/dist/services/syncEngine.js +91 -42
  62. package/dist/services/syncEngine.js.map +1 -1
  63. package/dist/types.d.ts +11 -0
  64. package/dist/types.js.map +1 -1
  65. package/dist/ui/report.d.ts +7 -0
  66. package/dist/ui/report.js +8 -0
  67. package/dist/ui/report.js.map +1 -1
  68. package/package.json +3 -3
  69. package/templates/claude/CLAUDE.md +7 -0
  70. package/templates/claude/mapples.md +118 -0
  71. package/templates/claude/mcp.json +11 -0
  72. package/templates/claude/skills/mapples-conventions/SKILL.md +136 -0
  73. package/templates/claude/skills/mapples-design/SKILL.md +218 -0
  74. package/templates/claude/skills/mapples-design/reference/component-library.md +128 -0
  75. package/templates/claude/skills/mapples-design/reference/design-tokens.md +132 -0
  76. package/templates/claude/skills/mapples-design/reference/layout-contract.md +227 -0
  77. package/templates/claude/skills/mapples-design/reference/lint-checklist.md +51 -0
  78. package/templates/claude/skills/mapples-design/reference/plan.md +95 -0
  79. package/templates/claude/skills/mapples-design/reference/playbooks/empty-states.md +14 -0
  80. package/templates/claude/skills/mapples-design/reference/playbooks/forms-and-auth.md +22 -0
  81. package/templates/claude/skills/mapples-design/reference/playbooks/home-dashboard.md +14 -0
  82. package/templates/claude/skills/mapples-design/reference/playbooks/list-and-detail.md +18 -0
  83. package/templates/claude/skills/mapples-design/reference/playbooks/microcopy.md +20 -0
  84. package/templates/claude/skills/mapples-design/reference/playbooks/navigation-chrome.md +21 -0
  85. package/templates/claude/skills/mapples-design/reference/playbooks/onboarding-flow.md +15 -0
  86. package/templates/claude/skills/mapples-design/reference/playbooks/screen-flow-wiring.md +37 -0
  87. package/templates/claude/skills/mapples-design/reference/playbooks/settings-profile.md +16 -0
  88. package/templates/claude/skills/mapples-design/reference/playbooks/stats-and-progress.md +17 -0
  89. package/templates/claude/skills/mapples-design/reference/playbooks/visual-hierarchy.md +18 -0
  90. package/templates/claude/skills/mapples-design/reference/style-guides.md +92 -0
  91. package/templates/claude/skills/mapples-sync/SKILL.md +92 -0
  92. package/templates/gitignore +2 -0
  93. package/templates/package.json +1 -0
@@ -0,0 +1,35 @@
1
+ export declare const SUPPORTED_AGENTS: readonly ["claude"];
2
+ export type AgentName = (typeof SUPPORTED_AGENTS)[number];
3
+ /** Validates the `--agent` option; only Claude Code is supported in v1. */
4
+ export declare function parseAgentName(value: unknown): AgentName | undefined;
5
+ /** The marker every generated Markdown file carries (line 1, or right after its frontmatter). */
6
+ export declare const GENERATED_HEADER: RegExp;
7
+ export declare const CLAUDE_MD_POINTER = "@.claude/mapples.md";
8
+ /**
9
+ * Whether the CLI generated this file: the header opens the file, or — for
10
+ * skills, whose YAML frontmatter must be the first thing Claude Code reads —
11
+ * it is the first line after the frontmatter block.
12
+ */
13
+ export declare function isGeneratedFile(content: string): boolean;
14
+ export interface InstallOptions {
15
+ apiUrl: string;
16
+ force?: boolean;
17
+ routesDir?: string;
18
+ pagesDir?: string;
19
+ componentsDir?: string;
20
+ }
21
+ export interface InstallOutcome {
22
+ file: string;
23
+ action: 'created' | 'updated' | 'unchanged' | 'skipped' | 'appended' | 'deprecated';
24
+ detail?: string;
25
+ }
26
+ export interface InstallResult {
27
+ outcomes: InstallOutcome[];
28
+ /** The MCP entry the user has to merge by hand when `.mcp.json` already existed. */
29
+ mcpSnippet: string | null;
30
+ }
31
+ export declare function claudeTemplatesDir(): string;
32
+ export declare function mcpConfigFor(apiUrl: string): string;
33
+ export declare function installClaudeIntegration(root: string, options: InstallOptions): InstallResult;
34
+ /** The lines printed after create/init/install with `--agent claude`. */
35
+ export declare function claudeNextSteps(appDir: string | null): string[];
@@ -0,0 +1,180 @@
1
+ // `--agent claude` / `mapples agent install`: puts the Claude Code bundle
2
+ // (templates/claude) into an app — project-local skills under .claude/skills,
3
+ // the conventions file, a CLAUDE.md pointer, and the read-only MCP entry.
4
+ // Files the CLI generated are refreshed in place (recognised by their
5
+ // GENERATED header); a file the user edited is never overwritten — it is
6
+ // skipped, or with --force deprecated (`_depr_<ts>_…old`) and regenerated.
7
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
8
+ import { dirname, join } from 'node:path';
9
+ import { deprecateFile } from '../merge/deprecate.js';
10
+ import { AGENT_STATE_GITIGNORE } from '../project/agentState.js';
11
+ import { DEFAULT_COMPONENTS_DIR, DEFAULT_PAGES_DIR, DEFAULT_ROUTES_DIR, } from '../project/config.js';
12
+ import { ensureGitignored } from '../project/secret.js';
13
+ import { cliVersion } from '../version.js';
14
+ import { templatesDir } from './scaffold.js';
15
+ export const SUPPORTED_AGENTS = ['claude'];
16
+ /** Validates the `--agent` option; only Claude Code is supported in v1. */
17
+ export function parseAgentName(value) {
18
+ if (value === undefined)
19
+ return undefined;
20
+ if (value === 'claude')
21
+ return 'claude';
22
+ throw new Error(`unknown --agent "${String(value)}" — supported: ${SUPPORTED_AGENTS.join(', ')}`);
23
+ }
24
+ /** The marker every generated Markdown file carries (line 1, or right after its frontmatter). */
25
+ export const GENERATED_HEADER = /^<!--\s*GENERATED by Mapples\b/;
26
+ export const CLAUDE_MD_POINTER = '@.claude/mapples.md';
27
+ /**
28
+ * Whether the CLI generated this file: the header opens the file, or — for
29
+ * skills, whose YAML frontmatter must be the first thing Claude Code reads —
30
+ * it is the first line after the frontmatter block.
31
+ */
32
+ export function isGeneratedFile(content) {
33
+ const lines = content.split('\n');
34
+ if (GENERATED_HEADER.test(lines[0] ?? ''))
35
+ return true;
36
+ if (lines[0]?.trim() !== '---')
37
+ return false;
38
+ const close = lines.findIndex((line, i) => i > 0 && line.trim() === '---');
39
+ if (close < 0)
40
+ return false;
41
+ const afterFrontmatter = lines.slice(close + 1).find((line) => line.trim() !== '');
42
+ return GENERATED_HEADER.test(afterFrontmatter ?? '');
43
+ }
44
+ export function claudeTemplatesDir() {
45
+ return join(templatesDir(), 'claude');
46
+ }
47
+ function substitute(content, opts) {
48
+ return content
49
+ .replaceAll('__CLI_VERSION__', cliVersion())
50
+ .replaceAll('__API_URL__', opts.apiUrl.replace(/\/+$/, ''))
51
+ .replaceAll('__ROUTES_DIR__', opts.routesDir)
52
+ .replaceAll('__PAGES_DIR__', opts.pagesDir)
53
+ .replaceAll('__COMPONENTS_DIR__', opts.componentsDir);
54
+ }
55
+ export function mcpConfigFor(apiUrl) {
56
+ return substitute(readFileSync(join(claudeTemplatesDir(), 'mcp.json'), 'utf8'), {
57
+ apiUrl,
58
+ force: false,
59
+ routesDir: '',
60
+ pagesDir: '',
61
+ componentsDir: '',
62
+ });
63
+ }
64
+ /** Write a generated Markdown file, honouring the header handshake. */
65
+ function placeGenerated(root, rel, content, force, outcomes) {
66
+ const abs = join(root, rel);
67
+ if (existsSync(abs)) {
68
+ const current = readFileSync(abs, 'utf8');
69
+ if (current === content) {
70
+ outcomes.push({ file: rel, action: 'unchanged' });
71
+ return;
72
+ }
73
+ if (!isGeneratedFile(current)) {
74
+ if (!force) {
75
+ outcomes.push({
76
+ file: rel,
77
+ action: 'skipped',
78
+ detail: 'edited by you — kept (re-run with --force to regenerate)',
79
+ });
80
+ return;
81
+ }
82
+ const kept = deprecateFile(abs);
83
+ outcomes.push({
84
+ file: rel,
85
+ action: 'deprecated',
86
+ detail: `your version is kept at ${kept.slice(root.length + 1)}`,
87
+ });
88
+ writeFileSync(abs, content);
89
+ return;
90
+ }
91
+ writeFileSync(abs, content);
92
+ outcomes.push({ file: rel, action: 'updated' });
93
+ return;
94
+ }
95
+ mkdirSync(dirname(abs), { recursive: true });
96
+ writeFileSync(abs, content);
97
+ outcomes.push({ file: rel, action: 'created' });
98
+ }
99
+ function walk(dir, rel = '') {
100
+ const out = [];
101
+ for (const entry of readdirSync(join(dir, rel), { withFileTypes: true })) {
102
+ const relPath = rel ? join(rel, entry.name) : entry.name;
103
+ if (entry.isDirectory())
104
+ out.push(...walk(dir, relPath));
105
+ else
106
+ out.push(relPath);
107
+ }
108
+ return out.sort();
109
+ }
110
+ export function installClaudeIntegration(root, options) {
111
+ const opts = {
112
+ apiUrl: options.apiUrl,
113
+ force: options.force === true,
114
+ routesDir: options.routesDir ?? DEFAULT_ROUTES_DIR,
115
+ pagesDir: options.pagesDir ?? DEFAULT_PAGES_DIR,
116
+ componentsDir: options.componentsDir ?? DEFAULT_COMPONENTS_DIR,
117
+ };
118
+ const src = claudeTemplatesDir();
119
+ const outcomes = [];
120
+ const read = (rel) => substitute(readFileSync(join(src, rel), 'utf8'), opts);
121
+ // Skills: templates/claude/skills/** -> .claude/skills/**
122
+ for (const rel of walk(join(src, 'skills'))) {
123
+ placeGenerated(root, join('.claude', 'skills', rel), read(join('skills', rel)), opts.force, outcomes);
124
+ }
125
+ // Conventions: templates/claude/mapples.md -> .claude/mapples.md
126
+ placeGenerated(root, join('.claude', 'mapples.md'), read('mapples.md'), opts.force, outcomes);
127
+ // CLAUDE.md: created from the template when absent; otherwise only the
128
+ // pointer line is appended — the user's instructions are theirs.
129
+ const claudeMd = join(root, 'CLAUDE.md');
130
+ if (!existsSync(claudeMd)) {
131
+ writeFileSync(claudeMd, read('CLAUDE.md'));
132
+ outcomes.push({ file: 'CLAUDE.md', action: 'created' });
133
+ }
134
+ else {
135
+ const current = readFileSync(claudeMd, 'utf8');
136
+ if (current.split('\n').some((line) => line.trim() === CLAUDE_MD_POINTER)) {
137
+ outcomes.push({ file: 'CLAUDE.md', action: 'unchanged' });
138
+ }
139
+ else {
140
+ writeFileSync(claudeMd, current +
141
+ (current.endsWith('\n') || current === '' ? '' : '\n') +
142
+ `\n${CLAUDE_MD_POINTER}\n`);
143
+ outcomes.push({ file: 'CLAUDE.md', action: 'appended', detail: CLAUDE_MD_POINTER });
144
+ }
145
+ }
146
+ // .mcp.json: written once; an existing one is never touched (the user may
147
+ // have other servers there) — the snippet is returned for them to merge.
148
+ const mcp = join(root, '.mcp.json');
149
+ let mcpSnippet = null;
150
+ const mcpContent = read('mcp.json');
151
+ if (!existsSync(mcp)) {
152
+ writeFileSync(mcp, mcpContent);
153
+ outcomes.push({ file: '.mcp.json', action: 'created' });
154
+ }
155
+ else if (readFileSync(mcp, 'utf8').includes('"mapples"')) {
156
+ outcomes.push({ file: '.mcp.json', action: 'unchanged' });
157
+ }
158
+ else {
159
+ mcpSnippet = mcpContent;
160
+ outcomes.push({
161
+ file: '.mcp.json',
162
+ action: 'skipped',
163
+ detail: 'exists — add the "mapples" server yourself (snippet printed below)',
164
+ });
165
+ }
166
+ if (ensureGitignored(root, [AGENT_STATE_GITIGNORE])) {
167
+ outcomes.push({ file: '.gitignore', action: 'appended', detail: AGENT_STATE_GITIGNORE });
168
+ }
169
+ return { outcomes, mcpSnippet };
170
+ }
171
+ /** The lines printed after create/init/install with `--agent claude`. */
172
+ export function claudeNextSteps(appDir) {
173
+ const cd = appDir ? `cd ${appDir} && ` : '';
174
+ return [
175
+ 'Claude Code is set up. Start it with the project key in the environment:',
176
+ ` ${cd}MAPPLES_SECRET=$(cat .mapples/secret) claude`,
177
+ 'then type /mapples-design and describe your app.',
178
+ ];
179
+ }
180
+ //# 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,7 +1,9 @@
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
8
  import { assetUrlFor, resolveApiUrl } from '../project/env.js';
7
9
  import { readSecret } from '../project/secret.js';
@@ -9,12 +11,25 @@ import { cliOrigin } from '../version.js';
9
11
  export function clientForApp(root, opts) {
10
12
  const config = readConfig(root);
11
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);
12
17
  return new JpatchClient({
13
18
  baseUrl,
14
19
  assetsBaseUrl: assetUrlFor(baseUrl),
15
20
  projectId: config.projectId,
16
21
  token: readSecret(root),
17
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),
18
33
  });
19
34
  }
20
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,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,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;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"}
@@ -8,6 +8,8 @@ export function templatesDir() {
8
8
  return fileURLToPath(new URL('../../templates/', import.meta.url));
9
9
  }
10
10
  const RENAMES = { gitignore: '.gitignore' };
11
+ /** Template subtrees that are not part of the app shell (installed by their own service). */
12
+ const NOT_APP_SHELL = new Set(['claude']);
11
13
  /** Copy the app-shell templates into `target`, substituting __APP_NAME__. Never overwrites. */
12
14
  export function scaffoldApp(target, appName) {
13
15
  const written = [];
@@ -16,6 +18,8 @@ export function scaffoldApp(target, appName) {
16
18
  for (const entry of readdirSync(join(src, rel), { withFileTypes: true })) {
17
19
  const relPath = rel ? join(rel, entry.name) : entry.name;
18
20
  if (entry.isDirectory()) {
21
+ if (!rel && NOT_APP_SHELL.has(entry.name))
22
+ continue;
19
23
  walk(relPath);
20
24
  continue;
21
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/services/scaffold.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,UAAU,YAAY;IAC1B,+CAA+C;IAC/C,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,OAAO,GAA2B,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAEpE,+FAA+F;AAC/F,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,OAAe;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACzE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YACzD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,OAAO,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACrC,IAAI,UAAU,CAAC,OAAO,CAAC;gBAAE,SAAS,CAAC,kBAAkB;YACrD,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC;iBACrD,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC;iBACnC,UAAU,CAAC,iBAAiB,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/C,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,iBAAiB,CAAC,EAAE,UAAU,CAAC,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAAE,OAAO,SAAS,CAAC;IACnE,sEAAsE;IACtE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/services/scaffold.ts"],"names":[],"mappings":"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"}