forgeprint 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,55 @@
1
+ # Changelog — forgeprint
2
+
3
+ The catalog tooling. Every pipeline step is a command here, so a contributor
4
+ gets the same answer locally that a pull request gets in CI (ADR 0002).
5
+
6
+ ## 0.2.0 — 2026-09-22
7
+
8
+ The release that makes a setup recipe executable rather than readable.
9
+
10
+ ### Added
11
+
12
+ - `forgeprint test-setup` — runs a recipe in a fresh temporary directory: every
13
+ step, then its verification, stopping at the first failure with the command
14
+ and its output. It checks the tools a manifest declares in `requires_tools`
15
+ before it starts and installs nothing; a missing tool is a refusal that names
16
+ the tool (ADR 0005). Flags: `--all`, `--options database=postgres,auth=jwt`,
17
+ `--all-options` for the full matrix, `--keep` to keep the working directory.
18
+ - `--changed-since <ref>` on `test-setup` — the blueprints a branch changed,
19
+ and every blueprint when the recipe runner itself changed. It compares
20
+ commits, not the working tree. When nothing changed it says so and succeeds,
21
+ which is what lets the recipe run be a required status check without
22
+ blocking pull requests that touch no blueprint.
23
+ - A recipe parser behind `test-setup`: a step is one command (the last code
24
+ span) or one file (a path in backticks followed by a fenced block), and a
25
+ step ends at the next heading, so the prose after a recipe is never run.
26
+ - `--all` on `lint-setup` and `similarity`.
27
+ - Two `lint-setup` rules that came out of running the recipes for real:
28
+ `one-action-per-step` and `write-step-needs-path`.
29
+
30
+ ### Fixed
31
+
32
+ - `forgeprint --version` reported `0.1.0` whatever was installed. It now
33
+ reports the package version, and a test keeps the two in step.
34
+
35
+ ## 0.1.1 — 2026-09-22
36
+
37
+ - Published unscoped as `forgeprint`. `0.1.0` went out depending on
38
+ `@forgeprint/cli`, which does not exist and made the package uninstallable;
39
+ it is deprecated on npm.
40
+
41
+ ## 0.1.0 — 2026-09-22
42
+
43
+ First release.
44
+
45
+ - `validate` — schema, taxonomy, required files, one blueprint per
46
+ `stack + project_type + requirements`, a CHANGELOG entry per version, and
47
+ generated files that are committed and current.
48
+ - `lint-setup` — the structure and safety rules for `setup.md`: numbered steps,
49
+ a verification per step, pinned versions, and no `sudo`, no pipe to a shell,
50
+ no recursive delete, no system paths (rule 20).
51
+ - `similarity` — the duplicate report: tag overlap and TF-IDF text similarity
52
+ against the closest blueprint in the catalog.
53
+ - `build-index`, `build-schema`, `build-codeowners` — the generated files that
54
+ are committed to the repository so that Pages and CODEOWNERS work without a
55
+ build service.
package/dist/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createProgram } from './cli.js';
3
3
  try {
4
- createProgram().parse(process.argv);
4
+ await createProgram().parseAsync(process.argv);
5
5
  }
6
6
  catch (error) {
7
7
  console.error(`error ${error instanceof Error ? error.message : String(error)}`);
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,IAAI,CAAC;IACH,aAAa,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,IAAI,CAAC;IACH,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The files that changed between `ref` and the working tree's commit.
3
+ *
4
+ * Three dots: what this branch did, not what happened on the base branch
5
+ * meanwhile.
6
+ */
7
+ export declare function changedFiles(root: string, ref: string): string[];
8
+ /**
9
+ * Which of `slugs` the changed paths affect, in catalog order.
10
+ *
11
+ * Deliberately blunt: a touched blueprint folder selects that blueprint, and a
12
+ * touched runner selects all of them. Anything else — documentation, the site,
13
+ * the MCP server — selects none, and the caller reports that rather than
14
+ * failing.
15
+ */
16
+ export declare function affectedBlueprints(changed: readonly string[], slugs: readonly string[]): string[];
17
+ //# sourceMappingURL=changed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changed.d.ts","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"AAyBA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBhE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAQjG"}
@@ -0,0 +1,62 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ /**
3
+ * Selecting the blueprints a change actually affects.
4
+ *
5
+ * A pull request that edits the README should not spend twenty minutes
6
+ * building containers, and a required status check that never reports blocks
7
+ * the merge. So the workflow runs on every pull request and asks this module
8
+ * what to run, instead of a `paths:` filter deciding whether the check exists
9
+ * at all (see docs/repo-settings.md).
10
+ *
11
+ * The decision lives here rather than in the workflow because it has to be
12
+ * reproducible on a laptop: `test-setup --changed-since main` answers the same
13
+ * question a reviewer has (ADR 0002).
14
+ */
15
+ /**
16
+ * A change under the recipe runner affects every blueprint, because it changes
17
+ * what "the recipe passed" means. Paths are repository-relative, the way `git
18
+ * diff --name-only` prints them.
19
+ */
20
+ const RUNNER_PATHS = ['packages/cli/'];
21
+ const BLUEPRINT_PATH = /^blueprints\/([^/]+)\//;
22
+ /**
23
+ * The files that changed between `ref` and the working tree's commit.
24
+ *
25
+ * Three dots: what this branch did, not what happened on the base branch
26
+ * meanwhile.
27
+ */
28
+ export function changedFiles(root, ref) {
29
+ let output;
30
+ try {
31
+ output = execFileSync('git', ['diff', '--name-only', `${ref}...HEAD`], {
32
+ cwd: root,
33
+ encoding: 'utf8',
34
+ stdio: ['ignore', 'pipe', 'pipe'],
35
+ });
36
+ }
37
+ catch (error) {
38
+ const detail = error instanceof Error ? error.message.split('\n')[0] : String(error);
39
+ throw new Error(`Cannot compare against "${ref}": ${detail ?? ''}\n` +
40
+ 'The reference has to exist locally; in CI that means fetching enough history.', { cause: error });
41
+ }
42
+ return output
43
+ .split('\n')
44
+ .map((line) => line.trim())
45
+ .filter((line) => line !== '');
46
+ }
47
+ /**
48
+ * Which of `slugs` the changed paths affect, in catalog order.
49
+ *
50
+ * Deliberately blunt: a touched blueprint folder selects that blueprint, and a
51
+ * touched runner selects all of them. Anything else — documentation, the site,
52
+ * the MCP server — selects none, and the caller reports that rather than
53
+ * failing.
54
+ */
55
+ export function affectedBlueprints(changed, slugs) {
56
+ if (changed.some((path) => RUNNER_PATHS.some((prefix) => path.startsWith(prefix)))) {
57
+ return [...slugs];
58
+ }
59
+ const touched = new Set(changed.map((path) => BLUEPRINT_PATH.exec(path)?.[1]).filter((slug) => slug !== undefined));
60
+ return slugs.filter((slug) => touched.has(slug));
61
+ }
62
+ //# sourceMappingURL=changed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changed.js","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,eAAe,CAAC,CAAC;AAEvC,MAAM,cAAc,GAAG,wBAAwB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,GAAW;IACpD,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAG,SAAS,CAAC,EAAE;YACrE,GAAG,EAAE,IAAI;YACT,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrF,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,MAAM,MAAM,IAAI,EAAE,IAAI;YAClD,+EAA+E,EACjF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA0B,EAAE,KAAwB;IACrF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAC3F,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC"}
package/dist/cli.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Command } from 'commander';
2
- export declare const VERSION = "0.1.0";
2
+ export declare const VERSION = "0.2.0";
3
3
  /**
4
4
  * Every pipeline step is a command here, so that contributors and maintainers
5
5
  * get the same result locally that CI produces (ADR 0002).
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,OAAO,UAAU,CAAC;AAM/B;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAmHvC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,OAAO,UAAU,CAAC;AAM/B;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAiPvC"}
package/dist/cli.js CHANGED
@@ -1,17 +1,22 @@
1
- import { mkdirSync, writeFileSync } from 'node:fs';
2
- import { dirname } from 'node:path';
1
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
3
4
  import { Command } from 'commander';
4
5
  import { renderCodeowners } from './build-codeowners.js';
5
6
  import { loadBlueprints, renderIndex } from './build-index.js';
6
7
  import { buildManifestJsonSchema } from './build-schema.js';
7
- import { readBlueprintFile, readBlueprintFolder, readManifest } from './catalog.js';
8
+ import { listBlueprintSlugs, readBlueprintFile, readBlueprintFolder, readManifest, } from './catalog.js';
9
+ import { affectedBlueprints, changedFiles } from './changed.js';
8
10
  import { CONFIG_FILE, loadConfig } from './config.js';
9
11
  import { lintSetup } from './lint-setup.js';
12
+ import { checkOptions, resolveSetupOptions } from './options.js';
13
+ import { parseRecipe } from './recipe.js';
14
+ import { checkTools, runDirectoryName, runRecipe } from './test-setup.js';
10
15
  import { compareBlueprints, DEFAULT_THRESHOLD, renderReport } from './similarity.js';
11
16
  import { findRepoRoot, repoPaths } from './paths.js';
12
17
  import { loadTaxonomy } from './taxonomy.js';
13
18
  import { validateCatalog } from './validate.js';
14
- export const VERSION = '0.1.0';
19
+ export const VERSION = '0.2.0';
15
20
  /**
16
21
  * Every pipeline step is a command here, so that contributors and maintainers
17
22
  * get the same result locally that CI produces (ADR 0002).
@@ -43,29 +48,37 @@ export function createProgram() {
43
48
  });
44
49
  program
45
50
  .command('lint-setup')
46
- .argument('<slug>', 'blueprint to check')
51
+ .argument('[slug]', 'blueprint to check; omit with --all')
52
+ .option('--all', 'check every blueprint in the catalog')
47
53
  .description('check a blueprint setup.md against the structure and safety rules')
48
- .action((slug) => {
54
+ .action((slug, options) => {
49
55
  const root = rootOf();
50
- const folder = readBlueprintFolder(root, slug);
51
- const manifest = readManifest(loadTaxonomy(root), folder);
52
- const problems = lintSetup(readBlueprintFile(folder, 'setup.md'), {
53
- options: manifest.options ?? {},
54
- });
55
- for (const problem of problems) {
56
- console.error(`error setup.md:${problem.line} ${problem.rule}: ${problem.message}`);
56
+ const taxonomy = loadTaxonomy(root);
57
+ const slugs = targets(root, slug, options.all === true);
58
+ let problemCount = 0;
59
+ for (const target of slugs) {
60
+ const folder = readBlueprintFolder(root, target);
61
+ const manifest = readManifest(taxonomy, folder);
62
+ const problems = lintSetup(readBlueprintFile(folder, 'setup.md'), {
63
+ options: manifest.options ?? {},
64
+ });
65
+ for (const problem of problems) {
66
+ console.error(`error ${target}/setup.md:${problem.line} ${problem.rule}: ${problem.message}`);
67
+ }
68
+ problemCount += problems.length;
57
69
  }
58
- if (problems.length === 0) {
59
- console.log(`ok ${slug}/setup.md passes the setup rules`);
70
+ if (problemCount === 0) {
71
+ console.log(`ok ${slugs.length} setup recipe(s) pass the setup rules`);
60
72
  return;
61
73
  }
62
74
  console.error(`
63
- ${problems.length} problem(s) in ${slug}/setup.md`);
75
+ ${problemCount} problem(s) in ${slugs.length} setup recipe(s)`);
64
76
  process.exitCode = 1;
65
77
  });
66
78
  program
67
79
  .command('similarity')
68
- .argument('<slug>', 'blueprint to compare against the rest of the catalog')
80
+ .argument('[slug]', 'blueprint to compare; omit with --all')
81
+ .option('--all', 'report on every blueprint in the catalog')
69
82
  .option('--threshold <ratio>', 'flag above this similarity', String(DEFAULT_THRESHOLD))
70
83
  .option('--fail-on-flag', 'exit non-zero on a red flag, not only on a rule 9 rejection')
71
84
  .description('report how close a blueprint is to the ones already in the catalog')
@@ -73,22 +86,110 @@ ${problems.length} problem(s) in ${slug}/setup.md`);
73
86
  const root = rootOf();
74
87
  const taxonomy = loadTaxonomy(root);
75
88
  const blueprints = loadBlueprints(root, taxonomy);
76
- const subject = blueprints.find((blueprint) => blueprint.slug === slug);
77
- if (subject === undefined)
78
- throw new Error(`No such blueprint: ${slug}`);
79
89
  const threshold = Number(options.threshold);
80
90
  if (!Number.isFinite(threshold) || threshold <= 0 || threshold > 1) {
81
91
  throw new Error('--threshold must be a ratio between 0 and 1');
82
92
  }
83
- const report = compareBlueprints(subject, blueprints.filter((blueprint) => blueprint.slug !== slug), threshold);
84
- console.log(renderReport(report));
93
+ let rejected = false;
94
+ let flagged = false;
95
+ for (const target of targets(root, slug, options.all === true)) {
96
+ const subject = blueprints.find((blueprint) => blueprint.slug === target);
97
+ if (subject === undefined)
98
+ throw new Error(`No such blueprint: ${target}`);
99
+ const report = compareBlueprints(subject, blueprints.filter((blueprint) => blueprint.slug !== target), threshold);
100
+ console.log(renderReport(report));
101
+ console.log('');
102
+ rejected ||= report.closest?.sameCombination === true;
103
+ flagged ||= report.flagged;
104
+ }
85
105
  // A red flag is a question for the reviewer, which the pull request
86
106
  // template makes them answer (rule 11). Only the objective rule — one
87
107
  // blueprint per stack + project_type + requirements — fails the command.
88
- if (report.closest?.sameCombination === true || options.failOnFlag === true) {
89
- if (report.flagged || report.closest?.sameCombination === true)
90
- process.exitCode = 1;
108
+ if (rejected || (options.failOnFlag === true && flagged))
109
+ process.exitCode = 1;
110
+ });
111
+ program
112
+ .command('test-setup')
113
+ .argument('[slug]', 'blueprint to run; omit with --all')
114
+ .option('--all', 'run every blueprint in the catalog')
115
+ .option('--options <pairs>', 'option values, for example database=postgres,auth=jwt')
116
+ .option('--all-options', 'run every combination of the declared options')
117
+ .option('--changed-since <ref>', 'only the blueprints changed since this git reference')
118
+ .option('--keep', 'keep the working directory instead of deleting it')
119
+ .description('run a setup recipe in a fresh directory and verify every step')
120
+ .action(async (slug, flags) => {
121
+ const root = rootOf();
122
+ const taxonomy = loadTaxonomy(root);
123
+ let failures = 0;
124
+ let selected = targets(root, slug, flags.all === true);
125
+ if (flags.changedSince !== undefined) {
126
+ const ref = flags.changedSince;
127
+ selected = affectedBlueprints(changedFiles(root, ref), selected);
128
+ if (selected.length === 0) {
129
+ // Not a skip and not a failure: the question was asked and the
130
+ // answer is nothing to run. A required check has to say that out
131
+ // loud, or the pull request waits forever.
132
+ console.log(`ok no blueprint changed since ${ref}; no recipe to run`);
133
+ return;
134
+ }
135
+ console.log(`Changed since ${ref}: ${selected.join(', ')}`);
91
136
  }
137
+ for (const target of selected) {
138
+ const folder = readBlueprintFolder(root, target);
139
+ const manifest = readManifest(taxonomy, folder);
140
+ // Nothing is installed: a missing tool is a refusal, not a guess at a
141
+ // different toolchain (ADR 0005).
142
+ const missing = await checkTools(manifest.requires_tools ?? []);
143
+ if (missing.length > 0) {
144
+ for (const problem of missing)
145
+ console.error(`error ${target}: ${problem.message}`);
146
+ console.error(`\n${target} cannot be tested on this machine. Nothing was installed.`);
147
+ failures += 1;
148
+ continue;
149
+ }
150
+ for (const chosen of combinations(manifest, flags)) {
151
+ checkOptions(manifest, chosen);
152
+ const label = describeOptions(chosen);
153
+ console.log(`\n${target}${label === '' ? '' : ` ${label}`}`);
154
+ const resolved = resolveSetupOptions(readBlueprintFile(folder, 'setup.md'), chosen);
155
+ const recipe = parseRecipe(resolved.markdown);
156
+ if (recipe.problems.length > 0) {
157
+ for (const problem of recipe.problems) {
158
+ console.error(`error setup.md:${problem.line}: ${problem.message}`);
159
+ }
160
+ failures += 1;
161
+ continue;
162
+ }
163
+ const dir = mkdtempSync(join(tmpdir(), `${runDirectoryName(target, chosen)}-`));
164
+ const started = Date.now();
165
+ const result = await runRecipe(recipe.steps, {
166
+ dir,
167
+ // The step's own number can outrun the count: a branch the caller
168
+ // did not pick leaves a gap in the numbering of the one they did.
169
+ onStep: (step, position, total) => {
170
+ console.log(` [${String(position).padStart(2)}/${total}] ${step.number}. ${step.title}`);
171
+ },
172
+ });
173
+ if (result.ok) {
174
+ console.log(`ok ${recipe.steps.length} step(s) in ${seconds(started)}`);
175
+ if (flags.keep === true)
176
+ console.log(` working directory: ${dir}`);
177
+ else
178
+ rmSync(dir, { recursive: true, force: true });
179
+ }
180
+ else {
181
+ const failure = result.failure;
182
+ console.error(`\nerror step ${String(failure?.step.number)} failed during the ` +
183
+ `${String(failure?.phase)} (exit ${String(failure?.exitCode)})`);
184
+ console.error(` ${failedCommand(failure)}`);
185
+ console.error(indent(tail(failure?.output ?? '', 40)));
186
+ console.error(` working directory kept at ${dir}`);
187
+ failures += 1;
188
+ }
189
+ }
190
+ }
191
+ if (failures > 0)
192
+ process.exitCode = 1;
92
193
  });
93
194
  program
94
195
  .command('build-index')
@@ -120,6 +221,67 @@ ${problems.length} problem(s) in ${slug}/setup.md`);
120
221
  });
121
222
  return program;
122
223
  }
224
+ /** Every combination of the declared options, or just the first of each. */
225
+ function combinations(manifest, flags) {
226
+ if (flags.options !== undefined)
227
+ return [parsePairs(flags.options)];
228
+ const fields = Object.entries(manifest.options ?? {});
229
+ if (fields.length === 0)
230
+ return [{}];
231
+ if (flags.allOptions !== true) {
232
+ // One run, deterministically the first value of each field. The full matrix
233
+ // is slow enough that making it the default would mean nobody runs it.
234
+ return [Object.fromEntries(fields.map(([field, values]) => [field, values[0] ?? '']))];
235
+ }
236
+ return fields.reduce((rows, [field, values]) => rows.flatMap((row) => values.map((value) => ({ ...row, [field]: value }))), [{}]);
237
+ }
238
+ function parsePairs(text) {
239
+ return Object.fromEntries(text.split(',').map((pair) => {
240
+ const [field = '', value = ''] = pair.split('=');
241
+ if (field.trim() === '' || value.trim() === '') {
242
+ throw new Error(`--options takes field=value pairs, got "${pair}"`);
243
+ }
244
+ return [field.trim(), value.trim()];
245
+ }));
246
+ }
247
+ function describeOptions(chosen) {
248
+ return Object.entries(chosen)
249
+ .map(([field, value]) => `${field}=${value}`)
250
+ .join(' ');
251
+ }
252
+ /** What to show for a failure: the verification, or the action that ran. */
253
+ function failedCommand(failure) {
254
+ if (failure === undefined)
255
+ return '';
256
+ if (failure.phase === 'verify')
257
+ return failure.step.verify;
258
+ return failure.step.action.kind === 'run'
259
+ ? failure.step.action.command
260
+ : `write ${failure.step.action.path}`;
261
+ }
262
+ function seconds(started) {
263
+ return `${((Date.now() - started) / 1000).toFixed(1)}s`;
264
+ }
265
+ function tail(text, lines) {
266
+ return text.split('\n').slice(-lines).join('\n');
267
+ }
268
+ function indent(text) {
269
+ return text
270
+ .split('\n')
271
+ .map((line) => ` | ${line}`)
272
+ .join('\n');
273
+ }
274
+ /** The blueprints a command should act on: one slug, or the whole catalog. */
275
+ function targets(root, slug, all) {
276
+ if (all && slug !== undefined) {
277
+ throw new Error('Pass a slug or --all, not both');
278
+ }
279
+ if (all)
280
+ return listBlueprintSlugs(root);
281
+ if (slug === undefined)
282
+ throw new Error('Pass a blueprint slug, or --all for every blueprint');
283
+ return [slug];
284
+ }
123
285
  function write(file, contents) {
124
286
  mkdirSync(dirname(file), { recursive: true });
125
287
  writeFileSync(file, contents, 'utf8');
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export * from './build-codeowners.js';
2
2
  export * from './build-index.js';
3
3
  export * from './build-schema.js';
4
4
  export * from './catalog.js';
5
+ export * from './changed.js';
5
6
  export * from './cli.js';
6
7
  export * from './config.js';
7
8
  export * from './json.js';
@@ -9,7 +10,9 @@ export * from './lint-setup.js';
9
10
  export * from './manifest.js';
10
11
  export * from './options.js';
11
12
  export * from './paths.js';
13
+ export * from './recipe.js';
12
14
  export * from './similarity.js';
13
15
  export * from './taxonomy.js';
16
+ export * from './test-setup.js';
14
17
  export * from './validate.js';
15
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ export * from './build-codeowners.js';
2
2
  export * from './build-index.js';
3
3
  export * from './build-schema.js';
4
4
  export * from './catalog.js';
5
+ export * from './changed.js';
5
6
  export * from './cli.js';
6
7
  export * from './config.js';
7
8
  export * from './json.js';
@@ -9,7 +10,9 @@ export * from './lint-setup.js';
9
10
  export * from './manifest.js';
10
11
  export * from './options.js';
11
12
  export * from './paths.js';
13
+ export * from './recipe.js';
12
14
  export * from './similarity.js';
13
15
  export * from './taxonomy.js';
16
+ export * from './test-setup.js';
14
17
  export * from './validate.js';
15
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"lint-setup.d.ts","sourceRoot":"","sources":["../src/lint-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA2HD,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CAChE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAY,EAAE,GAAE,WAAgB,GAAG,YAAY,EAAE,CA0L5F"}
1
+ {"version":3,"file":"lint-setup.d.ts","sourceRoot":"","sources":["../src/lint-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA8HD,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CAChE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAY,EAAE,GAAE,WAAgB,GAAG,YAAY,EAAE,CA2N5F"}
@@ -13,6 +13,8 @@ const STEP_PATTERN = /^(\d+)\.\s+(\S.*)$/;
13
13
  const IF_PATTERN = /^<!--\s*if\s+options\.([a-z0-9-]+)\s*==\s*([a-z0-9-]+)\s*-->$/;
14
14
  const ENDIF_PATTERN = /^<!--\s*endif\s*-->$/;
15
15
  const ANY_GUARD_PATTERN = /^<!--\s*(if|endif)\b/;
16
+ /** A heading ends the step above it; the prose after a recipe is not a step. */
17
+ const HEADING_PATTERN = /^\s{0,3}#{1,6}\s/;
16
18
  /** Opening or closing line of a fenced code block. */
17
19
  const FENCE_PATTERN = /^\s*(?:```|~~~)/;
18
20
  /** Hosts a setup step may reach: package registries and the local machine. */
@@ -138,6 +140,10 @@ export function lintSetup(source, { options = {} } = {}) {
138
140
  current.body.push(text);
139
141
  return;
140
142
  }
143
+ if (HEADING_PATTERN.test(text)) {
144
+ closeStep();
145
+ return;
146
+ }
141
147
  const guard = IF_PATTERN.exec(text.trim());
142
148
  const isEndif = ENDIF_PATTERN.test(text.trim());
143
149
  if (guard !== null) {
@@ -229,6 +235,24 @@ export function lintSetup(source, { options = {} } = {}) {
229
235
  if (!step.body.some((text) => VERIFY_PATTERN.test(text))) {
230
236
  add(step.line, 'step-needs-verification', `step ${step.number} has no "Verify: \`command\`" line`);
231
237
  }
238
+ // A step that writes a file names the file in backticks and then opens a
239
+ // fenced block. Anything in backticks after that block is a second action,
240
+ // which makes the step unexecutable however clearly it reads.
241
+ const opening = step.body.findIndex((text) => FENCE_PATTERN.test(text));
242
+ if (opening !== -1) {
243
+ const closing = step.body.findIndex((text, at) => at > opening && FENCE_PATTERN.test(text));
244
+ const before = step.body.slice(0, opening).join('\n');
245
+ const after = step.body
246
+ .slice(closing === -1 ? step.body.length : closing + 1)
247
+ .filter((text) => !VERIFY_PATTERN.test(text))
248
+ .join('\n');
249
+ if (!/`[^`]+`/.test(before)) {
250
+ add(step.line, 'write-step-needs-path', `step ${step.number} writes a file but does not name it; put the path in backticks before the block`);
251
+ }
252
+ if (/`[^`]+`/.test(after)) {
253
+ add(step.line, 'one-action-per-step', `step ${step.number} states another action after the block; a step is one action, so give it its own step`);
254
+ }
255
+ }
232
256
  }
233
257
  // Only commands are linted. Prose that mentions `sudo` to warn against it is
234
258
  // not a violation; a code span that runs it is.
@@ -270,8 +294,19 @@ function hostsIn(text) {
270
294
  const authority = match[1];
271
295
  if (authority === undefined)
272
296
  continue;
273
- const host = authority.split('@').pop() ?? authority;
274
- hosts.push(host.replace(/:\d+$/, '').toLowerCase());
297
+ // A host the shell computes at run time cannot be checked here. The rules
298
+ // that matter for those commands — no privilege, no pipe from a download —
299
+ // are checked on the command itself.
300
+ if (authority.includes('$'))
301
+ continue;
302
+ const authorityOnly = authority.split('@').pop() ?? authority;
303
+ // Backslashes come from regexes written inside a command; the port may be a
304
+ // pattern rather than a number, so everything after the colon goes.
305
+ const withoutEscapes = authorityOnly.replace(/\\/g, '');
306
+ const host = withoutEscapes.startsWith('[')
307
+ ? withoutEscapes.slice(0, withoutEscapes.indexOf(']') + 1)
308
+ : (withoutEscapes.split(':')[0] ?? withoutEscapes);
309
+ hosts.push(host.toLowerCase());
275
310
  }
276
311
  return hosts;
277
312
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lint-setup.js","sourceRoot":"","sources":["../src/lint-setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lint-setup.js","sourceRoot":"","sources":["../src/lint-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Turning a `setup.md` into something executable.
3
+ *
4
+ * The recipe is written for a reader, and it has to run. Both work because a
5
+ * step is exactly one action: either a command, or a file written from a fenced
6
+ * block. `lint-setup` enforces that shape, so this parser can be strict rather
7
+ * than clever — anything ambiguous is reported, never guessed.
8
+ */
9
+ export type RecipeAction = {
10
+ readonly kind: 'run';
11
+ readonly command: string;
12
+ } | {
13
+ readonly kind: 'write';
14
+ readonly path: string;
15
+ readonly contents: string;
16
+ };
17
+ export interface RecipeStep {
18
+ readonly number: number;
19
+ /** Line in `setup.md`, for error messages. */
20
+ readonly line: number;
21
+ /** The step's own words, for progress output. */
22
+ readonly title: string;
23
+ readonly action: RecipeAction;
24
+ /** The command that proves the step worked. */
25
+ readonly verify: string;
26
+ }
27
+ export interface RecipeProblem {
28
+ readonly line: number;
29
+ readonly message: string;
30
+ }
31
+ export interface Recipe {
32
+ readonly steps: readonly RecipeStep[];
33
+ /** Reasons the recipe could not be read as a script. */
34
+ readonly problems: readonly RecipeProblem[];
35
+ }
36
+ /**
37
+ * Parse an option-resolved `setup.md`.
38
+ *
39
+ * Guards must already be resolved; one left in place means the caller did not
40
+ * choose an option, and a recipe with branches in it is not a script.
41
+ */
42
+ export declare function parseRecipe(markdown: string): Recipe;
43
+ //# sourceMappingURL=recipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../src/recipe.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AASD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoDpD"}
package/dist/recipe.js ADDED
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Turning a `setup.md` into something executable.
3
+ *
4
+ * The recipe is written for a reader, and it has to run. Both work because a
5
+ * step is exactly one action: either a command, or a file written from a fenced
6
+ * block. `lint-setup` enforces that shape, so this parser can be strict rather
7
+ * than clever — anything ambiguous is reported, never guessed.
8
+ */
9
+ const STEP_PATTERN = /^(\d+)\.\s+(\S.*)$/;
10
+ const VERIFY_PATTERN = /^\s*(?:[-*]\s*)?Verify:\s*`([^`]+)`/;
11
+ const FENCE_PATTERN = /^(\s*)(?:```|~~~)(.*)$/;
12
+ const GUARD_PATTERN = /^\s*<!--\s*(?:if|endif)\b/;
13
+ /** A heading ends the step above it; the prose after a recipe is not a step. */
14
+ const HEADING_PATTERN = /^\s{0,3}#{1,6}\s/;
15
+ /**
16
+ * Parse an option-resolved `setup.md`.
17
+ *
18
+ * Guards must already be resolved; one left in place means the caller did not
19
+ * choose an option, and a recipe with branches in it is not a script.
20
+ */
21
+ export function parseRecipe(markdown) {
22
+ const lines = markdown.split(/\r?\n/);
23
+ const steps = [];
24
+ const problems = [];
25
+ let current = null;
26
+ let inFence = false;
27
+ const finish = () => {
28
+ if (current === null)
29
+ return;
30
+ const step = readStep(current);
31
+ if ('message' in step)
32
+ problems.push({ line: current.line, message: step.message });
33
+ else
34
+ steps.push(step);
35
+ current = null;
36
+ };
37
+ lines.forEach((text, index) => {
38
+ if (FENCE_PATTERN.test(text)) {
39
+ inFence = !inFence;
40
+ current?.body.push(text);
41
+ return;
42
+ }
43
+ if (inFence) {
44
+ current?.body.push(text);
45
+ return;
46
+ }
47
+ if (GUARD_PATTERN.test(text)) {
48
+ finish();
49
+ problems.push({
50
+ line: index + 1,
51
+ message: 'an option guard is still in the recipe; resolve the options first',
52
+ });
53
+ return;
54
+ }
55
+ if (HEADING_PATTERN.test(text)) {
56
+ finish();
57
+ return;
58
+ }
59
+ const start = STEP_PATTERN.exec(text);
60
+ if (start !== null) {
61
+ finish();
62
+ current = { number: Number(start[1]), line: index + 1, body: [start[2] ?? ''] };
63
+ return;
64
+ }
65
+ current?.body.push(text);
66
+ });
67
+ finish();
68
+ if (steps.length === 0 && problems.length === 0) {
69
+ problems.push({ line: 1, message: 'the recipe has no numbered steps' });
70
+ }
71
+ return { steps, problems };
72
+ }
73
+ function readStep(raw) {
74
+ const verifyLine = raw.body.find((text) => VERIFY_PATTERN.test(text));
75
+ const verify = verifyLine === undefined ? undefined : VERIFY_PATTERN.exec(verifyLine)?.[1];
76
+ if (verify === undefined) {
77
+ return { message: `step ${raw.number} has no "Verify: \`command\`" line` };
78
+ }
79
+ const body = raw.body.filter((text) => !VERIFY_PATTERN.test(text));
80
+ const fence = readFence(body);
81
+ if (fence === undefined) {
82
+ const command = lastCodeSpan(body.join('\n'));
83
+ if (command === undefined) {
84
+ return { message: `step ${raw.number} states no command` };
85
+ }
86
+ return {
87
+ number: raw.number,
88
+ line: raw.line,
89
+ title: summarize(body),
90
+ action: { kind: 'run', command },
91
+ verify,
92
+ };
93
+ }
94
+ const path = lastCodeSpan(body.slice(0, fence.start).join('\n'));
95
+ if (path === undefined) {
96
+ return {
97
+ message: `step ${raw.number} writes a file but does not name it; put the path in backticks before the block`,
98
+ };
99
+ }
100
+ return {
101
+ number: raw.number,
102
+ line: raw.line,
103
+ title: summarize(body.slice(0, fence.start)),
104
+ action: { kind: 'write', path, contents: fence.contents },
105
+ verify,
106
+ };
107
+ }
108
+ /** The first fenced block in a step body, dedented to the fence's own indent. */
109
+ function readFence(body) {
110
+ const start = body.findIndex((text) => FENCE_PATTERN.test(text));
111
+ if (start === -1)
112
+ return undefined;
113
+ const indent = FENCE_PATTERN.exec(body[start] ?? '')?.[1]?.length ?? 0;
114
+ const end = body.findIndex((text, at) => at > start && FENCE_PATTERN.test(text));
115
+ const inner = body.slice(start + 1, end === -1 ? undefined : end);
116
+ const contents = inner
117
+ .map((text) => (text.slice(0, indent).trim().length === 0 ? text.slice(indent) : text))
118
+ .join('\n')
119
+ .replace(/\s+$/, '');
120
+ return { start, contents: `${contents}\n` };
121
+ }
122
+ /** Code spans are how a recipe names a command or a path. The last one wins. */
123
+ function lastCodeSpan(text) {
124
+ const spans = [...text.matchAll(/`([^`]+)`/g)];
125
+ return spans.length === 0 ? undefined : spans[spans.length - 1]?.[1];
126
+ }
127
+ function summarize(body) {
128
+ const first = body.join(' ').replace(/\s+/g, ' ').trim();
129
+ return first.length > 100 ? `${first.slice(0, 97)}...` : first;
130
+ }
131
+ //# sourceMappingURL=recipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe.js","sourceRoot":"","sources":["../src/recipe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Running a recipe for real.
3
+ *
4
+ * A fresh directory, the declared tools checked first, every step followed by
5
+ * its verification, and a stop at the first failure with enough output to fix
6
+ * it. The environment is a precondition, not something this provides: nothing
7
+ * here installs anything (ADR 0005).
8
+ */
9
+ import { join } from 'node:path';
10
+ import type { RecipeStep } from './recipe.js';
11
+ /** A step that runs longer than this has hung; the run fails rather than waits. */
12
+ export declare const STEP_TIMEOUT_MS: number;
13
+ /** Commands are POSIX shell, so they read the same on every platform. */
14
+ export declare const SHELL = "bash";
15
+ export interface StepOutcome {
16
+ readonly step: RecipeStep;
17
+ /** Which half of the step this is: the action, or its verification. */
18
+ readonly phase: 'action' | 'verify';
19
+ readonly ok: boolean;
20
+ readonly exitCode: number | null;
21
+ readonly output: string;
22
+ readonly ms: number;
23
+ }
24
+ export interface RunOptions {
25
+ readonly dir: string;
26
+ /** Called before each step, for progress output: step, position, total. */
27
+ readonly onStep?: (step: RecipeStep, position: number, total: number) => void;
28
+ readonly timeoutMs?: number;
29
+ readonly env?: NodeJS.ProcessEnv;
30
+ }
31
+ export interface RunResult {
32
+ readonly ok: boolean;
33
+ readonly dir: string;
34
+ readonly outcomes: readonly StepOutcome[];
35
+ /** The first failure, which is where the run stopped. */
36
+ readonly failure: StepOutcome | undefined;
37
+ }
38
+ export declare function runRecipe(steps: readonly RecipeStep[], options: RunOptions): Promise<RunResult>;
39
+ export interface ToolProblem {
40
+ readonly tool: string;
41
+ readonly message: string;
42
+ }
43
+ /**
44
+ * Check the tools a blueprint declares. Nothing is installed: a missing tool is
45
+ * a refusal naming the tool and the version, because a run that quietly used a
46
+ * different toolchain would be worse than no run at all.
47
+ */
48
+ export declare function checkTools(requires: readonly string[]): Promise<ToolProblem[]>;
49
+ /** Numeric comparison, part by part. Enough for the constraints a tool takes. */
50
+ export declare function satisfies(found: string, operator: string, wanted: string): boolean;
51
+ /** A directory name for a run, stable enough to recognise in a temp folder. */
52
+ export declare function runDirectoryName(slug: string, options: Readonly<Record<string, string>>): string;
53
+ export { join as joinPath };
54
+ //# sourceMappingURL=test-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-setup.d.ts","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAW,IAAI,EAAW,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,mFAAmF;AACnF,eAAO,MAAM,eAAe,QAAiB,CAAC;AAE9C,yEAAyE;AACzE,eAAO,MAAM,KAAK,SAAS,CAAC;AAE5B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,SAAS,CAAC,CAoBpB;AAsFD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAWD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAqCpF;AAwBD,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAwBlF;AAgBD,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAMhG;AAED,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Running a recipe for real.
3
+ *
4
+ * A fresh directory, the declared tools checked first, every step followed by
5
+ * its verification, and a stop at the first failure with enough output to fix
6
+ * it. The environment is a precondition, not something this provides: nothing
7
+ * here installs anything (ADR 0005).
8
+ */
9
+ import { spawn } from 'node:child_process';
10
+ import { mkdir, writeFile } from 'node:fs/promises';
11
+ import { dirname, join, resolve } from 'node:path';
12
+ /** A step that runs longer than this has hung; the run fails rather than waits. */
13
+ export const STEP_TIMEOUT_MS = 15 * 60 * 1000;
14
+ /** Commands are POSIX shell, so they read the same on every platform. */
15
+ export const SHELL = 'bash';
16
+ export async function runRecipe(steps, options) {
17
+ const outcomes = [];
18
+ await mkdir(options.dir, { recursive: true });
19
+ for (const [index, step] of steps.entries()) {
20
+ options.onStep?.(step, index + 1, steps.length);
21
+ const action = step.action.kind === 'run'
22
+ ? await execute(step.action.command, step, 'action', options)
23
+ : await write(step.action.path, step.action.contents, step, options);
24
+ outcomes.push(action);
25
+ if (!action.ok)
26
+ return { ok: false, dir: options.dir, outcomes, failure: action };
27
+ const verify = await execute(step.verify, step, 'verify', options);
28
+ outcomes.push(verify);
29
+ if (!verify.ok)
30
+ return { ok: false, dir: options.dir, outcomes, failure: verify };
31
+ }
32
+ return { ok: true, dir: options.dir, outcomes, failure: undefined };
33
+ }
34
+ async function write(path, contents, step, options) {
35
+ const started = Date.now();
36
+ const target = resolve(options.dir, path);
37
+ // A recipe may not write outside its own directory. lint-setup rejects the
38
+ // paths that would; this is the second lock on the same door.
39
+ if (!target.startsWith(resolve(options.dir))) {
40
+ return {
41
+ step,
42
+ phase: 'action',
43
+ ok: false,
44
+ exitCode: null,
45
+ output: `refusing to write outside the project directory: ${path}`,
46
+ ms: Date.now() - started,
47
+ };
48
+ }
49
+ try {
50
+ await mkdir(dirname(target), { recursive: true });
51
+ await writeFile(target, contents, 'utf8');
52
+ return { step, phase: 'action', ok: true, exitCode: 0, output: '', ms: Date.now() - started };
53
+ }
54
+ catch (error) {
55
+ return {
56
+ step,
57
+ phase: 'action',
58
+ ok: false,
59
+ exitCode: null,
60
+ output: error instanceof Error ? error.message : String(error),
61
+ ms: Date.now() - started,
62
+ };
63
+ }
64
+ }
65
+ function execute(command, step, phase, options) {
66
+ const started = Date.now();
67
+ return new Promise((resolvePromise) => {
68
+ const child = spawn(SHELL, ['-c', command], {
69
+ cwd: options.dir,
70
+ env: { ...process.env, ...options.env },
71
+ windowsHide: true,
72
+ });
73
+ let output = '';
74
+ const collect = (chunk) => {
75
+ output += chunk.toString('utf8');
76
+ if (output.length > 200_000)
77
+ output = output.slice(-200_000);
78
+ };
79
+ child.stdout.on('data', collect);
80
+ child.stderr.on('data', collect);
81
+ const timer = setTimeout(() => {
82
+ output += `\n[timed out after ${(options.timeoutMs ?? STEP_TIMEOUT_MS) / 1000}s]`;
83
+ child.kill('SIGKILL');
84
+ }, options.timeoutMs ?? STEP_TIMEOUT_MS);
85
+ const done = (exitCode, failure) => {
86
+ clearTimeout(timer);
87
+ resolvePromise({
88
+ step,
89
+ phase,
90
+ ok: exitCode === 0 && failure === undefined,
91
+ exitCode,
92
+ output: failure === undefined ? output : `${output}\n${failure.message}`,
93
+ ms: Date.now() - started,
94
+ });
95
+ };
96
+ child.on('error', (error) => {
97
+ done(null, error);
98
+ });
99
+ child.on('close', (code) => {
100
+ done(code);
101
+ });
102
+ });
103
+ }
104
+ /** How to ask a tool for its version, when `--version` is not what it takes. */
105
+ const VERSION_FLAG = {
106
+ go: 'version',
107
+ java: '-version',
108
+ };
109
+ const REQUIREMENT_PATTERN = /^([a-z0-9][a-z0-9.+-]*)\s*(>=|<=|==|>|<|~|\^)?\s*([0-9][0-9a-z.-]*)?$/i;
110
+ /**
111
+ * Check the tools a blueprint declares. Nothing is installed: a missing tool is
112
+ * a refusal naming the tool and the version, because a run that quietly used a
113
+ * different toolchain would be worse than no run at all.
114
+ */
115
+ export async function checkTools(requires) {
116
+ const problems = [];
117
+ const shell = await probe(SHELL, '--version');
118
+ if (shell === undefined) {
119
+ problems.push({
120
+ tool: SHELL,
121
+ message: `${SHELL} is required: recipe commands are POSIX shell. On Windows, Git Bash provides it.`,
122
+ });
123
+ }
124
+ for (const requirement of requires) {
125
+ const parsed = REQUIREMENT_PATTERN.exec(requirement.trim());
126
+ if (parsed === null) {
127
+ problems.push({ tool: requirement, message: `cannot read the requirement "${requirement}"` });
128
+ continue;
129
+ }
130
+ const [, tool = '', operator, wanted] = parsed;
131
+ const flag = VERSION_FLAG[tool] ?? '--version';
132
+ const reported = await probe(tool, flag);
133
+ if (reported === undefined) {
134
+ problems.push({ tool, message: `${tool} is not installed, or not on PATH` });
135
+ continue;
136
+ }
137
+ if (wanted === undefined || operator === undefined)
138
+ continue;
139
+ const found = firstVersion(reported);
140
+ if (found === undefined) {
141
+ problems.push({ tool, message: `could not read a version from "${reported.trim()}"` });
142
+ continue;
143
+ }
144
+ if (!satisfies(found, operator, wanted)) {
145
+ problems.push({ tool, message: `${tool} ${found} does not satisfy ${operator}${wanted}` });
146
+ }
147
+ }
148
+ return problems;
149
+ }
150
+ async function probe(tool, flag) {
151
+ return await new Promise((resolvePromise) => {
152
+ const child = spawn(tool, [flag], { windowsHide: true, shell: process.platform === 'win32' });
153
+ let output = '';
154
+ child.stdout.on('data', (chunk) => (output += chunk.toString('utf8')));
155
+ child.stderr.on('data', (chunk) => (output += chunk.toString('utf8')));
156
+ child.on('error', () => {
157
+ resolvePromise(undefined);
158
+ });
159
+ child.on('close', (code) => {
160
+ // Exit code, not output: with a shell, a missing command still prints
161
+ // something, and treating that as "installed" is how a run ends up using
162
+ // a toolchain nobody declared.
163
+ resolvePromise(code === 0 ? output : undefined);
164
+ });
165
+ });
166
+ }
167
+ function firstVersion(text) {
168
+ return /(\d+(?:\.\d+)*)/.exec(text)?.[1];
169
+ }
170
+ /** Numeric comparison, part by part. Enough for the constraints a tool takes. */
171
+ export function satisfies(found, operator, wanted) {
172
+ const order = compareVersions(found, wanted);
173
+ switch (operator) {
174
+ case '>=':
175
+ return order >= 0;
176
+ case '>':
177
+ return order > 0;
178
+ case '<=':
179
+ return order <= 0;
180
+ case '<':
181
+ return order < 0;
182
+ case '==':
183
+ return order === 0;
184
+ // `~` and `^` allow anything at or above the stated version that does not
185
+ // change the part they pin.
186
+ case '~':
187
+ case '^': {
188
+ if (order < 0)
189
+ return false;
190
+ const index = operator === '^' ? 0 : 1;
191
+ return part(found, index) === part(wanted, index);
192
+ }
193
+ default:
194
+ return false;
195
+ }
196
+ }
197
+ function compareVersions(a, b) {
198
+ const left = a.split('.').map(Number);
199
+ const right = b.split('.').map(Number);
200
+ for (let at = 0; at < Math.max(left.length, right.length); at += 1) {
201
+ const difference = (left[at] ?? 0) - (right[at] ?? 0);
202
+ if (difference !== 0)
203
+ return difference < 0 ? -1 : 1;
204
+ }
205
+ return 0;
206
+ }
207
+ function part(version, index) {
208
+ return Number(version.split('.')[index] ?? 0);
209
+ }
210
+ /** A directory name for a run, stable enough to recognise in a temp folder. */
211
+ export function runDirectoryName(slug, options) {
212
+ const suffix = Object.entries(options)
213
+ .sort(([a], [b]) => a.localeCompare(b))
214
+ .map(([field, value]) => `${field}-${value}`)
215
+ .join('_');
216
+ return suffix.length === 0 ? `forgeprint-${slug}` : `forgeprint-${slug}-${suffix}`;
217
+ }
218
+ export { join as joinPath };
219
+ //# sourceMappingURL=test-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-setup.js","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forgeprint",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Forgeprint catalog tooling. Every pipeline step runs here, not in CI configuration.",
5
5
  "keywords": [
6
6
  "forgeprint",
@@ -38,6 +38,7 @@
38
38
  }
39
39
  },
40
40
  "files": [
41
+ "CHANGELOG.md",
41
42
  "dist",
42
43
  "!dist/**/*.test.*"
43
44
  ],