forgeprint 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +41 -0
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +10 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/build-codeowners.d.ts +8 -0
  8. package/dist/build-codeowners.d.ts.map +1 -0
  9. package/dist/build-codeowners.js +26 -0
  10. package/dist/build-codeowners.js.map +1 -0
  11. package/dist/build-index.d.ts +45 -0
  12. package/dist/build-index.d.ts.map +1 -0
  13. package/dist/build-index.js +41 -0
  14. package/dist/build-index.js.map +1 -0
  15. package/dist/build-schema.d.ts +4 -0
  16. package/dist/build-schema.d.ts.map +1 -0
  17. package/dist/build-schema.js +38 -0
  18. package/dist/build-schema.js.map +1 -0
  19. package/dist/catalog.d.ts +23 -0
  20. package/dist/catalog.d.ts.map +1 -0
  21. package/dist/catalog.js +55 -0
  22. package/dist/catalog.js.map +1 -0
  23. package/dist/cli.d.ts +8 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +128 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config.d.ts +13 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +30 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/index.d.ts +15 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +15 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/json.d.ts +5 -0
  36. package/dist/json.d.ts.map +1 -0
  37. package/dist/json.js +9 -0
  38. package/dist/json.js.map +1 -0
  39. package/dist/lint-setup.d.ts +19 -0
  40. package/dist/lint-setup.d.ts.map +1 -0
  41. package/dist/lint-setup.js +278 -0
  42. package/dist/lint-setup.js.map +1 -0
  43. package/dist/manifest.d.ts +104 -0
  44. package/dist/manifest.d.ts.map +1 -0
  45. package/dist/manifest.js +93 -0
  46. package/dist/manifest.js.map +1 -0
  47. package/dist/options.d.ts +43 -0
  48. package/dist/options.d.ts.map +1 -0
  49. package/dist/options.js +127 -0
  50. package/dist/options.js.map +1 -0
  51. package/dist/paths.d.ts +16 -0
  52. package/dist/paths.d.ts.map +1 -0
  53. package/dist/paths.js +37 -0
  54. package/dist/paths.js.map +1 -0
  55. package/dist/similarity.d.ts +61 -0
  56. package/dist/similarity.d.ts.map +1 -0
  57. package/dist/similarity.js +184 -0
  58. package/dist/similarity.js.map +1 -0
  59. package/dist/taxonomy.d.ts +24 -0
  60. package/dist/taxonomy.d.ts.map +1 -0
  61. package/dist/taxonomy.js +46 -0
  62. package/dist/taxonomy.js.map +1 -0
  63. package/dist/testing.d.ts +23 -0
  64. package/dist/testing.d.ts.map +1 -0
  65. package/dist/testing.js +107 -0
  66. package/dist/testing.js.map +1 -0
  67. package/dist/validate.d.ts +16 -0
  68. package/dist/validate.d.ts.map +1 -0
  69. package/dist/validate.js +122 -0
  70. package/dist/validate.js.map +1 -0
  71. package/package.json +58 -0
@@ -0,0 +1,107 @@
1
+ import { mkdirSync, mkdtempSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { stringify } from 'yaml';
5
+ import { loadBlueprints, renderIndex } from './build-index.js';
6
+ import { buildManifestJsonSchema } from './build-schema.js';
7
+ import { repoPaths } from './paths.js';
8
+ import { loadTaxonomy } from './taxonomy.js';
9
+ /** A taxonomy small enough to read in a test failure message. */
10
+ export const TEST_TAXONOMY = `
11
+ version: 1
12
+ languages:
13
+ csharp: C#
14
+ typescript: TypeScript
15
+ stack:
16
+ aspnetcore: ASP.NET Core
17
+ postgres: PostgreSQL
18
+ node: Node.js
19
+ platforms:
20
+ linux: Linux
21
+ docker: Docker
22
+ distribution:
23
+ saas: SaaS
24
+ free: Free
25
+ project_type:
26
+ api: API service
27
+ cli: Command-line tool
28
+ audience:
29
+ intermediate: Intermediate
30
+ requirements:
31
+ auth: Authentication
32
+ ci: Continuous integration
33
+ agents:
34
+ claude-code: Claude Code
35
+ tier:
36
+ community: Community
37
+ official: Official
38
+ `;
39
+ /** A manifest that passes validation, so a test only states what it changes. */
40
+ export function validManifest(overrides = {}) {
41
+ return {
42
+ schema: 1,
43
+ slug: 'sample-api',
44
+ name: 'Sample API',
45
+ version: '1.0.0',
46
+ tier: 'community',
47
+ maintainers: ['octocat'],
48
+ summary: 'A sample API blueprint used by the Forgeprint test suite.',
49
+ stack: ['aspnetcore', 'postgres'],
50
+ languages: ['csharp'],
51
+ platforms: ['linux'],
52
+ distribution: ['saas'],
53
+ project_type: 'api',
54
+ audience: ['intermediate'],
55
+ requirements: ['auth', 'ci'],
56
+ agents: ['claude-code'],
57
+ ...overrides,
58
+ };
59
+ }
60
+ /**
61
+ * Create a throwaway repository on disk. Generated artifacts are written too,
62
+ * so that `validateCatalog` starts from a clean state.
63
+ */
64
+ export function makeRepo(blueprints = []) {
65
+ const root = mkdtempSync(join(tmpdir(), 'forgeprint-test-'));
66
+ mkdirSync(join(root, 'schema'), { recursive: true });
67
+ writeFileSync(repoPaths.taxonomy(root), TEST_TAXONOMY.trimStart(), 'utf8');
68
+ for (const fixture of blueprints) {
69
+ const dir = repoPaths.blueprintDir(root, fixture.slug);
70
+ mkdirSync(dir, { recursive: true });
71
+ const manifest = fixture.manifest === undefined ? validManifest({ slug: fixture.slug }) : fixture.manifest;
72
+ const omit = new Set(fixture.omit ?? []);
73
+ const version = typeof manifest?.['version'] === 'string' ? manifest['version'] : '1.0.0';
74
+ const files = {
75
+ ...(manifest === null ? {} : { 'manifest.yaml': stringify(manifest) }),
76
+ 'AGENTS.md': `# ${fixture.slug}\n`,
77
+ 'overview.md': `# ${fixture.slug} overview\n`,
78
+ 'setup.md': '1. Do nothing.\n',
79
+ 'CHANGELOG.md': `## ${version}\n`,
80
+ ...fixture.files,
81
+ };
82
+ for (const [name, contents] of Object.entries(files)) {
83
+ if (omit.has(name))
84
+ continue;
85
+ const file = join(dir, ...name.split('/'));
86
+ mkdirSync(join(file, '..'), { recursive: true });
87
+ writeFileSync(file, contents, 'utf8');
88
+ }
89
+ }
90
+ regenerate(root);
91
+ return root;
92
+ }
93
+ /** Write the generated artifacts so drift checks pass. */
94
+ export function regenerate(root) {
95
+ const taxonomy = loadTaxonomy(root);
96
+ writeFileSync(repoPaths.manifestSchema(root), buildManifestJsonSchema(taxonomy), 'utf8');
97
+ mkdirSync(join(root, 'docs'), { recursive: true });
98
+ let blueprints;
99
+ try {
100
+ blueprints = loadBlueprints(root, taxonomy);
101
+ }
102
+ catch {
103
+ blueprints = [];
104
+ }
105
+ writeFileSync(repoPaths.index(root), renderIndex(blueprints, taxonomy), 'utf8');
106
+ }
107
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface Problem {
2
+ /** Blueprint slug, or undefined for a catalog-wide problem. */
3
+ readonly blueprint?: string;
4
+ readonly message: string;
5
+ }
6
+ export interface ValidationReport {
7
+ readonly ok: boolean;
8
+ readonly checked: number;
9
+ readonly problems: readonly Problem[];
10
+ }
11
+ /**
12
+ * Validate the whole catalog: schema conformance, required files, and the
13
+ * catalog-wide rules that no single manifest can enforce on its own.
14
+ */
15
+ export declare function validateCatalog(root: string): ValidationReport;
16
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,122 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join, sep } from 'node:path';
3
+ import { renderCodeowners } from './build-codeowners.js';
4
+ import { renderIndex } from './build-index.js';
5
+ import { buildManifestJsonSchema } from './build-schema.js';
6
+ import { listBlueprintSlugs, missingRequiredFiles, readBlueprintFolder, readManifest, } from './catalog.js';
7
+ import { loadConfig } from './config.js';
8
+ import { normalizeNewlines } from './json.js';
9
+ import { combinationKey } from './manifest.js';
10
+ import { repoPaths } from './paths.js';
11
+ import { SLUG_PATTERN, describeError, loadTaxonomy } from './taxonomy.js';
12
+ /**
13
+ * Validate the whole catalog: schema conformance, required files, and the
14
+ * catalog-wide rules that no single manifest can enforce on its own.
15
+ */
16
+ export function validateCatalog(root) {
17
+ const problems = [];
18
+ let taxonomy;
19
+ try {
20
+ taxonomy = loadTaxonomy(root);
21
+ }
22
+ catch (error) {
23
+ return { ok: false, checked: 0, problems: [{ message: describeError(error) }] };
24
+ }
25
+ const slugs = listBlueprintSlugs(root);
26
+ const blueprints = [];
27
+ for (const slug of slugs) {
28
+ const report = (message) => void problems.push({ blueprint: slug, message });
29
+ if (!SLUG_PATTERN.test(slug)) {
30
+ report('folder name must be lower kebab-case');
31
+ continue;
32
+ }
33
+ const folder = readBlueprintFolder(root, slug);
34
+ const missing = missingRequiredFiles(folder);
35
+ if (missing.length > 0)
36
+ report(`missing required file(s): ${missing.join(', ')}`);
37
+ if (missing.includes('manifest.yaml'))
38
+ continue;
39
+ let blueprint;
40
+ try {
41
+ blueprint = { ...folder, manifest: readManifest(taxonomy, folder) };
42
+ }
43
+ catch (error) {
44
+ report(`manifest.yaml: ${describeError(error)}`);
45
+ continue;
46
+ }
47
+ blueprints.push(blueprint);
48
+ const manifest = blueprint.manifest;
49
+ if (manifest.slug !== slug) {
50
+ report(`manifest slug "${manifest.slug}" does not match the folder name`);
51
+ }
52
+ if (!missing.includes('CHANGELOG.md') && !mentionsVersion(folder.dir, manifest.version)) {
53
+ report(`CHANGELOG.md has no entry for version ${manifest.version} (rule 17)`);
54
+ }
55
+ }
56
+ const known = new Set(blueprints.map((blueprint) => blueprint.slug));
57
+ const combinations = new Map();
58
+ for (const { slug, manifest } of blueprints) {
59
+ if (manifest.supersedes !== null && !known.has(manifest.supersedes)) {
60
+ problems.push({
61
+ blueprint: slug,
62
+ message: `supersedes "${manifest.supersedes}", which is not in the catalog`,
63
+ });
64
+ }
65
+ if (manifest.deprecated)
66
+ continue;
67
+ const key = combinationKey(manifest);
68
+ const owner = combinations.get(key);
69
+ if (owner === undefined) {
70
+ combinations.set(key, slug);
71
+ }
72
+ else {
73
+ problems.push({
74
+ blueprint: slug,
75
+ message: `same stack + project_type + requirements combination as "${owner}" (rule 9); supersede it instead`,
76
+ });
77
+ }
78
+ }
79
+ problems.push(...generatedFileProblems(root, blueprints, taxonomy));
80
+ return { ok: problems.length === 0, checked: slugs.length, problems };
81
+ }
82
+ /**
83
+ * Generated artifacts are committed (ADR 0002), so a stale one is a defect.
84
+ * Each check reports the command that fixes it.
85
+ */
86
+ function generatedFileProblems(root, blueprints, taxonomy) {
87
+ const problems = [];
88
+ const check = (file, expected, command) => {
89
+ if (!existsSync(file)) {
90
+ problems.push({ message: `${label(root, file)} is missing; run \`${command}\`` });
91
+ return;
92
+ }
93
+ if (normalizeNewlines(readFileSync(file, 'utf8')) !== normalizeNewlines(expected)) {
94
+ problems.push({ message: `${label(root, file)} is out of date; run \`${command}\`` });
95
+ }
96
+ };
97
+ check(repoPaths.index(root), renderIndex(blueprints, taxonomy), 'forgeprint build-index');
98
+ check(repoPaths.manifestSchema(root), buildManifestJsonSchema(taxonomy), 'forgeprint build-schema');
99
+ const coreMaintainer = loadConfig(root).core_maintainer;
100
+ if (coreMaintainer !== undefined) {
101
+ check(repoPaths.codeowners(root), renderCodeowners(blueprints, coreMaintainer), 'forgeprint build-codeowners');
102
+ }
103
+ return problems;
104
+ }
105
+ /** True when the changelog mentions the version as a standalone token. */
106
+ function mentionsVersion(dir, version) {
107
+ const changelog = readFileSync(join(dir, 'CHANGELOG.md'), 'utf8');
108
+ const isVersionChar = (char) => char !== undefined && (char === '.' || (char >= '0' && char <= '9'));
109
+ for (let at = changelog.indexOf(version); at !== -1; at = changelog.indexOf(version, at + 1)) {
110
+ if (!isVersionChar(changelog[at - 1]) && !isVersionChar(changelog[at + version.length])) {
111
+ return true;
112
+ }
113
+ }
114
+ return false;
115
+ }
116
+ function label(root, file) {
117
+ return file
118
+ .slice(root.length + 1)
119
+ .split(sep)
120
+ .join('/');
121
+ }
122
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "forgeprint",
3
+ "version": "0.1.1",
4
+ "description": "Forgeprint catalog tooling. Every pipeline step runs here, not in CI configuration.",
5
+ "keywords": [
6
+ "forgeprint",
7
+ "blueprints",
8
+ "catalog",
9
+ "cli",
10
+ "agents",
11
+ "ai-agents",
12
+ "scaffolding"
13
+ ],
14
+ "license": "SEE LICENSE IN LICENSE",
15
+ "homepage": "https://github.com/forgeprint/forgeprint#readme",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/forgeprint/forgeprint.git",
19
+ "directory": "packages/cli"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/forgeprint/forgeprint/issues"
23
+ },
24
+ "type": "module",
25
+ "bin": {
26
+ "forgeprint": "dist/bin.js"
27
+ },
28
+ "main": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "default": "./dist/index.js"
34
+ },
35
+ "./testing": {
36
+ "types": "./dist/testing.d.ts",
37
+ "default": "./dist/testing.js"
38
+ }
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "!dist/**/*.test.*"
43
+ ],
44
+ "engines": {
45
+ "node": ">=20.0.0"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "dependencies": {
51
+ "commander": "15.0.0",
52
+ "yaml": "2.9.1",
53
+ "zod": "4.6.5"
54
+ },
55
+ "scripts": {
56
+ "test": "node --test \"dist/**/*.test.js\""
57
+ }
58
+ }