forgeprint 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +71 -0
- package/dist/bin.js +1 -1
- package/dist/bin.js.map +1 -1
- package/dist/changed.d.ts +17 -0
- package/dist/changed.d.ts.map +1 -0
- package/dist/changed.js +62 -0
- package/dist/changed.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +209 -25
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/lint-setup.d.ts.map +1 -1
- package/dist/lint-setup.js +37 -2
- package/dist/lint-setup.js.map +1 -1
- package/dist/manifest.d.ts +2 -0
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +1 -1
- package/dist/manifest.js.map +1 -1
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +1 -0
- package/dist/paths.js.map +1 -1
- package/dist/recipe.d.ts +43 -0
- package/dist/recipe.d.ts.map +1 -0
- package/dist/recipe.js +131 -0
- package/dist/recipe.js.map +1 -0
- package/dist/requests.d.ts +54 -0
- package/dist/requests.d.ts.map +1 -0
- package/dist/requests.js +102 -0
- package/dist/requests.js.map +1 -0
- package/dist/skills.d.ts +23 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +162 -0
- package/dist/skills.js.map +1 -0
- package/dist/test-setup.d.ts +54 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +219 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +6 -0
- package/dist/validate.js.map +1 -1
- package/package.json +2 -1
package/dist/skills.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join, sep } from 'node:path';
|
|
3
|
+
import { parse } from 'yaml';
|
|
4
|
+
import { repoPaths } from './paths.js';
|
|
5
|
+
/**
|
|
6
|
+
* Skills, checked against the format the distribution tools actually read.
|
|
7
|
+
*
|
|
8
|
+
* Forgeprint does not define a skill format; it follows the Agent Skills
|
|
9
|
+
* conventions so that `npx skills add forgeprint/forgeprint` and
|
|
10
|
+
* `gh skill install forgeprint/forgeprint <name>` work on this repository
|
|
11
|
+
* without anything Forgeprint-specific (rule 6, and the fourth differentiator
|
|
12
|
+
* in the README). The rules below are theirs, not ours — see
|
|
13
|
+
* docs/decisions/0006-skill-distribution.md for what was verified against the
|
|
14
|
+
* real tools and when.
|
|
15
|
+
*
|
|
16
|
+
* The check is offline and deterministic on purpose: it belongs in `validate`,
|
|
17
|
+
* which has to pass on a laptop with no network (ADR 0002).
|
|
18
|
+
*/
|
|
19
|
+
/** Both tools resolve a skill by the name of its directory. */
|
|
20
|
+
const SKILL_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
21
|
+
/** agentskills.io naming rules, as `gh skill publish` enforces them. */
|
|
22
|
+
const MAX_NAME = 64;
|
|
23
|
+
const MAX_DESCRIPTION = 1024;
|
|
24
|
+
/** Frontmatter `gh skill install` injects; committing it breaks updates. */
|
|
25
|
+
const INSTALL_METADATA = /^github-/;
|
|
26
|
+
/**
|
|
27
|
+
* Every skill in the repository: the catalog's own, and the ones a blueprint
|
|
28
|
+
* ships. Both live at `<something>/skills/<name>/SKILL.md`, which is the
|
|
29
|
+
* layout the tools discover.
|
|
30
|
+
*/
|
|
31
|
+
export function findSkills(root) {
|
|
32
|
+
const parents = [root, ...listDirectories(repoPaths.blueprintsDir(root))];
|
|
33
|
+
return parents
|
|
34
|
+
.flatMap((parent) => listDirectories(join(parent, 'skills')))
|
|
35
|
+
.map((dir) => ({
|
|
36
|
+
path: relative(root, dir),
|
|
37
|
+
name: dir.split(sep).at(-1) ?? '',
|
|
38
|
+
file: join(dir, 'SKILL.md'),
|
|
39
|
+
}))
|
|
40
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check every skill, and the catalog-wide rule no single skill can check: a
|
|
44
|
+
* name is how both tools address a skill, so it has to be unique here.
|
|
45
|
+
*/
|
|
46
|
+
export function checkSkills(root) {
|
|
47
|
+
const skills = findSkills(root);
|
|
48
|
+
const problems = skills.flatMap((skill) => checkSkill(skill));
|
|
49
|
+
const owners = new Map();
|
|
50
|
+
for (const skill of skills) {
|
|
51
|
+
const owner = owners.get(skill.name);
|
|
52
|
+
if (owner === undefined) {
|
|
53
|
+
owners.set(skill.name, skill.path);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
problems.push({
|
|
57
|
+
file: `${skill.path}/SKILL.md`,
|
|
58
|
+
message: `another skill is also named "${skill.name}" (${owner}); a name addresses one skill`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return problems;
|
|
62
|
+
}
|
|
63
|
+
function checkSkill(skill) {
|
|
64
|
+
const file = `${skill.path}/SKILL.md`;
|
|
65
|
+
const problem = (message) => ({ file, message });
|
|
66
|
+
let source;
|
|
67
|
+
try {
|
|
68
|
+
source = readFileSync(skill.file, 'utf8');
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return [problem('no SKILL.md: a skill folder without one is invisible to both tools')];
|
|
72
|
+
}
|
|
73
|
+
const frontmatter = readFrontmatter(source);
|
|
74
|
+
if (frontmatter === undefined) {
|
|
75
|
+
return [problem('no YAML frontmatter between --- lines at the top of the file')];
|
|
76
|
+
}
|
|
77
|
+
let fields;
|
|
78
|
+
try {
|
|
79
|
+
const parsed = parse(frontmatter);
|
|
80
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
81
|
+
return [problem('frontmatter is not a mapping of fields')];
|
|
82
|
+
}
|
|
83
|
+
fields = parsed;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return [
|
|
87
|
+
problem(`frontmatter is not valid YAML: ${error instanceof Error ? error.message : ''}`),
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
const problems = [];
|
|
91
|
+
const name = fields['name'];
|
|
92
|
+
if (typeof name !== 'string' || name === '') {
|
|
93
|
+
problems.push(problem('frontmatter needs a `name`'));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
if (name !== skill.name) {
|
|
97
|
+
problems.push(problem(`name "${name}" does not match the folder name "${skill.name}"`));
|
|
98
|
+
}
|
|
99
|
+
if (!SKILL_NAME.test(name)) {
|
|
100
|
+
problems.push(problem(`name "${name}" must be lower-case words joined by hyphens`));
|
|
101
|
+
}
|
|
102
|
+
if (name.length > MAX_NAME) {
|
|
103
|
+
problems.push(problem(`name is ${String(name.length)} characters; the limit is ${String(MAX_NAME)}`));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const description = fields['description'];
|
|
107
|
+
if (typeof description !== 'string' || description.trim() === '') {
|
|
108
|
+
// The description is what an agent matches against, so an empty one is a
|
|
109
|
+
// skill nobody will ever load.
|
|
110
|
+
problems.push(problem('frontmatter needs a `description` saying what it does and when to use it'));
|
|
111
|
+
}
|
|
112
|
+
else if (description.length > MAX_DESCRIPTION) {
|
|
113
|
+
problems.push(problem(`description is ${String(description.length)} characters; the limit is ${String(MAX_DESCRIPTION)}`));
|
|
114
|
+
}
|
|
115
|
+
// Recommended by the tools, required here: a skill is copied into somebody
|
|
116
|
+
// else's repository, and §8 only works if each copy says what it is under.
|
|
117
|
+
if (typeof fields['license'] !== 'string' || fields['license'] === '') {
|
|
118
|
+
problems.push(problem('frontmatter needs a `license`, because the file travels on its own'));
|
|
119
|
+
}
|
|
120
|
+
if ('allowed-tools' in fields && typeof fields['allowed-tools'] !== 'string') {
|
|
121
|
+
problems.push(problem('`allowed-tools` has to be a string, not a list'));
|
|
122
|
+
}
|
|
123
|
+
const metadata = fields['metadata'];
|
|
124
|
+
if (metadata !== null && typeof metadata === 'object' && !Array.isArray(metadata)) {
|
|
125
|
+
const injected = Object.keys(metadata).filter((key) => INSTALL_METADATA.test(key));
|
|
126
|
+
if (injected.length > 0) {
|
|
127
|
+
problems.push(problem(`frontmatter carries install metadata (${injected.join(', ')}); that belongs to an ` +
|
|
128
|
+
'installed copy, not to the source'));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return problems;
|
|
132
|
+
}
|
|
133
|
+
/** The text between the opening `---` and the next one, or undefined. */
|
|
134
|
+
function readFrontmatter(source) {
|
|
135
|
+
const lines = source.split('\n');
|
|
136
|
+
if (lines[0]?.trim() !== '---')
|
|
137
|
+
return undefined;
|
|
138
|
+
const end = lines.indexOf('---', 1);
|
|
139
|
+
if (end === -1)
|
|
140
|
+
return undefined;
|
|
141
|
+
return lines.slice(1, end).join('\n');
|
|
142
|
+
}
|
|
143
|
+
function listDirectories(dir) {
|
|
144
|
+
let entries;
|
|
145
|
+
try {
|
|
146
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
return entries
|
|
152
|
+
.filter((entry) => entry.isDirectory())
|
|
153
|
+
.map((entry) => join(dir, entry.name))
|
|
154
|
+
.sort();
|
|
155
|
+
}
|
|
156
|
+
function relative(root, dir) {
|
|
157
|
+
return dir
|
|
158
|
+
.slice(root.length + 1)
|
|
159
|
+
.split(sep)
|
|
160
|
+
.join('/');
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.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/dist/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,OAAO;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAyE9D"}
|
package/dist/validate.js
CHANGED
|
@@ -8,6 +8,7 @@ import { loadConfig } from './config.js';
|
|
|
8
8
|
import { normalizeNewlines } from './json.js';
|
|
9
9
|
import { combinationKey } from './manifest.js';
|
|
10
10
|
import { repoPaths } from './paths.js';
|
|
11
|
+
import { checkSkills } from './skills.js';
|
|
11
12
|
import { SLUG_PATTERN, describeError, loadTaxonomy } from './taxonomy.js';
|
|
12
13
|
/**
|
|
13
14
|
* Validate the whole catalog: schema conformance, required files, and the
|
|
@@ -76,6 +77,11 @@ export function validateCatalog(root) {
|
|
|
76
77
|
});
|
|
77
78
|
}
|
|
78
79
|
}
|
|
80
|
+
// Skills are distributed by tools nobody here controls, so the format they
|
|
81
|
+
// read is checked with everything else (ADR 0006).
|
|
82
|
+
for (const problem of checkSkills(root)) {
|
|
83
|
+
problems.push({ message: `${problem.file}: ${problem.message}` });
|
|
84
|
+
}
|
|
79
85
|
problems.push(...generatedFileProblems(root, blueprints, taxonomy));
|
|
80
86
|
return { ok: problems.length === 0, checked: slugs.length, problems };
|
|
81
87
|
}
|
package/dist/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "forgeprint",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
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
|
],
|