knitto 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +869 -0
  3. package/dist/src/checks/run.d.ts +3 -0
  4. package/dist/src/checks/run.js +173 -0
  5. package/dist/src/checks/run.js.map +1 -0
  6. package/dist/src/cli.d.ts +2 -0
  7. package/dist/src/cli.js +406 -0
  8. package/dist/src/cli.js.map +1 -0
  9. package/dist/src/config.d.ts +11 -0
  10. package/dist/src/config.js +585 -0
  11. package/dist/src/config.js.map +1 -0
  12. package/dist/src/context/build.d.ts +2 -0
  13. package/dist/src/context/build.js +147 -0
  14. package/dist/src/context/build.js.map +1 -0
  15. package/dist/src/context/render.d.ts +7 -0
  16. package/dist/src/context/render.js +74 -0
  17. package/dist/src/context/render.js.map +1 -0
  18. package/dist/src/engine/apply.d.ts +2 -0
  19. package/dist/src/engine/apply.js +96 -0
  20. package/dist/src/engine/apply.js.map +1 -0
  21. package/dist/src/engine/diff.d.ts +2 -0
  22. package/dist/src/engine/diff.js +100 -0
  23. package/dist/src/engine/diff.js.map +1 -0
  24. package/dist/src/engine/plan.d.ts +2 -0
  25. package/dist/src/engine/plan.js +259 -0
  26. package/dist/src/engine/plan.js.map +1 -0
  27. package/dist/src/errors.d.ts +14 -0
  28. package/dist/src/errors.js +31 -0
  29. package/dist/src/errors.js.map +1 -0
  30. package/dist/src/filesystem/paths.d.ts +2 -0
  31. package/dist/src/filesystem/paths.js +47 -0
  32. package/dist/src/filesystem/paths.js.map +1 -0
  33. package/dist/src/hooks/run.d.ts +10 -0
  34. package/dist/src/hooks/run.js +105 -0
  35. package/dist/src/hooks/run.js.map +1 -0
  36. package/dist/src/index.d.ts +7 -0
  37. package/dist/src/index.js +7 -0
  38. package/dist/src/index.js.map +1 -0
  39. package/dist/src/lock.d.ts +2 -0
  40. package/dist/src/lock.js +16 -0
  41. package/dist/src/lock.js.map +1 -0
  42. package/dist/src/onboarding.d.ts +26 -0
  43. package/dist/src/onboarding.js +212 -0
  44. package/dist/src/onboarding.js.map +1 -0
  45. package/dist/src/parsers/index.d.ts +18 -0
  46. package/dist/src/parsers/index.js +194 -0
  47. package/dist/src/parsers/index.js.map +1 -0
  48. package/dist/src/parsers/json.d.ts +17 -0
  49. package/dist/src/parsers/json.js +214 -0
  50. package/dist/src/parsers/json.js.map +1 -0
  51. package/dist/src/parsers/merge.d.ts +1 -0
  52. package/dist/src/parsers/merge.js +17 -0
  53. package/dist/src/parsers/merge.js.map +1 -0
  54. package/dist/src/project/discover.d.ts +2 -0
  55. package/dist/src/project/discover.js +144 -0
  56. package/dist/src/project/discover.js.map +1 -0
  57. package/dist/src/rules/json-pointer.d.ts +3 -0
  58. package/dist/src/rules/json-pointer.js +114 -0
  59. package/dist/src/rules/json-pointer.js.map +1 -0
  60. package/dist/src/snapshots/canonical.d.ts +11 -0
  61. package/dist/src/snapshots/canonical.js +150 -0
  62. package/dist/src/snapshots/canonical.js.map +1 -0
  63. package/dist/src/sources/process.d.ts +3 -0
  64. package/dist/src/sources/process.js +28 -0
  65. package/dist/src/sources/process.js.map +1 -0
  66. package/dist/src/sources/resolve.d.ts +3 -0
  67. package/dist/src/sources/resolve.js +144 -0
  68. package/dist/src/sources/resolve.js.map +1 -0
  69. package/dist/src/template/init.d.ts +1 -0
  70. package/dist/src/template/init.js +62 -0
  71. package/dist/src/template/init.js.map +1 -0
  72. package/dist/src/template/manifest.d.ts +2 -0
  73. package/dist/src/template/manifest.js +80 -0
  74. package/dist/src/template/manifest.js.map +1 -0
  75. package/dist/src/template/release.d.ts +3 -0
  76. package/dist/src/template/release.js +8 -0
  77. package/dist/src/template/release.js.map +1 -0
  78. package/dist/src/template/validate.d.ts +2 -0
  79. package/dist/src/template/validate.js +62 -0
  80. package/dist/src/template/validate.js.map +1 -0
  81. package/dist/src/types.d.ts +242 -0
  82. package/dist/src/types.js +4 -0
  83. package/dist/src/types.js.map +1 -0
  84. package/dist/src/version.d.ts +2 -0
  85. package/dist/src/version.js +3 -0
  86. package/dist/src/version.js.map +1 -0
  87. package/package.json +51 -0
@@ -0,0 +1,3 @@
1
+ import { type TemplatePartial } from "../context/render.js";
2
+ import type { CheckResult, ProjectUnit, RenderContext, TemplateCheck } from "../types.js";
3
+ export declare function runChecks(checks: TemplateCheck[], unit: ProjectUnit, context: RenderContext, partials: TemplatePartial[]): Promise<CheckResult[]>;
@@ -0,0 +1,173 @@
1
+ import path from "node:path";
2
+ import { readFile } from "node:fs/promises";
3
+ import { intersects, subset, validRange } from "semver";
4
+ import { KnittoError } from "../errors.js";
5
+ import { resolveInside } from "../filesystem/paths.js";
6
+ import { renderTemplate } from "../context/render.js";
7
+ function applies(check, isRoot) {
8
+ const scope = check.scope ?? "root";
9
+ return scope === "all" || (scope === "root" ? isRoot : !isRoot);
10
+ }
11
+ function enabled(check, context, partials) {
12
+ if (!check.when)
13
+ return true;
14
+ const result = renderTemplate(check.when, context, `${check.id}.when`, partials)
15
+ .trim()
16
+ .toLowerCase();
17
+ return result !== "" && result !== "false" && result !== "0";
18
+ }
19
+ function dependencySections(pkg) {
20
+ return [
21
+ "dependencies",
22
+ "devDependencies",
23
+ "peerDependencies",
24
+ "optionalDependencies",
25
+ ].flatMap((location) => {
26
+ const value = pkg[location];
27
+ return typeof value === "object" && value !== null && !Array.isArray(value)
28
+ ? [[location, value]]
29
+ : [];
30
+ });
31
+ }
32
+ function splitSpec(spec) {
33
+ if (spec.startsWith("@")) {
34
+ const separator = spec.indexOf("@", 1);
35
+ return separator === -1
36
+ ? { name: spec, range: "*" }
37
+ : { name: spec.slice(0, separator), range: spec.slice(separator + 1) };
38
+ }
39
+ const separator = spec.indexOf("@");
40
+ return separator === -1
41
+ ? { name: spec, range: "*" }
42
+ : { name: spec.slice(0, separator), range: spec.slice(separator + 1) };
43
+ }
44
+ function rangeMatches(actual, required) {
45
+ if (typeof actual !== "string")
46
+ return false;
47
+ if (required === "*" || required === "")
48
+ return true;
49
+ const actualRange = validRange(actual);
50
+ const requiredRange = validRange(required);
51
+ return actualRange && requiredRange
52
+ ? intersects(actualRange, requiredRange)
53
+ : actual === required;
54
+ }
55
+ async function runCheck(check, unit, context, partials) {
56
+ if (check.type === "required-packages") {
57
+ const missing = [];
58
+ for (const [location, specs] of Object.entries(check.packages)) {
59
+ const section = unit.packageJson[location];
60
+ const packages = typeof section === "object" && section !== null && !Array.isArray(section)
61
+ ? section
62
+ : {};
63
+ for (const raw of specs) {
64
+ const spec = splitSpec(raw);
65
+ if (!rangeMatches(packages[spec.name], spec.range))
66
+ missing.push(raw);
67
+ }
68
+ }
69
+ if (missing.length === 0)
70
+ return null;
71
+ return {
72
+ id: check.id,
73
+ project: unit.relativePath,
74
+ title: "Required packages are missing or incompatible",
75
+ body: missing,
76
+ solution: "Install the required packages in their configured locations.",
77
+ };
78
+ }
79
+ if (check.type === "unwanted-packages") {
80
+ const installed = new Set(dependencySections(unit.packageJson).flatMap(([, packages]) => Object.keys(packages)));
81
+ const allowed = new Set(check.allowed ?? []);
82
+ const unwanted = check.packages.filter((name) => installed.has(name) && !allowed.has(name));
83
+ if (unwanted.length === 0)
84
+ return null;
85
+ return {
86
+ id: check.id,
87
+ project: unit.relativePath,
88
+ title: "Unwanted packages are installed",
89
+ body: unwanted,
90
+ solution: `Remove: ${unwanted.join(" ")}`,
91
+ };
92
+ }
93
+ if (check.type === "file-regex") {
94
+ const renderedPath = renderTemplate(check.path, context, `${check.id}.path`, partials);
95
+ const file = resolveInside(unit.path, renderedPath);
96
+ let contents;
97
+ try {
98
+ contents = await readFile(file, "utf8");
99
+ }
100
+ catch (error) {
101
+ throw new KnittoError(`Unable to read checked file: ${path.relative(unit.repositoryRoot, file)}`, "TEMPLATE", { cause: error });
102
+ }
103
+ const matches = new RegExp(check.pattern, check.flags).test(contents);
104
+ if (matches === (check.mustMatch ?? true))
105
+ return null;
106
+ return {
107
+ id: check.id,
108
+ project: unit.relativePath,
109
+ title: check.message ?? `${renderedPath} failed its content check`,
110
+ body: [`Pattern: ${check.pattern}`],
111
+ ...(check.solution ? { solution: check.solution } : {}),
112
+ };
113
+ }
114
+ const projectRange = typeof unit.packageJson.engines
115
+ ?.node === "string"
116
+ ? String(unit.packageJson.engines.node)
117
+ : null;
118
+ if (!projectRange || !validRange(projectRange))
119
+ return null;
120
+ const incompatible = [];
121
+ const production = unit.packageJson.dependencies;
122
+ if (typeof production !== "object" || production === null)
123
+ return null;
124
+ for (const name of Object.keys(production)) {
125
+ if (check.omit?.includes(name))
126
+ continue;
127
+ try {
128
+ const installed = JSON.parse(await readFile(path.join(unit.path, "node_modules", name, "package.json"), "utf8"));
129
+ const dependencyRange = typeof installed.engines?.node ===
130
+ "string"
131
+ ? String(installed.engines.node)
132
+ : null;
133
+ if (dependencyRange &&
134
+ validRange(dependencyRange) &&
135
+ !subset(projectRange, dependencyRange)) {
136
+ incompatible.push(`${name}@${String(installed.version ?? "unknown")}: ${dependencyRange}`);
137
+ }
138
+ }
139
+ catch (error) {
140
+ if (typeof error !== "object" ||
141
+ error === null ||
142
+ !("code" in error) ||
143
+ error.code !== "ENOENT") {
144
+ throw error;
145
+ }
146
+ }
147
+ }
148
+ if (incompatible.length === 0)
149
+ return null;
150
+ return {
151
+ id: check.id,
152
+ project: unit.relativePath,
153
+ title: `Production dependencies are incompatible with engines.node ${projectRange}`,
154
+ body: incompatible,
155
+ solution: "Remove incompatible dependencies or move them to devDependencies.",
156
+ };
157
+ }
158
+ export async function runChecks(checks, unit, context, partials) {
159
+ const results = [];
160
+ for (const check of checks) {
161
+ if (!applies(check, unit.isRoot))
162
+ continue;
163
+ if (unit.config.exclude?.checks?.includes(check.id))
164
+ continue;
165
+ if (!enabled(check, context, partials))
166
+ continue;
167
+ const result = await runCheck(check, unit, context, partials);
168
+ if (result)
169
+ results.push(result);
170
+ }
171
+ return results;
172
+ }
173
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/checks/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,406 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import { access } from "node:fs/promises";
4
+ import { createInterface } from "node:readline/promises";
5
+ import { stdin, stdout } from "node:process";
6
+ import { Command, InvalidArgumentError } from "commander";
7
+ import { loadProjectConfig, loadProjectLock, saveProjectConfig, writeProjectConfig, writeProjectLock, } from "./config.js";
8
+ import { applyPlan } from "./engine/apply.js";
9
+ import { formatPlan } from "./engine/diff.js";
10
+ import { createPlan } from "./engine/plan.js";
11
+ import { exitCodeFor, KnittoError } from "./errors.js";
12
+ import { createLock } from "./lock.js";
13
+ import { assertCiTemplateInputsConfigured, describeTemplateInputs, parsePromptAssignments, resolveTemplateInputs, } from "./onboarding.js";
14
+ import { resolveCurrentSnapshot, resolveLockedSnapshot, } from "./sources/resolve.js";
15
+ import { run } from "./sources/process.js";
16
+ import { initializeTemplate } from "./template/init.js";
17
+ import { validateTemplateSnapshot } from "./template/validate.js";
18
+ import { templateReleaseTag } from "./template/release.js";
19
+ import { KNITTO_PACKAGE, KNITTO_VERSION } from "./version.js";
20
+ import { CONFIG_FILE, LOCK_FILE, } from "./types.js";
21
+ function collectOption(value, previous) {
22
+ return [...previous, value];
23
+ }
24
+ function assignmentValues(options) {
25
+ return Array.isArray(options.set)
26
+ ? options.set.filter((entry) => typeof entry === "string")
27
+ : [];
28
+ }
29
+ function isCiEnvironment() {
30
+ const value = process.env.CI?.trim().toLowerCase();
31
+ return (value !== undefined && value !== "" && value !== "0" && value !== "false");
32
+ }
33
+ async function configuredInputs(root, config, snapshot, options) {
34
+ const supplied = parsePromptAssignments(assignmentValues(options));
35
+ assertCiTemplateInputsConfigured(root, config, snapshot.manifest, supplied, isCiEnvironment());
36
+ const resolved = await resolveTemplateInputs(root, config, snapshot.manifest, supplied);
37
+ if (resolved.changed)
38
+ await saveProjectConfig(root, resolved.config);
39
+ return resolved.config;
40
+ }
41
+ function projectPath(value) {
42
+ return path.resolve(value);
43
+ }
44
+ function sourceType(value) {
45
+ if (value === "local" || value === "http" || value === "git")
46
+ return value;
47
+ throw new InvalidArgumentError("Source type must be local, http, or git");
48
+ }
49
+ async function promptSource() {
50
+ if (!stdin.isTTY) {
51
+ throw new KnittoError("Interactive init requires a terminal; pass --type and --source", "USAGE");
52
+ }
53
+ const prompts = createInterface({ input: stdin, output: stdout });
54
+ try {
55
+ const type = sourceType((await prompts.question("Template source type (local/http/git): ")).trim());
56
+ const locator = (await prompts.question(type === "local" ? "Template directory: " : "Template URL: ")).trim();
57
+ const templatePath = (await prompts.question("Template path within source (optional): ")).trim();
58
+ if (type === "local")
59
+ return { type, path: locator };
60
+ if (type === "http") {
61
+ return {
62
+ type,
63
+ url: locator,
64
+ ...(templatePath ? { path: templatePath } : {}),
65
+ };
66
+ }
67
+ const ref = (await prompts.question("Git ref (default: HEAD): ")).trim();
68
+ return {
69
+ type,
70
+ url: locator,
71
+ ...(templatePath ? { path: templatePath } : {}),
72
+ ...(ref ? { ref } : {}),
73
+ };
74
+ }
75
+ finally {
76
+ prompts.close();
77
+ }
78
+ }
79
+ function configuredSource(options) {
80
+ if (!options.type && !options.source)
81
+ return null;
82
+ if (!options.type || !options.source) {
83
+ throw new KnittoError("--type and --source must be provided together", "USAGE");
84
+ }
85
+ if (options.type === "local") {
86
+ return { type: "local", path: options.source };
87
+ }
88
+ if (options.type === "http") {
89
+ return {
90
+ type: "http",
91
+ url: options.source,
92
+ ...(options.templatePath ? { path: options.templatePath } : {}),
93
+ };
94
+ }
95
+ return {
96
+ type: "git",
97
+ url: options.source,
98
+ ...(options.templatePath ? { path: options.templatePath } : {}),
99
+ ...(options.ref ? { ref: options.ref } : {}),
100
+ };
101
+ }
102
+ async function selectedSnapshot(projectRoot, config, update) {
103
+ const lockExists = await access(path.join(projectRoot, LOCK_FILE))
104
+ .then(() => true)
105
+ .catch(() => false);
106
+ if (update || !lockExists) {
107
+ return {
108
+ snapshot: await resolveCurrentSnapshot(config.source, projectRoot),
109
+ advanceLock: true,
110
+ };
111
+ }
112
+ return {
113
+ snapshot: await resolveLockedSnapshot(await loadProjectLock(projectRoot), projectRoot),
114
+ advanceLock: false,
115
+ };
116
+ }
117
+ async function selectedValidatedSnapshot(projectRoot, config, update) {
118
+ const selection = await selectedSnapshot(projectRoot, config, update);
119
+ await validateTemplateSnapshot(selection.snapshot);
120
+ if (config.source.type === "git") {
121
+ const expectedTag = templateReleaseTag(selection.snapshot.manifest.release);
122
+ if (expectedTag && config.source.ref !== expectedTag) {
123
+ throw new KnittoError(`Template updates require an immutable release tag; run knitto source pin ${projectRoot} --ref ${expectedTag}`, "CONFIG");
124
+ }
125
+ }
126
+ return selection;
127
+ }
128
+ function outputPlan(plan, options) {
129
+ if (options.json) {
130
+ console.log(JSON.stringify(plan, null, 2));
131
+ }
132
+ else if (!options.quiet) {
133
+ process.stdout.write(formatPlan(plan));
134
+ }
135
+ }
136
+ const program = new Command();
137
+ program
138
+ .name("knitto")
139
+ .description("Reconcile a project directory with a pinned template snapshot")
140
+ .version(KNITTO_VERSION);
141
+ program
142
+ .command("init-template")
143
+ .description("scaffold a new self-managed Knitto template")
144
+ .argument("[directory]", "template directory", ".")
145
+ .option("--name <name>", "template name; defaults to the directory name")
146
+ .action(async (directory, options) => {
147
+ const root = projectPath(directory);
148
+ await initializeTemplate(root, options.name);
149
+ console.log(`Initialized Knitto template in ${root}`);
150
+ });
151
+ program
152
+ .command("inputs")
153
+ .description("inspect template-required inputs without prompting")
154
+ .argument("[project]", "project directory", ".")
155
+ .option("--update", "inspect the newest source snapshot")
156
+ .option("--json", "emit machine-readable JSON")
157
+ .action(async (project, options) => {
158
+ const root = projectPath(project);
159
+ const config = await loadProjectConfig(root);
160
+ const { snapshot } = await selectedSnapshot(root, config, options.update ?? false);
161
+ const description = describeTemplateInputs(root, config, snapshot.manifest);
162
+ const result = {
163
+ projectRoot: root,
164
+ templateDigest: snapshot.digest,
165
+ ...description,
166
+ };
167
+ if (options.json) {
168
+ console.log(JSON.stringify(result, null, 2));
169
+ return;
170
+ }
171
+ console.log(`Template Inputs\n\nProject: ${root}`);
172
+ console.log(`Template: ${snapshot.digest}`);
173
+ console.log(`Prompts: ${description.willPrompt ? "yes" : "no"}\n`);
174
+ if (description.inputs.length === 0) {
175
+ console.log("No template inputs declared.");
176
+ return;
177
+ }
178
+ for (const input of description.inputs) {
179
+ const status = input.configured
180
+ ? "configured"
181
+ : input.default !== undefined
182
+ ? `default: ${input.default}`
183
+ : "missing";
184
+ console.log(`${input.path} (${input.type}, ${status})`);
185
+ console.log(` ${input.message}`);
186
+ if (input.choices) {
187
+ console.log(` Choices: ${input.choices
188
+ .map((choice) => choice.value)
189
+ .join(", ")}`);
190
+ }
191
+ }
192
+ });
193
+ program
194
+ .command("init")
195
+ .argument("[project]", "project directory", ".")
196
+ .option("--type <type>", "source type", sourceType)
197
+ .option("--source <locator>", "source directory or URL")
198
+ .option("--template-path <path>", "template path within the source")
199
+ .option("--ref <ref>", "Git ref")
200
+ .option("--set <key=value>", "set a template onboarding answer; repeatable", collectOption, [])
201
+ .action(async (project, options) => {
202
+ const root = projectPath(project);
203
+ const explicit = configuredSource(options);
204
+ let config;
205
+ let shouldWriteConfig = false;
206
+ if (explicit) {
207
+ config = {
208
+ source: explicit,
209
+ engine: {
210
+ package: KNITTO_PACKAGE,
211
+ version: KNITTO_VERSION,
212
+ },
213
+ };
214
+ shouldWriteConfig = true;
215
+ }
216
+ else {
217
+ const configExists = await access(path.join(root, CONFIG_FILE))
218
+ .then(() => true)
219
+ .catch(() => false);
220
+ if (configExists) {
221
+ config = await loadProjectConfig(root);
222
+ }
223
+ else {
224
+ config = {
225
+ source: await promptSource(),
226
+ engine: {
227
+ package: KNITTO_PACKAGE,
228
+ version: KNITTO_VERSION,
229
+ },
230
+ };
231
+ shouldWriteConfig = true;
232
+ }
233
+ }
234
+ const source = config.source;
235
+ const snapshot = await resolveCurrentSnapshot(source, root);
236
+ if (shouldWriteConfig)
237
+ await writeProjectConfig(root, config);
238
+ config = await configuredInputs(root, config, snapshot, options);
239
+ await writeProjectLock(root, createLock(source, snapshot), {
240
+ exclusive: true,
241
+ });
242
+ console.log(`Initialized ${root} with ${snapshot.digest}`);
243
+ });
244
+ program
245
+ .command("check")
246
+ .description("validate Knitto configuration, template assets, and compliance")
247
+ .argument("[project]", "project directory", ".")
248
+ .option("--update", "validate against the newest source snapshot")
249
+ .option("--json", "emit machine-readable JSON")
250
+ .option("--quiet", "suppress human-readable output")
251
+ .option("--set <path=value>", "set a required template input", collectOption, [])
252
+ .action(async (project, options) => {
253
+ const root = projectPath(project);
254
+ let config = await loadProjectConfig(root);
255
+ const lockExists = await access(path.join(root, LOCK_FILE))
256
+ .then(() => true)
257
+ .catch(() => false);
258
+ if (lockExists)
259
+ await loadProjectLock(root);
260
+ const { snapshot } = await selectedValidatedSnapshot(root, config, options.update ?? false);
261
+ config = await configuredInputs(root, config, snapshot, options);
262
+ const plan = await createPlan(root, config, snapshot);
263
+ outputPlan(plan, options);
264
+ if (plan.operations.length > 0 || plan.checks.length > 0) {
265
+ process.exitCode = 1;
266
+ }
267
+ });
268
+ program
269
+ .command("plan")
270
+ .argument("[project]", "project directory", ".")
271
+ .option("--update", "resolve the newest source snapshot")
272
+ .option("--json", "emit machine-readable JSON")
273
+ .option("--set <path=value>", "set a required template input", collectOption, [])
274
+ .action(async (project, options) => {
275
+ const root = projectPath(project);
276
+ let config = await loadProjectConfig(root);
277
+ const { snapshot } = await selectedValidatedSnapshot(root, config, options.update ?? false);
278
+ config = await configuredInputs(root, config, snapshot, options);
279
+ outputPlan(await createPlan(root, config, snapshot), options);
280
+ });
281
+ program
282
+ .command("apply")
283
+ .description("plan and atomically apply repository changes in one command")
284
+ .argument("[project]", "project directory", ".")
285
+ .option("--update", "resolve and apply the newest source snapshot")
286
+ .option("--json", "emit machine-readable JSON")
287
+ .option("--set <path=value>", "set a required template input", collectOption, [])
288
+ .action(async (project, options) => {
289
+ const root = projectPath(project);
290
+ let config = await loadProjectConfig(root);
291
+ const update = options.update ?? false;
292
+ const { snapshot, advanceLock } = await selectedValidatedSnapshot(root, config, update);
293
+ config = await configuredInputs(root, config, snapshot, options);
294
+ const plan = await createPlan(root, config, snapshot);
295
+ outputPlan(plan, options);
296
+ await applyPlan(plan);
297
+ if (advanceLock) {
298
+ const appliedConfig = await loadProjectConfig(root);
299
+ await writeProjectLock(root, createLock(appliedConfig.source, snapshot));
300
+ }
301
+ if (!options.json) {
302
+ console.log(plan.operations.length === 0
303
+ ? "Project already complies."
304
+ : `Applied ${plan.operations.length} operation(s).`);
305
+ }
306
+ });
307
+ const source = program.command("source").description("Inspect template sources");
308
+ source
309
+ .command("pin")
310
+ .description("pin a Git template release and its required Knitto engine")
311
+ .argument("[project]", "project directory", ".")
312
+ .requiredOption("--ref <tag>", "immutable template release tag")
313
+ .action(async (project, options) => {
314
+ const root = projectPath(project);
315
+ const config = await loadProjectConfig(root);
316
+ if (config.source.type !== "git") {
317
+ throw new KnittoError("Only Git template sources can be pinned to a release tag", "CONFIG");
318
+ }
319
+ const pinnedSource = {
320
+ ...config.source,
321
+ ref: options.ref,
322
+ };
323
+ await run("git", [
324
+ "ls-remote",
325
+ "--exit-code",
326
+ "--tags",
327
+ config.source.url,
328
+ `refs/tags/${options.ref}`,
329
+ ]);
330
+ const snapshot = await resolveCurrentSnapshot(pinnedSource, root);
331
+ await validateTemplateSnapshot(snapshot);
332
+ const expectedTag = templateReleaseTag(snapshot.manifest.release);
333
+ if (expectedTag) {
334
+ if (options.ref !== expectedTag) {
335
+ throw new KnittoError(`Template release ${options.ref} declares tag ${expectedTag}`, "TEMPLATE");
336
+ }
337
+ }
338
+ await saveProjectConfig(root, {
339
+ ...config,
340
+ source: pinnedSource,
341
+ ...(snapshot.manifest.engine
342
+ ? { engine: snapshot.manifest.engine }
343
+ : {}),
344
+ });
345
+ console.log(`Pinned ${root} to ${options.ref}${snapshot.manifest.engine
346
+ ? ` with ${snapshot.manifest.engine.package}@${snapshot.manifest.engine.version}`
347
+ : ""}`);
348
+ });
349
+ source
350
+ .command("inspect")
351
+ .argument("[project]", "project directory", ".")
352
+ .option("--json", "emit machine-readable JSON")
353
+ .action(async (project, options) => {
354
+ const root = projectPath(project);
355
+ const config = await loadProjectConfig(root);
356
+ const lock = await loadProjectLock(root);
357
+ const current = await resolveCurrentSnapshot(config.source, root);
358
+ const result = {
359
+ source: config.source,
360
+ locked: {
361
+ digest: lock.digest,
362
+ provenance: lock.provenance,
363
+ resolvedAt: lock.resolvedAt,
364
+ },
365
+ current: {
366
+ digest: current.digest,
367
+ provenance: current.provenance,
368
+ },
369
+ updateAvailable: current.digest !== lock.digest,
370
+ };
371
+ if (options.json)
372
+ console.log(JSON.stringify(result, null, 2));
373
+ else {
374
+ console.log(`Source: ${JSON.stringify(config.source)}`);
375
+ console.log(`Locked: ${lock.digest}`);
376
+ console.log(`Current: ${current.digest}`);
377
+ console.log(`Update available: ${result.updateAvailable ? "yes" : "no"}`);
378
+ }
379
+ });
380
+ source
381
+ .command("trust")
382
+ .argument("[project]", "project directory", ".")
383
+ .option("--digest <digest>", "template digest; defaults to the locked digest")
384
+ .action(async (project, options) => {
385
+ const root = projectPath(project);
386
+ const config = await loadProjectConfig(root);
387
+ const lock = await loadProjectLock(root);
388
+ const digest = options.digest ?? lock.digest;
389
+ if (!/^sha256:[a-f0-9]{64}$/.test(digest)) {
390
+ throw new KnittoError(`Invalid template digest: ${digest}`, "USAGE");
391
+ }
392
+ config.trust = {
393
+ hooks: [...new Set([...(config.trust?.hooks ?? []), digest])],
394
+ };
395
+ await saveProjectConfig(root, config);
396
+ console.log(`Trusted executable hooks from ${digest}`);
397
+ });
398
+ program.command("gh", "orchestrate Knitto repositories through GitHub", {
399
+ executableFile: "knitto-gh",
400
+ });
401
+ program.parseAsync().catch((error) => {
402
+ const message = error instanceof Error ? error.message : String(error);
403
+ console.error(`knitto: ${message}`);
404
+ process.exitCode = exitCodeFor(error);
405
+ });
406
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type ProjectConfig, type ProjectLock, type SourceConfig, type TemplateManifest } from "./types.js";
2
+ export declare function validateSource(value: unknown): SourceConfig;
3
+ export declare function validateProjectConfig(value: unknown): ProjectConfig;
4
+ export declare function validateTemplateManifest(value: unknown): TemplateManifest;
5
+ export declare function loadProjectConfig(projectRoot: string): Promise<ProjectConfig>;
6
+ export declare function loadProjectLock(projectRoot: string): Promise<ProjectLock>;
7
+ export declare function writeProjectConfig(projectRoot: string, config: ProjectConfig): Promise<void>;
8
+ export declare function saveProjectConfig(projectRoot: string, config: ProjectConfig): Promise<void>;
9
+ export declare function writeProjectLock(projectRoot: string, lock: ProjectLock, options?: {
10
+ exclusive?: boolean;
11
+ }): Promise<void>;