forgeprint 0.2.0 → 0.2.5

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 (48) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/build-index.d.ts +7 -0
  3. package/dist/build-index.d.ts.map +1 -1
  4. package/dist/build-index.js +3 -0
  5. package/dist/build-index.js.map +1 -1
  6. package/dist/cli.d.ts +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +41 -2
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.d.ts +1 -0
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +6 -0
  13. package/dist/config.js.map +1 -1
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/lint-setup.d.ts.map +1 -1
  19. package/dist/lint-setup.js +35 -5
  20. package/dist/lint-setup.js.map +1 -1
  21. package/dist/manifest.d.ts +14 -0
  22. package/dist/manifest.d.ts.map +1 -1
  23. package/dist/manifest.js +29 -1
  24. package/dist/manifest.js.map +1 -1
  25. package/dist/paths.d.ts +1 -0
  26. package/dist/paths.d.ts.map +1 -1
  27. package/dist/paths.js +1 -0
  28. package/dist/paths.js.map +1 -1
  29. package/dist/requests.d.ts +54 -0
  30. package/dist/requests.d.ts.map +1 -0
  31. package/dist/requests.js +102 -0
  32. package/dist/requests.js.map +1 -0
  33. package/dist/skills.d.ts +23 -0
  34. package/dist/skills.d.ts.map +1 -0
  35. package/dist/skills.js +162 -0
  36. package/dist/skills.js.map +1 -0
  37. package/dist/taxonomy.d.ts +6 -1
  38. package/dist/taxonomy.d.ts.map +1 -1
  39. package/dist/taxonomy.js +58 -1
  40. package/dist/taxonomy.js.map +1 -1
  41. package/dist/testing.d.ts +1 -1
  42. package/dist/testing.d.ts.map +1 -1
  43. package/dist/testing.js +10 -0
  44. package/dist/testing.js.map +1 -1
  45. package/dist/validate.d.ts.map +1 -1
  46. package/dist/validate.js +6 -0
  47. package/dist/validate.js.map +1 -1
  48. package/package.json +1 -1
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,2DAA2D;AAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC3D,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACnD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,0CAA0C,WAAW,sBAAsB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAC/F,CAAC;QACJ,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,QAAQ,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC;IACzE,cAAc,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,sBAAsB,CAAC;IACtF,aAAa,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;IACjE,YAAY,EAAE,CAAC,IAAY,EAAE,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC;IACpF,KAAK,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;IACjE,UAAU,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC;CAC1E,CAAC;AAEF,iDAAiD;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,eAAe;IACf,WAAW;IACX,aAAa;IACb,UAAU;IACV,cAAc;CACN,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,2DAA2D;AAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC3D,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACnD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,0CAA0C,WAAW,sBAAsB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAC/F,CAAC;QACJ,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,QAAQ,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC;IACzE,cAAc,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,sBAAsB,CAAC;IACtF,aAAa,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;IACjE,YAAY,EAAE,CAAC,IAAY,EAAE,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC;IACpF,KAAK,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;IACjE,QAAQ,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC;IACvE,UAAU,EAAE,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC;CAC1E,CAAC;AAEF,iDAAiD;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,eAAe;IACf,WAAW;IACX,aAAa;IACb,UAAU;IACV,cAAc;CACN,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * The demand signal, as data.
4
+ *
5
+ * `request_blueprint` turns "nothing fits" into a public issue, and that list
6
+ * is what decides which blueprint gets written next — the catalog grows by
7
+ * demand, not by guesswork (CLAUDE.md §3.4). The site shows it, so it has to
8
+ * exist as a file: Pages serves a branch, and a browser fetching the GitHub
9
+ * API on every page load would be a different product.
10
+ *
11
+ * It is generated and committed like the other artifacts, with one difference
12
+ * that matters: it comes from outside the repository, so `validate` cannot
13
+ * regenerate it to check for drift. Nothing depends on it being current — a
14
+ * stale list is a list, and a missing one renders as "none yet".
15
+ */
16
+ /** The label `.github/ISSUE_TEMPLATE/blueprint-request.yml` applies. */
17
+ export declare const REQUEST_LABEL = "blueprint-request";
18
+ declare const requestSchema: z.ZodObject<{
19
+ number: z.ZodNumber;
20
+ title: z.ZodString;
21
+ url: z.ZodString;
22
+ author: z.ZodString;
23
+ }, z.core.$strip>;
24
+ declare const fileSchema: z.ZodObject<{
25
+ repository: z.ZodString;
26
+ generated_on: z.ZodString;
27
+ requests: z.ZodArray<z.ZodObject<{
28
+ number: z.ZodNumber;
29
+ title: z.ZodString;
30
+ url: z.ZodString;
31
+ author: z.ZodString;
32
+ }, z.core.$strip>>;
33
+ }, z.core.$strip>;
34
+ export type BlueprintRequest = z.infer<typeof requestSchema>;
35
+ export type RequestsFile = z.infer<typeof fileSchema>;
36
+ /**
37
+ * Open blueprint requests, straight from `gh`.
38
+ *
39
+ * `gh` rather than a fetch with a token: the maintainer is already
40
+ * authenticated, and nothing here should ask anybody for a secret.
41
+ */
42
+ export declare function fetchRequests(repository: string): BlueprintRequest[];
43
+ /** True when `gh` is on this machine, which is the only thing this needs. */
44
+ export declare function hasGitHubCli(): boolean;
45
+ export declare function renderRequests(repository: string, requests: readonly BlueprintRequest[], generatedOn?: string): string;
46
+ /** The date, to the day: a rebuild an hour later is still the same snapshot. */
47
+ export declare function today(): string;
48
+ /**
49
+ * The committed list, or nothing at all. Every failure is the same answer —
50
+ * no requests — because a demand list is never worth failing a build over.
51
+ */
52
+ export declare function readRequests(root: string): RequestsFile;
53
+ export {};
54
+ //# sourceMappingURL=requests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../src/requests.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;;;;;;;GAaG;AAEH,wEAAwE;AACxE,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAEjD,QAAA,MAAM,aAAa;;;;;iBAKjB,CAAC;AAEH,QAAA,MAAM,UAAU;;;;;;;;;iBAKd,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAC7D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAwCpE;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,IAAI,OAAO,CAOtC;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACrC,WAAW,GAAE,MAAgB,GAC5B,MAAM,CAER;AAED,gFAAgF;AAChF,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAMvD"}
@@ -0,0 +1,102 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ import { z } from 'zod';
4
+ import { stableJson } from './json.js';
5
+ import { repoPaths } from './paths.js';
6
+ /**
7
+ * The demand signal, as data.
8
+ *
9
+ * `request_blueprint` turns "nothing fits" into a public issue, and that list
10
+ * is what decides which blueprint gets written next — the catalog grows by
11
+ * demand, not by guesswork (CLAUDE.md §3.4). The site shows it, so it has to
12
+ * exist as a file: Pages serves a branch, and a browser fetching the GitHub
13
+ * API on every page load would be a different product.
14
+ *
15
+ * It is generated and committed like the other artifacts, with one difference
16
+ * that matters: it comes from outside the repository, so `validate` cannot
17
+ * regenerate it to check for drift. Nothing depends on it being current — a
18
+ * stale list is a list, and a missing one renders as "none yet".
19
+ */
20
+ /** The label `.github/ISSUE_TEMPLATE/blueprint-request.yml` applies. */
21
+ export const REQUEST_LABEL = 'blueprint-request';
22
+ const requestSchema = z.object({
23
+ number: z.number().int().positive(),
24
+ title: z.string().min(1),
25
+ url: z.string().min(1),
26
+ author: z.string(),
27
+ });
28
+ const fileSchema = z.object({
29
+ repository: z.string(),
30
+ /** The day the snapshot was taken, so the site can date what it shows. */
31
+ generated_on: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
32
+ requests: z.array(requestSchema),
33
+ });
34
+ /**
35
+ * Open blueprint requests, straight from `gh`.
36
+ *
37
+ * `gh` rather than a fetch with a token: the maintainer is already
38
+ * authenticated, and nothing here should ask anybody for a secret.
39
+ */
40
+ export function fetchRequests(repository) {
41
+ const output = execFileSync('gh', [
42
+ 'issue',
43
+ 'list',
44
+ '--repo',
45
+ repository,
46
+ '--label',
47
+ REQUEST_LABEL,
48
+ '--state',
49
+ 'open',
50
+ '--limit',
51
+ '50',
52
+ '--json',
53
+ 'number,title,url,author',
54
+ ], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
55
+ const raw = JSON.parse(output);
56
+ const issues = z
57
+ .array(z.object({
58
+ number: z.number(),
59
+ title: z.string(),
60
+ url: z.string(),
61
+ author: z.object({ login: z.string() }).nullish(),
62
+ }))
63
+ .parse(raw);
64
+ return issues
65
+ .map((issue) => ({
66
+ number: issue.number,
67
+ title: issue.title,
68
+ url: issue.url,
69
+ author: issue.author?.login ?? '',
70
+ }))
71
+ .sort((a, b) => a.number - b.number);
72
+ }
73
+ /** True when `gh` is on this machine, which is the only thing this needs. */
74
+ export function hasGitHubCli() {
75
+ try {
76
+ execFileSync('gh', ['--version'], { stdio: 'ignore' });
77
+ return true;
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ export function renderRequests(repository, requests, generatedOn = today()) {
84
+ return stableJson({ repository, generated_on: generatedOn, requests });
85
+ }
86
+ /** The date, to the day: a rebuild an hour later is still the same snapshot. */
87
+ export function today() {
88
+ return new Date().toISOString().slice(0, 10);
89
+ }
90
+ /**
91
+ * The committed list, or nothing at all. Every failure is the same answer —
92
+ * no requests — because a demand list is never worth failing a build over.
93
+ */
94
+ export function readRequests(root) {
95
+ try {
96
+ return fileSchema.parse(JSON.parse(readFileSync(repoPaths.requests(root), 'utf8')));
97
+ }
98
+ catch {
99
+ return { repository: '', generated_on: '', requests: [] };
100
+ }
101
+ }
102
+ //# sourceMappingURL=requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.js","sourceRoot":"","sources":["../src/requests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface SkillProblem {
2
+ /** Repository-relative path of the SKILL.md, for the error message. */
3
+ readonly file: string;
4
+ readonly message: string;
5
+ }
6
+ export interface SkillFolder {
7
+ /** Repository-relative path of the folder, e.g. `skills/blueprint-author`. */
8
+ readonly path: string;
9
+ readonly name: string;
10
+ readonly file: string;
11
+ }
12
+ /**
13
+ * Every skill in the repository: the catalog's own, and the ones a blueprint
14
+ * ships. Both live at `<something>/skills/<name>/SKILL.md`, which is the
15
+ * layout the tools discover.
16
+ */
17
+ export declare function findSkills(root: string): SkillFolder[];
18
+ /**
19
+ * Check every skill, and the catalog-wide rule no single skill can check: a
20
+ * name is how both tools address a skill, so it has to be unique here.
21
+ */
22
+ export declare function checkSkills(root: string): SkillProblem[];
23
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAUtD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAgBxD"}
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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"}
@@ -12,10 +12,15 @@ export declare const taxonomySchema: z.ZodObject<{
12
12
  requirements: z.ZodRecord<z.ZodString, z.ZodString>;
13
13
  agents: z.ZodRecord<z.ZodString, z.ZodString>;
14
14
  tier: z.ZodRecord<z.ZodString, z.ZodString>;
15
+ aliases: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>>;
15
16
  }, z.core.$strict>;
16
17
  export type Taxonomy = z.infer<typeof taxonomySchema>;
17
18
  /** Vocabulary names a manifest field can draw from. */
18
- export type Vocabulary = Exclude<keyof Taxonomy, 'version'>;
19
+ export type Vocabulary = Exclude<keyof Taxonomy, 'version' | 'aliases'>;
20
+ /** Every vocabulary, in a fixed order, for code that has to walk them all. */
21
+ export declare const VOCABULARIES: readonly ["languages", "stack", "platforms", "distribution", "project_type", "audience", "requirements", "agents", "tier"];
22
+ /** The spellings declared for one vocabulary: alias to identifier. */
23
+ export declare function aliasesFor(taxonomy: Taxonomy, vocabulary: Vocabulary): Record<string, string>;
19
24
  export declare function parseTaxonomy(source: string): Taxonomy;
20
25
  export declare function loadTaxonomy(root: string): Taxonomy;
21
26
  /** Sorted identifiers of one vocabulary. Sorted so generated output is stable. */
@@ -1 +1 @@
1
- {"version":3,"file":"taxonomy.d.ts","sourceRoot":"","sources":["../src/taxonomy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,mEAAmE;AACnE,eAAO,MAAM,YAAY,QAA+B,CAAC;AAIzD,eAAO,MAAM,cAAc;;;;;;;;;;;kBAahB,CAAC;AAEZ,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,uDAAuD;AACvD,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,QAAQ,EAAE,SAAS,CAAC,CAAC;AAE5D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAEtD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAOnD;AAED,kFAAkF;AAClF,wBAAgB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,EAAE,CAE1E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOpD"}
1
+ {"version":3,"file":"taxonomy.d.ts","sourceRoot":"","sources":["../src/taxonomy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,mEAAmE;AACnE,eAAO,MAAM,YAAY,QAA+B,CAAC;AAczD,eAAO,MAAM,cAAc;;;;;;;;;;;;kBA+CvB,CAAC;AAEL,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,uDAAuD;AACvD,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;AAExE,8EAA8E;AAC9E,eAAO,MAAM,YAAY,4HAUiB,CAAC;AAE3C,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE7F;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAEtD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAOnD;AAED,kFAAkF;AAClF,wBAAgB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,EAAE,CAE1E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOpD"}
package/dist/taxonomy.js CHANGED
@@ -5,6 +5,15 @@ import { repoPaths } from './paths.js';
5
5
  /** Identifiers used in manifests: lower kebab-case, ASCII only. */
6
6
  export const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
7
7
  const termMap = z.record(z.string().regex(SLUG_PATTERN), z.string().min(1));
8
+ /**
9
+ * Spellings that mean an existing identifier.
10
+ *
11
+ * Not new values — the vocabularies stay closed (rule 8 and §3.1). These are
12
+ * the words people write for a value that is already there: `golang` for `go`,
13
+ * `k8s` for `kubernetes`. The key is free text because the whole point is the
14
+ * spellings that are not identifiers; the value has to be one.
15
+ */
16
+ const aliasMap = z.record(z.string().min(1), z.string().regex(SLUG_PATTERN));
8
17
  export const taxonomySchema = z
9
18
  .object({
10
19
  version: z.literal(1),
@@ -17,8 +26,56 @@ export const taxonomySchema = z
17
26
  requirements: termMap,
18
27
  agents: termMap,
19
28
  tier: termMap,
29
+ aliases: z.record(z.string().min(1), aliasMap).optional(),
20
30
  })
21
- .strict();
31
+ .strict()
32
+ .superRefine((taxonomy, context) => {
33
+ for (const [vocabulary, aliases] of Object.entries(taxonomy.aliases ?? {})) {
34
+ const terms = taxonomy[vocabulary];
35
+ if (terms === undefined) {
36
+ context.addIssue({
37
+ code: 'custom',
38
+ path: ['aliases', vocabulary],
39
+ message: `"${vocabulary}" is not a vocabulary`,
40
+ });
41
+ continue;
42
+ }
43
+ for (const [alias, id] of Object.entries(aliases)) {
44
+ if (!(id in terms)) {
45
+ context.addIssue({
46
+ code: 'custom',
47
+ path: ['aliases', vocabulary, alias],
48
+ message: `"${id}" is not in ${vocabulary}`,
49
+ });
50
+ }
51
+ if (alias in terms) {
52
+ // An alias that is already an identifier is either a mistake or a
53
+ // rename in disguise, and either way it can only cause confusion.
54
+ context.addIssue({
55
+ code: 'custom',
56
+ path: ['aliases', vocabulary, alias],
57
+ message: `"${alias}" is already an identifier in ${vocabulary}`,
58
+ });
59
+ }
60
+ }
61
+ }
62
+ });
63
+ /** Every vocabulary, in a fixed order, for code that has to walk them all. */
64
+ export const VOCABULARIES = [
65
+ 'languages',
66
+ 'stack',
67
+ 'platforms',
68
+ 'distribution',
69
+ 'project_type',
70
+ 'audience',
71
+ 'requirements',
72
+ 'agents',
73
+ 'tier',
74
+ ];
75
+ /** The spellings declared for one vocabulary: alias to identifier. */
76
+ export function aliasesFor(taxonomy, vocabulary) {
77
+ return taxonomy.aliases?.[vocabulary] ?? {};
78
+ }
22
79
  export function parseTaxonomy(source) {
23
80
  return taxonomySchema.parse(parse(source));
24
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"taxonomy.js","sourceRoot":"","sources":["../src/taxonomy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAEzD,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,SAAS,EAAE,OAAO;IAClB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,OAAO;IAClB,YAAY,EAAE,OAAO;IACrB,YAAY,EAAE,OAAO;IACrB,QAAQ,EAAE,OAAO;IACjB,YAAY,EAAE,OAAO;IACrB,MAAM,EAAE,OAAO;IACf,IAAI,EAAE,OAAO;CACd,CAAC;KACD,MAAM,EAAE,CAAC;AAOZ,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,KAAK,CAAC,QAAkB,EAAE,UAAsB;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,MAAM;aAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;aACvE,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"taxonomy.js","sourceRoot":"","sources":["../src/taxonomy.ts"],"names":[],"mappings":"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"}
package/dist/testing.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /** A taxonomy small enough to read in a test failure message. */
2
- export declare const TEST_TAXONOMY = "\nversion: 1\nlanguages:\n csharp: C#\n typescript: TypeScript\nstack:\n aspnetcore: ASP.NET Core\n postgres: PostgreSQL\n node: Node.js\nplatforms:\n linux: Linux\n docker: Docker\ndistribution:\n saas: SaaS\n free: Free\nproject_type:\n api: API service\n cli: Command-line tool\naudience:\n intermediate: Intermediate\nrequirements:\n auth: Authentication\n ci: Continuous integration\nagents:\n claude-code: Claude Code\ntier:\n community: Community\n official: Official\n";
2
+ export declare const TEST_TAXONOMY = "\nversion: 1\nlanguages:\n csharp: C#\n typescript: TypeScript\n go: Go\n python: Python\nstack:\n aspnetcore: ASP.NET Core\n postgres: PostgreSQL\n node: Node.js\nplatforms:\n linux: Linux\n docker: Docker\ndistribution:\n saas: SaaS\n free: Free\n open-source: Open source\nproject_type:\n api: API service\n cli: Command-line tool\naudience:\n intermediate: Intermediate\nrequirements:\n auth: Authentication\n ci: Continuous integration\n multi-tenant: Multi-tenancy\nagents:\n claude-code: Claude Code\ntier:\n community: Community\n official: Official\naliases:\n languages:\n golang: go\n ts: typescript\n requirements:\n multitenancy: multi-tenant\n";
3
3
  export interface ManifestFields {
4
4
  [key: string]: unknown;
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAUA,iEAAiE;AACjE,eAAO,MAAM,aAAa,kfA4BzB,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,SAAS,GAAE,cAAmB,GAAG,cAAc,CAmB5E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC1C,wEAAwE;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,UAAU,GAAE,SAAS,gBAAgB,EAAO,GAAG,MAAM,CA8B7E;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAW7C"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAUA,iEAAiE;AACjE,eAAO,MAAM,aAAa,srBAsCzB,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,SAAS,GAAE,cAAmB,GAAG,cAAc,CAmB5E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC1C,wEAAwE;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,UAAU,GAAE,SAAS,gBAAgB,EAAO,GAAG,MAAM,CA8B7E;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAW7C"}
package/dist/testing.js CHANGED
@@ -12,6 +12,8 @@ version: 1
12
12
  languages:
13
13
  csharp: C#
14
14
  typescript: TypeScript
15
+ go: Go
16
+ python: Python
15
17
  stack:
16
18
  aspnetcore: ASP.NET Core
17
19
  postgres: PostgreSQL
@@ -22,6 +24,7 @@ platforms:
22
24
  distribution:
23
25
  saas: SaaS
24
26
  free: Free
27
+ open-source: Open source
25
28
  project_type:
26
29
  api: API service
27
30
  cli: Command-line tool
@@ -30,11 +33,18 @@ audience:
30
33
  requirements:
31
34
  auth: Authentication
32
35
  ci: Continuous integration
36
+ multi-tenant: Multi-tenancy
33
37
  agents:
34
38
  claude-code: Claude Code
35
39
  tier:
36
40
  community: Community
37
41
  official: Official
42
+ aliases:
43
+ languages:
44
+ golang: go
45
+ ts: typescript
46
+ requirements:
47
+ multitenancy: multi-tenant
38
48
  `;
39
49
  /** A manifest that passes validation, so a test only states what it changes. */
40
50
  export function validManifest(overrides = {}) {
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAkBA,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,CAmE9D"}
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
  }
@@ -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.2.0",
3
+ "version": "0.2.5",
4
4
  "description": "Forgeprint catalog tooling. Every pipeline step runs here, not in CI configuration.",
5
5
  "keywords": [
6
6
  "forgeprint",