@planu/cli 0.44.0 → 0.45.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/dist/config/license-plans.json +8 -2
- package/dist/config/registry-categories.json +20 -0
- package/dist/config/registry-stacks.json +16 -0
- package/dist/engine/spec-registry/adapter.d.ts +9 -0
- package/dist/engine/spec-registry/adapter.d.ts.map +1 -0
- package/dist/engine/spec-registry/adapter.js +303 -0
- package/dist/engine/spec-registry/adapter.js.map +1 -0
- package/dist/engine/spec-registry/client.d.ts +8 -0
- package/dist/engine/spec-registry/client.d.ts.map +1 -0
- package/dist/engine/spec-registry/client.js +194 -0
- package/dist/engine/spec-registry/client.js.map +1 -0
- package/dist/engine/spec-registry/index.d.ts +7 -0
- package/dist/engine/spec-registry/index.d.ts.map +1 -0
- package/dist/engine/spec-registry/index.js +7 -0
- package/dist/engine/spec-registry/index.js.map +1 -0
- package/dist/engine/spec-registry/packager.d.ts +24 -0
- package/dist/engine/spec-registry/packager.d.ts.map +1 -0
- package/dist/engine/spec-registry/packager.js +122 -0
- package/dist/engine/spec-registry/packager.js.map +1 -0
- package/dist/engine/spec-registry/scorer.d.ts +10 -0
- package/dist/engine/spec-registry/scorer.d.ts.map +1 -0
- package/dist/engine/spec-registry/scorer.js +151 -0
- package/dist/engine/spec-registry/scorer.js.map +1 -0
- package/dist/engine/spec-registry/validator.d.ts +11 -0
- package/dist/engine/spec-registry/validator.d.ts.map +1 -0
- package/dist/engine/spec-registry/validator.js +144 -0
- package/dist/engine/spec-registry/validator.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/register-spec-registry-tools.d.ts +3 -0
- package/dist/tools/register-spec-registry-tools.d.ts.map +1 -0
- package/dist/tools/register-spec-registry-tools.js +91 -0
- package/dist/tools/register-spec-registry-tools.js.map +1 -0
- package/dist/tools/registry/auth.d.ts +17 -0
- package/dist/tools/registry/auth.d.ts.map +1 -0
- package/dist/tools/registry/auth.js +132 -0
- package/dist/tools/registry/auth.js.map +1 -0
- package/dist/tools/registry/index.d.ts +5 -0
- package/dist/tools/registry/index.d.ts.map +1 -0
- package/dist/tools/registry/index.js +6 -0
- package/dist/tools/registry/index.js.map +1 -0
- package/dist/tools/registry/install.d.ts +7 -0
- package/dist/tools/registry/install.d.ts.map +1 -0
- package/dist/tools/registry/install.js +125 -0
- package/dist/tools/registry/install.js.map +1 -0
- package/dist/tools/registry/publish.d.ts +7 -0
- package/dist/tools/registry/publish.d.ts.map +1 -0
- package/dist/tools/registry/publish.js +96 -0
- package/dist/tools/registry/publish.js.map +1 -0
- package/dist/tools/registry/search.d.ts +7 -0
- package/dist/tools/registry/search.d.ts.map +1 -0
- package/dist/tools/registry/search.js +79 -0
- package/dist/tools/registry/search.js.map +1 -0
- package/dist/tools/schemas/index.d.ts +1 -0
- package/dist/tools/schemas/index.d.ts.map +1 -1
- package/dist/tools/schemas/index.js +1 -0
- package/dist/tools/schemas/index.js.map +1 -1
- package/dist/tools/schemas/spec-registry-schemas.d.ts +39 -0
- package/dist/tools/schemas/spec-registry-schemas.d.ts.map +1 -0
- package/dist/tools/schemas/spec-registry-schemas.js +72 -0
- package/dist/tools/schemas/spec-registry-schemas.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/spec-registry.d.ts +194 -0
- package/dist/types/spec-registry.d.ts.map +1 -0
- package/dist/types/spec-registry.js +3 -0
- package/dist/types/spec-registry.js.map +1 -0
- package/package.json +1 -1
- package/src/config/license-plans.json +8 -2
- package/src/config/registry-categories.json +20 -0
- package/src/config/registry-stacks.json +16 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pack a spec directory into a gzipped archive buffer.
|
|
3
|
+
* Only includes recognized spec files (spec.md, technical.md, progress.md, planu-registry.json).
|
|
4
|
+
* @param specDir - Absolute path to the spec directory.
|
|
5
|
+
* @returns Gzipped buffer containing the archived spec files.
|
|
6
|
+
*/
|
|
7
|
+
export declare function packSpec(specDir: string): Promise<Buffer>;
|
|
8
|
+
/**
|
|
9
|
+
* Unpack a gzipped archive buffer into a target directory.
|
|
10
|
+
* Creates the target directory if it does not exist.
|
|
11
|
+
* @param tarball - Gzipped buffer to extract.
|
|
12
|
+
* @param targetDir - Absolute path to extract files into.
|
|
13
|
+
*/
|
|
14
|
+
export declare function unpackSpec(tarball: Buffer, targetDir: string): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Validate a package buffer for structural correctness and size limits.
|
|
17
|
+
* @param tarball - Gzipped buffer to validate.
|
|
18
|
+
* @returns Validation result with errors array.
|
|
19
|
+
*/
|
|
20
|
+
export declare function validatePackage(tarball: Buffer): Promise<{
|
|
21
|
+
valid: boolean;
|
|
22
|
+
errors: string[];
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=packager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packager.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-registry/packager.ts"],"names":[],"mappings":"AAoBA;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B/D;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BlF;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA0C/C"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// engine/spec-registry/packager.ts — AC-3: Spec Package Format
|
|
2
|
+
// Creates and extracts gzipped JSON archives for spec packages.
|
|
3
|
+
// Format: gzip({ files: { [relativePath]: contentString } })
|
|
4
|
+
import { gzip, gunzip } from 'node:zlib';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import * as fs from 'node:fs/promises';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
const gzipAsync = promisify(gzip);
|
|
9
|
+
const gunzipAsync = promisify(gunzip);
|
|
10
|
+
/** Maximum package size in bytes (500 KB). */
|
|
11
|
+
const MAX_PACKAGE_SIZE = 500 * 1024;
|
|
12
|
+
/** Files that may be included in a spec package. */
|
|
13
|
+
const ALLOWED_FILES = ['spec.md', 'technical.md', 'progress.md', 'planu-registry.json'];
|
|
14
|
+
/**
|
|
15
|
+
* Pack a spec directory into a gzipped archive buffer.
|
|
16
|
+
* Only includes recognized spec files (spec.md, technical.md, progress.md, planu-registry.json).
|
|
17
|
+
* @param specDir - Absolute path to the spec directory.
|
|
18
|
+
* @returns Gzipped buffer containing the archived spec files.
|
|
19
|
+
*/
|
|
20
|
+
export async function packSpec(specDir) {
|
|
21
|
+
const archive = { files: {} };
|
|
22
|
+
for (const fileName of ALLOWED_FILES) {
|
|
23
|
+
const filePath = path.join(specDir, fileName);
|
|
24
|
+
try {
|
|
25
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
26
|
+
archive.files[fileName] = content;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Optional files may not exist — skip silently
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (Object.keys(archive.files).length === 0) {
|
|
33
|
+
throw new Error(`No spec files found in ${specDir}. Expected at least one of: ${ALLOWED_FILES.join(', ')}`);
|
|
34
|
+
}
|
|
35
|
+
const json = JSON.stringify(archive);
|
|
36
|
+
const compressed = await gzipAsync(Buffer.from(json, 'utf-8'));
|
|
37
|
+
if (compressed.length > MAX_PACKAGE_SIZE) {
|
|
38
|
+
throw new Error(`Package size ${compressed.length} bytes exceeds limit of ${MAX_PACKAGE_SIZE} bytes (500 KB)`);
|
|
39
|
+
}
|
|
40
|
+
return compressed;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Unpack a gzipped archive buffer into a target directory.
|
|
44
|
+
* Creates the target directory if it does not exist.
|
|
45
|
+
* @param tarball - Gzipped buffer to extract.
|
|
46
|
+
* @param targetDir - Absolute path to extract files into.
|
|
47
|
+
*/
|
|
48
|
+
export async function unpackSpec(tarball, targetDir) {
|
|
49
|
+
const decompressed = await gunzipAsync(tarball);
|
|
50
|
+
const archive = JSON.parse(decompressed.toString('utf-8'));
|
|
51
|
+
if (!archive.files || typeof archive.files !== 'object') {
|
|
52
|
+
throw new Error('Invalid archive format: missing files object');
|
|
53
|
+
}
|
|
54
|
+
// Validate paths before writing anything
|
|
55
|
+
for (const filePath of Object.keys(archive.files)) {
|
|
56
|
+
assertSafePath(filePath);
|
|
57
|
+
}
|
|
58
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
59
|
+
for (const [filePath, content] of Object.entries(archive.files)) {
|
|
60
|
+
const fullPath = path.join(targetDir, filePath);
|
|
61
|
+
// Double-check resolved path stays within target
|
|
62
|
+
const resolved = path.resolve(fullPath);
|
|
63
|
+
const resolvedTarget = path.resolve(targetDir);
|
|
64
|
+
/* v8 ignore next 2 -- path traversal guard, tested separately */
|
|
65
|
+
if (!resolved.startsWith(resolvedTarget + path.sep) && resolved !== resolvedTarget) {
|
|
66
|
+
throw new Error(`Path traversal detected: ${filePath}`);
|
|
67
|
+
}
|
|
68
|
+
await fs.writeFile(fullPath, content, 'utf-8');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Validate a package buffer for structural correctness and size limits.
|
|
73
|
+
* @param tarball - Gzipped buffer to validate.
|
|
74
|
+
* @returns Validation result with errors array.
|
|
75
|
+
*/
|
|
76
|
+
export async function validatePackage(tarball) {
|
|
77
|
+
const errors = [];
|
|
78
|
+
// Check compressed size
|
|
79
|
+
if (tarball.length > MAX_PACKAGE_SIZE) {
|
|
80
|
+
errors.push(`Package size ${tarball.length} bytes exceeds limit of ${MAX_PACKAGE_SIZE} bytes`);
|
|
81
|
+
}
|
|
82
|
+
// Try to decompress and parse
|
|
83
|
+
let archive;
|
|
84
|
+
try {
|
|
85
|
+
const decompressed = await gunzipAsync(tarball);
|
|
86
|
+
archive = JSON.parse(decompressed.toString('utf-8'));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
errors.push('Failed to decompress or parse package. Expected gzipped JSON.');
|
|
90
|
+
return { valid: false, errors };
|
|
91
|
+
}
|
|
92
|
+
/* v8 ignore start -- defensive guard for malformed archives */
|
|
93
|
+
if (!archive.files || typeof archive.files !== 'object') {
|
|
94
|
+
errors.push('Invalid archive format: missing "files" object');
|
|
95
|
+
return { valid: false, errors };
|
|
96
|
+
}
|
|
97
|
+
/* v8 ignore stop */
|
|
98
|
+
// Check for path traversal
|
|
99
|
+
for (const filePath of Object.keys(archive.files)) {
|
|
100
|
+
if (filePath.includes('..') || path.isAbsolute(filePath)) {
|
|
101
|
+
errors.push(`Unsafe path detected: ${filePath}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Check required files
|
|
105
|
+
if (!archive.files['spec.md']) {
|
|
106
|
+
errors.push('Missing required file: spec.md');
|
|
107
|
+
}
|
|
108
|
+
if (!archive.files['planu-registry.json']) {
|
|
109
|
+
errors.push('Missing required file: planu-registry.json');
|
|
110
|
+
}
|
|
111
|
+
return { valid: errors.length === 0, errors };
|
|
112
|
+
}
|
|
113
|
+
/** Assert that a file path is safe (no traversal, not absolute). */
|
|
114
|
+
function assertSafePath(filePath) {
|
|
115
|
+
if (filePath.includes('..')) {
|
|
116
|
+
throw new Error(`Path traversal detected in archive: ${filePath}`);
|
|
117
|
+
}
|
|
118
|
+
if (path.isAbsolute(filePath)) {
|
|
119
|
+
throw new Error(`Absolute path detected in archive: ${filePath}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=packager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packager.js","sourceRoot":"","sources":["../../../src/engine/spec-registry/packager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ScoreBreakdown } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Calculate a completeness score (0-100) for a spec directory.
|
|
4
|
+
* Reads spec.md and technical.md, evaluates 6 quality categories.
|
|
5
|
+
*/
|
|
6
|
+
export declare function calculateCompletenessScore(specDir: string): Promise<{
|
|
7
|
+
score: number;
|
|
8
|
+
breakdown: ScoreBreakdown;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-registry/scorer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAmJ3D;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,CAAC,CAwBvD"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// engine/spec-registry/scorer.ts — Spec completeness scorer for SPEC-128.
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Helpers
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
async function readFileOrEmpty(path) {
|
|
8
|
+
try {
|
|
9
|
+
return await readFile(path, 'utf-8');
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return '';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Count lines matching `- [ ]` or `- [x]` (acceptance criteria checkboxes). */
|
|
16
|
+
function scoreAcceptanceCriteria(specContent) {
|
|
17
|
+
const matches = specContent.match(/^[\s]*- \[[x ]\]/gm);
|
|
18
|
+
const count = matches?.length ?? 0;
|
|
19
|
+
if (count >= 8) {
|
|
20
|
+
return 20;
|
|
21
|
+
}
|
|
22
|
+
if (count >= 4) {
|
|
23
|
+
return 15;
|
|
24
|
+
}
|
|
25
|
+
if (count >= 1) {
|
|
26
|
+
return 10;
|
|
27
|
+
}
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
/** Check for a risk section header and whether it has content. */
|
|
31
|
+
function scoreRisks(specContent) {
|
|
32
|
+
const riskHeaderIdx = specContent.search(/^#{1,4}\s+.*(?:riesgo|risk)/im);
|
|
33
|
+
if (riskHeaderIdx === -1) {
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
// Grab text after the risk header until the next header or end
|
|
37
|
+
const afterHeader = specContent.slice(riskHeaderIdx);
|
|
38
|
+
const nextHeader = afterHeader.search(/\n#{1,4}\s+/);
|
|
39
|
+
const section = nextHeader === -1 ? afterHeader : afterHeader.slice(0, nextHeader);
|
|
40
|
+
const bodyLines = section
|
|
41
|
+
.split('\n')
|
|
42
|
+
.slice(1)
|
|
43
|
+
.filter((l) => l.trim().length > 0);
|
|
44
|
+
return bodyLines.length > 0 ? 15 : 5;
|
|
45
|
+
}
|
|
46
|
+
/** Check for testing strategy mentions. */
|
|
47
|
+
function scoreTestingStrategy(specContent, technicalContent) {
|
|
48
|
+
const combined = `${specContent}\n${technicalContent}`;
|
|
49
|
+
// Look for a dedicated testing section header
|
|
50
|
+
const hasTestSection = /^#{1,4}\s+.*(?:test|prueba)/im.test(combined);
|
|
51
|
+
if (hasTestSection) {
|
|
52
|
+
return 15;
|
|
53
|
+
}
|
|
54
|
+
// Look for inline test references
|
|
55
|
+
const testMentions = combined.match(/\b(?:test|prueba|jest|vitest|coverage)\b/gi);
|
|
56
|
+
if (testMentions && testMentions.length >= 2) {
|
|
57
|
+
return 8;
|
|
58
|
+
}
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
/** Check for a files/archivos listing. */
|
|
62
|
+
function scoreKeyFiles(specContent, technicalContent) {
|
|
63
|
+
const combined = `${specContent}\n${technicalContent}`;
|
|
64
|
+
const filesHeaderIdx = combined.search(/^#{1,4}\s+.*(?:archivos|files)/im);
|
|
65
|
+
if (filesHeaderIdx === -1) {
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
const afterHeader = combined.slice(filesHeaderIdx);
|
|
69
|
+
const nextHeader = afterHeader.search(/\n#{1,4}\s+/);
|
|
70
|
+
const section = nextHeader === -1 ? afterHeader : afterHeader.slice(0, nextHeader);
|
|
71
|
+
// Count file-like entries (lines with paths or table rows with file refs)
|
|
72
|
+
const fileEntries = section.match(/[`|]\S+\.\w{1,5}[`|]|^\s*[-|]\s*\S+\.\w{1,5}/gm);
|
|
73
|
+
const count = fileEntries?.length ?? 0;
|
|
74
|
+
if (count >= 3) {
|
|
75
|
+
return 15;
|
|
76
|
+
}
|
|
77
|
+
if (count >= 1) {
|
|
78
|
+
return 8;
|
|
79
|
+
}
|
|
80
|
+
/* v8 ignore next -- files header present but no file-like entries */
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
/** Score technical.md based on existence and length. */
|
|
84
|
+
function scoreTechnicalCompleteness(technicalContent) {
|
|
85
|
+
if (!technicalContent) {
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
const lines = technicalContent.split('\n');
|
|
89
|
+
const lineCount = lines.length;
|
|
90
|
+
// Check for metadata table (lines with `|`)
|
|
91
|
+
const hasMetaTable = lines.some((l) => /^\|.*\|.*\|/.test(l));
|
|
92
|
+
if (hasMetaTable && lineCount > 50) {
|
|
93
|
+
return 20;
|
|
94
|
+
}
|
|
95
|
+
if (lineCount > 50) {
|
|
96
|
+
return 15;
|
|
97
|
+
}
|
|
98
|
+
if (lineCount > 10) {
|
|
99
|
+
return 10;
|
|
100
|
+
}
|
|
101
|
+
return 5;
|
|
102
|
+
}
|
|
103
|
+
/** Parse YAML frontmatter and check for required fields. */
|
|
104
|
+
function scoreFrontmatter(specContent) {
|
|
105
|
+
const fmMatch = /^---\r?\n([\s\S]*?)\r?\n---/.exec(specContent);
|
|
106
|
+
if (!fmMatch) {
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
const fmBlock = fmMatch[1] ?? '';
|
|
110
|
+
const requiredFields = ['id', 'title', 'type', 'status', 'priority', 'difficulty'];
|
|
111
|
+
const presentCount = requiredFields.filter((field) => new RegExp(`^${field}\\s*:`, 'm').test(fmBlock)).length;
|
|
112
|
+
if (presentCount >= 6) {
|
|
113
|
+
return 15;
|
|
114
|
+
}
|
|
115
|
+
if (presentCount >= 4) {
|
|
116
|
+
return 10;
|
|
117
|
+
}
|
|
118
|
+
if (presentCount >= 2) {
|
|
119
|
+
return 5;
|
|
120
|
+
}
|
|
121
|
+
return 0;
|
|
122
|
+
}
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Public API
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
/**
|
|
127
|
+
* Calculate a completeness score (0-100) for a spec directory.
|
|
128
|
+
* Reads spec.md and technical.md, evaluates 6 quality categories.
|
|
129
|
+
*/
|
|
130
|
+
export async function calculateCompletenessScore(specDir) {
|
|
131
|
+
const [specContent, technicalContent] = await Promise.all([
|
|
132
|
+
readFileOrEmpty(join(specDir, 'spec.md')),
|
|
133
|
+
readFileOrEmpty(join(specDir, 'technical.md')),
|
|
134
|
+
]);
|
|
135
|
+
const breakdown = {
|
|
136
|
+
acceptanceCriteria: scoreAcceptanceCriteria(specContent),
|
|
137
|
+
risksDocumented: scoreRisks(specContent),
|
|
138
|
+
testingStrategy: scoreTestingStrategy(specContent, technicalContent),
|
|
139
|
+
keyFiles: scoreKeyFiles(specContent, technicalContent),
|
|
140
|
+
technicalCompleteness: scoreTechnicalCompleteness(technicalContent),
|
|
141
|
+
frontmatterFields: scoreFrontmatter(specContent),
|
|
142
|
+
};
|
|
143
|
+
const score = breakdown.acceptanceCriteria +
|
|
144
|
+
breakdown.risksDocumented +
|
|
145
|
+
breakdown.testingStrategy +
|
|
146
|
+
breakdown.keyFiles +
|
|
147
|
+
breakdown.technicalCompleteness +
|
|
148
|
+
breakdown.frontmatterFields;
|
|
149
|
+
return { score, breakdown };
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../../src/engine/spec-registry/scorer.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,SAAS,uBAAuB,CAAC,WAAmB;IAClD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;IACnC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,kEAAkE;AAClE,SAAS,UAAU,CAAC,WAAmB;IACrC,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC;IAC1E,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,+DAA+D;IAC/D,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,OAAO;SACtB,KAAK,CAAC,IAAI,CAAC;SACX,KAAK,CAAC,CAAC,CAAC;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEtC,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,2CAA2C;AAC3C,SAAS,oBAAoB,CAAC,WAAmB,EAAE,gBAAwB;IACzE,MAAM,QAAQ,GAAG,GAAG,WAAW,KAAK,gBAAgB,EAAE,CAAC;IAEvD,8CAA8C;IAC9C,MAAM,cAAc,GAAG,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtE,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAClF,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,0CAA0C;AAC1C,SAAS,aAAa,CAAC,WAAmB,EAAE,gBAAwB;IAClE,MAAM,QAAQ,GAAG,GAAG,WAAW,KAAK,gBAAgB,EAAE,CAAC;IAEvD,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC;IAC3E,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAEnF,0EAA0E;IAC1E,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC;IAEvC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;IACD,qEAAqE;IACrE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,wDAAwD;AACxD,SAAS,0BAA0B,CAAC,gBAAwB;IAC1D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;IAE/B,4CAA4C;IAC5C,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,YAAY,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,4DAA4D;AAC5D,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,MAAM,OAAO,GAAG,6BAA6B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IACnF,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CACnD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAChD,CAAC,MAAM,CAAC;IAET,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAe;IAEf,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxD,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;KAC/C,CAAC,CAAC;IAEH,MAAM,SAAS,GAAmB;QAChC,kBAAkB,EAAE,uBAAuB,CAAC,WAAW,CAAC;QACxD,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC;QACxC,eAAe,EAAE,oBAAoB,CAAC,WAAW,EAAE,gBAAgB,CAAC;QACpE,QAAQ,EAAE,aAAa,CAAC,WAAW,EAAE,gBAAgB,CAAC;QACtD,qBAAqB,EAAE,0BAA0B,CAAC,gBAAgB,CAAC;QACnE,iBAAiB,EAAE,gBAAgB,CAAC,WAAW,CAAC;KACjD,CAAC;IAEF,MAAM,KAAK,GACT,SAAS,CAAC,kBAAkB;QAC5B,SAAS,CAAC,eAAe;QACzB,SAAS,CAAC,eAAe;QACzB,SAAS,CAAC,QAAQ;QAClB,SAAS,CAAC,qBAAqB;QAC/B,SAAS,CAAC,iBAAiB,CAAC;IAE9B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate a spec directory for publishing to the registry.
|
|
3
|
+
* Checks file existence, frontmatter fields, manifest structure, semver format, and size limits.
|
|
4
|
+
* @param specDir - Absolute path to the spec directory to validate.
|
|
5
|
+
* @returns Validation result with detailed error messages for each failure.
|
|
6
|
+
*/
|
|
7
|
+
export declare function validateForPublish(specDir: string): Promise<{
|
|
8
|
+
valid: boolean;
|
|
9
|
+
errors: string[];
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-registry/validator.ts"],"names":[],"mappings":"AAkCA;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqB/C"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// engine/spec-registry/validator.ts — AC-4: Pre-publish Validation
|
|
2
|
+
// Validates a spec directory before publishing to the registry.
|
|
3
|
+
import * as fs from 'node:fs/promises';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
/** Maximum total size of all spec files combined (500 KB). */
|
|
6
|
+
const MAX_TOTAL_SIZE = 500 * 1024;
|
|
7
|
+
/** Semver regex (simplified: major.minor.patch with optional pre-release). */
|
|
8
|
+
const SEMVER_RE = /^\d+\.\d+\.\d+(-[\w.]+)?$/;
|
|
9
|
+
/** Required files in a publishable spec directory. */
|
|
10
|
+
const REQUIRED_FILES = ['spec.md', 'technical.md', 'progress.md'];
|
|
11
|
+
/** Required fields in the planu-registry.json manifest. */
|
|
12
|
+
const REQUIRED_MANIFEST_FIELDS = [
|
|
13
|
+
'name',
|
|
14
|
+
'org',
|
|
15
|
+
'version',
|
|
16
|
+
'description',
|
|
17
|
+
'category',
|
|
18
|
+
'stack',
|
|
19
|
+
'difficulty',
|
|
20
|
+
'estimatedHours',
|
|
21
|
+
'tags',
|
|
22
|
+
];
|
|
23
|
+
/** Required frontmatter fields in spec.md. */
|
|
24
|
+
const REQUIRED_FRONTMATTER_FIELDS = ['id', 'title', 'type', 'status'];
|
|
25
|
+
/** Simple frontmatter regex: extracts YAML block between --- delimiters. */
|
|
26
|
+
const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---/;
|
|
27
|
+
/**
|
|
28
|
+
* Validate a spec directory for publishing to the registry.
|
|
29
|
+
* Checks file existence, frontmatter fields, manifest structure, semver format, and size limits.
|
|
30
|
+
* @param specDir - Absolute path to the spec directory to validate.
|
|
31
|
+
* @returns Validation result with detailed error messages for each failure.
|
|
32
|
+
*/
|
|
33
|
+
export async function validateForPublish(specDir) {
|
|
34
|
+
const errors = [];
|
|
35
|
+
// Check required files exist
|
|
36
|
+
for (const file of REQUIRED_FILES) {
|
|
37
|
+
const exists = await fileExists(path.join(specDir, file));
|
|
38
|
+
if (!exists) {
|
|
39
|
+
errors.push(`Missing required file: ${file}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Validate spec.md frontmatter
|
|
43
|
+
await validateFrontmatter(specDir, errors);
|
|
44
|
+
// Validate planu-registry.json manifest
|
|
45
|
+
await validateManifest(specDir, errors);
|
|
46
|
+
// Check total size
|
|
47
|
+
await validateTotalSize(specDir, errors);
|
|
48
|
+
return { valid: errors.length === 0, errors };
|
|
49
|
+
}
|
|
50
|
+
/** Validate that spec.md has required frontmatter fields. */
|
|
51
|
+
async function validateFrontmatter(specDir, errors) {
|
|
52
|
+
const specPath = path.join(specDir, 'spec.md');
|
|
53
|
+
let content;
|
|
54
|
+
try {
|
|
55
|
+
content = await fs.readFile(specPath, 'utf-8');
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Already reported as missing file
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const match = FRONTMATTER_RE.exec(content);
|
|
62
|
+
if (!match?.[1]) {
|
|
63
|
+
errors.push('spec.md is missing YAML frontmatter (expected --- delimiters)');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const frontmatter = match[1];
|
|
67
|
+
for (const field of REQUIRED_FRONTMATTER_FIELDS) {
|
|
68
|
+
const fieldRegex = new RegExp(`^${field}:\\s*.+`, 'm');
|
|
69
|
+
if (!fieldRegex.test(frontmatter)) {
|
|
70
|
+
errors.push(`spec.md frontmatter missing required field: ${field}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Validate planu-registry.json manifest existence and required fields. */
|
|
75
|
+
async function validateManifest(specDir, errors) {
|
|
76
|
+
const manifestPath = path.join(specDir, 'planu-registry.json');
|
|
77
|
+
let raw;
|
|
78
|
+
try {
|
|
79
|
+
raw = await fs.readFile(manifestPath, 'utf-8');
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
errors.push('Missing required file: planu-registry.json');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
let manifest;
|
|
86
|
+
try {
|
|
87
|
+
manifest = JSON.parse(raw);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
errors.push('planu-registry.json contains invalid JSON');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
for (const field of REQUIRED_MANIFEST_FIELDS) {
|
|
94
|
+
if (manifest[field] === undefined || manifest[field] === null || manifest[field] === '') {
|
|
95
|
+
errors.push(`planu-registry.json missing required field: ${field}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Validate semver format
|
|
99
|
+
if (typeof manifest.version === 'string' && !SEMVER_RE.test(manifest.version)) {
|
|
100
|
+
errors.push(`Invalid version format in planu-registry.json: "${manifest.version}". Expected semver (e.g., 1.0.0)`);
|
|
101
|
+
}
|
|
102
|
+
// Validate stack is an array
|
|
103
|
+
if (manifest.stack !== undefined && !Array.isArray(manifest.stack)) {
|
|
104
|
+
errors.push('planu-registry.json "stack" must be an array of strings');
|
|
105
|
+
}
|
|
106
|
+
// Validate tags is an array
|
|
107
|
+
if (manifest.tags !== undefined && !Array.isArray(manifest.tags)) {
|
|
108
|
+
errors.push('planu-registry.json "tags" must be an array of strings');
|
|
109
|
+
}
|
|
110
|
+
// Validate difficulty range
|
|
111
|
+
if (typeof manifest.difficulty === 'number') {
|
|
112
|
+
if (manifest.difficulty < 1 || manifest.difficulty > 5) {
|
|
113
|
+
errors.push('planu-registry.json "difficulty" must be between 1 and 5');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Check that total size of spec files does not exceed limit. */
|
|
118
|
+
async function validateTotalSize(specDir, errors) {
|
|
119
|
+
const allFiles = [...REQUIRED_FILES, 'planu-registry.json'];
|
|
120
|
+
let totalSize = 0;
|
|
121
|
+
for (const file of allFiles) {
|
|
122
|
+
try {
|
|
123
|
+
const stat = await fs.stat(path.join(specDir, file));
|
|
124
|
+
totalSize += stat.size;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// File doesn't exist — already reported
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (totalSize > MAX_TOTAL_SIZE) {
|
|
131
|
+
errors.push(`Total spec size ${totalSize} bytes exceeds limit of ${MAX_TOTAL_SIZE} bytes (500 KB)`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** Check if a file exists at the given path. */
|
|
135
|
+
async function fileExists(filePath) {
|
|
136
|
+
try {
|
|
137
|
+
await fs.access(filePath);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/engine/spec-registry/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -75,6 +75,7 @@ import { registerWorkspaceTools } from './tools/register-workspace-tools.js';
|
|
|
75
75
|
import { registerExportTools } from './tools/register-export-tools.js';
|
|
76
76
|
import { registerLivingSpecTools } from './tools/register-living-spec-tools.js';
|
|
77
77
|
import { registerLivingSpecAdvancedTools } from './tools/register-living-spec-advanced-tools.js';
|
|
78
|
+
import { registerSpecRegistryTools } from './tools/register-spec-registry-tools.js';
|
|
78
79
|
import { PLANU_VERSION } from './config/version.js';
|
|
79
80
|
import { handleActivateLicense } from './tools/activate-license.js';
|
|
80
81
|
import { GroupManager } from './engine/tool-groups/group-manager.js';
|
|
@@ -185,6 +186,7 @@ function createMcpServer() {
|
|
|
185
186
|
registerExportTools(s);
|
|
186
187
|
registerLivingSpecTools(s);
|
|
187
188
|
registerLivingSpecAdvancedTools(s);
|
|
189
|
+
registerSpecRegistryTools(s);
|
|
188
190
|
registerPrompts(s);
|
|
189
191
|
return s;
|
|
190
192
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-spec-registry-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-spec-registry-tools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsHjE"}
|