@ebay-dt/bonfire-cli 0.2.0-alpha.0 → 0.2.0-alpha.11
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 +16 -10
- package/dist/branch-prepare.d.ts +6 -2
- package/dist/branch-prepare.d.ts.map +1 -1
- package/dist/branch-prepare.js +69 -11
- package/dist/branch-prepare.js.map +1 -1
- package/dist/command.d.ts +5 -1
- package/dist/command.d.ts.map +1 -1
- package/dist/command.js +62 -12
- package/dist/command.js.map +1 -1
- package/dist/convert.d.ts.map +1 -1
- package/dist/convert.js +2 -2
- package/dist/convert.js.map +1 -1
- package/dist/release-versions.d.ts +1 -1
- package/dist/release-versions.d.ts.map +1 -1
- package/dist/release-versions.js +1 -1
- package/dist/release-versions.js.map +1 -1
- package/package.json +4 -4
- package/templates/instance/context/PROTOTYPE.md +2 -2
- package/templates/instance/context/skills/color-scheme/SKILL.md +4 -4
- package/templates/instance/context/skills/item-data/SKILL.md +21 -21
- package/templates/instance/next.config.ts +4 -4
- package/templates/instance/src/actions/agents.ts +5 -5
- package/templates/instance/src/actions/prototypes.ts +22 -10
- package/templates/instance/src/actions/repository.ts +12 -2
- package/templates/instance/src/app/(prototypes)/layout.tsx +11 -11
- package/templates/instance/src/app/(system)/api/prototype-dirty/route.ts +3 -3
- package/templates/instance/src/app/(system)/api/repository/check/route.ts +2 -2
- package/templates/instance/src/app/(system)/api/repository/preparation/retry/route.ts +3 -0
- package/templates/instance/src/app/(system)/api/repository/retry/route.ts +2 -2
- package/templates/instance/src/app/(system)/api/repository/summary/route.ts +2 -2
- package/templates/instance/src/app/(system)/api/repository/update/route.ts +2 -2
- package/templates/instance/src/app/(system)/auth/login/route.ts +3 -3
- package/templates/instance/src/app/(system)/auth/logout/route.ts +3 -3
- package/templates/instance/src/app/(system)/auth/status/route.ts +3 -3
- package/templates/instance/src/app/(system)/layout.tsx +6 -6
- package/templates/instance/src/app/(system)/login/page.tsx +8 -8
- package/templates/instance/src/app/(system)/page.tsx +9 -9
- package/templates/instance/src/app/api/items/[itemId]/route.ts +7 -7
- package/templates/instance/src/app/api/items/route.ts +4 -4
- package/templates/instance/src/app/layout.tsx +29 -17
- package/templates/instance/src/bonfire.ts +19 -11
- package/templates/instance/src/lib/items/gateway-schemas.ts +12 -12
- package/templates/instance/src/lib/items/server.ts +52 -52
- package/templates/instance/src/proxy.ts +4 -4
package/README.md
CHANGED
|
@@ -80,15 +80,21 @@ machine state without changing it.
|
|
|
80
80
|
Before starting Next.js in development, run:
|
|
81
81
|
|
|
82
82
|
```sh
|
|
83
|
-
bonfire branch prepare --root <application-root> --hostname <hostname>
|
|
83
|
+
bonfire branch prepare --root <application-root> [--hostname <hostname>] [--default-hostname <hostname>]
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
The command loads environment values with Next-compatible precedence
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
86
|
+
The command loads environment values with Next-compatible precedence. Explicit
|
|
87
|
+
`--hostname` wins; generated development scripts use `--default-hostname` so
|
|
88
|
+
`BF_GITHUB_HOSTNAME` from `.env.local` is loaded before the fallback is used.
|
|
89
|
+
`BF_GIT_MODE=manual` disables Bonfire Git mutations and skips GitHub CLI and
|
|
90
|
+
branch preparation; managed mode is the default. Separately,
|
|
91
|
+
`BF_DISABLE_AUTO_BRANCH_SWITCH=true` skips automatic branch selection but does
|
|
92
|
+
not turn off managed commits and pushes. When enabled,
|
|
93
|
+
`BF_PROTOTYPE_BASE_BRANCH` overrides the default `main` primary branch, and
|
|
94
|
+
an available GitHub CLI identity is synchronized on their login branch through
|
|
95
|
+
`@ebay-dt/bonfire-node`. Missing GitHub CLI identity and classified repository
|
|
96
|
+
attention (for example dirty work, failed fetch, or missing primary) are
|
|
97
|
+
nonfatal and allow Next.js to start. Invalid configuration or unexpected
|
|
98
|
+
preparation failures still exit nonzero; no other branch is silently used.
|
|
99
|
+
The command never starts interactive authentication or prints identity,
|
|
100
|
+
credentials, paths, or raw Git output.
|
package/dist/branch-prepare.d.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { type GitHubCliClientLike, type PrototypeLifecycle } from "@ebay-dt/bonfire-node";
|
|
1
|
+
import { type DependencyInstaller, type GitHubCliClientLike, type PrototypeLifecycle } from "@ebay-dt/bonfire-node";
|
|
2
2
|
import type { BranchPrepareCommandOptions } from "./command.js";
|
|
3
3
|
export type CliEnvironmentLoader = (root: string) => Readonly<Record<string, string | undefined>>;
|
|
4
4
|
export type BranchPrepareDependencies = {
|
|
5
5
|
environment?: Readonly<Record<string, string | undefined>>;
|
|
6
6
|
loadEnvironment?: CliEnvironmentLoader;
|
|
7
7
|
githubCli?: GitHubCliClientLike;
|
|
8
|
-
|
|
8
|
+
createGitHubCli?: (options: {
|
|
9
|
+
hostname: string;
|
|
10
|
+
}) => GitHubCliClientLike;
|
|
11
|
+
lifecycle?: Pick<PrototypeLifecycle, "prepareBranch" | "prepareDependencies">;
|
|
12
|
+
installDependencies?: DependencyInstaller;
|
|
9
13
|
};
|
|
10
14
|
export declare class BranchPrepareError extends Error {
|
|
11
15
|
constructor(message: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-prepare.d.ts","sourceRoot":"","sources":["../src/branch-prepare.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,CACjC,IAAI,EAAE,MAAM,KACT,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAElD,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,eAAe,CAAC,EAAE,oBAAoB,CAAC;IACvC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,SAAS,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"branch-prepare.d.ts","sourceRoot":"","sources":["../src/branch-prepare.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,CACjC,IAAI,EAAE,MAAM,KACT,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAElD,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,eAAe,CAAC,EAAE,oBAAoB,CAAC;IACvC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,mBAAmB,CAAC;IACzE,SAAS,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,eAAe,GAAG,qBAAqB,CAAC,CAAC;IAC9E,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAMD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,2BAA2B,EACpC,YAAY,EAAE,yBAAyB,GACtC,OAAO,CAAC,MAAM,CAAC,CA0JjB","sourcesContent":["import nextEnv from \"@next/env\";\nimport {\n parseAutomaticBranchSwitchSetting,\n parseGitModeSetting,\n parseHostname,\n} from \"@ebay-dt/bonfire-core\";\nimport {\n GitHubCliClient,\n GitHubCliError,\n LocalPrototypeLifecycle,\n type DependencyInstaller,\n type GitHubCliClientLike,\n type PrototypeLifecycle,\n} from \"@ebay-dt/bonfire-node\";\nimport { resolve } from \"node:path\";\nimport type { BranchPrepareCommandOptions } from \"./command.js\";\n\nexport type CliEnvironmentLoader = (\n root: string,\n) => Readonly<Record<string, string | undefined>>;\n\nexport type BranchPrepareDependencies = {\n environment?: Readonly<Record<string, string | undefined>>;\n loadEnvironment?: CliEnvironmentLoader;\n githubCli?: GitHubCliClientLike;\n createGitHubCli?: (options: { hostname: string }) => GitHubCliClientLike;\n lifecycle?: Pick<PrototypeLifecycle, \"prepareBranch\" | \"prepareDependencies\">;\n installDependencies?: DependencyInstaller;\n};\n\nexport class BranchPrepareError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BranchPrepareError\";\n }\n}\n\nfunction loadEnvironment(root: string) {\n return nextEnv.loadEnvConfig(root, true, undefined, false).combinedEnv;\n}\n\nexport async function runBranchPrepare(\n options: BranchPrepareCommandOptions,\n dependencies: BranchPrepareDependencies,\n): Promise<number> {\n const root = resolve(options.root);\n const environment =\n dependencies.environment ??\n dependencies.loadEnvironment?.(root) ??\n loadEnvironment(root);\n // This guard must precede marker reads, identity resolution, and all Git\n // collaborators. A direct production invocation must remain read-only even\n // when a previous development install left recovery state behind.\n if (environment.NODE_ENV === \"production\") {\n console.log(\"Branch preparation is disabled in production.\");\n return 0;\n }\n\n const mode = parseAutomaticBranchSwitchSetting(\n environment.BF_DISABLE_AUTO_BRANCH_SWITCH,\n );\n const gitMode = parseGitModeSetting(environment.BF_GIT_MODE);\n\n if (gitMode === \"manual\") {\n console.log(\"Git management is in manual mode.\");\n return 0;\n }\n\n if (mode === \"disabled\") {\n console.log(\"Automatic branch switching is disabled.\");\n return 0;\n }\n\n // Explicit --hostname wins. Generated scripts use --default-hostname so\n // Next-compatible .env.local loading can supply BF_GITHUB_HOSTNAME first.\n const hostname = parseHostname(\n options.hostname ??\n environment.BF_GITHUB_HOSTNAME ??\n options.defaultHostname,\n );\n const lifecycle =\n dependencies.lifecycle ??\n new LocalPrototypeLifecycle({\n repositoryRoot: root,\n prototypeRoot: options.prototypeRoot ?? environment.BF_PROTOTYPE_ROOT,\n remote: options.remote ?? environment.BF_GIT_REMOTE,\n primaryBranch:\n options.primaryBranch ?? environment.BF_PROTOTYPE_BASE_BRANCH,\n automaticBranchSwitch: mode,\n gitMode,\n installDependencies: dependencies.installDependencies,\n });\n const prepareDependencies = lifecycle.prepareDependencies;\n if (prepareDependencies !== undefined) {\n const pending = await prepareDependencies.call(\n lifecycle,\n [],\n dependencies.installDependencies,\n );\n if (!pending.ok) {\n throw new BranchPrepareError(\"Unable to prepare project dependencies.\");\n }\n if (pending.value.status === \"failed\") {\n throw new BranchPrepareError(\n \"Dependency preparation failed; the development server was not started.\",\n );\n }\n if (pending.value.status === \"prepared\") {\n console.log(\"Pending project dependencies prepared.\");\n }\n }\n\n const githubCli =\n dependencies.githubCli ??\n (dependencies.createGitHubCli?.({ hostname }) ??\n new GitHubCliClient({ hostname }));\n let identity;\n try {\n identity = await githubCli.getUser();\n } catch (error) {\n if (\n error instanceof GitHubCliError &&\n (error.reason === \"missing\" || error.reason === \"unauthenticated\")\n ) {\n console.log(\n \"Branch preparation deferred; GitHub CLI authentication is not available.\",\n );\n return 0;\n }\n throw new BranchPrepareError(\"Unable to resolve GitHub CLI identity.\");\n }\n\n const result = await lifecycle.prepareBranch(identity);\n if (!result.ok) {\n throw new BranchPrepareError(\n `Branch preparation failed with ${result.error.code}.`,\n );\n }\n\n if (result.value.status === \"deferred\") {\n console.log(\n `Branch preparation deferred; repository attention: ${result.value.reason}.`,\n );\n // A dirty/offline check that made no changes is safe to leave for the\n // existing environment. Never launch after a partially applied update.\n if (\n result.value.effects.changed ||\n result.value.effects.pushed ||\n result.value.effects.reconciledPaths.length > 0 ||\n (result.value.effects.platformPaths?.length ?? 0) > 0 ||\n (result.value.effects.dependencyPaths?.length ?? 0) > 0 ||\n result.value.effects.preparationRequired === true ||\n result.value.effects.restartRequired\n ) {\n throw new BranchPrepareError(\n \"Branch preparation was only partially completed; the development server was not started.\",\n );\n }\n return 0;\n }\n if (result.value.status === \"unsafe\") {\n throw new BranchPrepareError(\n `Branch preparation requires repository attention (${result.value.reason}); the development server was not started.`,\n );\n }\n if (result.value.status === \"disabled\") {\n console.log(\n \"Branch preparation skipped; synchronization is disabled by configuration.\",\n );\n return 0;\n }\n\n const dependencyPaths = result.value.effects.dependencyPaths ?? [];\n const managedPathChanged =\n dependencyPaths.length > 0 ||\n result.value.effects.preparationRequired === true;\n if (managedPathChanged) {\n console.log(\"Installing updated project dependencies...\");\n if (prepareDependencies !== undefined) {\n const preparation = await prepareDependencies.call(\n lifecycle,\n dependencyPaths,\n dependencies.installDependencies,\n );\n if (!preparation.ok || preparation.value.status === \"failed\") {\n throw new BranchPrepareError(\n \"Dependency preparation failed; the development server was not started.\",\n );\n }\n } else {\n throw new BranchPrepareError(\n \"This lifecycle does not support dependency preparation; the development server was not started.\",\n );\n }\n }\n\n console.log(\"Branch preparation complete.\");\n return 0;\n}\n"]}
|
package/dist/branch-prepare.js
CHANGED
|
@@ -16,9 +16,15 @@ export async function runBranchPrepare(options, dependencies) {
|
|
|
16
16
|
const environment = dependencies.environment ??
|
|
17
17
|
dependencies.loadEnvironment?.(root) ??
|
|
18
18
|
loadEnvironment(root);
|
|
19
|
+
// This guard must precede marker reads, identity resolution, and all Git
|
|
20
|
+
// collaborators. A direct production invocation must remain read-only even
|
|
21
|
+
// when a previous development install left recovery state behind.
|
|
22
|
+
if (environment.NODE_ENV === "production") {
|
|
23
|
+
console.log("Branch preparation is disabled in production.");
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
19
26
|
const mode = parseAutomaticBranchSwitchSetting(environment.BF_DISABLE_AUTO_BRANCH_SWITCH);
|
|
20
27
|
const gitMode = parseGitModeSetting(environment.BF_GIT_MODE);
|
|
21
|
-
const hostname = parseHostname(options.hostname);
|
|
22
28
|
if (gitMode === "manual") {
|
|
23
29
|
console.log("Git management is in manual mode.");
|
|
24
30
|
return 0;
|
|
@@ -27,7 +33,37 @@ export async function runBranchPrepare(options, dependencies) {
|
|
|
27
33
|
console.log("Automatic branch switching is disabled.");
|
|
28
34
|
return 0;
|
|
29
35
|
}
|
|
30
|
-
|
|
36
|
+
// Explicit --hostname wins. Generated scripts use --default-hostname so
|
|
37
|
+
// Next-compatible .env.local loading can supply BF_GITHUB_HOSTNAME first.
|
|
38
|
+
const hostname = parseHostname(options.hostname ??
|
|
39
|
+
environment.BF_GITHUB_HOSTNAME ??
|
|
40
|
+
options.defaultHostname);
|
|
41
|
+
const lifecycle = dependencies.lifecycle ??
|
|
42
|
+
new LocalPrototypeLifecycle({
|
|
43
|
+
repositoryRoot: root,
|
|
44
|
+
prototypeRoot: options.prototypeRoot ?? environment.BF_PROTOTYPE_ROOT,
|
|
45
|
+
remote: options.remote ?? environment.BF_GIT_REMOTE,
|
|
46
|
+
primaryBranch: options.primaryBranch ?? environment.BF_PROTOTYPE_BASE_BRANCH,
|
|
47
|
+
automaticBranchSwitch: mode,
|
|
48
|
+
gitMode,
|
|
49
|
+
installDependencies: dependencies.installDependencies,
|
|
50
|
+
});
|
|
51
|
+
const prepareDependencies = lifecycle.prepareDependencies;
|
|
52
|
+
if (prepareDependencies !== undefined) {
|
|
53
|
+
const pending = await prepareDependencies.call(lifecycle, [], dependencies.installDependencies);
|
|
54
|
+
if (!pending.ok) {
|
|
55
|
+
throw new BranchPrepareError("Unable to prepare project dependencies.");
|
|
56
|
+
}
|
|
57
|
+
if (pending.value.status === "failed") {
|
|
58
|
+
throw new BranchPrepareError("Dependency preparation failed; the development server was not started.");
|
|
59
|
+
}
|
|
60
|
+
if (pending.value.status === "prepared") {
|
|
61
|
+
console.log("Pending project dependencies prepared.");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const githubCli = dependencies.githubCli ??
|
|
65
|
+
(dependencies.createGitHubCli?.({ hostname }) ??
|
|
66
|
+
new GitHubCliClient({ hostname }));
|
|
31
67
|
let identity;
|
|
32
68
|
try {
|
|
33
69
|
identity = await githubCli.getUser();
|
|
@@ -40,25 +76,47 @@ export async function runBranchPrepare(options, dependencies) {
|
|
|
40
76
|
}
|
|
41
77
|
throw new BranchPrepareError("Unable to resolve GitHub CLI identity.");
|
|
42
78
|
}
|
|
43
|
-
const lifecycle = dependencies.lifecycle ??
|
|
44
|
-
new LocalPrototypeLifecycle({
|
|
45
|
-
repositoryRoot: root,
|
|
46
|
-
primaryBranch: environment.BF_PROTOTYPE_BASE_BRANCH,
|
|
47
|
-
automaticBranchSwitch: mode,
|
|
48
|
-
gitMode,
|
|
49
|
-
});
|
|
50
79
|
const result = await lifecycle.prepareBranch(identity);
|
|
51
80
|
if (!result.ok) {
|
|
52
81
|
throw new BranchPrepareError(`Branch preparation failed with ${result.error.code}.`);
|
|
53
82
|
}
|
|
54
83
|
if (result.value.status === "deferred") {
|
|
55
|
-
console.log(`Branch preparation deferred; repository attention: ${result.value.reason
|
|
84
|
+
console.log(`Branch preparation deferred; repository attention: ${result.value.reason}.`);
|
|
85
|
+
// A dirty/offline check that made no changes is safe to leave for the
|
|
86
|
+
// existing environment. Never launch after a partially applied update.
|
|
87
|
+
if (result.value.effects.changed ||
|
|
88
|
+
result.value.effects.pushed ||
|
|
89
|
+
result.value.effects.reconciledPaths.length > 0 ||
|
|
90
|
+
(result.value.effects.platformPaths?.length ?? 0) > 0 ||
|
|
91
|
+
(result.value.effects.dependencyPaths?.length ?? 0) > 0 ||
|
|
92
|
+
result.value.effects.preparationRequired === true ||
|
|
93
|
+
result.value.effects.restartRequired) {
|
|
94
|
+
throw new BranchPrepareError("Branch preparation was only partially completed; the development server was not started.");
|
|
95
|
+
}
|
|
56
96
|
return 0;
|
|
57
97
|
}
|
|
58
98
|
if (result.value.status === "unsafe") {
|
|
59
|
-
|
|
99
|
+
throw new BranchPrepareError(`Branch preparation requires repository attention (${result.value.reason}); the development server was not started.`);
|
|
100
|
+
}
|
|
101
|
+
if (result.value.status === "disabled") {
|
|
102
|
+
console.log("Branch preparation skipped; synchronization is disabled by configuration.");
|
|
60
103
|
return 0;
|
|
61
104
|
}
|
|
105
|
+
const dependencyPaths = result.value.effects.dependencyPaths ?? [];
|
|
106
|
+
const managedPathChanged = dependencyPaths.length > 0 ||
|
|
107
|
+
result.value.effects.preparationRequired === true;
|
|
108
|
+
if (managedPathChanged) {
|
|
109
|
+
console.log("Installing updated project dependencies...");
|
|
110
|
+
if (prepareDependencies !== undefined) {
|
|
111
|
+
const preparation = await prepareDependencies.call(lifecycle, dependencyPaths, dependencies.installDependencies);
|
|
112
|
+
if (!preparation.ok || preparation.value.status === "failed") {
|
|
113
|
+
throw new BranchPrepareError("Dependency preparation failed; the development server was not started.");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
throw new BranchPrepareError("This lifecycle does not support dependency preparation; the development server was not started.");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
62
120
|
console.log("Branch preparation complete.");
|
|
63
121
|
return 0;
|
|
64
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-prepare.js","sourceRoot":"","sources":["../src/branch-prepare.ts"],"names":[],"mappings":"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","sourcesContent":["import nextEnv from \"@next/env\";\nimport {\n parseAutomaticBranchSwitchSetting,\n parseGitModeSetting,\n parseHostname,\n} from \"@ebay-dt/bonfire-core\";\nimport {\n GitHubCliClient,\n GitHubCliError,\n LocalPrototypeLifecycle,\n type GitHubCliClientLike,\n type PrototypeLifecycle,\n} from \"@ebay-dt/bonfire-node\";\nimport { resolve } from \"node:path\";\nimport type { BranchPrepareCommandOptions } from \"./command.js\";\n\nexport type CliEnvironmentLoader = (\n root: string,\n) => Readonly<Record<string, string | undefined>>;\n\nexport type BranchPrepareDependencies = {\n environment?: Readonly<Record<string, string | undefined>>;\n loadEnvironment?: CliEnvironmentLoader;\n githubCli?: GitHubCliClientLike;\n lifecycle?: Pick<PrototypeLifecycle, \"prepareBranch\">;\n};\n\nexport class BranchPrepareError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BranchPrepareError\";\n }\n}\n\nfunction loadEnvironment(root: string) {\n return nextEnv.loadEnvConfig(root, true, undefined, false).combinedEnv;\n}\n\nexport async function runBranchPrepare(\n options: BranchPrepareCommandOptions,\n dependencies: BranchPrepareDependencies,\n): Promise<number> {\n const root = resolve(options.root);\n const environment =\n dependencies.environment ??\n dependencies.loadEnvironment?.(root) ??\n loadEnvironment(root);\n const mode = parseAutomaticBranchSwitchSetting(\n environment.BF_DISABLE_AUTO_BRANCH_SWITCH,\n );\n const gitMode = parseGitModeSetting(environment.BF_GIT_MODE);\n const hostname = parseHostname(options.hostname);\n\n if (gitMode === \"manual\") {\n console.log(\"Git management is in manual mode.\");\n return 0;\n }\n\n if (mode === \"disabled\") {\n console.log(\"Automatic branch switching is disabled.\");\n return 0;\n }\n\n const githubCli = dependencies.githubCli ?? new GitHubCliClient({ hostname });\n let identity;\n try {\n identity = await githubCli.getUser();\n } catch (error) {\n if (\n error instanceof GitHubCliError &&\n (error.reason === \"missing\" || error.reason === \"unauthenticated\")\n ) {\n console.log(\n \"Branch preparation deferred; GitHub CLI authentication is not available.\",\n );\n return 0;\n }\n throw new BranchPrepareError(\"Unable to resolve GitHub CLI identity.\");\n }\n\n const lifecycle =\n dependencies.lifecycle ??\n new LocalPrototypeLifecycle({\n repositoryRoot: root,\n primaryBranch: environment.BF_PROTOTYPE_BASE_BRANCH,\n automaticBranchSwitch: mode,\n gitMode,\n });\n const result = await lifecycle.prepareBranch(identity);\n if (!result.ok) {\n throw new BranchPrepareError(\n `Branch preparation failed with ${result.error.code}.`,\n );\n }\n\n if (result.value.status === \"deferred\") {\n console.log(\n `Branch preparation deferred; repository attention: ${result.value.reason ?? \"unknown\"}.`,\n );\n return 0;\n }\n if (result.value.status === \"unsafe\") {\n console.log(\n `Branch preparation requires repository attention: ${result.value.reason ?? \"unknown\"}.`,\n );\n return 0;\n }\n\n console.log(\"Branch preparation complete.\");\n return 0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"branch-prepare.js","sourceRoot":"","sources":["../src/branch-prepare.ts"],"names":[],"mappings":"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","sourcesContent":["import nextEnv from \"@next/env\";\nimport {\n parseAutomaticBranchSwitchSetting,\n parseGitModeSetting,\n parseHostname,\n} from \"@ebay-dt/bonfire-core\";\nimport {\n GitHubCliClient,\n GitHubCliError,\n LocalPrototypeLifecycle,\n type DependencyInstaller,\n type GitHubCliClientLike,\n type PrototypeLifecycle,\n} from \"@ebay-dt/bonfire-node\";\nimport { resolve } from \"node:path\";\nimport type { BranchPrepareCommandOptions } from \"./command.js\";\n\nexport type CliEnvironmentLoader = (\n root: string,\n) => Readonly<Record<string, string | undefined>>;\n\nexport type BranchPrepareDependencies = {\n environment?: Readonly<Record<string, string | undefined>>;\n loadEnvironment?: CliEnvironmentLoader;\n githubCli?: GitHubCliClientLike;\n createGitHubCli?: (options: { hostname: string }) => GitHubCliClientLike;\n lifecycle?: Pick<PrototypeLifecycle, \"prepareBranch\" | \"prepareDependencies\">;\n installDependencies?: DependencyInstaller;\n};\n\nexport class BranchPrepareError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"BranchPrepareError\";\n }\n}\n\nfunction loadEnvironment(root: string) {\n return nextEnv.loadEnvConfig(root, true, undefined, false).combinedEnv;\n}\n\nexport async function runBranchPrepare(\n options: BranchPrepareCommandOptions,\n dependencies: BranchPrepareDependencies,\n): Promise<number> {\n const root = resolve(options.root);\n const environment =\n dependencies.environment ??\n dependencies.loadEnvironment?.(root) ??\n loadEnvironment(root);\n // This guard must precede marker reads, identity resolution, and all Git\n // collaborators. A direct production invocation must remain read-only even\n // when a previous development install left recovery state behind.\n if (environment.NODE_ENV === \"production\") {\n console.log(\"Branch preparation is disabled in production.\");\n return 0;\n }\n\n const mode = parseAutomaticBranchSwitchSetting(\n environment.BF_DISABLE_AUTO_BRANCH_SWITCH,\n );\n const gitMode = parseGitModeSetting(environment.BF_GIT_MODE);\n\n if (gitMode === \"manual\") {\n console.log(\"Git management is in manual mode.\");\n return 0;\n }\n\n if (mode === \"disabled\") {\n console.log(\"Automatic branch switching is disabled.\");\n return 0;\n }\n\n // Explicit --hostname wins. Generated scripts use --default-hostname so\n // Next-compatible .env.local loading can supply BF_GITHUB_HOSTNAME first.\n const hostname = parseHostname(\n options.hostname ??\n environment.BF_GITHUB_HOSTNAME ??\n options.defaultHostname,\n );\n const lifecycle =\n dependencies.lifecycle ??\n new LocalPrototypeLifecycle({\n repositoryRoot: root,\n prototypeRoot: options.prototypeRoot ?? environment.BF_PROTOTYPE_ROOT,\n remote: options.remote ?? environment.BF_GIT_REMOTE,\n primaryBranch:\n options.primaryBranch ?? environment.BF_PROTOTYPE_BASE_BRANCH,\n automaticBranchSwitch: mode,\n gitMode,\n installDependencies: dependencies.installDependencies,\n });\n const prepareDependencies = lifecycle.prepareDependencies;\n if (prepareDependencies !== undefined) {\n const pending = await prepareDependencies.call(\n lifecycle,\n [],\n dependencies.installDependencies,\n );\n if (!pending.ok) {\n throw new BranchPrepareError(\"Unable to prepare project dependencies.\");\n }\n if (pending.value.status === \"failed\") {\n throw new BranchPrepareError(\n \"Dependency preparation failed; the development server was not started.\",\n );\n }\n if (pending.value.status === \"prepared\") {\n console.log(\"Pending project dependencies prepared.\");\n }\n }\n\n const githubCli =\n dependencies.githubCli ??\n (dependencies.createGitHubCli?.({ hostname }) ??\n new GitHubCliClient({ hostname }));\n let identity;\n try {\n identity = await githubCli.getUser();\n } catch (error) {\n if (\n error instanceof GitHubCliError &&\n (error.reason === \"missing\" || error.reason === \"unauthenticated\")\n ) {\n console.log(\n \"Branch preparation deferred; GitHub CLI authentication is not available.\",\n );\n return 0;\n }\n throw new BranchPrepareError(\"Unable to resolve GitHub CLI identity.\");\n }\n\n const result = await lifecycle.prepareBranch(identity);\n if (!result.ok) {\n throw new BranchPrepareError(\n `Branch preparation failed with ${result.error.code}.`,\n );\n }\n\n if (result.value.status === \"deferred\") {\n console.log(\n `Branch preparation deferred; repository attention: ${result.value.reason}.`,\n );\n // A dirty/offline check that made no changes is safe to leave for the\n // existing environment. Never launch after a partially applied update.\n if (\n result.value.effects.changed ||\n result.value.effects.pushed ||\n result.value.effects.reconciledPaths.length > 0 ||\n (result.value.effects.platformPaths?.length ?? 0) > 0 ||\n (result.value.effects.dependencyPaths?.length ?? 0) > 0 ||\n result.value.effects.preparationRequired === true ||\n result.value.effects.restartRequired\n ) {\n throw new BranchPrepareError(\n \"Branch preparation was only partially completed; the development server was not started.\",\n );\n }\n return 0;\n }\n if (result.value.status === \"unsafe\") {\n throw new BranchPrepareError(\n `Branch preparation requires repository attention (${result.value.reason}); the development server was not started.`,\n );\n }\n if (result.value.status === \"disabled\") {\n console.log(\n \"Branch preparation skipped; synchronization is disabled by configuration.\",\n );\n return 0;\n }\n\n const dependencyPaths = result.value.effects.dependencyPaths ?? [];\n const managedPathChanged =\n dependencyPaths.length > 0 ||\n result.value.effects.preparationRequired === true;\n if (managedPathChanged) {\n console.log(\"Installing updated project dependencies...\");\n if (prepareDependencies !== undefined) {\n const preparation = await prepareDependencies.call(\n lifecycle,\n dependencyPaths,\n dependencies.installDependencies,\n );\n if (!preparation.ok || preparation.value.status === \"failed\") {\n throw new BranchPrepareError(\n \"Dependency preparation failed; the development server was not started.\",\n );\n }\n } else {\n throw new BranchPrepareError(\n \"This lifecycle does not support dependency preparation; the development server was not started.\",\n );\n }\n }\n\n console.log(\"Branch preparation complete.\");\n return 0;\n}\n"]}
|
package/dist/command.d.ts
CHANGED
|
@@ -9,7 +9,11 @@ export type PrepareCommandOptions = {
|
|
|
9
9
|
};
|
|
10
10
|
export type BranchPrepareCommandOptions = {
|
|
11
11
|
root: string;
|
|
12
|
-
hostname
|
|
12
|
+
hostname?: string;
|
|
13
|
+
defaultHostname?: string;
|
|
14
|
+
prototypeRoot?: string;
|
|
15
|
+
remote?: string;
|
|
16
|
+
primaryBranch?: string;
|
|
13
17
|
};
|
|
14
18
|
export type ContextCommandOptions = {
|
|
15
19
|
context: "sync";
|
package/dist/command.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAE3B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAEtB,qBAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAC7B;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,GACD;IACE,OAAO,EAAE,SAAS,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEN,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC;AAE5E,KAAK,iBAAiB,GAClB,qBAAqB,GACrB,2BAA2B,GAC3B,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,eAAe,GAAG,yBAAyB,GAAG;IACxD,cAAc,CAAC,EAAE,CACf,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACzC,CAAC;AAiPF,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,iBAAiB,CAUpE;AA+ED,wBAAsB,GAAG,CACvB,IAAI,GAAE,SAAS,MAAM,EAA0B,EAC/C,YAAY,GAAE,eAAoB,GACjC,OAAO,CAAC,MAAM,CAAC,CA4DjB","sourcesContent":["import {\n checkContext,\n checkContextInstallation,\n installContext,\n syncContext,\n type ContextInstallCheckResult,\n type ContextInstallResult,\n type ContextInstallOptions,\n type ContextSyncResult,\n} from \"@ebay-dt/bonfire-context\";\nimport { prepare, PrepareError } from \"./prepare.js\";\nimport {\n BranchPrepareError,\n runBranchPrepare,\n type BranchPrepareDependencies,\n} from \"./branch-prepare.js\";\nimport {\n convert,\n convertDefaults,\n defaultConvertOptions,\n humanizeAppId,\n type ConvertOptions,\n} from \"./convert.js\";\n\nexport class CliSyntaxError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CliSyntaxError\";\n }\n}\n\nexport type PrepareCommandOptions = {\n root: string;\n};\n\nexport type BranchPrepareCommandOptions = {\n root: string;\n hostname: string;\n};\n\nexport type ContextCommandOptions =\n | {\n context: \"sync\";\n root: string;\n check: boolean;\n }\n | {\n context: \"install\";\n root: string;\n appId: string;\n check: boolean;\n };\n\nexport type ConvertCommandOptions = ConvertOptions & { command: \"convert\" };\n\ntype CliCommandOptions =\n | PrepareCommandOptions\n | BranchPrepareCommandOptions\n | ContextCommandOptions\n | ConvertCommandOptions;\n\nexport type CliDependencies = BranchPrepareDependencies & {\n contextInstall?: (\n options: ContextInstallOptions,\n ) => Promise<ContextInstallResult>;\n contextInstallCheck?: (\n options: ContextInstallOptions,\n ) => Promise<ContextInstallCheckResult>;\n};\n\nfunction parseRootOption(\n argv: readonly string[],\n start: number,\n): { root: string; nextIndex: number } {\n const value = argv[start + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(\"The --root option requires a value\");\n }\n return { root: value, nextIndex: start + 2 };\n}\n\nfunction parsePrepareArgs(argv: readonly string[]): PrepareCommandOptions {\n let root = process.cwd();\n let rootProvided = false;\n for (let index = 1; index < argv.length;) {\n if (argv[index] !== \"--root\") {\n throw new CliSyntaxError(`Unknown option: ${argv[index]}`);\n }\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n }\n return { root };\n}\n\nfunction parseContextArgs(argv: readonly string[]): ContextCommandOptions {\n const context = argv[1];\n if (context !== \"sync\" && context !== \"install\") {\n throw new CliSyntaxError(\n \"Usage: bonfire context sync [--check] [--root <root>] | bonfire context install [--check] --app-id <app-id> [--root <root>]\",\n );\n }\n\n let root = process.cwd();\n let appId: string | undefined;\n let check = false;\n let rootProvided = false;\n let appIdProvided = false;\n let checkProvided = false;\n\n for (let index = 2; index < argv.length;) {\n const option = argv[index];\n if (option === \"--check\") {\n if (checkProvided) {\n throw new CliSyntaxError(\n \"The --check option may only be provided once\",\n );\n }\n check = true;\n checkProvided = true;\n index += 1;\n continue;\n }\n if (option === \"--root\") {\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n continue;\n }\n if (option === \"--app-id\") {\n if (appIdProvided) {\n throw new CliSyntaxError(\n \"The --app-id option may only be provided once\",\n );\n }\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(\"The --app-id option requires a value\");\n }\n appId = value;\n appIdProvided = true;\n index += 2;\n continue;\n }\n throw new CliSyntaxError(`Unknown option: ${option}`);\n }\n\n if (context === \"install\") {\n if (appId === undefined) {\n throw new CliSyntaxError(\n \"Usage: bonfire context install [--check] --app-id <app-id> [--root <root>]\",\n );\n }\n return { context, root, appId, check };\n }\n if (appId !== undefined) {\n throw new CliSyntaxError(\"The --app-id option is only valid for install\");\n }\n return { context, root, check };\n}\n\nfunction parseConvertArgs(argv: readonly string[]): ConvertCommandOptions {\n const defaults = defaultConvertOptions();\n let root: string | undefined;\n let appId: string | undefined;\n let name: string | undefined;\n let packageName = defaults.packageName;\n let hostname = convertDefaults.hostname;\n let port = convertDefaults.port;\n let deploymentEndpoint = convertDefaults.deploymentEndpoint;\n let withoutData = false;\n let dryRun = false;\n let skipInstall = false;\n const seen = new Set<string>();\n\n for (let index = 1; index < argv.length;) {\n const option = argv[index];\n if (!option) throw new CliSyntaxError(\"Missing convert option\");\n if (\n option === \"--without-data\" ||\n option === \"--dry-run\" ||\n option === \"--skip-install\"\n ) {\n if (seen.has(option))\n throw new CliSyntaxError(`${option} may only be provided once`);\n seen.add(option);\n if (option === \"--without-data\") withoutData = true;\n if (option === \"--dry-run\") dryRun = true;\n if (option === \"--skip-install\") skipInstall = true;\n index += 1;\n continue;\n }\n const setters: Record<string, (value: string) => void> = {\n \"--root\": (value) => {\n root = value;\n },\n \"--app-id\": (value) => {\n appId = value;\n },\n \"--name\": (value) => {\n name = value;\n },\n \"--package-name\": (value) => {\n packageName = value;\n },\n \"--hostname\": (value) => {\n hostname = value;\n },\n \"--deployment-endpoint\": (value) => {\n deploymentEndpoint = value;\n },\n \"--port\": (value) => {\n if (\n !/^\\d+$/u.test(value) ||\n Number(value) < 1 ||\n Number(value) > 65535\n ) {\n throw new CliSyntaxError(\n \"--port must be a number between 1 and 65535\",\n );\n }\n port = Number(value);\n },\n };\n const setter = setters[option];\n if (!setter) throw new CliSyntaxError(`Unknown option: ${option}`);\n if (seen.has(option))\n throw new CliSyntaxError(`${option} may only be provided once`);\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\"))\n throw new CliSyntaxError(`${option} requires a value`);\n seen.add(option);\n setter(value);\n index += 2;\n }\n if (!root || !appId) {\n throw new CliSyntaxError(\n \"Usage: bonfire convert --root <next-app> --app-id <app-id> [--name <display-name>] [--hostname <hostname>] [--port <port>] [--without-data] [--dry-run] [--skip-install]\",\n );\n }\n return {\n command: \"convert\",\n root,\n appId,\n name: name ?? humanizeAppId(appId),\n packageName,\n hostname,\n port,\n deploymentEndpoint,\n withItemData: !withoutData,\n dryRun,\n skipInstall,\n };\n}\n\nfunction parseBranchPrepareArgs(\n argv: readonly string[],\n): BranchPrepareCommandOptions {\n let root = process.cwd();\n let hostname: string | undefined;\n let rootProvided = false;\n let hostnameProvided = false;\n\n for (let index = 2; index < argv.length;) {\n const option = argv[index];\n if (option === \"--root\") {\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n continue;\n }\n if (option === \"--hostname\") {\n if (hostnameProvided) {\n throw new CliSyntaxError(\n \"The --hostname option may only be provided once\",\n );\n }\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(\"The --hostname option requires a value\");\n }\n hostname = value;\n hostnameProvided = true;\n index += 2;\n continue;\n }\n throw new CliSyntaxError(`Unknown option: ${option}`);\n }\n\n if (hostname === undefined) {\n throw new CliSyntaxError(\n \"Usage: bonfire branch prepare --root <application-root> --hostname <hostname>\",\n );\n }\n return { root, hostname };\n}\n\nexport function parseArgs(argv: readonly string[]): CliCommandOptions {\n if (argv[0] === \"convert\") return parseConvertArgs(argv);\n if (argv[0] === \"context\") return parseContextArgs(argv);\n if (argv[0] === \"prepare\") return parsePrepareArgs(argv);\n if (argv[0] === \"branch\" && argv[1] === \"prepare\") {\n return parseBranchPrepareArgs(argv);\n }\n throw new CliSyntaxError(\n \"Usage: bonfire convert --root <next-app> --app-id <app-id> [options] | bonfire context sync [--check] [--root <root>] | bonfire context install [--check] --app-id <app-id> [--root <root>] | bonfire prepare [--root <application-root>] | bonfire branch prepare --root <application-root> --hostname <hostname>\",\n );\n}\n\nfunction printContextIssues(result: {\n issues: readonly { kind: string; path: string }[];\n}) {\n for (const issue of result.issues) {\n console.error(`- ${issue.kind}: ${issue.path}`);\n }\n}\n\nfunction printContextSyncSummary(result: ContextSyncResult) {\n if (result.written.length > 0) {\n console.log(`Written: ${result.written.join(\", \")}`);\n }\n if (result.removed.length > 0) {\n console.log(`Removed: ${result.removed.join(\", \")}`);\n }\n}\n\nasync function runContextCommand(\n options: ContextCommandOptions,\n dependencies: CliDependencies,\n): Promise<number> {\n if (options.context === \"install\") {\n if (options.check) {\n const result = await (\n dependencies.contextInstallCheck ?? checkContextInstallation\n )({\n repositoryRoot: options.root,\n appId: options.appId,\n });\n if (!result.ok) {\n console.error(\"Context install check failed:\");\n printContextIssues(result);\n return 1;\n }\n console.log(\"Context install check passed.\");\n return 0;\n }\n const result = await (dependencies.contextInstall ?? installContext)({\n repositoryRoot: options.root,\n appId: options.appId,\n });\n const skills = result.skills.map(\n (skill) => `${skill.name} (${skill.status})`,\n );\n const mcp = result.mcp.map((server) => `${server.name} (${server.status})`);\n console.log(\n skills.length > 0\n ? `Context skills: ${skills.join(\", \")}`\n : \"No context skills configured.\",\n );\n if (mcp.length > 0) console.log(`Context MCP: ${mcp.join(\", \")}`);\n console.log(\"Context install complete.\");\n return 0;\n }\n\n if (options.check) {\n const result = await checkContext({ repositoryRoot: options.root });\n if (!result.ok) {\n console.error(\"Context sync check failed:\");\n printContextIssues(result);\n return 1;\n }\n console.log(\"Context sync check passed.\");\n return 0;\n }\n\n const result = await syncContext({ repositoryRoot: options.root });\n if (!result.ok) {\n console.error(\"Context sync failed:\");\n printContextIssues(result);\n return 1;\n }\n printContextSyncSummary(result);\n console.log(\"Context sync complete.\");\n return 0;\n}\n\nexport async function run(\n argv: readonly string[] = process.argv.slice(2),\n dependencies: CliDependencies = {},\n): Promise<number> {\n const isBranchPrepare = argv[0] === \"branch\";\n const isContext = argv[0] === \"context\";\n const isConvert = argv[0] === \"convert\";\n try {\n const options = parseArgs(argv);\n if (\"context\" in options) {\n return await runContextCommand(options, dependencies);\n }\n if (isConvert && \"command\" in options) {\n await convert(options);\n return 0;\n }\n if (\"hostname\" in options) {\n return await runBranchPrepare(options, dependencies);\n }\n\n const result = await prepare(options);\n const descriptions = {\n environment: \"the process environment\",\n existing: \".env.local\",\n generated: \"a newly generated value in .env.local\",\n } as const;\n console.log(\n `Bonfire preparation complete; BF_SESSION_SECRET came from ${descriptions[result.source]}.`,\n );\n return 0;\n } catch (error) {\n if (error instanceof CliSyntaxError) {\n console.error(`bonfire: ${error.message}`);\n return 2;\n }\n if (isContext) {\n const message =\n error instanceof Error ? error.message : \"an unknown error occurred\";\n console.error(`bonfire context failed: ${message}`);\n return 1;\n }\n if (isBranchPrepare) {\n const message =\n error instanceof BranchPrepareError\n ? error.message\n : \"Unable to load branch preparation configuration.\";\n console.error(`bonfire branch prepare failed: ${message}`);\n return 1;\n }\n if (isConvert) {\n const message =\n error instanceof Error ? error.message : \"an unknown error occurred\";\n console.error(`bonfire convert failed: ${message}`);\n return 1;\n }\n\n const message =\n error instanceof PrepareError || error instanceof Error\n ? error.message\n : \"an unknown error occurred\";\n console.error(`bonfire prepare failed: ${message}`);\n return 1;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAE3B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAEtB,qBAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAC7B;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,GACD;IACE,OAAO,EAAE,SAAS,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEN,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC;AAE5E,KAAK,iBAAiB,GAClB,qBAAqB,GACrB,2BAA2B,GAC3B,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,eAAe,GAAG,yBAAyB,GAAG;IACxD,cAAc,CAAC,EAAE,CACf,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACzC,CAAC;AA6RF,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,iBAAiB,CAUpE;AA+ED,wBAAsB,GAAG,CACvB,IAAI,GAAE,SAAS,MAAM,EAA0B,EAC/C,YAAY,GAAE,eAAoB,GACjC,OAAO,CAAC,MAAM,CAAC,CA+DjB","sourcesContent":["import {\n checkContext,\n checkContextInstallation,\n installContext,\n syncContext,\n type ContextInstallCheckResult,\n type ContextInstallResult,\n type ContextInstallOptions,\n type ContextSyncResult,\n} from \"@ebay-dt/bonfire-context\";\nimport { prepare, PrepareError } from \"./prepare.js\";\nimport {\n BranchPrepareError,\n runBranchPrepare,\n type BranchPrepareDependencies,\n} from \"./branch-prepare.js\";\nimport {\n convert,\n convertDefaults,\n defaultConvertOptions,\n humanizeAppId,\n type ConvertOptions,\n} from \"./convert.js\";\n\nexport class CliSyntaxError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CliSyntaxError\";\n }\n}\n\nexport type PrepareCommandOptions = {\n root: string;\n};\n\nexport type BranchPrepareCommandOptions = {\n root: string;\n hostname?: string;\n defaultHostname?: string;\n prototypeRoot?: string;\n remote?: string;\n primaryBranch?: string;\n};\n\nexport type ContextCommandOptions =\n | {\n context: \"sync\";\n root: string;\n check: boolean;\n }\n | {\n context: \"install\";\n root: string;\n appId: string;\n check: boolean;\n };\n\nexport type ConvertCommandOptions = ConvertOptions & { command: \"convert\" };\n\ntype CliCommandOptions =\n | PrepareCommandOptions\n | BranchPrepareCommandOptions\n | ContextCommandOptions\n | ConvertCommandOptions;\n\nexport type CliDependencies = BranchPrepareDependencies & {\n contextInstall?: (\n options: ContextInstallOptions,\n ) => Promise<ContextInstallResult>;\n contextInstallCheck?: (\n options: ContextInstallOptions,\n ) => Promise<ContextInstallCheckResult>;\n};\n\nfunction parseRootOption(\n argv: readonly string[],\n start: number,\n): { root: string; nextIndex: number } {\n const value = argv[start + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(\"The --root option requires a value\");\n }\n return { root: value, nextIndex: start + 2 };\n}\n\nfunction parsePrepareArgs(argv: readonly string[]): PrepareCommandOptions {\n let root = process.cwd();\n let rootProvided = false;\n for (let index = 1; index < argv.length;) {\n if (argv[index] !== \"--root\") {\n throw new CliSyntaxError(`Unknown option: ${argv[index]}`);\n }\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n }\n return { root };\n}\n\nfunction parseContextArgs(argv: readonly string[]): ContextCommandOptions {\n const context = argv[1];\n if (context !== \"sync\" && context !== \"install\") {\n throw new CliSyntaxError(\n \"Usage: bonfire context sync [--check] [--root <root>] | bonfire context install [--check] --app-id <app-id> [--root <root>]\",\n );\n }\n\n let root = process.cwd();\n let appId: string | undefined;\n let check = false;\n let rootProvided = false;\n let appIdProvided = false;\n let checkProvided = false;\n\n for (let index = 2; index < argv.length;) {\n const option = argv[index];\n if (option === \"--check\") {\n if (checkProvided) {\n throw new CliSyntaxError(\n \"The --check option may only be provided once\",\n );\n }\n check = true;\n checkProvided = true;\n index += 1;\n continue;\n }\n if (option === \"--root\") {\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n continue;\n }\n if (option === \"--app-id\") {\n if (appIdProvided) {\n throw new CliSyntaxError(\n \"The --app-id option may only be provided once\",\n );\n }\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(\"The --app-id option requires a value\");\n }\n appId = value;\n appIdProvided = true;\n index += 2;\n continue;\n }\n throw new CliSyntaxError(`Unknown option: ${option}`);\n }\n\n if (context === \"install\") {\n if (appId === undefined) {\n throw new CliSyntaxError(\n \"Usage: bonfire context install [--check] --app-id <app-id> [--root <root>]\",\n );\n }\n return { context, root, appId, check };\n }\n if (appId !== undefined) {\n throw new CliSyntaxError(\"The --app-id option is only valid for install\");\n }\n return { context, root, check };\n}\n\nfunction parseConvertArgs(argv: readonly string[]): ConvertCommandOptions {\n const defaults = defaultConvertOptions();\n let root: string | undefined;\n let appId: string | undefined;\n let name: string | undefined;\n let packageName = defaults.packageName;\n let hostname = convertDefaults.hostname;\n let port = convertDefaults.port;\n let deploymentEndpoint = convertDefaults.deploymentEndpoint;\n let withoutData = false;\n let dryRun = false;\n let skipInstall = false;\n const seen = new Set<string>();\n\n for (let index = 1; index < argv.length;) {\n const option = argv[index];\n if (!option) throw new CliSyntaxError(\"Missing convert option\");\n if (\n option === \"--without-data\" ||\n option === \"--dry-run\" ||\n option === \"--skip-install\"\n ) {\n if (seen.has(option))\n throw new CliSyntaxError(`${option} may only be provided once`);\n seen.add(option);\n if (option === \"--without-data\") withoutData = true;\n if (option === \"--dry-run\") dryRun = true;\n if (option === \"--skip-install\") skipInstall = true;\n index += 1;\n continue;\n }\n const setters: Record<string, (value: string) => void> = {\n \"--root\": (value) => {\n root = value;\n },\n \"--app-id\": (value) => {\n appId = value;\n },\n \"--name\": (value) => {\n name = value;\n },\n \"--package-name\": (value) => {\n packageName = value;\n },\n \"--hostname\": (value) => {\n hostname = value;\n },\n \"--deployment-endpoint\": (value) => {\n deploymentEndpoint = value;\n },\n \"--port\": (value) => {\n if (\n !/^\\d+$/u.test(value) ||\n Number(value) < 1 ||\n Number(value) > 65535\n ) {\n throw new CliSyntaxError(\n \"--port must be a number between 1 and 65535\",\n );\n }\n port = Number(value);\n },\n };\n const setter = setters[option];\n if (!setter) throw new CliSyntaxError(`Unknown option: ${option}`);\n if (seen.has(option))\n throw new CliSyntaxError(`${option} may only be provided once`);\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\"))\n throw new CliSyntaxError(`${option} requires a value`);\n seen.add(option);\n setter(value);\n index += 2;\n }\n if (!root || !appId) {\n throw new CliSyntaxError(\n \"Usage: bonfire convert --root <next-app> --app-id <app-id> [--name <display-name>] [--hostname <hostname>] [--port <port>] [--without-data] [--dry-run] [--skip-install]\",\n );\n }\n return {\n command: \"convert\",\n root,\n appId,\n name: name ?? humanizeAppId(appId),\n packageName,\n hostname,\n port,\n deploymentEndpoint,\n withItemData: !withoutData,\n dryRun,\n skipInstall,\n };\n}\n\nfunction parseBranchPrepareArgs(\n argv: readonly string[],\n): BranchPrepareCommandOptions {\n let root = process.cwd();\n let hostname: string | undefined;\n let defaultHostname: string | undefined;\n let prototypeRoot: string | undefined;\n let remote: string | undefined;\n let primaryBranch: string | undefined;\n let rootProvided = false;\n let hostnameProvided = false;\n let defaultHostnameProvided = false;\n let prototypeRootProvided = false;\n let remoteProvided = false;\n let primaryBranchProvided = false;\n\n for (let index = 2; index < argv.length;) {\n const option = argv[index];\n if (option === \"--root\") {\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n continue;\n }\n if (\n option === \"--prototype-root\" ||\n option === \"--remote\" ||\n option === \"--primary\"\n ) {\n const provided =\n option === \"--prototype-root\"\n ? prototypeRootProvided\n : option === \"--remote\"\n ? remoteProvided\n : primaryBranchProvided;\n if (provided) {\n throw new CliSyntaxError(`${option} may only be provided once`);\n }\n if (option === \"--prototype-root\") prototypeRootProvided = true;\n if (option === \"--remote\") remoteProvided = true;\n if (option === \"--primary\") primaryBranchProvided = true;\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(`${option} requires a value`);\n }\n if (option === \"--prototype-root\") prototypeRoot = value;\n if (option === \"--remote\") remote = value;\n if (option === \"--primary\") primaryBranch = value;\n index += 2;\n continue;\n }\n if (option === \"--hostname\" || option === \"--default-hostname\") {\n const isDefault = option === \"--default-hostname\";\n const provided = isDefault ? defaultHostnameProvided : hostnameProvided;\n if (provided) {\n throw new CliSyntaxError(\n `The ${option} option may only be provided once`,\n );\n }\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(`The ${option} option requires a value`);\n }\n if (isDefault) {\n defaultHostname = value;\n defaultHostnameProvided = true;\n } else {\n hostname = value;\n hostnameProvided = true;\n }\n index += 2;\n continue;\n }\n throw new CliSyntaxError(`Unknown option: ${option}`);\n }\n\n return {\n root,\n ...(hostname === undefined ? {} : { hostname }),\n ...(defaultHostname === undefined ? {} : { defaultHostname }),\n ...(prototypeRoot === undefined ? {} : { prototypeRoot }),\n ...(remote === undefined ? {} : { remote }),\n ...(primaryBranch === undefined ? {} : { primaryBranch }),\n };\n}\n\nexport function parseArgs(argv: readonly string[]): CliCommandOptions {\n if (argv[0] === \"convert\") return parseConvertArgs(argv);\n if (argv[0] === \"context\") return parseContextArgs(argv);\n if (argv[0] === \"prepare\") return parsePrepareArgs(argv);\n if (argv[0] === \"branch\" && argv[1] === \"prepare\") {\n return parseBranchPrepareArgs(argv);\n }\n throw new CliSyntaxError(\n \"Usage: bonfire convert --root <next-app> --app-id <app-id> [options] | bonfire context sync [--check] [--root <root>] | bonfire context install [--check] --app-id <app-id> [--root <root>] | bonfire prepare [--root <application-root>] | bonfire branch prepare --root <application-root> [--hostname <hostname>] [--default-hostname <hostname>] [--prototype-root <root>] [--remote <name>] [--primary <branch>]\",\n );\n}\n\nfunction printContextIssues(result: {\n issues: readonly { kind: string; path: string }[];\n}) {\n for (const issue of result.issues) {\n console.error(`- ${issue.kind}: ${issue.path}`);\n }\n}\n\nfunction printContextSyncSummary(result: ContextSyncResult) {\n if (result.written.length > 0) {\n console.log(`Written: ${result.written.join(\", \")}`);\n }\n if (result.removed.length > 0) {\n console.log(`Removed: ${result.removed.join(\", \")}`);\n }\n}\n\nasync function runContextCommand(\n options: ContextCommandOptions,\n dependencies: CliDependencies,\n): Promise<number> {\n if (options.context === \"install\") {\n if (options.check) {\n const result = await (\n dependencies.contextInstallCheck ?? checkContextInstallation\n )({\n repositoryRoot: options.root,\n appId: options.appId,\n });\n if (!result.ok) {\n console.error(\"Context install check failed:\");\n printContextIssues(result);\n return 1;\n }\n console.log(\"Context install check passed.\");\n return 0;\n }\n const result = await (dependencies.contextInstall ?? installContext)({\n repositoryRoot: options.root,\n appId: options.appId,\n });\n const skills = result.skills.map(\n (skill) => `${skill.name} (${skill.status})`,\n );\n const mcp = result.mcp.map((server) => `${server.name} (${server.status})`);\n console.log(\n skills.length > 0\n ? `Context skills: ${skills.join(\", \")}`\n : \"No context skills configured.\",\n );\n if (mcp.length > 0) console.log(`Context MCP: ${mcp.join(\", \")}`);\n console.log(\"Context install complete.\");\n return 0;\n }\n\n if (options.check) {\n const result = await checkContext({ repositoryRoot: options.root });\n if (!result.ok) {\n console.error(\"Context sync check failed:\");\n printContextIssues(result);\n return 1;\n }\n console.log(\"Context sync check passed.\");\n return 0;\n }\n\n const result = await syncContext({ repositoryRoot: options.root });\n if (!result.ok) {\n console.error(\"Context sync failed:\");\n printContextIssues(result);\n return 1;\n }\n printContextSyncSummary(result);\n console.log(\"Context sync complete.\");\n return 0;\n}\n\nexport async function run(\n argv: readonly string[] = process.argv.slice(2),\n dependencies: CliDependencies = {},\n): Promise<number> {\n const isBranchPrepare = argv[0] === \"branch\";\n const isContext = argv[0] === \"context\";\n const isConvert = argv[0] === \"convert\";\n try {\n const options = parseArgs(argv);\n if (\"context\" in options) {\n return await runContextCommand(options, dependencies);\n }\n if (isConvert && \"command\" in options) {\n await convert(options);\n return 0;\n }\n if (isBranchPrepare) {\n return await runBranchPrepare(\n options as BranchPrepareCommandOptions,\n dependencies,\n );\n }\n\n const result = await prepare(options as PrepareCommandOptions);\n const descriptions = {\n environment: \"the process environment\",\n existing: \".env.local\",\n generated: \"a newly generated value in .env.local\",\n } as const;\n console.log(\n `Bonfire preparation complete; BF_SESSION_SECRET came from ${descriptions[result.source]}.`,\n );\n return 0;\n } catch (error) {\n if (error instanceof CliSyntaxError) {\n console.error(`bonfire: ${error.message}`);\n return 2;\n }\n if (isContext) {\n const message =\n error instanceof Error ? error.message : \"an unknown error occurred\";\n console.error(`bonfire context failed: ${message}`);\n return 1;\n }\n if (isBranchPrepare) {\n const message =\n error instanceof BranchPrepareError\n ? error.message\n : \"Unable to load branch preparation configuration.\";\n console.error(`bonfire branch prepare failed: ${message}`);\n return 1;\n }\n if (isConvert) {\n const message =\n error instanceof Error ? error.message : \"an unknown error occurred\";\n console.error(`bonfire convert failed: ${message}`);\n return 1;\n }\n\n const message =\n error instanceof PrepareError || error instanceof Error\n ? error.message\n : \"an unknown error occurred\";\n console.error(`bonfire prepare failed: ${message}`);\n return 1;\n }\n}\n"]}
|
package/dist/command.js
CHANGED
|
@@ -182,8 +182,16 @@ function parseConvertArgs(argv) {
|
|
|
182
182
|
function parseBranchPrepareArgs(argv) {
|
|
183
183
|
let root = process.cwd();
|
|
184
184
|
let hostname;
|
|
185
|
+
let defaultHostname;
|
|
186
|
+
let prototypeRoot;
|
|
187
|
+
let remote;
|
|
188
|
+
let primaryBranch;
|
|
185
189
|
let rootProvided = false;
|
|
186
190
|
let hostnameProvided = false;
|
|
191
|
+
let defaultHostnameProvided = false;
|
|
192
|
+
let prototypeRootProvided = false;
|
|
193
|
+
let remoteProvided = false;
|
|
194
|
+
let primaryBranchProvided = false;
|
|
187
195
|
for (let index = 2; index < argv.length;) {
|
|
188
196
|
const option = argv[index];
|
|
189
197
|
if (option === "--root") {
|
|
@@ -196,25 +204,67 @@ function parseBranchPrepareArgs(argv) {
|
|
|
196
204
|
index = parsed.nextIndex;
|
|
197
205
|
continue;
|
|
198
206
|
}
|
|
199
|
-
if (option === "--
|
|
200
|
-
|
|
201
|
-
|
|
207
|
+
if (option === "--prototype-root" ||
|
|
208
|
+
option === "--remote" ||
|
|
209
|
+
option === "--primary") {
|
|
210
|
+
const provided = option === "--prototype-root"
|
|
211
|
+
? prototypeRootProvided
|
|
212
|
+
: option === "--remote"
|
|
213
|
+
? remoteProvided
|
|
214
|
+
: primaryBranchProvided;
|
|
215
|
+
if (provided) {
|
|
216
|
+
throw new CliSyntaxError(`${option} may only be provided once`);
|
|
217
|
+
}
|
|
218
|
+
if (option === "--prototype-root")
|
|
219
|
+
prototypeRootProvided = true;
|
|
220
|
+
if (option === "--remote")
|
|
221
|
+
remoteProvided = true;
|
|
222
|
+
if (option === "--primary")
|
|
223
|
+
primaryBranchProvided = true;
|
|
224
|
+
const value = argv[index + 1];
|
|
225
|
+
if (!value || value.startsWith("--")) {
|
|
226
|
+
throw new CliSyntaxError(`${option} requires a value`);
|
|
227
|
+
}
|
|
228
|
+
if (option === "--prototype-root")
|
|
229
|
+
prototypeRoot = value;
|
|
230
|
+
if (option === "--remote")
|
|
231
|
+
remote = value;
|
|
232
|
+
if (option === "--primary")
|
|
233
|
+
primaryBranch = value;
|
|
234
|
+
index += 2;
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (option === "--hostname" || option === "--default-hostname") {
|
|
238
|
+
const isDefault = option === "--default-hostname";
|
|
239
|
+
const provided = isDefault ? defaultHostnameProvided : hostnameProvided;
|
|
240
|
+
if (provided) {
|
|
241
|
+
throw new CliSyntaxError(`The ${option} option may only be provided once`);
|
|
202
242
|
}
|
|
203
243
|
const value = argv[index + 1];
|
|
204
244
|
if (!value || value.startsWith("--")) {
|
|
205
|
-
throw new CliSyntaxError(
|
|
245
|
+
throw new CliSyntaxError(`The ${option} option requires a value`);
|
|
246
|
+
}
|
|
247
|
+
if (isDefault) {
|
|
248
|
+
defaultHostname = value;
|
|
249
|
+
defaultHostnameProvided = true;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
hostname = value;
|
|
253
|
+
hostnameProvided = true;
|
|
206
254
|
}
|
|
207
|
-
hostname = value;
|
|
208
|
-
hostnameProvided = true;
|
|
209
255
|
index += 2;
|
|
210
256
|
continue;
|
|
211
257
|
}
|
|
212
258
|
throw new CliSyntaxError(`Unknown option: ${option}`);
|
|
213
259
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
260
|
+
return {
|
|
261
|
+
root,
|
|
262
|
+
...(hostname === undefined ? {} : { hostname }),
|
|
263
|
+
...(defaultHostname === undefined ? {} : { defaultHostname }),
|
|
264
|
+
...(prototypeRoot === undefined ? {} : { prototypeRoot }),
|
|
265
|
+
...(remote === undefined ? {} : { remote }),
|
|
266
|
+
...(primaryBranch === undefined ? {} : { primaryBranch }),
|
|
267
|
+
};
|
|
218
268
|
}
|
|
219
269
|
export function parseArgs(argv) {
|
|
220
270
|
if (argv[0] === "convert")
|
|
@@ -226,7 +276,7 @@ export function parseArgs(argv) {
|
|
|
226
276
|
if (argv[0] === "branch" && argv[1] === "prepare") {
|
|
227
277
|
return parseBranchPrepareArgs(argv);
|
|
228
278
|
}
|
|
229
|
-
throw new CliSyntaxError("Usage: bonfire convert --root <next-app> --app-id <app-id> [options] | bonfire context sync [--check] [--root <root>] | bonfire context install [--check] --app-id <app-id> [--root <root>] | bonfire prepare [--root <application-root>] | bonfire branch prepare --root <application-root> --hostname <hostname>");
|
|
279
|
+
throw new CliSyntaxError("Usage: bonfire convert --root <next-app> --app-id <app-id> [options] | bonfire context sync [--check] [--root <root>] | bonfire context install [--check] --app-id <app-id> [--root <root>] | bonfire prepare [--root <application-root>] | bonfire branch prepare --root <application-root> [--hostname <hostname>] [--default-hostname <hostname>] [--prototype-root <root>] [--remote <name>] [--primary <branch>]");
|
|
230
280
|
}
|
|
231
281
|
function printContextIssues(result) {
|
|
232
282
|
for (const issue of result.issues) {
|
|
@@ -303,7 +353,7 @@ export async function run(argv = process.argv.slice(2), dependencies = {}) {
|
|
|
303
353
|
await convert(options);
|
|
304
354
|
return 0;
|
|
305
355
|
}
|
|
306
|
-
if (
|
|
356
|
+
if (isBranchPrepare) {
|
|
307
357
|
return await runBranchPrepare(options, dependencies);
|
|
308
358
|
}
|
|
309
359
|
const result = await prepare(options);
|
package/dist/command.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n checkContext,\n checkContextInstallation,\n installContext,\n syncContext,\n type ContextInstallCheckResult,\n type ContextInstallResult,\n type ContextInstallOptions,\n type ContextSyncResult,\n} from \"@ebay-dt/bonfire-context\";\nimport { prepare, PrepareError } from \"./prepare.js\";\nimport {\n BranchPrepareError,\n runBranchPrepare,\n type BranchPrepareDependencies,\n} from \"./branch-prepare.js\";\nimport {\n convert,\n convertDefaults,\n defaultConvertOptions,\n humanizeAppId,\n type ConvertOptions,\n} from \"./convert.js\";\n\nexport class CliSyntaxError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CliSyntaxError\";\n }\n}\n\nexport type PrepareCommandOptions = {\n root: string;\n};\n\nexport type BranchPrepareCommandOptions = {\n root: string;\n hostname: string;\n};\n\nexport type ContextCommandOptions =\n | {\n context: \"sync\";\n root: string;\n check: boolean;\n }\n | {\n context: \"install\";\n root: string;\n appId: string;\n check: boolean;\n };\n\nexport type ConvertCommandOptions = ConvertOptions & { command: \"convert\" };\n\ntype CliCommandOptions =\n | PrepareCommandOptions\n | BranchPrepareCommandOptions\n | ContextCommandOptions\n | ConvertCommandOptions;\n\nexport type CliDependencies = BranchPrepareDependencies & {\n contextInstall?: (\n options: ContextInstallOptions,\n ) => Promise<ContextInstallResult>;\n contextInstallCheck?: (\n options: ContextInstallOptions,\n ) => Promise<ContextInstallCheckResult>;\n};\n\nfunction parseRootOption(\n argv: readonly string[],\n start: number,\n): { root: string; nextIndex: number } {\n const value = argv[start + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(\"The --root option requires a value\");\n }\n return { root: value, nextIndex: start + 2 };\n}\n\nfunction parsePrepareArgs(argv: readonly string[]): PrepareCommandOptions {\n let root = process.cwd();\n let rootProvided = false;\n for (let index = 1; index < argv.length;) {\n if (argv[index] !== \"--root\") {\n throw new CliSyntaxError(`Unknown option: ${argv[index]}`);\n }\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n }\n return { root };\n}\n\nfunction parseContextArgs(argv: readonly string[]): ContextCommandOptions {\n const context = argv[1];\n if (context !== \"sync\" && context !== \"install\") {\n throw new CliSyntaxError(\n \"Usage: bonfire context sync [--check] [--root <root>] | bonfire context install [--check] --app-id <app-id> [--root <root>]\",\n );\n }\n\n let root = process.cwd();\n let appId: string | undefined;\n let check = false;\n let rootProvided = false;\n let appIdProvided = false;\n let checkProvided = false;\n\n for (let index = 2; index < argv.length;) {\n const option = argv[index];\n if (option === \"--check\") {\n if (checkProvided) {\n throw new CliSyntaxError(\n \"The --check option may only be provided once\",\n );\n }\n check = true;\n checkProvided = true;\n index += 1;\n continue;\n }\n if (option === \"--root\") {\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n continue;\n }\n if (option === \"--app-id\") {\n if (appIdProvided) {\n throw new CliSyntaxError(\n \"The --app-id option may only be provided once\",\n );\n }\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(\"The --app-id option requires a value\");\n }\n appId = value;\n appIdProvided = true;\n index += 2;\n continue;\n }\n throw new CliSyntaxError(`Unknown option: ${option}`);\n }\n\n if (context === \"install\") {\n if (appId === undefined) {\n throw new CliSyntaxError(\n \"Usage: bonfire context install [--check] --app-id <app-id> [--root <root>]\",\n );\n }\n return { context, root, appId, check };\n }\n if (appId !== undefined) {\n throw new CliSyntaxError(\"The --app-id option is only valid for install\");\n }\n return { context, root, check };\n}\n\nfunction parseConvertArgs(argv: readonly string[]): ConvertCommandOptions {\n const defaults = defaultConvertOptions();\n let root: string | undefined;\n let appId: string | undefined;\n let name: string | undefined;\n let packageName = defaults.packageName;\n let hostname = convertDefaults.hostname;\n let port = convertDefaults.port;\n let deploymentEndpoint = convertDefaults.deploymentEndpoint;\n let withoutData = false;\n let dryRun = false;\n let skipInstall = false;\n const seen = new Set<string>();\n\n for (let index = 1; index < argv.length;) {\n const option = argv[index];\n if (!option) throw new CliSyntaxError(\"Missing convert option\");\n if (\n option === \"--without-data\" ||\n option === \"--dry-run\" ||\n option === \"--skip-install\"\n ) {\n if (seen.has(option))\n throw new CliSyntaxError(`${option} may only be provided once`);\n seen.add(option);\n if (option === \"--without-data\") withoutData = true;\n if (option === \"--dry-run\") dryRun = true;\n if (option === \"--skip-install\") skipInstall = true;\n index += 1;\n continue;\n }\n const setters: Record<string, (value: string) => void> = {\n \"--root\": (value) => {\n root = value;\n },\n \"--app-id\": (value) => {\n appId = value;\n },\n \"--name\": (value) => {\n name = value;\n },\n \"--package-name\": (value) => {\n packageName = value;\n },\n \"--hostname\": (value) => {\n hostname = value;\n },\n \"--deployment-endpoint\": (value) => {\n deploymentEndpoint = value;\n },\n \"--port\": (value) => {\n if (\n !/^\\d+$/u.test(value) ||\n Number(value) < 1 ||\n Number(value) > 65535\n ) {\n throw new CliSyntaxError(\n \"--port must be a number between 1 and 65535\",\n );\n }\n port = Number(value);\n },\n };\n const setter = setters[option];\n if (!setter) throw new CliSyntaxError(`Unknown option: ${option}`);\n if (seen.has(option))\n throw new CliSyntaxError(`${option} may only be provided once`);\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\"))\n throw new CliSyntaxError(`${option} requires a value`);\n seen.add(option);\n setter(value);\n index += 2;\n }\n if (!root || !appId) {\n throw new CliSyntaxError(\n \"Usage: bonfire convert --root <next-app> --app-id <app-id> [--name <display-name>] [--hostname <hostname>] [--port <port>] [--without-data] [--dry-run] [--skip-install]\",\n );\n }\n return {\n command: \"convert\",\n root,\n appId,\n name: name ?? humanizeAppId(appId),\n packageName,\n hostname,\n port,\n deploymentEndpoint,\n withItemData: !withoutData,\n dryRun,\n skipInstall,\n };\n}\n\nfunction parseBranchPrepareArgs(\n argv: readonly string[],\n): BranchPrepareCommandOptions {\n let root = process.cwd();\n let hostname: string | undefined;\n let rootProvided = false;\n let hostnameProvided = false;\n\n for (let index = 2; index < argv.length;) {\n const option = argv[index];\n if (option === \"--root\") {\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n continue;\n }\n if (option === \"--hostname\") {\n if (hostnameProvided) {\n throw new CliSyntaxError(\n \"The --hostname option may only be provided once\",\n );\n }\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(\"The --hostname option requires a value\");\n }\n hostname = value;\n hostnameProvided = true;\n index += 2;\n continue;\n }\n throw new CliSyntaxError(`Unknown option: ${option}`);\n }\n\n if (hostname === undefined) {\n throw new CliSyntaxError(\n \"Usage: bonfire branch prepare --root <application-root> --hostname <hostname>\",\n );\n }\n return { root, hostname };\n}\n\nexport function parseArgs(argv: readonly string[]): CliCommandOptions {\n if (argv[0] === \"convert\") return parseConvertArgs(argv);\n if (argv[0] === \"context\") return parseContextArgs(argv);\n if (argv[0] === \"prepare\") return parsePrepareArgs(argv);\n if (argv[0] === \"branch\" && argv[1] === \"prepare\") {\n return parseBranchPrepareArgs(argv);\n }\n throw new CliSyntaxError(\n \"Usage: bonfire convert --root <next-app> --app-id <app-id> [options] | bonfire context sync [--check] [--root <root>] | bonfire context install [--check] --app-id <app-id> [--root <root>] | bonfire prepare [--root <application-root>] | bonfire branch prepare --root <application-root> --hostname <hostname>\",\n );\n}\n\nfunction printContextIssues(result: {\n issues: readonly { kind: string; path: string }[];\n}) {\n for (const issue of result.issues) {\n console.error(`- ${issue.kind}: ${issue.path}`);\n }\n}\n\nfunction printContextSyncSummary(result: ContextSyncResult) {\n if (result.written.length > 0) {\n console.log(`Written: ${result.written.join(\", \")}`);\n }\n if (result.removed.length > 0) {\n console.log(`Removed: ${result.removed.join(\", \")}`);\n }\n}\n\nasync function runContextCommand(\n options: ContextCommandOptions,\n dependencies: CliDependencies,\n): Promise<number> {\n if (options.context === \"install\") {\n if (options.check) {\n const result = await (\n dependencies.contextInstallCheck ?? checkContextInstallation\n )({\n repositoryRoot: options.root,\n appId: options.appId,\n });\n if (!result.ok) {\n console.error(\"Context install check failed:\");\n printContextIssues(result);\n return 1;\n }\n console.log(\"Context install check passed.\");\n return 0;\n }\n const result = await (dependencies.contextInstall ?? installContext)({\n repositoryRoot: options.root,\n appId: options.appId,\n });\n const skills = result.skills.map(\n (skill) => `${skill.name} (${skill.status})`,\n );\n const mcp = result.mcp.map((server) => `${server.name} (${server.status})`);\n console.log(\n skills.length > 0\n ? `Context skills: ${skills.join(\", \")}`\n : \"No context skills configured.\",\n );\n if (mcp.length > 0) console.log(`Context MCP: ${mcp.join(\", \")}`);\n console.log(\"Context install complete.\");\n return 0;\n }\n\n if (options.check) {\n const result = await checkContext({ repositoryRoot: options.root });\n if (!result.ok) {\n console.error(\"Context sync check failed:\");\n printContextIssues(result);\n return 1;\n }\n console.log(\"Context sync check passed.\");\n return 0;\n }\n\n const result = await syncContext({ repositoryRoot: options.root });\n if (!result.ok) {\n console.error(\"Context sync failed:\");\n printContextIssues(result);\n return 1;\n }\n printContextSyncSummary(result);\n console.log(\"Context sync complete.\");\n return 0;\n}\n\nexport async function run(\n argv: readonly string[] = process.argv.slice(2),\n dependencies: CliDependencies = {},\n): Promise<number> {\n const isBranchPrepare = argv[0] === \"branch\";\n const isContext = argv[0] === \"context\";\n const isConvert = argv[0] === \"convert\";\n try {\n const options = parseArgs(argv);\n if (\"context\" in options) {\n return await runContextCommand(options, dependencies);\n }\n if (isConvert && \"command\" in options) {\n await convert(options);\n return 0;\n }\n if (\"hostname\" in options) {\n return await runBranchPrepare(options, dependencies);\n }\n\n const result = await prepare(options);\n const descriptions = {\n environment: \"the process environment\",\n existing: \".env.local\",\n generated: \"a newly generated value in .env.local\",\n } as const;\n console.log(\n `Bonfire preparation complete; BF_SESSION_SECRET came from ${descriptions[result.source]}.`,\n );\n return 0;\n } catch (error) {\n if (error instanceof CliSyntaxError) {\n console.error(`bonfire: ${error.message}`);\n return 2;\n }\n if (isContext) {\n const message =\n error instanceof Error ? error.message : \"an unknown error occurred\";\n console.error(`bonfire context failed: ${message}`);\n return 1;\n }\n if (isBranchPrepare) {\n const message =\n error instanceof BranchPrepareError\n ? error.message\n : \"Unable to load branch preparation configuration.\";\n console.error(`bonfire branch prepare failed: ${message}`);\n return 1;\n }\n if (isConvert) {\n const message =\n error instanceof Error ? error.message : \"an unknown error occurred\";\n console.error(`bonfire convert failed: ${message}`);\n return 1;\n }\n\n const message =\n error instanceof PrepareError || error instanceof Error\n ? error.message\n : \"an unknown error occurred\";\n console.error(`bonfire prepare failed: ${message}`);\n return 1;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n checkContext,\n checkContextInstallation,\n installContext,\n syncContext,\n type ContextInstallCheckResult,\n type ContextInstallResult,\n type ContextInstallOptions,\n type ContextSyncResult,\n} from \"@ebay-dt/bonfire-context\";\nimport { prepare, PrepareError } from \"./prepare.js\";\nimport {\n BranchPrepareError,\n runBranchPrepare,\n type BranchPrepareDependencies,\n} from \"./branch-prepare.js\";\nimport {\n convert,\n convertDefaults,\n defaultConvertOptions,\n humanizeAppId,\n type ConvertOptions,\n} from \"./convert.js\";\n\nexport class CliSyntaxError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CliSyntaxError\";\n }\n}\n\nexport type PrepareCommandOptions = {\n root: string;\n};\n\nexport type BranchPrepareCommandOptions = {\n root: string;\n hostname?: string;\n defaultHostname?: string;\n prototypeRoot?: string;\n remote?: string;\n primaryBranch?: string;\n};\n\nexport type ContextCommandOptions =\n | {\n context: \"sync\";\n root: string;\n check: boolean;\n }\n | {\n context: \"install\";\n root: string;\n appId: string;\n check: boolean;\n };\n\nexport type ConvertCommandOptions = ConvertOptions & { command: \"convert\" };\n\ntype CliCommandOptions =\n | PrepareCommandOptions\n | BranchPrepareCommandOptions\n | ContextCommandOptions\n | ConvertCommandOptions;\n\nexport type CliDependencies = BranchPrepareDependencies & {\n contextInstall?: (\n options: ContextInstallOptions,\n ) => Promise<ContextInstallResult>;\n contextInstallCheck?: (\n options: ContextInstallOptions,\n ) => Promise<ContextInstallCheckResult>;\n};\n\nfunction parseRootOption(\n argv: readonly string[],\n start: number,\n): { root: string; nextIndex: number } {\n const value = argv[start + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(\"The --root option requires a value\");\n }\n return { root: value, nextIndex: start + 2 };\n}\n\nfunction parsePrepareArgs(argv: readonly string[]): PrepareCommandOptions {\n let root = process.cwd();\n let rootProvided = false;\n for (let index = 1; index < argv.length;) {\n if (argv[index] !== \"--root\") {\n throw new CliSyntaxError(`Unknown option: ${argv[index]}`);\n }\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n }\n return { root };\n}\n\nfunction parseContextArgs(argv: readonly string[]): ContextCommandOptions {\n const context = argv[1];\n if (context !== \"sync\" && context !== \"install\") {\n throw new CliSyntaxError(\n \"Usage: bonfire context sync [--check] [--root <root>] | bonfire context install [--check] --app-id <app-id> [--root <root>]\",\n );\n }\n\n let root = process.cwd();\n let appId: string | undefined;\n let check = false;\n let rootProvided = false;\n let appIdProvided = false;\n let checkProvided = false;\n\n for (let index = 2; index < argv.length;) {\n const option = argv[index];\n if (option === \"--check\") {\n if (checkProvided) {\n throw new CliSyntaxError(\n \"The --check option may only be provided once\",\n );\n }\n check = true;\n checkProvided = true;\n index += 1;\n continue;\n }\n if (option === \"--root\") {\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n continue;\n }\n if (option === \"--app-id\") {\n if (appIdProvided) {\n throw new CliSyntaxError(\n \"The --app-id option may only be provided once\",\n );\n }\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(\"The --app-id option requires a value\");\n }\n appId = value;\n appIdProvided = true;\n index += 2;\n continue;\n }\n throw new CliSyntaxError(`Unknown option: ${option}`);\n }\n\n if (context === \"install\") {\n if (appId === undefined) {\n throw new CliSyntaxError(\n \"Usage: bonfire context install [--check] --app-id <app-id> [--root <root>]\",\n );\n }\n return { context, root, appId, check };\n }\n if (appId !== undefined) {\n throw new CliSyntaxError(\"The --app-id option is only valid for install\");\n }\n return { context, root, check };\n}\n\nfunction parseConvertArgs(argv: readonly string[]): ConvertCommandOptions {\n const defaults = defaultConvertOptions();\n let root: string | undefined;\n let appId: string | undefined;\n let name: string | undefined;\n let packageName = defaults.packageName;\n let hostname = convertDefaults.hostname;\n let port = convertDefaults.port;\n let deploymentEndpoint = convertDefaults.deploymentEndpoint;\n let withoutData = false;\n let dryRun = false;\n let skipInstall = false;\n const seen = new Set<string>();\n\n for (let index = 1; index < argv.length;) {\n const option = argv[index];\n if (!option) throw new CliSyntaxError(\"Missing convert option\");\n if (\n option === \"--without-data\" ||\n option === \"--dry-run\" ||\n option === \"--skip-install\"\n ) {\n if (seen.has(option))\n throw new CliSyntaxError(`${option} may only be provided once`);\n seen.add(option);\n if (option === \"--without-data\") withoutData = true;\n if (option === \"--dry-run\") dryRun = true;\n if (option === \"--skip-install\") skipInstall = true;\n index += 1;\n continue;\n }\n const setters: Record<string, (value: string) => void> = {\n \"--root\": (value) => {\n root = value;\n },\n \"--app-id\": (value) => {\n appId = value;\n },\n \"--name\": (value) => {\n name = value;\n },\n \"--package-name\": (value) => {\n packageName = value;\n },\n \"--hostname\": (value) => {\n hostname = value;\n },\n \"--deployment-endpoint\": (value) => {\n deploymentEndpoint = value;\n },\n \"--port\": (value) => {\n if (\n !/^\\d+$/u.test(value) ||\n Number(value) < 1 ||\n Number(value) > 65535\n ) {\n throw new CliSyntaxError(\n \"--port must be a number between 1 and 65535\",\n );\n }\n port = Number(value);\n },\n };\n const setter = setters[option];\n if (!setter) throw new CliSyntaxError(`Unknown option: ${option}`);\n if (seen.has(option))\n throw new CliSyntaxError(`${option} may only be provided once`);\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\"))\n throw new CliSyntaxError(`${option} requires a value`);\n seen.add(option);\n setter(value);\n index += 2;\n }\n if (!root || !appId) {\n throw new CliSyntaxError(\n \"Usage: bonfire convert --root <next-app> --app-id <app-id> [--name <display-name>] [--hostname <hostname>] [--port <port>] [--without-data] [--dry-run] [--skip-install]\",\n );\n }\n return {\n command: \"convert\",\n root,\n appId,\n name: name ?? humanizeAppId(appId),\n packageName,\n hostname,\n port,\n deploymentEndpoint,\n withItemData: !withoutData,\n dryRun,\n skipInstall,\n };\n}\n\nfunction parseBranchPrepareArgs(\n argv: readonly string[],\n): BranchPrepareCommandOptions {\n let root = process.cwd();\n let hostname: string | undefined;\n let defaultHostname: string | undefined;\n let prototypeRoot: string | undefined;\n let remote: string | undefined;\n let primaryBranch: string | undefined;\n let rootProvided = false;\n let hostnameProvided = false;\n let defaultHostnameProvided = false;\n let prototypeRootProvided = false;\n let remoteProvided = false;\n let primaryBranchProvided = false;\n\n for (let index = 2; index < argv.length;) {\n const option = argv[index];\n if (option === \"--root\") {\n if (rootProvided) {\n throw new CliSyntaxError(\"The --root option may only be provided once\");\n }\n const parsed = parseRootOption(argv, index);\n root = parsed.root;\n rootProvided = true;\n index = parsed.nextIndex;\n continue;\n }\n if (\n option === \"--prototype-root\" ||\n option === \"--remote\" ||\n option === \"--primary\"\n ) {\n const provided =\n option === \"--prototype-root\"\n ? prototypeRootProvided\n : option === \"--remote\"\n ? remoteProvided\n : primaryBranchProvided;\n if (provided) {\n throw new CliSyntaxError(`${option} may only be provided once`);\n }\n if (option === \"--prototype-root\") prototypeRootProvided = true;\n if (option === \"--remote\") remoteProvided = true;\n if (option === \"--primary\") primaryBranchProvided = true;\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(`${option} requires a value`);\n }\n if (option === \"--prototype-root\") prototypeRoot = value;\n if (option === \"--remote\") remote = value;\n if (option === \"--primary\") primaryBranch = value;\n index += 2;\n continue;\n }\n if (option === \"--hostname\" || option === \"--default-hostname\") {\n const isDefault = option === \"--default-hostname\";\n const provided = isDefault ? defaultHostnameProvided : hostnameProvided;\n if (provided) {\n throw new CliSyntaxError(\n `The ${option} option may only be provided once`,\n );\n }\n const value = argv[index + 1];\n if (!value || value.startsWith(\"--\")) {\n throw new CliSyntaxError(`The ${option} option requires a value`);\n }\n if (isDefault) {\n defaultHostname = value;\n defaultHostnameProvided = true;\n } else {\n hostname = value;\n hostnameProvided = true;\n }\n index += 2;\n continue;\n }\n throw new CliSyntaxError(`Unknown option: ${option}`);\n }\n\n return {\n root,\n ...(hostname === undefined ? {} : { hostname }),\n ...(defaultHostname === undefined ? {} : { defaultHostname }),\n ...(prototypeRoot === undefined ? {} : { prototypeRoot }),\n ...(remote === undefined ? {} : { remote }),\n ...(primaryBranch === undefined ? {} : { primaryBranch }),\n };\n}\n\nexport function parseArgs(argv: readonly string[]): CliCommandOptions {\n if (argv[0] === \"convert\") return parseConvertArgs(argv);\n if (argv[0] === \"context\") return parseContextArgs(argv);\n if (argv[0] === \"prepare\") return parsePrepareArgs(argv);\n if (argv[0] === \"branch\" && argv[1] === \"prepare\") {\n return parseBranchPrepareArgs(argv);\n }\n throw new CliSyntaxError(\n \"Usage: bonfire convert --root <next-app> --app-id <app-id> [options] | bonfire context sync [--check] [--root <root>] | bonfire context install [--check] --app-id <app-id> [--root <root>] | bonfire prepare [--root <application-root>] | bonfire branch prepare --root <application-root> [--hostname <hostname>] [--default-hostname <hostname>] [--prototype-root <root>] [--remote <name>] [--primary <branch>]\",\n );\n}\n\nfunction printContextIssues(result: {\n issues: readonly { kind: string; path: string }[];\n}) {\n for (const issue of result.issues) {\n console.error(`- ${issue.kind}: ${issue.path}`);\n }\n}\n\nfunction printContextSyncSummary(result: ContextSyncResult) {\n if (result.written.length > 0) {\n console.log(`Written: ${result.written.join(\", \")}`);\n }\n if (result.removed.length > 0) {\n console.log(`Removed: ${result.removed.join(\", \")}`);\n }\n}\n\nasync function runContextCommand(\n options: ContextCommandOptions,\n dependencies: CliDependencies,\n): Promise<number> {\n if (options.context === \"install\") {\n if (options.check) {\n const result = await (\n dependencies.contextInstallCheck ?? checkContextInstallation\n )({\n repositoryRoot: options.root,\n appId: options.appId,\n });\n if (!result.ok) {\n console.error(\"Context install check failed:\");\n printContextIssues(result);\n return 1;\n }\n console.log(\"Context install check passed.\");\n return 0;\n }\n const result = await (dependencies.contextInstall ?? installContext)({\n repositoryRoot: options.root,\n appId: options.appId,\n });\n const skills = result.skills.map(\n (skill) => `${skill.name} (${skill.status})`,\n );\n const mcp = result.mcp.map((server) => `${server.name} (${server.status})`);\n console.log(\n skills.length > 0\n ? `Context skills: ${skills.join(\", \")}`\n : \"No context skills configured.\",\n );\n if (mcp.length > 0) console.log(`Context MCP: ${mcp.join(\", \")}`);\n console.log(\"Context install complete.\");\n return 0;\n }\n\n if (options.check) {\n const result = await checkContext({ repositoryRoot: options.root });\n if (!result.ok) {\n console.error(\"Context sync check failed:\");\n printContextIssues(result);\n return 1;\n }\n console.log(\"Context sync check passed.\");\n return 0;\n }\n\n const result = await syncContext({ repositoryRoot: options.root });\n if (!result.ok) {\n console.error(\"Context sync failed:\");\n printContextIssues(result);\n return 1;\n }\n printContextSyncSummary(result);\n console.log(\"Context sync complete.\");\n return 0;\n}\n\nexport async function run(\n argv: readonly string[] = process.argv.slice(2),\n dependencies: CliDependencies = {},\n): Promise<number> {\n const isBranchPrepare = argv[0] === \"branch\";\n const isContext = argv[0] === \"context\";\n const isConvert = argv[0] === \"convert\";\n try {\n const options = parseArgs(argv);\n if (\"context\" in options) {\n return await runContextCommand(options, dependencies);\n }\n if (isConvert && \"command\" in options) {\n await convert(options);\n return 0;\n }\n if (isBranchPrepare) {\n return await runBranchPrepare(\n options as BranchPrepareCommandOptions,\n dependencies,\n );\n }\n\n const result = await prepare(options as PrepareCommandOptions);\n const descriptions = {\n environment: \"the process environment\",\n existing: \".env.local\",\n generated: \"a newly generated value in .env.local\",\n } as const;\n console.log(\n `Bonfire preparation complete; BF_SESSION_SECRET came from ${descriptions[result.source]}.`,\n );\n return 0;\n } catch (error) {\n if (error instanceof CliSyntaxError) {\n console.error(`bonfire: ${error.message}`);\n return 2;\n }\n if (isContext) {\n const message =\n error instanceof Error ? error.message : \"an unknown error occurred\";\n console.error(`bonfire context failed: ${message}`);\n return 1;\n }\n if (isBranchPrepare) {\n const message =\n error instanceof BranchPrepareError\n ? error.message\n : \"Unable to load branch preparation configuration.\";\n console.error(`bonfire branch prepare failed: ${message}`);\n return 1;\n }\n if (isConvert) {\n const message =\n error instanceof Error ? error.message : \"an unknown error occurred\";\n console.error(`bonfire convert failed: ${message}`);\n return 1;\n }\n\n const message =\n error instanceof PrepareError || error instanceof Error\n ? error.message\n : \"an unknown error occurred\";\n console.error(`bonfire prepare failed: ${message}`);\n return 1;\n }\n}\n"]}
|