@noodleseed/one 0.156.0 → 0.158.0

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 (80) hide show
  1. package/README.md +8 -5
  2. package/dist/commands/import.d.ts.map +1 -1
  3. package/dist/commands/import.js +4 -0
  4. package/dist/commands/import.js.map +1 -1
  5. package/dist/commands/local-readiness.d.ts.map +1 -1
  6. package/dist/commands/local-readiness.js +8 -0
  7. package/dist/commands/local-readiness.js.map +1 -1
  8. package/dist/commands/project-setup.d.ts.map +1 -1
  9. package/dist/commands/project-setup.js +83 -47
  10. package/dist/commands/project-setup.js.map +1 -1
  11. package/dist/first-run.d.ts +1 -0
  12. package/dist/first-run.d.ts.map +1 -1
  13. package/dist/first-run.js +119 -46
  14. package/dist/first-run.js.map +1 -1
  15. package/dist/import-scaffold.d.ts +5 -0
  16. package/dist/import-scaffold.d.ts.map +1 -0
  17. package/dist/import-scaffold.js +41 -0
  18. package/dist/import-scaffold.js.map +1 -0
  19. package/dist/mcp-import.d.ts.map +1 -1
  20. package/dist/mcp-import.js +18 -15
  21. package/dist/mcp-import.js.map +1 -1
  22. package/dist/openapi-import.d.ts.map +1 -1
  23. package/dist/openapi-import.js +68 -43
  24. package/dist/openapi-import.js.map +1 -1
  25. package/dist/plugin-mode/plugin-operation-contract.d.ts +142 -3
  26. package/dist/plugin-mode/plugin-operation-contract.d.ts.map +1 -1
  27. package/dist/plugin-mode/plugin-operation-contract.js +13 -2
  28. package/dist/plugin-mode/plugin-operation-contract.js.map +1 -1
  29. package/dist/plugin-mode/plugin-operation-tools.d.ts.map +1 -1
  30. package/dist/plugin-mode/plugin-operation-tools.js +27 -8
  31. package/dist/plugin-mode/plugin-operation-tools.js.map +1 -1
  32. package/dist/project-bootstrap-install.d.ts +14 -0
  33. package/dist/project-bootstrap-install.d.ts.map +1 -0
  34. package/dist/project-bootstrap-install.js +73 -0
  35. package/dist/project-bootstrap-install.js.map +1 -0
  36. package/dist/project-bootstrap-launch.d.ts +27 -0
  37. package/dist/project-bootstrap-launch.d.ts.map +1 -0
  38. package/dist/project-bootstrap-launch.js +64 -0
  39. package/dist/project-bootstrap-launch.js.map +1 -0
  40. package/dist/project-bootstrap-process.d.ts +19 -0
  41. package/dist/project-bootstrap-process.d.ts.map +1 -0
  42. package/dist/project-bootstrap-process.js +60 -0
  43. package/dist/project-bootstrap-process.js.map +1 -0
  44. package/dist/project-bootstrap-report.d.ts +55 -0
  45. package/dist/project-bootstrap-report.d.ts.map +1 -0
  46. package/dist/project-bootstrap-report.js +30 -0
  47. package/dist/project-bootstrap-report.js.map +1 -0
  48. package/dist/project-bootstrap-state.d.ts +87 -0
  49. package/dist/project-bootstrap-state.d.ts.map +1 -0
  50. package/dist/project-bootstrap-state.js +125 -0
  51. package/dist/project-bootstrap-state.js.map +1 -0
  52. package/dist/project-bootstrap.d.ts +36 -0
  53. package/dist/project-bootstrap.d.ts.map +1 -0
  54. package/dist/project-bootstrap.js +243 -0
  55. package/dist/project-bootstrap.js.map +1 -0
  56. package/dist/project-scaffold-templates.d.ts +1 -1
  57. package/dist/project-scaffold-templates.d.ts.map +1 -1
  58. package/dist/project-scaffold-templates.js +17 -12
  59. package/dist/project-scaffold-templates.js.map +1 -1
  60. package/dist/project-toolchain.d.ts +13 -0
  61. package/dist/project-toolchain.d.ts.map +1 -0
  62. package/dist/project-toolchain.js +73 -0
  63. package/dist/project-toolchain.js.map +1 -0
  64. package/dist/project.d.ts +2 -0
  65. package/dist/project.d.ts.map +1 -1
  66. package/dist/project.js +40 -9
  67. package/dist/project.js.map +1 -1
  68. package/dist/widget-scaffold-template.d.ts.map +1 -1
  69. package/dist/widget-scaffold-template.js +5 -10
  70. package/dist/widget-scaffold-template.js.map +1 -1
  71. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +2 -2
  72. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bootstrap-skill.js +2 -1
  73. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +3 -2
  74. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  75. package/node_modules/@noodle-borg/assistant-gateway/package.json +1 -1
  76. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-bootstrap-authoring.js +1 -1
  77. package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-bootstrap-pre-auth.js +26 -4
  78. package/node_modules/@noodle-borg/service/package.json +1 -1
  79. package/node_modules/@noodleseed/assistant/package.json +1 -1
  80. package/package.json +2 -2
@@ -0,0 +1,36 @@
1
+ import type { AgentTarget } from '@noodle-borg/agent-kit';
2
+ import { type AgentSetupReport, setupAgentsWithResolvedSkills } from './agents.js';
3
+ import { type DocsMcpResult } from './commands/docs-mcp.js';
4
+ import type { ConfigLocation } from './config.js';
5
+ import { type InitProjectOptions, type InitProjectResult } from './project.js';
6
+ import { type BootstrapLaunchTarget, launchBootstrapAgent } from './project-bootstrap-launch.js';
7
+ import { type BootstrapExecutor } from './project-bootstrap-process.js';
8
+ import { type BootstrapReport } from './project-bootstrap-report.js';
9
+ export type { BootstrapReport } from './project-bootstrap-report.js';
10
+ import { type BootstrapStage } from './project-bootstrap-state.js';
11
+ import { type ProjectPackageManager } from './project-toolchain.js';
12
+ export interface BootstrapProjectOptions extends InitProjectOptions {
13
+ readonly install?: boolean;
14
+ readonly packageManager?: ProjectPackageManager;
15
+ readonly launch?: BootstrapLaunchTarget;
16
+ readonly docsMcp?: boolean;
17
+ }
18
+ export interface BootstrapProjectResult extends InitProjectResult {
19
+ readonly agents?: AgentSetupReport;
20
+ readonly setup: BootstrapReport;
21
+ readonly docsMcp?: DocsMcpResult;
22
+ readonly warnings?: readonly string[];
23
+ }
24
+ interface BootstrapDependencies {
25
+ readonly env: NodeJS.ProcessEnv;
26
+ readonly configLocation?: ConfigLocation;
27
+ readonly execute?: BootstrapExecutor;
28
+ readonly setupContext?: typeof setupAgentsWithResolvedSkills;
29
+ readonly interactive?: boolean;
30
+ readonly launchAgent?: typeof launchBootstrapAgent;
31
+ readonly chooseAgent?: (agents: readonly AgentTarget[], env: NodeJS.ProcessEnv) => Promise<BootstrapLaunchTarget>;
32
+ readonly progress?: (stage: BootstrapStage, status: 'running' | 'complete') => void;
33
+ }
34
+ /** One canonical local orchestration shared by init and the guided first-run projection. */
35
+ export declare function bootstrapProject(options: BootstrapProjectOptions, dependencies: BootstrapDependencies): Promise<BootstrapProjectResult>;
36
+ //# sourceMappingURL=project-bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-bootstrap.d.ts","sourceRoot":"","sources":["../src/project-bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,KAAK,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,KAAK,aAAa,EAAsB,MAAM,wBAAwB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAe,MAAM,cAAc,CAAC;AAQ5F,OAAO,EAEL,KAAK,qBAAqB,EAE1B,oBAAoB,EACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,gCAAgC,CAAC;AAC7F,OAAO,EAAE,KAAK,eAAe,EAA0B,MAAM,+BAA+B,CAAC;AAE7F,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,wBAAwB,CAAC;AAGhC,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AACD,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AACD,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,6BAA6B,CAAC;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,CACrB,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,KAAK,IAAI,CAAC;CACrF;AASD,4FAA4F;AAC5F,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,EAChC,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC,sBAAsB,CAAC,CAyPjC"}
@@ -0,0 +1,243 @@
1
+ import { resolve } from 'node:path';
2
+ import { setupAgentsWithResolvedSkills } from './agents.js';
3
+ import { writeDocsMcpConfig } from './commands/docs-mcp.js';
4
+ import { initProject } from './project.js';
5
+ import { bootstrapDependencyFingerprint, bootstrapLockfiles, hasCompletedBootstrapLock, installedBootstrapCli, readBootstrapManifest, } from './project-bootstrap-install.js';
6
+ import { assertBootstrapLaunchAllowed, isRunningCodingAgent, launchBootstrapAgent, } from './project-bootstrap-launch.js';
7
+ import { runBootstrapProcess } from './project-bootstrap-process.js';
8
+ import { bootstrapJsonSucceeded } from './project-bootstrap-report.js';
9
+ import { readBootstrapState, writeBootstrapState, } from './project-bootstrap-state.js';
10
+ import { installArguments, selectPackageManager, } from './project-toolchain.js';
11
+ import { currentCliVersion } from './update.js';
12
+ function quote(value) {
13
+ return `'${value.replace(/'/g, `'"'"'`)}'`;
14
+ }
15
+ function agentSelection(agents) {
16
+ return agents.length === 2 ? 'all' : (agents[0] ?? 'none');
17
+ }
18
+ /** One canonical local orchestration shared by init and the guided first-run projection. */
19
+ export async function bootstrapProject(options, dependencies) {
20
+ const project = resolve(options.dir ?? '.');
21
+ const agents = options.agentTargets ?? ['codex', 'claude-code'];
22
+ let launch = options.launch ?? 'none';
23
+ assertBootstrapLaunchAllowed(launch, agents, dependencies.interactive ?? false, dependencies.env, options.install !== false);
24
+ const previous = readBootstrapState(project);
25
+ const manifest = readBootstrapManifest(project);
26
+ const manager = selectPackageManager({
27
+ ...(options.packageManager
28
+ ? { requested: options.packageManager }
29
+ : previous
30
+ ? { requested: previous.packageManager }
31
+ : {}),
32
+ ...(manifest?.packageManager ? { packageManager: manifest.packageManager } : {}),
33
+ lockfiles: bootstrapLockfiles(project),
34
+ ...(dependencies.env.npm_config_user_agent
35
+ ? { userAgent: dependencies.env.npm_config_user_agent }
36
+ : {}),
37
+ });
38
+ const version = currentCliVersion();
39
+ const resume = () => `npx --yes @noodleseed/one@${version} init ${quote(project)} --package-manager ${manager} --agents ${agentSelection(agents)}${options.docsMcp === false ? ' --no-docs-mcp' : ''}${launch === 'none' ? '' : ` --launch ${launch}`}`;
40
+ if (!options.dryRun)
41
+ dependencies.progress?.('scaffold', 'running');
42
+ const result = initProject(options);
43
+ let state = {
44
+ schemaVersion: 1,
45
+ cliVersion: version,
46
+ packageManager: manager,
47
+ completed: [],
48
+ };
49
+ let agentReport;
50
+ let docsMcpReport;
51
+ const warnings = [];
52
+ const connectDocs = () => {
53
+ if (options.docsMcp !== false && agents.length) {
54
+ try {
55
+ docsMcpReport = writeDocsMcpConfig(project, { dryRun: options.dryRun ?? false });
56
+ }
57
+ catch {
58
+ warnings.push('Docs MCP configuration was preserved but could not be reconciled; inspect .mcp.json and re-run init --no-install.');
59
+ }
60
+ }
61
+ };
62
+ const execute = dependencies.execute ?? runBootstrapProcess;
63
+ const processOptions = {
64
+ cwd: project,
65
+ env: { ...dependencies.env, NOODLE_DISABLE_UPDATE_CHECK: '1' },
66
+ };
67
+ const save = () => {
68
+ if (!options.dryRun && options.install !== false)
69
+ writeBootstrapState(project, state);
70
+ };
71
+ const begin = (stage) => {
72
+ state = { ...state, inProgress: stage };
73
+ save();
74
+ dependencies.progress?.(stage, 'running');
75
+ };
76
+ const complete = (stage) => {
77
+ const { inProgress: _inProgress, failed: _failed, ...rest } = state;
78
+ state = { ...rest, completed: [...state.completed.filter((value) => value !== stage), stage] };
79
+ save();
80
+ dependencies.progress?.(stage, 'complete');
81
+ };
82
+ const report = (failed) => {
83
+ if (failed) {
84
+ const { inProgress: _inProgress, ...rest } = state;
85
+ state = { ...rest, failed };
86
+ save();
87
+ }
88
+ const ready = !failed && state.completed.includes('types');
89
+ const resumeCommand = resume();
90
+ return {
91
+ ...result,
92
+ ...(agentReport ? { agents: agentReport } : {}),
93
+ ...(docsMcpReport ? { docsMcp: docsMcpReport } : {}),
94
+ ...(warnings.length ? { warnings } : {}),
95
+ setup: {
96
+ ready,
97
+ packageManager: manager,
98
+ completed: state.completed,
99
+ ...(failed ? { failed } : {}),
100
+ resumeCommand,
101
+ nextSteps: ready
102
+ ? [
103
+ {
104
+ command: `${manager} run dev`,
105
+ reason: 'After binding declared configuration, adapt and test your real application boundary; synthetic proof is not customer or hosted verification.',
106
+ },
107
+ ]
108
+ : [
109
+ {
110
+ command: resumeCommand,
111
+ reason: failed
112
+ ? failed.code === 'package_manager_unsupported'
113
+ ? 'Yarn cannot install this release’s bundled runtime. Preserve this project; use --no-install for files-only work, or choose npm/pnpm in a separate project. Do not replace its lockfile.'
114
+ : failed.code === 'dependency_mismatch'
115
+ ? 'The existing project pins a different CLI release. Use that pinned CLI, or explicitly review an SDK upgrade before resuming; setup does not silently rewrite package.json.'
116
+ : `Repair the ${failed.stage} step (${failed.code}), then resume without overwriting customer files.`
117
+ : 'Install dependencies and run local verification when ready.',
118
+ },
119
+ ],
120
+ restartRequired: agents.length > 0 && !state.completed.includes('launch'),
121
+ proof: ready ? 'local-synthetic' : 'unverified',
122
+ },
123
+ };
124
+ };
125
+ if (options.dryRun) {
126
+ if (agents.length)
127
+ agentReport = await (dependencies.setupContext ?? setupAgentsWithResolvedSkills)({ agents, project, write: false, force: options.force ?? false, json: true }, processOptions.env, dependencies.configLocation);
128
+ connectDocs();
129
+ return report();
130
+ }
131
+ complete('scaffold');
132
+ let cli;
133
+ if (options.install !== false) {
134
+ begin('install');
135
+ if (manager === 'yarn')
136
+ return report({ stage: 'install', code: 'package_manager_unsupported' });
137
+ const localManifest = readBootstrapManifest(project);
138
+ if ((localManifest?.devDependencies?.['@noodleseed/one'] ??
139
+ localManifest?.dependencies?.['@noodleseed/one']) !== version)
140
+ return report({ stage: 'install', code: 'dependency_mismatch' });
141
+ const detected = await execute(manager, ['--version'], {
142
+ ...processOptions,
143
+ timeoutMs: 10_000,
144
+ maxOutputBytes: 1024,
145
+ });
146
+ if (!detected.ok)
147
+ return report({ stage: 'install', code: detected.code });
148
+ const managerVersion = detected.stdout.trim();
149
+ if (!/^\d+\.\d+\.\d+(?:[-+][\w.+-]+)?$/.test(managerVersion))
150
+ return report({ stage: 'install', code: 'verification_failed' });
151
+ if (localManifest?.packageManager &&
152
+ localManifest.packageManager !== `${manager}@${managerVersion}`)
153
+ return report({ stage: 'install', code: 'configuration_conflict' });
154
+ state = { ...state, managerVersion };
155
+ cli = installedBootstrapCli(project, version);
156
+ const unchanged = previous?.completed.includes('install') &&
157
+ previous.cliVersion === version &&
158
+ previous.managerVersion === managerVersion &&
159
+ previous.packageManager === manager &&
160
+ previous.dependencyFingerprint === bootstrapDependencyFingerprint(project) &&
161
+ cli !== undefined;
162
+ if (!unchanged) {
163
+ const installed = await execute(manager, installArguments(manager, managerVersion, hasCompletedBootstrapLock(project, manager)), processOptions);
164
+ if (!installed.ok)
165
+ return report({ stage: 'install', code: installed.code });
166
+ cli = installedBootstrapCli(project, version);
167
+ if (!cli || !hasCompletedBootstrapLock(project, manager))
168
+ return report({ stage: 'install', code: 'verification_failed' });
169
+ }
170
+ state = { ...state, dependencyFingerprint: bootstrapDependencyFingerprint(project) };
171
+ complete('install');
172
+ }
173
+ if (agents.length > 0) {
174
+ begin('context');
175
+ try {
176
+ agentReport = await (dependencies.setupContext ?? setupAgentsWithResolvedSkills)({ agents, project, write: true, force: options.force ?? false, json: true }, processOptions.env, dependencies.configLocation);
177
+ connectDocs();
178
+ if (!agentReport.ok || agentReport.files.some((file) => file.action === 'skipped'))
179
+ return report({ stage: 'context', code: 'context_invalid' });
180
+ if (cli) {
181
+ const verified = await execute(process.execPath, [
182
+ cli,
183
+ 'agents',
184
+ 'doctor',
185
+ '--project',
186
+ project,
187
+ '--agents',
188
+ agentSelection(agents),
189
+ '--json',
190
+ ], processOptions);
191
+ if (!verified.ok)
192
+ return report({ stage: 'context', code: verified.code });
193
+ if (!bootstrapJsonSucceeded(verified.stdout))
194
+ return report({ stage: 'context', code: 'verification_failed' });
195
+ }
196
+ complete('context');
197
+ }
198
+ catch {
199
+ return report({ stage: 'context', code: 'context_invalid' });
200
+ }
201
+ }
202
+ if (!cli)
203
+ return report();
204
+ for (const [stage, command, args] of [
205
+ ['validate', process.execPath, [cli, 'validate', '--json']],
206
+ ['behavior', manager, ['run', 'test']],
207
+ ['types', manager, ['run', 'typecheck']],
208
+ ]) {
209
+ begin(stage);
210
+ const checked = await execute(command, args, processOptions);
211
+ if (!checked.ok)
212
+ return report({ stage, code: checked.code });
213
+ if (stage === 'validate' && !bootstrapJsonSucceeded(checked.stdout))
214
+ return report({ stage, code: 'verification_failed' });
215
+ complete(stage);
216
+ }
217
+ if (options.launch === undefined &&
218
+ !previous &&
219
+ !manifest &&
220
+ dependencies.interactive &&
221
+ !isRunningCodingAgent(dependencies.env) &&
222
+ agents.length &&
223
+ dependencies.chooseAgent) {
224
+ launch = await dependencies.chooseAgent(agents, dependencies.env);
225
+ assertBootstrapLaunchAllowed(launch, agents, true, dependencies.env, true);
226
+ }
227
+ if (launch !== 'none') {
228
+ if (previous?.completed.includes('launch') && previous.launchedAgent === launch) {
229
+ state = { ...state, launchedAgent: launch };
230
+ complete('launch');
231
+ }
232
+ else {
233
+ begin('launch');
234
+ const launched = await (dependencies.launchAgent ?? launchBootstrapAgent)(launch, project, dependencies.env);
235
+ if (!launched.ok)
236
+ return report({ stage: 'launch', code: launched.code });
237
+ state = { ...state, launchedAgent: launch };
238
+ complete('launch');
239
+ }
240
+ }
241
+ return report();
242
+ }
243
+ //# sourceMappingURL=project-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-bootstrap.js","sourceRoot":"","sources":["../src/project-bootstrap.ts"],"names":[],"mappings":"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"}
@@ -10,5 +10,5 @@ export declare function title(value: string): string;
10
10
  export declare function manifestName(value: string): string;
11
11
  export declare function helloFiles(name: string, agentTargets: readonly ProjectAgentTarget[]): Record<string, string>;
12
12
  export declare function httpApiFiles(name: string, agentTargets: readonly ProjectAgentTarget[]): Record<string, string>;
13
- export declare function commonFiles(name: string, template: InitTemplate, agentTargets: readonly ProjectAgentTarget[], serverTs: string, extraDevDependencies: Record<string, string>): Record<string, string>;
13
+ export declare function commonFiles(name: string, template: InitTemplate, agentTargets: readonly ProjectAgentTarget[], serverTs: string, extraDependencies: readonly string[]): Record<string, string>;
14
14
  //# sourceMappingURL=project-scaffold-templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-scaffold-templates.d.ts","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIrE,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM3C;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AACD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,kBAAkB,EAAE,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BxB;AACD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,kBAAkB,EAAE,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoDxB;AACD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,SAAS,kBAAkB,EAAE,EAC3C,QAAQ,EAAE,MAAM,EAChB,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyIxB"}
1
+ {"version":3,"file":"project-scaffold-templates.d.ts","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAMrE,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM3C;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AACD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,kBAAkB,EAAE,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BxB;AACD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,SAAS,kBAAkB,EAAE,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoDxB;AACD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,SAAS,kBAAkB,EAAE,EAC3C,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,SAAS,MAAM,EAAE,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4IxB"}
@@ -1,5 +1,7 @@
1
1
  import { SCAFFOLD_MODELS, scaffoldEnvironment } from './project-scaffold-model.js';
2
2
  import { scaffoldBehaviorTest } from './project-scaffold-test-template.js';
3
+ import { projectDependencyPins } from './project-toolchain.js';
4
+ import { currentCliVersion } from './update.js';
3
5
  export function title(value) {
4
6
  return value
5
7
  .split('-')
@@ -33,7 +35,7 @@ export default server('${serverName}', { title: '${title(name)}', version: '1.0.
33
35
  },
34
36
  }),
35
37
  ]);
36
- `, {});
38
+ `, []);
37
39
  }
38
40
  export function httpApiFiles(name, agentTargets) {
39
41
  const serverName = manifestName(name);
@@ -80,9 +82,9 @@ export default server('${serverName}', {
80
82
  },
81
83
  }),
82
84
  ]);
83
- `, {});
85
+ `, []);
84
86
  }
85
- export function commonFiles(name, template, agentTargets, serverTs, extraDevDependencies) {
87
+ export function commonFiles(name, template, agentTargets, serverTs, extraDependencies) {
86
88
  const model = SCAFFOLD_MODELS[template];
87
89
  const agentCheck = 'vitest run --dir test && noodle validate --json && tsc --noEmit' +
88
90
  (model.widget ? ' && noodle check --json' : '');
@@ -117,13 +119,13 @@ export function commonFiles(name, template, agentTargets, serverTs, extraDevDepe
117
119
  ...(agentCheckChatgpt ? { 'agent:check:chatgpt': agentCheckChatgpt } : {}),
118
120
  'agent:commands': 'noodle commands --json',
119
121
  },
120
- devDependencies: {
121
- '@noodleseed/one': 'latest',
122
- vitest: 'latest',
123
- typescript: 'latest',
124
- '@types/node': 'latest',
125
- ...extraDevDependencies,
126
- },
122
+ devDependencies: projectDependencyPins([
123
+ '@noodleseed/one',
124
+ 'vitest',
125
+ 'typescript',
126
+ '@types/node',
127
+ ...extraDependencies,
128
+ ]),
127
129
  }, null, 2)}\n`,
128
130
  'test/server.test.ts': scaffoldBehaviorTest(model),
129
131
  'tsconfig.json': `${JSON.stringify({
@@ -150,6 +152,7 @@ export function commonFiles(name, template, agentTargets, serverTs, extraDevDepe
150
152
  '.env.*',
151
153
  '!.env.example',
152
154
  '.noodle/',
155
+ '.yarn/',
153
156
  '',
154
157
  ].join('\n'),
155
158
  'README.md': `# ${title(name)}
@@ -157,10 +160,12 @@ export function commonFiles(name, template, agentTargets, serverTs, extraDevDepe
157
160
  ## Run locally (no account, no login)
158
161
 
159
162
  \`\`\`sh
160
- npm install
161
- npm test
163
+ npm run agent:check
162
164
  \`\`\`
163
165
 
166
+ Init already installed pinned project-local tooling and ran these checks unless you selected \`--no-install\`.
167
+ For files-only or failed setup, rerun \`npx --yes @noodleseed/one@${currentCliVersion()} init .\`; modified files survive.
168
+ Use the selected package manager consistently (\`pnpm run\` / \`yarn run\` instead of \`npm run\`).
164
169
  The generated tests compile the authored source, list tools, check a representative result and reject invalid
165
170
  input. They copy source into temporary fixture storage, never copy customer credentials, and make no hosted
166
171
  requests. Use your existing package manager consistently. A fixture pass is not a customer-integration pass.
@@ -1 +1 @@
1
- {"version":3,"file":"project-scaffold-templates.js","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-scaffold-templates.js","sourceRoot":"","sources":["../src/project-scaffold-templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type ProjectPackageManager = 'npm' | 'pnpm' | 'yarn';
2
+ export declare function projectDependencyPins(names: readonly string[]): Record<string, string>;
3
+ export declare function isProjectPackageManager(value: unknown): value is ProjectPackageManager;
4
+ export declare const PROJECT_LOCKFILES: Readonly<Record<string, ProjectPackageManager>>;
5
+ export declare function selectPackageManager(input: {
6
+ readonly requested?: ProjectPackageManager;
7
+ readonly packageManager?: string;
8
+ readonly lockfiles?: readonly string[];
9
+ readonly userAgent?: string;
10
+ }): ProjectPackageManager;
11
+ /** Installation stays local, retains existing locks and never runs dependency lifecycle scripts. */
12
+ export declare function installArguments(manager: ProjectPackageManager, version: string, locked: boolean): string[];
13
+ //# sourceMappingURL=project-toolchain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-toolchain.d.ts","sourceRoot":"","sources":["../src/project-toolchain.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAe5D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQtF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAEtF;AAED,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAK7E,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,qBAAqB,CAqBxB;AAED,oGAAoG;AACpG,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GACd,MAAM,EAAE,CAoBV"}
@@ -0,0 +1,73 @@
1
+ import { currentCliVersion } from './update.js';
2
+ /** Versions qualified with the generated profiles. System Release supplies the CLI's own version. */
3
+ const TOOLCHAIN = {
4
+ vitest: '4.1.8',
5
+ typescript: '6.0.3',
6
+ vite: '8.1.0',
7
+ '@vitejs/plugin-react': '6.1.1',
8
+ '@types/node': '24.13.1',
9
+ react: '19.2.7',
10
+ 'react-dom': '19.2.7',
11
+ '@types/react': '19.2.17',
12
+ '@types/react-dom': '19.2.3',
13
+ };
14
+ export function projectDependencyPins(names) {
15
+ return Object.fromEntries(names.map((name) => {
16
+ const version = name === '@noodleseed/one' ? currentCliVersion() : TOOLCHAIN[name];
17
+ if (!version)
18
+ throw new Error('Starter dependency has no qualified version.');
19
+ return [name, version];
20
+ }));
21
+ }
22
+ export function isProjectPackageManager(value) {
23
+ return value === 'npm' || value === 'pnpm' || value === 'yarn';
24
+ }
25
+ export const PROJECT_LOCKFILES = {
26
+ 'package-lock.json': 'npm',
27
+ 'npm-shrinkwrap.json': 'npm',
28
+ 'pnpm-lock.yaml': 'pnpm',
29
+ 'yarn.lock': 'yarn',
30
+ };
31
+ export function selectPackageManager(input) {
32
+ const owners = new Set((input.lockfiles ?? [])
33
+ .map((name) => PROJECT_LOCKFILES[name])
34
+ .filter((owner) => owner !== undefined));
35
+ if (input.packageManager !== undefined) {
36
+ const declared = /^(npm|pnpm|yarn)@\d+\.\d+\.\d+(?:[-+][\w.+-]+)?$/.exec(input.packageManager)?.[1];
37
+ if (!isProjectPackageManager(declared))
38
+ throw new Error('unsupported package manager declaration');
39
+ owners.add(declared);
40
+ }
41
+ if (input.requested)
42
+ owners.add(input.requested);
43
+ if (owners.size > 1)
44
+ throw new Error('package-manager conflict: preserve the existing manager and lockfile');
45
+ const existing = [...owners][0];
46
+ if (existing)
47
+ return existing;
48
+ const invoking = input.userAgent?.split('/')[0];
49
+ return isProjectPackageManager(invoking) ? invoking : 'npm';
50
+ }
51
+ /** Installation stays local, retains existing locks and never runs dependency lifecycle scripts. */
52
+ export function installArguments(manager, version, locked) {
53
+ const major = Number(/^(\d+)\./.exec(version)?.[1]);
54
+ if (!Number.isSafeInteger(major) || major < 1)
55
+ throw new Error('Package manager version could not be verified.');
56
+ if (manager === 'npm')
57
+ return [
58
+ locked ? 'ci' : 'install',
59
+ '--ignore-scripts',
60
+ '--no-audit',
61
+ '--no-fund',
62
+ '--workspaces=false',
63
+ ];
64
+ if (manager === 'pnpm')
65
+ return [
66
+ 'install',
67
+ locked ? '--frozen-lockfile' : '--no-frozen-lockfile',
68
+ '--ignore-scripts',
69
+ '--ignore-workspace',
70
+ ];
71
+ throw new Error('Yarn cannot install the CLI bundled runtime; preserve its existing lockfile.');
72
+ }
73
+ //# sourceMappingURL=project-toolchain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-toolchain.js","sourceRoot":"","sources":["../src/project-toolchain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIhD,qGAAqG;AACrG,MAAM,SAAS,GAAqC;IAClD,MAAM,EAAE,OAAO;IACf,UAAU,EAAE,OAAO;IACnB,IAAI,EAAE,OAAO;IACb,sBAAsB,EAAE,OAAO;IAC/B,aAAa,EAAE,SAAS;IACxB,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE,QAAQ;IACrB,cAAc,EAAE,SAAS;IACzB,kBAAkB,EAAE,QAAQ;CAC7B,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,OAAO,MAAM,CAAC,WAAW,CACvB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnF,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAoD;IAChF,mBAAmB,EAAE,KAAK;IAC1B,qBAAqB,EAAE,KAAK;IAC5B,gBAAgB,EAAE,MAAM;IACxB,WAAW,EAAE,MAAM;CACpB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,KAKpC;IACC,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;SACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;SACtC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAC1C,CAAC;IACF,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,kDAAkD,CAAC,IAAI,CACtE,KAAK,CAAC,cAAc,CACrB,EAAE,CAAC,CAAC,CAAC,CAAC;QACP,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,CAAC,SAAS;QAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9D,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,gBAAgB,CAC9B,OAA8B,EAC9B,OAAe,EACf,MAAe;IAEf,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,IAAI,OAAO,KAAK,KAAK;QACnB,OAAO;YACL,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACzB,kBAAkB;YAClB,YAAY;YACZ,WAAW;YACX,oBAAoB;SACrB,CAAC;IACJ,IAAI,OAAO,KAAK,MAAM;QACpB,OAAO;YACL,SAAS;YACT,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,sBAAsB;YACrD,kBAAkB;YAClB,oBAAoB;SACrB,CAAC;IACJ,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;AAClG,CAAC"}
package/dist/project.d.ts CHANGED
@@ -89,6 +89,8 @@ export declare function writeProjectDeployment(deployment: ProjectDeployment, cw
89
89
  * re-run `noodle init` to assert a baseline without clobbering edits.
90
90
  */
91
91
  export declare function initProject(options?: InitProjectOptions): InitProjectResult;
92
+ /** One customer-file reconcile path for built-in starters and generated imports. */
93
+ export declare function writeProjectScaffold(options: Pick<InitProjectOptions, 'dir' | 'force' | 'dryRun'>, files: Readonly<Record<string, string>>): InitProjectResult;
92
94
  export declare function resolveLinkedEntrypoint(cwd?: string): string | undefined;
93
95
  /**
94
96
  * The entrypoint a local author-loop command (`dev`, `validate`, `test`, `tools`/`resources`/`prompts`)
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
package/dist/project.js CHANGED
@@ -1,4 +1,4 @@
1
- import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from 'node:fs';
1
+ import { chmodSync, closeSync, constants, existsSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, statSync, writeFileSync, } from 'node:fs';
2
2
  import { basename, dirname, join, relative, resolve } from 'node:path';
3
3
  import { ACCESS_MODES } from '@noodle-borg/wire-contracts';
4
4
  import { DEFAULT_SERVICE_URL, slug } from './deploy.js';
@@ -152,6 +152,18 @@ export function initProject(options = {}) {
152
152
  const name = slug(options.name ?? basename(dir) ?? 'noodle-app');
153
153
  if (!isTemplate(template))
154
154
  throw new Error('init: --template must be saas, hello, http-api, or widget');
155
+ const files = template === 'saas'
156
+ ? widgetFiles(name, options.agentTargets ?? ['codex', 'claude-code'], 'saas')
157
+ : template === 'hello'
158
+ ? helloFiles(name, options.agentTargets ?? ['codex', 'claude-code'])
159
+ : template === 'http-api'
160
+ ? httpApiFiles(name, options.agentTargets ?? ['codex', 'claude-code'])
161
+ : widgetFiles(name, options.agentTargets ?? ['codex', 'claude-code']);
162
+ return writeProjectScaffold(options, files);
163
+ }
164
+ /** One customer-file reconcile path for built-in starters and generated imports. */
165
+ export function writeProjectScaffold(options, files) {
166
+ const dir = resolve(options.dir ?? '.');
155
167
  if (existsSync(dir)) {
156
168
  if (!statSync(dir).isDirectory())
157
169
  throw new Error('init: target path is not a directory');
@@ -162,25 +174,44 @@ export function initProject(options = {}) {
162
174
  throw new Error('init: target directory is not empty; pass --force to add Noodle files anyway');
163
175
  }
164
176
  }
165
- const files = template === 'saas'
166
- ? widgetFiles(name, options.agentTargets ?? ['codex', 'claude-code'], 'saas')
167
- : template === 'hello'
168
- ? helloFiles(name, options.agentTargets ?? ['codex', 'claude-code'])
169
- : template === 'http-api'
170
- ? httpApiFiles(name, options.agentTargets ?? ['codex', 'claude-code'])
171
- : widgetFiles(name, options.agentTargets ?? ['codex', 'claude-code']);
172
177
  const results = [];
178
+ // Check the whole write set before changing anything. A customer symlink is not permission to
179
+ // read or overwrite its destination, including when an explicit --force applies to this project.
180
+ for (const path of Object.keys(files))
181
+ assertScaffoldPath(dir, path);
173
182
  for (const [path, content] of Object.entries(files)) {
174
183
  const full = join(dir, path);
175
184
  const action = reconcileFileAction(full, content, options.force === true);
176
185
  if (!options.dryRun && (action === 'created' || action === 'overwritten')) {
177
186
  mkdirSync(dirname(full), { recursive: true });
178
- writeFileSync(full, content);
187
+ const descriptor = openSync(full, constants.O_WRONLY |
188
+ constants.O_NOFOLLOW |
189
+ (action === 'created' ? constants.O_CREAT | constants.O_EXCL : constants.O_TRUNC));
190
+ try {
191
+ writeFileSync(descriptor, content);
192
+ }
193
+ finally {
194
+ closeSync(descriptor);
195
+ }
179
196
  }
180
197
  results.push({ path, action });
181
198
  }
182
199
  return { dir, files: results };
183
200
  }
201
+ function assertScaffoldPath(project, path) {
202
+ let current = project;
203
+ for (const part of path.split('/')) {
204
+ current = join(current, part);
205
+ try {
206
+ if (lstatSync(current).isSymbolicLink())
207
+ throw new Error('init: scaffold paths must not traverse a symbolic link; preserve the link and choose a separate project directory.');
208
+ }
209
+ catch (error) {
210
+ if (error.code !== 'ENOENT')
211
+ throw error;
212
+ }
213
+ }
214
+ }
184
215
  /**
185
216
  * A directory is an existing Noodle project if it has a `.noodle/` dir, a conventional entrypoint, or a
186
217
  * `package.json` that references `@noodleseed/one` (so a reconcile still recognizes the project even if the