@cat-factory/cli 0.13.7 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -209,7 +209,7 @@ npx @cat-factory/cli init \
209
209
  local/ # backend - @cat-factory/local-server
210
210
  package.json
211
211
  src/main.ts # one-line startLocal() entry
212
- docker-compose.yml # local Postgres (creds derived from --db-url)
212
+ docker-compose.yml # local Postgres (creds from --db-url, Compose project from --dir)
213
213
  tsconfig.json
214
214
  .env # generated, gitignored: DATABASE_URL, secrets, PAT, harness image
215
215
  .env.example # documented template
@@ -243,6 +243,24 @@ selectable, so no pipeline can start. The quickest is Cloudflare Workers AI over
243
243
  `ANTHROPIC_API_KEY`. Put it in `local/.env` before you start, or sign in and add it through the
244
244
  UI, whichever you prefer.
245
245
 
246
+ ### Each deployment gets its own Compose project
247
+
248
+ `local/docker-compose.yml` declares a `name:`, derived from the deployment directory
249
+ (`--dir`, or the project name when you omit it) plus a `-local` suffix: scaffolding into
250
+ `~/deploy-a` gives the Compose project `deploy-a-local`. That name keys the Postgres container
251
+ and the `deploy-a-local_cat-factory-pg` volume, so `npm run db:up` in one deployment can never
252
+ bring up another's database. Compose's own default is the compose file's directory, which is
253
+ `local/` in every deployment, so without the declared name the second deployment you scaffold
254
+ migrates and serves the first one's data. Two deployment directories with the SAME basename
255
+ still land in one project, so give each deployment its own directory name.
256
+
257
+ Re-scaffolding an existing deployment with `--force` after changing its directory name moves it
258
+ to a new Compose project. The CLI then prints the project it leaves behind and the
259
+ `docker compose -p <old> down` that stops it: until you do, the old container holds the
260
+ published Postgres port and `npm run db:down` no longer reaches it. The same rule, with the
261
+ recovery step spelled out:
262
+ [One Compose project per deployment](https://www.catfactory.ai/deploy/local.html#one-compose-project-per-deployment).
263
+
246
264
  The generated `README.md` repeats these steps with your chosen values, and links to the full
247
265
  [local-mode docs](https://github.com/kibertoad/cat-factory/blob/main/deploy/local/README.md) (container-runtime matrix, repo linking, the
248
266
  Tester's Docker-in-Docker / ephemeral environments, the warm container pool, etc.).
@@ -262,10 +280,17 @@ Tester's Docker-in-Docker / ephemeral environments, the warm container pool, etc
262
280
  The bin is a thin shell over the package's exported functions, which are pure and reusable:
263
281
 
264
282
  ```ts
265
- import { buildPlan, generateSecrets, patCreationUrl } from '@cat-factory/cli'
283
+ import { buildPlan, composeProjectNameFor, generateSecrets, patCreationUrl } from '@cat-factory/cli'
266
284
 
285
+ const targetDir = '/home/me/deploy-a'
267
286
  const secrets = generateSecrets()
268
- const files = buildPlan({ projectName: 'my-cats', /* … */ ...secrets })
287
+ const files = buildPlan({
288
+ projectName: 'my-cats',
289
+ // Keys the deployment's container + database volume: derive it from the directory you are
290
+ // about to write into, or two deployments end up sharing one Postgres.
291
+ composeProjectName: composeProjectNameFor(targetDir, 'cat-factory'),
292
+ /* … */ ...secrets,
293
+ })
269
294
  // files: { path, content, secret? }[] - write them wherever you like
270
295
  ```
271
296
 
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,WAAW,CAAA;AAE5D,OAAO,EAAE,KAAK,UAAU,EAAU,MAAM,SAAS,CAAA;AACjD,OAAO,EAAmB,KAAK,EAAE,EAAE,MAAM,SAAS,CAAA;AAUlD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAI/C,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,EAAE,CAAA;IACP,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAED,qBAAa,cAAe,SAAQ,KAAK;CAAG;AAE5C,wFAAwF;AACxF,wBAAsB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+F9F"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,WAAW,CAAA;AAO5D,OAAO,EAAE,KAAK,UAAU,EAAU,MAAM,SAAS,CAAA;AACjD,OAAO,EAAmB,KAAK,EAAE,EAAE,MAAM,SAAS,CAAA;AAUlD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAI/C,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,EAAE,CAAA;IACP,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAED,qBAAa,cAAe,SAAQ,KAAK;CAAG;AAE5C,wFAAwF;AACxF,wBAAsB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8G9F"}
package/dist/bootstrap.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { dirname, join, resolve } from 'node:path';
2
2
  import { OPTION_DEFAULTS } from './args.js';
3
+ import { COMPOSE_FILE_PATH, composeProjectNameFor, orphanedComposeProjectNote, } from './composeProject.js';
3
4
  import { ALL_NATIVE_HARNESSES, NATIVE_HARNESS_INFO } from './execution.js';
4
5
  import { realFs } from './fs.js';
5
6
  import { createConsoleIo } from './io.js';
@@ -26,6 +27,9 @@ export async function bootstrap(options, deps = {}) {
26
27
  io.warn(`Using "${projectName}" as the project slug (npm package names must be lowercased).`);
27
28
  }
28
29
  const targetDir = resolve(cwd, options.dir ?? projectName);
30
+ // Resolved here, beside the npm slug, because it is the only place the target directory is
31
+ // known. Both names identify the same deployment and each obeys its own charset rule.
32
+ const composeProjectName = composeProjectNameFor(targetDir, OPTION_DEFAULTS.projectName);
29
33
  const appTitle = options.appTitle ??
30
34
  (options.yes
31
35
  ? OPTION_DEFAULTS.appTitle
@@ -55,8 +59,15 @@ export async function bootstrap(options, deps = {}) {
55
59
  const existingGitignore = fs.existsSync(gitignorePath)
56
60
  ? fs.readFileSync(gitignorePath, 'utf8')
57
61
  : undefined;
62
+ // Only a --force run rewrites the compose file, so only a --force run can move the deployment
63
+ // to another Compose project and leave the old one's container and volume behind.
64
+ const composePath = join(targetDir, ...COMPOSE_FILE_PATH.split('/'));
65
+ const orphanedProject = options.force && fs.existsSync(composePath)
66
+ ? orphanedComposeProjectNote(fs.readFileSync(composePath, 'utf8'), composeProjectName)
67
+ : undefined;
58
68
  const plan = buildPlan({
59
69
  projectName,
70
+ composeProjectName,
60
71
  appTitle,
61
72
  provider,
62
73
  token,
@@ -75,6 +86,8 @@ export async function bootstrap(options, deps = {}) {
75
86
  existingGitignore,
76
87
  });
77
88
  writePlan(plan, targetDir, fs, io, options.force);
89
+ if (orphanedProject !== undefined)
90
+ io.warn(orphanedProject);
78
91
  printNextSteps(io, {
79
92
  targetDir,
80
93
  projectName,
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /** Where the scaffold writes the deployment's compose file, relative to the project root. */
2
+ export declare const COMPOSE_FILE_PATH = "local/docker-compose.yml";
3
+ /**
4
+ * The Compose project name for a scaffolded deployment, complete with its suffix so the value is
5
+ * assembled in exactly one place. It keys the deployment's Postgres container, its network and
6
+ * its `<project>_cat-factory-pg` database volume.
7
+ *
8
+ * Derived from the DEPLOYMENT DIRECTORY, which is the field a user varies per deployment
9
+ * (`--dir`, or the project name when `--dir` is omitted). The project name on its own would not
10
+ * do: it defaults to a constant that `-y` and a bare Enter both take, so two deployments would
11
+ * still meet in one project. Two deployment directories that share a basename do still collide,
12
+ * one level up from where Compose's own default (the compose file's `local/` directory, shared by
13
+ * every deployment) collided.
14
+ *
15
+ * Compose accepts `[a-z0-9][a-z0-9_-]*`, so a dot becomes `_` rather than `-`: folding it onto a
16
+ * hyphen would map `acme.site` and `acme site` onto one project, which is the collision the name
17
+ * exists to prevent. The npm slug it starts from never begins with `.`, `_` or `-`, so the result
18
+ * satisfies Compose's first-character rule.
19
+ */
20
+ export declare function composeProjectNameFor(deploymentDir: string, fallback: string): string;
21
+ /**
22
+ * What a regenerate owes the operator: the Compose project the deployment already in the target
23
+ * directory runs under, once rewriting its compose file moves it to a different one. Returns
24
+ * `undefined` when the name does not move, which is every fresh scaffold and every plain rerun.
25
+ *
26
+ * Without this the containers and the database volume are simply left behind under a name nothing
27
+ * prints: `npm run db:down` no longer reaches them, the old container keeps the published
28
+ * Postgres port until it is stopped, and the board comes up on an empty database.
29
+ */
30
+ export declare function orphanedComposeProjectNote(existingCompose: string, nextName: string): string | undefined;
31
+ //# sourceMappingURL=composeProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composeProject.d.ts","sourceRoot":"","sources":["../src/composeProject.ts"],"names":[],"mappings":"AAGA,6FAA6F;AAC7F,eAAO,MAAM,iBAAiB,6BAA6B,CAAA;AAS3D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrF;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAapB"}
@@ -0,0 +1,60 @@
1
+ import { basename, posix } from 'node:path';
2
+ import { slugifyProjectName } from './slug.js';
3
+ /** Where the scaffold writes the deployment's compose file, relative to the project root. */
4
+ export const COMPOSE_FILE_PATH = 'local/docker-compose.yml';
5
+ /**
6
+ * The project name Compose falls back to when a compose file declares none: the file's own
7
+ * directory. Every scaffolded deployment keeps its compose file in the same place, so this one
8
+ * name is what any deployment with an undeclared project is running under.
9
+ */
10
+ const COMPOSE_DIRECTORY_DEFAULT = posix.dirname(COMPOSE_FILE_PATH);
11
+ /**
12
+ * The Compose project name for a scaffolded deployment, complete with its suffix so the value is
13
+ * assembled in exactly one place. It keys the deployment's Postgres container, its network and
14
+ * its `<project>_cat-factory-pg` database volume.
15
+ *
16
+ * Derived from the DEPLOYMENT DIRECTORY, which is the field a user varies per deployment
17
+ * (`--dir`, or the project name when `--dir` is omitted). The project name on its own would not
18
+ * do: it defaults to a constant that `-y` and a bare Enter both take, so two deployments would
19
+ * still meet in one project. Two deployment directories that share a basename do still collide,
20
+ * one level up from where Compose's own default (the compose file's `local/` directory, shared by
21
+ * every deployment) collided.
22
+ *
23
+ * Compose accepts `[a-z0-9][a-z0-9_-]*`, so a dot becomes `_` rather than `-`: folding it onto a
24
+ * hyphen would map `acme.site` and `acme site` onto one project, which is the collision the name
25
+ * exists to prevent. The npm slug it starts from never begins with `.`, `_` or `-`, so the result
26
+ * satisfies Compose's first-character rule.
27
+ */
28
+ export function composeProjectNameFor(deploymentDir, fallback) {
29
+ const slug = slugifyProjectName(basename(deploymentDir), fallback).replace(/\./g, '_');
30
+ return `${slug}-local`;
31
+ }
32
+ /**
33
+ * What a regenerate owes the operator: the Compose project the deployment already in the target
34
+ * directory runs under, once rewriting its compose file moves it to a different one. Returns
35
+ * `undefined` when the name does not move, which is every fresh scaffold and every plain rerun.
36
+ *
37
+ * Without this the containers and the database volume are simply left behind under a name nothing
38
+ * prints: `npm run db:down` no longer reaches them, the old container keeps the published
39
+ * Postgres port until it is stopped, and the board comes up on an empty database.
40
+ */
41
+ export function orphanedComposeProjectNote(existingCompose, nextName) {
42
+ const previous = declaredComposeProject(existingCompose) ?? COMPOSE_DIRECTORY_DEFAULT;
43
+ if (previous === nextName)
44
+ return undefined;
45
+ return [
46
+ `The deployment already in this directory runs under Compose project "${previous}"; it now`,
47
+ `declares "${nextName}". Its container and its "${previous}_cat-factory-pg" volume stay`,
48
+ 'behind under the old name, out of reach of `npm run db:down`, and while that container runs',
49
+ 'it holds the published Postgres port:',
50
+ '',
51
+ ` docker compose -p ${previous} down # add -v to delete that database as well`,
52
+ '',
53
+ `Afterwards \`npm run db:up\` brings up a FRESH database under "${nextName}".`,
54
+ ].join('\n');
55
+ }
56
+ /** The top-level `name:` a compose file declares, if any (quoted or bare). */
57
+ function declaredComposeProject(compose) {
58
+ return /^name:[ \t]*['"]?([^'"\s#]+)/m.exec(compose)?.[1];
59
+ }
60
+ //# sourceMappingURL=composeProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composeProject.js","sourceRoot":"","sources":["../src/composeProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,6FAA6F;AAC7F,MAAM,CAAC,MAAM,iBAAiB,GAAG,0BAA0B,CAAA;AAE3D;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAElE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,qBAAqB,CAAC,aAAqB,EAAE,QAAgB;IAC3E,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACtF,OAAO,GAAG,IAAI,QAAQ,CAAA;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CACxC,eAAuB,EACvB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,eAAe,CAAC,IAAI,yBAAyB,CAAA;IACrF,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC3C,OAAO;QACL,wEAAwE,QAAQ,WAAW;QAC3F,aAAa,QAAQ,6BAA6B,QAAQ,8BAA8B;QACxF,6FAA6F;QAC7F,uCAAuC;QACvC,EAAE;QACF,yBAAyB,QAAQ,oDAAoD;QACrF,EAAE;QACF,kEAAkE,QAAQ,IAAI;KAC/E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,8EAA8E;AAC9E,SAAS,sBAAsB,CAAC,OAAe;IAC7C,OAAO,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAC3D,CAAC"}
package/dist/index.d.ts CHANGED
@@ -16,6 +16,7 @@ export { type Io, createConsoleIo } from './io.js';
16
16
  export { type BootstrapInput, buildPlan, type PlannedFile } from './plan.js';
17
17
  export { generateSecrets, type GeneratedSecrets, type RandomBytes } from './secrets.js';
18
18
  export { slugifyProjectName } from './slug.js';
19
+ export { composeProjectNameFor } from './composeProject.js';
19
20
  export { CONTAINER_RUNTIMES, type ContainerRuntime, EXECUTION_MODES, type ExecutionMode, HARNESS_IMAGE_EXAMPLE, HARNESS_IMAGE_GUIDANCE, harnessImageEnvLines, NATIVE_HARNESSES, type NativeHarness, } from './templates.js';
20
21
  export { EXECUTION_MODE_TRADEOFFS, NATIVE_HARNESS_INFO, type NativeHarnessInfo, type NativeModel, NATIVE_MODELS, nativeModelsFor, nativeModelSummary, } from './execution.js';
21
22
  export { githubPatCreationUrl, gitlabPatCreationUrl, patCreationUrl, patEnvVar, providerLabel, VCS_PROVIDERS, type VcsProvider, } from './vcs.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,UAAU,EACf,SAAS,EACT,YAAY,EACZ,KAAK,UAAU,EACf,eAAe,EACf,SAAS,EACT,QAAQ,GACT,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC9E,OAAO,EAAE,KAAK,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACnF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EACL,KAAK,OAAO,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,0BAA0B,EAC1B,KAAK,SAAS,EACd,iBAAiB,EACjB,UAAU,EACV,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACtF,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,0BAA0B,EAC1B,YAAY,EACZ,KAAK,eAAe,EACpB,+BAA+B,GAChC,MAAM,kBAAkB,CAAA;AAUzB,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAK3B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,KAAK,QAAQ,GACd,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,eAAe,EACf,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,aAAa,GACd,MAAM,UAAU,CAAA;AAKjB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,KAAK,QAAQ,EACb,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,KAAK,cAAc,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EACL,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,eAAe,EACf,KAAK,aAAa,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,EACb,KAAK,WAAW,GACjB,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -38,6 +38,10 @@ export { createConsoleIo } from './io.js';
38
38
  export { buildPlan } from './plan.js';
39
39
  export { generateSecrets } from './secrets.js';
40
40
  export { slugifyProjectName } from './slug.js';
41
+ // Travels with `buildPlan`: `BootstrapInput.composeProjectName` is what keeps two deployments out
42
+ // of one Compose project, so a programmatic caller needs the same derivation `bootstrap()` uses
43
+ // rather than a name of its own invention.
44
+ export { composeProjectNameFor } from './composeProject.js';
41
45
  export { CONTAINER_RUNTIMES, EXECUTION_MODES, HARNESS_IMAGE_EXAMPLE, HARNESS_IMAGE_GUIDANCE, harnessImageEnvLines, NATIVE_HARNESSES, } from './templates.js';
42
46
  export { EXECUTION_MODE_TRADEOFFS, NATIVE_HARNESS_INFO, NATIVE_MODELS, nativeModelsFor, nativeModelSummary, } from './execution.js';
43
47
  export { githubPatCreationUrl, gitlabPatCreationUrl, patCreationUrl, patEnvVar, providerLabel, VCS_PROVIDERS, } from './vcs.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,8FAA8F;AAC9F,OAAO,EAEL,SAAS,EACT,YAAY,EAEZ,eAAe,EACf,SAAS,EACT,QAAQ,GACT,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,SAAS,EAAsB,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC9E,OAAO,EAAuB,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACnF,OAAO,EAAmB,MAAM,SAAS,CAAA;AACzC,OAAO,EAEL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,0BAA0B,EAE1B,iBAAiB,EACjB,UAAU,GAEX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,mBAAmB,EAAgC,QAAQ,EAAE,MAAM,UAAU,CAAA;AACtF,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,0BAA0B,EAC1B,YAAY,EAEZ,+BAA+B,GAChC,MAAM,kBAAkB,CAAA;AACzB,gGAAgG;AAChG,iGAAiG;AACjG,kGAAkG;AAClG,6FAA6F;AAC7F,EAAE;AACF,kGAAkG;AAClG,kGAAkG;AAClG,6FAA6F;AAC7F,qFAAqF;AACrF,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAC3B,kGAAkG;AAClG,mGAAmG;AACnG,oGAAoG;AACpG,wFAAwF;AACxF,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EAKrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,YAAY,GAEb,MAAM,kBAAkB,CAAA;AACzB,6FAA6F;AAC7F,6FAA6F;AAC7F,kGAAkG;AAClG,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAGhB,eAAe,EAGf,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,wBAAwB,GAEzB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,gBAAgB,EAChB,aAAa,EAIb,aAAa,GACd,MAAM,UAAU,CAAA;AACjB,iGAAiG;AACjG,gGAAgG;AAChG,iGAAiG;AACjG,2DAA2D;AAC3D,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,aAAa,EAEb,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAW,eAAe,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAuB,SAAS,EAAoB,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,eAAe,EAA2C,MAAM,cAAc,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EACL,kBAAkB,EAElB,eAAe,EAEf,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,GAEjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EAGnB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,GAEd,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,8FAA8F;AAC9F,OAAO,EAEL,SAAS,EACT,YAAY,EAEZ,eAAe,EACf,SAAS,EACT,QAAQ,GACT,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,SAAS,EAAsB,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC9E,OAAO,EAAuB,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACnF,OAAO,EAAmB,MAAM,SAAS,CAAA;AACzC,OAAO,EAEL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,0BAA0B,EAE1B,iBAAiB,EACjB,UAAU,GAEX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,mBAAmB,EAAgC,QAAQ,EAAE,MAAM,UAAU,CAAA;AACtF,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,0BAA0B,EAC1B,YAAY,EAEZ,+BAA+B,GAChC,MAAM,kBAAkB,CAAA;AACzB,gGAAgG;AAChG,iGAAiG;AACjG,kGAAkG;AAClG,6FAA6F;AAC7F,EAAE;AACF,kGAAkG;AAClG,kGAAkG;AAClG,6FAA6F;AAC7F,qFAAqF;AACrF,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAC3B,kGAAkG;AAClG,mGAAmG;AACnG,oGAAoG;AACpG,wFAAwF;AACxF,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EAKrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,YAAY,GAEb,MAAM,kBAAkB,CAAA;AACzB,6FAA6F;AAC7F,6FAA6F;AAC7F,kGAAkG;AAClG,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EACL,YAAY,EACZ,gBAAgB,EAGhB,eAAe,EAGf,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,wBAAwB,GAEzB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,gBAAgB,EAChB,aAAa,EAIb,aAAa,GACd,MAAM,UAAU,CAAA;AACjB,iGAAiG;AACjG,gGAAgG;AAChG,iGAAiG;AACjG,2DAA2D;AAC3D,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,aAAa,EAEb,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAW,eAAe,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAuB,SAAS,EAAoB,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,eAAe,EAA2C,MAAM,cAAc,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC9C,kGAAkG;AAClG,gGAAgG;AAChG,2CAA2C;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EACL,kBAAkB,EAElB,eAAe,EAEf,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,GAEjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EAGnB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,GAEd,MAAM,UAAU,CAAA"}
package/dist/io.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,MAAM,WAAW,EAAE;IACjB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAChE,+DAA+D;IAC/D,MAAM,CAAC,CAAC,SAAS,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,EAC/C,YAAY,EAAE,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAAA;IACb,yFAAyF;IACzF,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACvC,qBAAqB;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAChE,yFAAyF;IACzF,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxC;AAED,gGAAgG;AAChG,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,EAAE,CAAA;IACd;;;OAGG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAA;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,kBAAkB,CActF;AAWD,8EAA8E;AAC9E,wBAAgB,eAAe,IAAI,EAAE,CA4DpC"}
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,MAAM,WAAW,EAAE;IACjB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAChE,+DAA+D;IAC/D,MAAM,CAAC,CAAC,SAAS,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,EAC/C,YAAY,EAAE,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAAA;IACb,yFAAyF;IACzF,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACvC,qBAAqB;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAChE,yFAAyF;IACzF,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxC;AAED,gGAAgG;AAChG,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,EAAE,CAAA;IACd;;;OAGG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAA;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,kBAAkB,CActF;AA6BD,8EAA8E;AAC9E,wBAAgB,eAAe,IAAI,EAAE,CA4DpC"}
package/dist/io.js CHANGED
@@ -39,9 +39,27 @@ export function openCommand(url, platform) {
39
39
  return { cmd: 'xdg-open', args: [href] };
40
40
  }
41
41
  }
42
- /** A clack prompt resolved to a cancel symbol (Ctrl-C / Esc): print a notice and exit cleanly. */
42
+ /**
43
+ * A clack prompt resolved to a cancel symbol (Ctrl-C / Esc): print a notice and exit cleanly. The
44
+ * ONE seam every prompt result passes through, so it is the only place that has to know about it.
45
+ *
46
+ * The guard is TWO conditions, and the second is what keeps the return total with no assertion.
47
+ * Each prompt is declared as `Promise<T | symbol>`, with the WIDE `symbol`, while `isCancel`
48
+ * narrows to `value is typeof CANCEL_SYMBOL`, one UNIQUE symbol belonging to the `@clack/core`
49
+ * module instance that minted it. Control flow cannot subtract a unique symbol from the wide type,
50
+ * so `isCancel` alone leaves the surviving branch at `T | symbol`; `typeof value === 'symbol'`
51
+ * subtracts the rest, and TypeScript narrows to `T` on its own.
52
+ *
53
+ * That second condition also catches a cancel `isCancel` does not recognise. Two copies of
54
+ * `@clack/core` in the graph (a direct dependency and a transitive one on a different range) are
55
+ * two unique symbols, and the guard only knows the one its own copy exported. Asserting `as T`
56
+ * over that case hands the symbol back as a value: `question` calls `.trim()` on it and dies with
57
+ * a `TypeError` where this seam exists to exit 130, and `select` returns it as a `T extends string`
58
+ * for the caller to branch on. Exiting on ANY symbol is right whichever copy produced it, since
59
+ * none of these prompts resolves to a symbol for any other reason.
60
+ */
43
61
  function bailIfCancelled(value) {
44
- if (isCancel(value)) {
62
+ if (isCancel(value) || typeof value === 'symbol') {
45
63
  cancel('Cancelled.');
46
64
  process.exit(130);
47
65
  }
package/dist/io.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EACL,MAAM,EACN,OAAO,IAAI,YAAY,EACvB,QAAQ,EACR,GAAG,EAEH,QAAQ,EACR,MAAM,IAAI,WAAW,EACrB,IAAI,GACL,MAAM,gBAAgB,CAAA;AAqCvB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,QAAyB;IAChE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;IAC9B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAA;QACtC,KAAK,OAAO;YACV,OAAO;gBACL,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,CAAC;gBACxC,wBAAwB,EAAE,IAAI;aAC/B,CAAA;QACH;YACE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAA;IAC5C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,eAAe,CAAI,KAAiB;IAC3C,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjD,MAAM,CAAC,YAAY,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,IAAI,CAAC,OAAO;YACV,4FAA4F;YAC5F,0DAA0D;YAC1D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAA;QAChD,CAAC;QACD,IAAI,CAAC,OAAO;YACV,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAA;QAC7C,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY;YACjC,MAAM,KAAK,GAAG,eAAe,CAC3B,MAAM,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CACzE,CAAA;YACD,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YACpC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAA;QAC5D,CAAC;QACD,KAAK,CAAC,MAAM,CACV,MAAc,EACd,OAA+C,EAC/C,YAAe;YAEf,oFAAoF;YACpF,0FAA0F;YAC1F,wDAAwD;YACxD,MAAM,KAAK,GAAG,eAAe,CAC3B,MAAM,WAAW,CAAI;gBACnB,OAAO,EAAE,MAAM;gBACf,OAAO,EAAE,CAAC,GAAG,OAAO,CAAgB;gBACpC,YAAY,EAAE,YAAY;aAC3B,CAAC,CACH,CAAA;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,iFAAiF;YACjF,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YAClE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC7B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY;YAChC,OAAO,eAAe,CAAC,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;QAC7F,CAAC;QACD,WAAW,CAAC,GAAG;YACb,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACnC,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;oBAClF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;wBAC7B,KAAK,EAAE,QAAQ;wBACf,QAAQ,EAAE,IAAI;wBACd,wBAAwB;qBACzB,CAAC,CAAA;oBACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;oBAClC,KAAK,CAAC,KAAK,EAAE,CAAA;oBACb,OAAO,EAAE,CAAA;gBACX,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,EAAE,CAAA;gBACX,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
package/dist/plan.d.ts CHANGED
@@ -10,6 +10,13 @@ export interface PlannedFile {
10
10
  /** Everything the orchestrator needs to render the full project. Fully resolved (no prompting). */
11
11
  export interface BootstrapInput {
12
12
  projectName: string;
13
+ /**
14
+ * The Compose project name keying this deployment's container, network and database volume,
15
+ * resolved by `composeProjectNameFor` from the target DIRECTORY. Required rather than derived
16
+ * here because the planner never sees that directory, and a defaulted one would silently put
17
+ * two deployments back in a single Compose project.
18
+ */
19
+ composeProjectName: string;
13
20
  appTitle: string;
14
21
  provider: VcsProvider;
15
22
  token: string;
@@ -1 +1 @@
1
- {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACpF,OAAO,EAA4C,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AAErF,8FAA8F;AAC9F,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,WAAW,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB,EAAE,MAAM,CAAA;IAC1B,8FAA8F;IAC9F,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,uFAAuF;IACvF,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,4FAA4F;IAC5F,eAAe,CAAC,EAAE,aAAa,EAAE,CAAA;IACjC,wFAAwF;IACxF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,iGAAiG;IACjG,mBAAmB,EAAE,MAAM,CAAA;IAC3B,mGAAmG;IACnG,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,WAAW,EAAE,CAoD9D"}
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACpF,OAAO,EAA4C,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AAErF,8FAA8F;AAC9F,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,kBAAkB,EAAE,MAAM,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,WAAW,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB,EAAE,MAAM,CAAA;IAC1B,8FAA8F;IAC9F,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,uFAAuF;IACvF,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,4FAA4F;IAC5F,eAAe,CAAC,EAAE,aAAa,EAAE,CAAA;IACjC,wFAAwF;IACxF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,iGAAiG;IACjG,mBAAmB,EAAE,MAAM,CAAA;IAC3B,mGAAmG;IACnG,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,WAAW,EAAE,CA0D9D"}
package/dist/plan.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { COMPOSE_FILE_PATH } from './composeProject.js';
1
2
  import { buildFrontendEnv, buildLocalEnv } from './env.js';
2
3
  import { buildGitignore, mergeGitignore } from './gitignore.js';
3
4
  import { dockerCompose, frontendEnvExample, frontendNuxtConfig, frontendPackageJson, frontendWranglerToml, localEnvExample, localMainTs, localPackageJson, tsconfigJson, } from './templates.js';
@@ -29,7 +30,13 @@ export function buildPlan(input) {
29
30
  // Local-mode backend.
30
31
  { path: 'local/package.json', content: localPackageJson(input.projectName) },
31
32
  { path: 'local/src/main.ts', content: localMainTs },
32
- { path: 'local/docker-compose.yml', content: dockerCompose(input.databaseUrl) },
33
+ {
34
+ path: COMPOSE_FILE_PATH,
35
+ content: dockerCompose({
36
+ databaseUrl: input.databaseUrl,
37
+ composeProjectName: input.composeProjectName,
38
+ }),
39
+ },
33
40
  { path: 'local/tsconfig.json', content: tsconfigJson },
34
41
  {
35
42
  path: 'local/.env.example',
@@ -114,6 +121,12 @@ cd local
114
121
  npm run db:up # start local Postgres (docker compose)
115
122
  npm start # migrate + serve the API on :${input.port}
116
123
  \`\`\`
124
+
125
+ Both scripts act on the Compose project \`${input.composeProjectName}\`, declared as \`name:\` in
126
+ \`local/docker-compose.yml\`, so this deployment's Postgres container and its
127
+ \`${input.composeProjectName}_cat-factory-pg\` volume are its own. Inspect them from anywhere with
128
+ \`docker compose -p ${input.composeProjectName} ps\`. Another deployment scaffolded into a
129
+ directory of the same name would share them, so give each one its own directory name.
117
130
  ${dbUpRuntimeNote(input.containerRuntime)}
118
131
  At least one **model provider** must be configured or no model is selectable. The simplest is
119
132
  Cloudflare Workers AI over REST — set \`CLOUDFLARE_ACCOUNT_ID\` + \`CLOUDFLARE_API_TOKEN\` in
package/dist/plan.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
package/dist/slug.d.ts CHANGED
@@ -1,3 +1,16 @@
1
1
  /** Coerce arbitrary text into a valid npm-name slug. Returns `fallback` if nothing usable remains. */
2
2
  export declare function slugifyProjectName(input: string, fallback?: string): string;
3
+ /**
4
+ * The generated SPA's Cloudflare Pages project name, complete with its suffix so the value is
5
+ * assembled in exactly one place.
6
+ *
7
+ * Pages accepts only lowercase letters, digits and hyphens, which is stricter than the npm slug
8
+ * this narrows: `acme.site` and `my_app` are valid npm names that `wrangler pages deploy`
9
+ * rejects, so leaving them in place ships a deploy target that is dead on arrival.
10
+ *
11
+ * Takes a slug already resolved by {@link slugifyProjectName}, whose first and last characters
12
+ * are therefore `[a-z0-9]`: that is what keeps the narrowed name non-empty and free of the
13
+ * leading/trailing hyphen Pages also refuses.
14
+ */
15
+ export declare function pagesProjectName(projectSlug: string): string;
3
16
  //# sourceMappingURL=slug.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAMA,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAgB,GAAG,MAAM,CAWlF"}
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAgBA,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAgB,GAAG,MAAM,CAWlF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG5D"}
package/dist/slug.js CHANGED
@@ -1,8 +1,18 @@
1
- // The project name is interpolated verbatim into the generated `local/`/`frontend/` package
2
- // `name` fields (`<name>-local` / `<name>-frontend`), so it has to be a valid npm package name:
3
- // lowercase, no spaces, and not starting with `.`/`_`. A free-text answer like "My Cats" would
4
- // otherwise produce `"My Cats-local"`, which `npm install` rejects. This coerces any input into a
5
- // safe slug, falling back to a default when nothing usable survives.
1
+ // The names the scaffold derives from the project name answered at setup. Each target has its
2
+ // OWN charset rule, and sharing one rule across two of them is how a name that is legal in one
3
+ // system silently breaks (or changes meaning) in another:
4
+ //
5
+ // - npm package names (`<slug>-local` / `<slug>-frontend` in the generated `package.json`s):
6
+ // lowercase, no spaces, `.` and `_` allowed but never leading. `slugifyProjectName`, the
7
+ // value carried as `BootstrapInput.projectName`.
8
+ // - the Cloudflare Pages project (`frontend/wrangler.toml`): lowercase letters, digits and
9
+ // hyphens only, so the npm slug's `.`/`_` cannot survive. `pagesProjectName`.
10
+ // - the Compose project that keys the deployment's containers and database volume: derived
11
+ // from the deployment DIRECTORY rather than from this slug, so it lives in
12
+ // `composeProject.ts`.
13
+ //
14
+ // A free-text answer like "My Cats" would otherwise produce `"My Cats-local"`, which
15
+ // `npm install` rejects.
6
16
  /** Coerce arbitrary text into a valid npm-name slug. Returns `fallback` if nothing usable remains. */
7
17
  export function slugifyProjectName(input, fallback = 'cat-factory') {
8
18
  const slug = input
@@ -16,4 +26,20 @@ export function slugifyProjectName(input, fallback = 'cat-factory') {
16
26
  .replace(/[._-]+$/, '');
17
27
  return slug.length > 0 ? slug : fallback;
18
28
  }
29
+ /**
30
+ * The generated SPA's Cloudflare Pages project name, complete with its suffix so the value is
31
+ * assembled in exactly one place.
32
+ *
33
+ * Pages accepts only lowercase letters, digits and hyphens, which is stricter than the npm slug
34
+ * this narrows: `acme.site` and `my_app` are valid npm names that `wrangler pages deploy`
35
+ * rejects, so leaving them in place ships a deploy target that is dead on arrival.
36
+ *
37
+ * Takes a slug already resolved by {@link slugifyProjectName}, whose first and last characters
38
+ * are therefore `[a-z0-9]`: that is what keeps the narrowed name non-empty and free of the
39
+ * leading/trailing hyphen Pages also refuses.
40
+ */
41
+ export function pagesProjectName(projectSlug) {
42
+ const narrowed = projectSlug.replace(/[^a-z0-9-]+/g, '-').replace(/-+/g, '-');
43
+ return `${narrowed}-frontend`;
44
+ }
19
45
  //# sourceMappingURL=slug.js.map
package/dist/slug.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"slug.js","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,gGAAgG;AAChG,+FAA+F;AAC/F,kGAAkG;AAClG,qEAAqE;AAErE,sGAAsG;AACtG,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,QAAQ,GAAG,aAAa;IACxE,MAAM,IAAI,GAAG,KAAK;SACf,IAAI,EAAE;SACN,WAAW,EAAE;QACd,sDAAsD;SACrD,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;QAC/B,2FAA2F;SAC1F,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IACzB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAA;AAC1C,CAAC"}
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../src/slug.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+FAA+F;AAC/F,0DAA0D;AAC1D,EAAE;AACF,+FAA+F;AAC/F,6FAA6F;AAC7F,qDAAqD;AACrD,6FAA6F;AAC7F,kFAAkF;AAClF,6FAA6F;AAC7F,+EAA+E;AAC/E,2BAA2B;AAC3B,EAAE;AACF,qFAAqF;AACrF,yBAAyB;AAEzB,sGAAsG;AACtG,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,QAAQ,GAAG,aAAa;IACxE,MAAM,IAAI,GAAG,KAAK;SACf,IAAI,EAAE;SACN,WAAW,EAAE;QACd,sDAAsD;SACrD,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;QAC/B,2FAA2F;SAC1F,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IACzB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAA;AAC1C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC7E,OAAO,GAAG,QAAQ,WAAW,CAAA;AAC/B,CAAC"}
@@ -23,7 +23,16 @@ export declare const NATIVE_HARNESSES: readonly ['claude-code', 'codex'];
23
23
  export type NativeHarness = (typeof NATIVE_HARNESSES)[number];
24
24
  export declare const localPackageJson: (projectName: string) => string;
25
25
  export declare const localMainTs = "// Local-mode backend entry point.\n//\n// Calls the reusable @cat-factory/local-server library's startLocal(): connect to the local\n// Postgres (DATABASE_URL), run the schema migration, boot pg-boss + the durable execution\n// worker, and serve the shared Hono app. Agent jobs run as per-run local containers and GitHub\n// is reached via the PAT in .env. Node 24+ runs this TypeScript directly via type stripping\n// (npm start = `node --env-file-if-exists=.env src/main.ts`), so edits here take effect with no\n// build step.\nimport { startLocal } from '@cat-factory/local-server'\n\nstartLocal().catch((err: unknown) => {\n console.error('failed to start cat-factory local server:', err)\n process.exit(1)\n})\n";
26
- export declare const dockerCompose: (dbUrl: string) => string;
26
+ export interface DockerComposeInput {
27
+ /** The deployment's `DATABASE_URL`: the Postgres credentials/db/port are read back off it. */
28
+ databaseUrl: string;
29
+ /**
30
+ * The deployment's Compose project name, ALREADY resolved by `composeProjectNameFor` (it is
31
+ * derived from the deployment directory, which the templates never see). Written verbatim.
32
+ */
33
+ composeProjectName: string;
34
+ }
35
+ export declare const dockerCompose: (input: DockerComposeInput) => string;
27
36
  /** Non-secret inputs shown in `local/.env.example`, kept in sync with the populated `.env`. */
28
37
  export interface LocalEnvExampleInput {
29
38
  provider?: 'github' | 'gitlab';
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,oBAAoB,YAAY,CAAA;AAC7C,eAAO,MAAM,WAAW,YAAY,CAAA;AAMpC;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,qDAAqD,CAAA;AAEvF,uFAAuF;AACvF,eAAO,MAAM,kBAAkB,YAAI,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAA;AAC9F,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;AAElE;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,YAAI,MAAM,EAAE,QAAQ,CAAU,CAAA;AAC1D,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5D,wGAAwG;AACxG,eAAO,MAAM,gBAAgB,YAAI,aAAa,EAAE,OAAO,CAAU,CAAA;AACjE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7D,eAAO,MAAM,gBAAgB,gBAAiB,MAAM,KAAG,MA6BhD,CAAA;AAEP,eAAO,MAAM,WAAW,otBAcvB,CAAA;AAED,eAAO,MAAM,aAAa,UAAW,MAAM,KAAG,MAuC7C,CAAA;AAED,+FAA+F;AAC/F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,eAAe,CAAC,EAAE,aAAa,EAAE,CAAA;CAClC;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,YACjC,sFAAsF,EACtF,uFAAuF,EACvF,uFAAuF,EACvF,wFAAwF,EACxF,sFAAsF,EACtF,qFAAqF,EACrF,yCAAyC,CACjC,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,oBAAoB,kBAAmB,MAAM,KAAG,MAAM,EAKlE,CAAA;AAED,eAAO,MAAM,eAAe,WAAW,oBAAoB,KAAQ,MA6ElE,CAAA;AAED,eAAO,MAAM,mBAAmB,gBAAiB,MAAM,KAAG,MA4BnD,CAAA;AAEP,eAAO,MAAM,kBAAkB,UAAW,MAAM,KAAG,MAalD,CAAA;AAED,eAAO,MAAM,oBAAoB,gBAAiB,MAAM,KAAG,MAS1D,CAAA;AAED,eAAO,MAAM,kBAAkB,wBAAwC,MAItE,CAAA;AAED,eAAO,MAAM,YAAY,sNAUxB,CAAA"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,oBAAoB,YAAY,CAAA;AAC7C,eAAO,MAAM,WAAW,YAAY,CAAA;AAMpC;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,qDAAqD,CAAA;AAEvF,uFAAuF;AACvF,eAAO,MAAM,kBAAkB,YAAI,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAA;AAC9F,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;AAElE;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,YAAI,MAAM,EAAE,QAAQ,CAAU,CAAA;AAC1D,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5D,wGAAwG;AACxG,eAAO,MAAM,gBAAgB,YAAI,aAAa,EAAE,OAAO,CAAU,CAAA;AACjE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7D,eAAO,MAAM,gBAAgB,gBAAiB,MAAM,KAAG,MA6BhD,CAAA;AAEP,eAAO,MAAM,WAAW,otBAcvB,CAAA;AAED,MAAM,WAAW,kBAAkB;IACjC,8FAA8F;IAC9F,WAAW,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAcD,eAAO,MAAM,aAAa,UAAW,kBAAkB,KAAG,MA8CzD,CAAA;AAED,+FAA+F;AAC/F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,eAAe,CAAC,EAAE,aAAa,EAAE,CAAA;CAClC;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,YACjC,sFAAsF,EACtF,uFAAuF,EACvF,uFAAuF,EACvF,wFAAwF,EACxF,sFAAsF,EACtF,qFAAqF,EACrF,yCAAyC,CACjC,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,oBAAoB,kBAAmB,MAAM,KAAG,MAAM,EAKlE,CAAA;AAED,eAAO,MAAM,eAAe,WAAW,oBAAoB,KAAQ,MA6ElE,CAAA;AAED,eAAO,MAAM,mBAAmB,gBAAiB,MAAM,KAAG,MA4BnD,CAAA;AAEP,eAAO,MAAM,kBAAkB,UAAW,MAAM,KAAG,MAalD,CAAA;AAED,eAAO,MAAM,oBAAoB,gBAAiB,MAAM,KAAG,MAY1D,CAAA;AAED,eAAO,MAAM,kBAAkB,wBAAwC,MAItE,CAAA;AAED,eAAO,MAAM,YAAY,sNAUxB,CAAA"}
package/dist/templates.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { pagesProjectName } from './slug.js';
1
2
  // Static file templates for the scaffolded deployment. These mirror `deploy/local` and
2
3
  // `deploy/frontend` in this repo, but depend on the PUBLISHED libraries (not `workspace:*`) so
3
4
  // the generated project works standalone outside the monorepo.
@@ -74,17 +75,27 @@ startLocal().catch((err: unknown) => {
74
75
  process.exit(1)
75
76
  })
76
77
  `;
77
- export const dockerCompose = (dbUrl) => {
78
+ /**
79
+ * YAML-quote a value read out of the DATABASE_URL and escape it for Compose's OWN `${}`
80
+ * interpolation. Both halves are load-bearing: as a bare scalar a password holding `: ` breaks
81
+ * the parse and one starting with `[`/`{`/`*` becomes a flow collection or an alias, and a `$`
82
+ * in a quoted value is still read as a variable reference, so Compose would create the container
83
+ * with a password that no longer matches the DATABASE_URL the backend authenticates with.
84
+ */
85
+ const composeValue = (value) => JSON.stringify(value).replace(/\$/g, '$$$$');
86
+ /** Quote a value that reaches a SHELL, inside the healthcheck's `CMD-SHELL` command. */
87
+ const shellArg = (value) => `'${value.replace(/'/g, `'\\''`)}'`;
88
+ export const dockerCompose = (input) => {
78
89
  // Derive the compose credentials/db from the DATABASE_URL so the two always agree.
79
90
  let user = 'cat';
80
91
  let password = 'cat';
81
92
  let db = 'catfactory';
82
93
  let port = '5432';
83
94
  try {
84
- const u = new URL(dbUrl);
95
+ const u = new URL(input.databaseUrl);
85
96
  user = decodeURIComponent(u.username) || user;
86
97
  password = decodeURIComponent(u.password) || password;
87
- db = u.pathname.replace(/^\//, '') || db;
98
+ db = decodeURIComponent(u.pathname.replace(/^\//, '')) || db;
88
99
  port = u.port || port;
89
100
  }
90
101
  catch {
@@ -94,19 +105,26 @@ export const dockerCompose = (dbUrl) => {
94
105
  # (so it can drive the container runtime to spawn agent containers), so only Postgres lives here.
95
106
  #
96
107
  # docker compose up -d postgres # or: pnpm db:up
108
+ #
109
+ # The project name below keys this deployment's container, network and database volume. It is
110
+ # declared rather than left to Compose's default (this file's own \`local/\` directory), which
111
+ # every generated deployment shares: two of them would then claim one Postgres volume and the
112
+ # second would serve the first one's data.
113
+ name: ${input.composeProjectName}
114
+
97
115
  services:
98
116
  postgres:
99
117
  image: postgres:18
100
118
  environment:
101
- POSTGRES_USER: ${user}
102
- POSTGRES_PASSWORD: ${password}
103
- POSTGRES_DB: ${db}
119
+ POSTGRES_USER: ${composeValue(user)}
120
+ POSTGRES_PASSWORD: ${composeValue(password)}
121
+ POSTGRES_DB: ${composeValue(db)}
104
122
  ports:
105
123
  - '${port}:5432'
106
124
  volumes:
107
125
  - cat-factory-pg:/var/lib/postgresql
108
126
  healthcheck:
109
- test: ['CMD-SHELL', 'pg_isready -U ${user} -d ${db}']
127
+ test: ['CMD-SHELL', ${composeValue(`pg_isready -U ${shellArg(user)} -d ${shellArg(db)}`)}]
110
128
  interval: 5s
111
129
  timeout: 5s
112
130
  retries: 10
@@ -249,7 +267,10 @@ export const frontendWranglerToml = (projectName) => `# Cloudflare Pages config
249
267
  # The SPA's backend URL is baked in at BUILD time (NUXT_PUBLIC_API_BASE), NOT here — Pages
250
268
  # [vars] only reach Functions at runtime and this is a pure static SPA. Change \`name\` to your
251
269
  # own Pages project.
252
- name = "${projectName}-frontend"
270
+ #
271
+ # Pages project names take lowercase letters, digits and hyphens only, which is narrower than the
272
+ # npm name the rest of the scaffold uses, so this one is normalized separately.
273
+ name = "${pagesProjectName(projectName)}"
253
274
  pages_build_output_dir = ".output/public"
254
275
  compatibility_date = "2025-06-01"
255
276
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/cli",
3
- "version": "0.13.7",
3
+ "version": "0.14.1",
4
4
  "description": "Bootstrap CLI for the Agent Architecture Board: scaffold a local-mode deployment (Node/local backend + frontend SPA) on your own machine — generates the crypto secrets, populates and gitignores the .env files, and mints a GitHub/GitLab personal access token by opening the browser at the right pre-scoped URL.",
5
5
  "keywords": [
6
6
  "bootstrap",
@@ -34,12 +34,12 @@
34
34
  "access": "public"
35
35
  },
36
36
  "dependencies": {
37
- "@clack/prompts": "^1.7.0"
37
+ "@clack/prompts": "^1.8.0"
38
38
  },
39
39
  "devDependencies": {
40
- "@cat-factory/contracts": "0.346.2",
41
- "@cat-factory/kernel": "0.336.1",
42
- "@types/node": "^26.4.1",
40
+ "@cat-factory/contracts": "0.349.0",
41
+ "@cat-factory/kernel": "0.342.0",
42
+ "@types/node": "^26.5.0",
43
43
  "typescript": "7.0.2",
44
44
  "valibot": "^1.4.2",
45
45
  "vitest": "^4.1.11"