@planu/cli 0.96.5 → 0.97.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/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +3 -1
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/config/compliance-profiles.json +62 -0
- package/dist/config/license-plans.json +18 -2
- package/dist/config/spec-templates/crud-rest-api/spec.md +35 -0
- package/dist/config/spec-templates/crud-rest-api/template.json +10 -0
- package/dist/config/spec-templates/email-notifications/spec.md +31 -0
- package/dist/config/spec-templates/email-notifications/template.json +10 -0
- package/dist/config/spec-templates/file-upload-s3/spec.md +31 -0
- package/dist/config/spec-templates/file-upload-s3/template.json +11 -0
- package/dist/config/spec-templates/jwt-auth/spec.md +35 -0
- package/dist/config/spec-templates/jwt-auth/template.json +10 -0
- package/dist/config/spec-templates/oauth-social-login/spec.md +31 -0
- package/dist/config/spec-templates/oauth-social-login/template.json +10 -0
- package/dist/config/spec-templates/rate-limiting/spec.md +31 -0
- package/dist/config/spec-templates/rate-limiting/template.json +10 -0
- package/dist/config/spec-templates/stripe-payments/spec.md +32 -0
- package/dist/config/spec-templates/stripe-payments/template.json +10 -0
- package/dist/config/spec-templates/webhook-system/spec.md +36 -0
- package/dist/config/spec-templates/webhook-system/template.json +10 -0
- package/dist/engine/agent-ready-exporter/formatters/devin.d.ts +7 -0
- package/dist/engine/agent-ready-exporter/formatters/devin.d.ts.map +1 -0
- package/dist/engine/agent-ready-exporter/formatters/devin.js +23 -0
- package/dist/engine/agent-ready-exporter/formatters/devin.js.map +1 -0
- package/dist/engine/agent-ready-exporter/formatters/generic.d.ts +7 -0
- package/dist/engine/agent-ready-exporter/formatters/generic.d.ts.map +1 -0
- package/dist/engine/agent-ready-exporter/formatters/generic.js +9 -0
- package/dist/engine/agent-ready-exporter/formatters/generic.js.map +1 -0
- package/dist/engine/agent-ready-exporter/formatters/kiro.d.ts +6 -0
- package/dist/engine/agent-ready-exporter/formatters/kiro.d.ts.map +1 -0
- package/dist/engine/agent-ready-exporter/formatters/kiro.js +34 -0
- package/dist/engine/agent-ready-exporter/formatters/kiro.js.map +1 -0
- package/dist/engine/agent-ready-exporter/formatters/swe-agent.d.ts +6 -0
- package/dist/engine/agent-ready-exporter/formatters/swe-agent.d.ts.map +1 -0
- package/dist/engine/agent-ready-exporter/formatters/swe-agent.js +40 -0
- package/dist/engine/agent-ready-exporter/formatters/swe-agent.js.map +1 -0
- package/dist/engine/agent-ready-exporter.d.ts +11 -0
- package/dist/engine/agent-ready-exporter.d.ts.map +1 -0
- package/dist/engine/agent-ready-exporter.js +86 -0
- package/dist/engine/agent-ready-exporter.js.map +1 -0
- package/dist/engine/compliance-checker.d.ts +19 -0
- package/dist/engine/compliance-checker.d.ts.map +1 -0
- package/dist/engine/compliance-checker.js +145 -0
- package/dist/engine/compliance-checker.js.map +1 -0
- package/dist/engine/generate-tests/generators/property-based-generator.d.ts +12 -0
- package/dist/engine/generate-tests/generators/property-based-generator.d.ts.map +1 -0
- package/dist/engine/generate-tests/generators/property-based-generator.js +159 -0
- package/dist/engine/generate-tests/generators/property-based-generator.js.map +1 -0
- package/dist/engine/jira-exporter.d.ts +39 -0
- package/dist/engine/jira-exporter.d.ts.map +1 -0
- package/dist/engine/jira-exporter.js +190 -0
- package/dist/engine/jira-exporter.js.map +1 -0
- package/dist/engine/linear-exporter.d.ts +32 -0
- package/dist/engine/linear-exporter.d.ts.map +1 -0
- package/dist/engine/linear-exporter.js +184 -0
- package/dist/engine/linear-exporter.js.map +1 -0
- package/dist/engine/property-test-generator.d.ts +14 -0
- package/dist/engine/property-test-generator.d.ts.map +1 -0
- package/dist/engine/property-test-generator.js +223 -0
- package/dist/engine/property-test-generator.js.map +1 -0
- package/dist/engine/skill-evaluator.d.ts +21 -0
- package/dist/engine/skill-evaluator.d.ts.map +1 -0
- package/dist/engine/skill-evaluator.js +126 -0
- package/dist/engine/skill-evaluator.js.map +1 -0
- package/dist/engine/spec-quality-scorer.d.ts +4 -0
- package/dist/engine/spec-quality-scorer.d.ts.map +1 -0
- package/dist/engine/spec-quality-scorer.js +334 -0
- package/dist/engine/spec-quality-scorer.js.map +1 -0
- package/dist/engine/spec-template-engine.d.ts +26 -0
- package/dist/engine/spec-template-engine.d.ts.map +1 -0
- package/dist/engine/spec-template-engine.js +127 -0
- package/dist/engine/spec-template-engine.js.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/compliance-store.d.ts +11 -0
- package/dist/storage/compliance-store.d.ts.map +1 -0
- package/dist/storage/compliance-store.js +30 -0
- package/dist/storage/compliance-store.js.map +1 -0
- package/dist/storage/jira-store.d.ts +30 -0
- package/dist/storage/jira-store.d.ts.map +1 -0
- package/dist/storage/jira-store.js +84 -0
- package/dist/storage/jira-store.js.map +1 -0
- package/dist/storage/linear-store.d.ts +30 -0
- package/dist/storage/linear-store.d.ts.map +1 -0
- package/dist/storage/linear-store.js +84 -0
- package/dist/storage/linear-store.js.map +1 -0
- package/dist/tools/check-readiness.d.ts.map +1 -1
- package/dist/tools/check-readiness.js +8 -2
- package/dist/tools/check-readiness.js.map +1 -1
- package/dist/tools/compliance-handler.d.ts +6 -0
- package/dist/tools/compliance-handler.d.ts.map +1 -0
- package/dist/tools/compliance-handler.js +99 -0
- package/dist/tools/compliance-handler.js.map +1 -0
- package/dist/tools/eval-skill-handler.d.ts +4 -0
- package/dist/tools/eval-skill-handler.d.ts.map +1 -0
- package/dist/tools/eval-skill-handler.js +26 -0
- package/dist/tools/eval-skill-handler.js.map +1 -0
- package/dist/tools/export-spec.d.ts.map +1 -1
- package/dist/tools/export-spec.js +42 -1
- package/dist/tools/export-spec.js.map +1 -1
- package/dist/tools/generate-tests/generators/property-based-generator.d.ts +11 -0
- package/dist/tools/generate-tests/generators/property-based-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/property-based-generator.js +27 -0
- package/dist/tools/generate-tests/generators/property-based-generator.js.map +1 -0
- package/dist/tools/generate-tests/spec-dispatcher.d.ts +5 -0
- package/dist/tools/generate-tests/spec-dispatcher.d.ts.map +1 -1
- package/dist/tools/generate-tests/spec-dispatcher.js +18 -1
- package/dist/tools/generate-tests/spec-dispatcher.js.map +1 -1
- package/dist/tools/jira-sync-handler.d.ts +6 -0
- package/dist/tools/jira-sync-handler.d.ts.map +1 -0
- package/dist/tools/jira-sync-handler.js +220 -0
- package/dist/tools/jira-sync-handler.js.map +1 -0
- package/dist/tools/linear-sync-handler.d.ts +6 -0
- package/dist/tools/linear-sync-handler.d.ts.map +1 -0
- package/dist/tools/linear-sync-handler.js +212 -0
- package/dist/tools/linear-sync-handler.js.map +1 -0
- package/dist/tools/register-export-tools.d.ts.map +1 -1
- package/dist/tools/register-export-tools.js +10 -3
- package/dist/tools/register-export-tools.js.map +1 -1
- package/dist/tools/register-spec-314.d.ts +3 -0
- package/dist/tools/register-spec-314.d.ts.map +1 -0
- package/dist/tools/register-spec-314.js +38 -0
- package/dist/tools/register-spec-314.js.map +1 -0
- package/dist/tools/register-spec-316.d.ts +3 -0
- package/dist/tools/register-spec-316.d.ts.map +1 -0
- package/dist/tools/register-spec-316.js +71 -0
- package/dist/tools/register-spec-316.js.map +1 -0
- package/dist/tools/register-spec-317.d.ts +3 -0
- package/dist/tools/register-spec-317.d.ts.map +1 -0
- package/dist/tools/register-spec-317.js +158 -0
- package/dist/tools/register-spec-317.js.map +1 -0
- package/dist/tools/register-spec-319.d.ts +3 -0
- package/dist/tools/register-spec-319.d.ts.map +1 -0
- package/dist/tools/register-spec-319.js +59 -0
- package/dist/tools/register-spec-319.js.map +1 -0
- package/dist/tools/register-spec-320.d.ts +3 -0
- package/dist/tools/register-spec-320.d.ts.map +1 -0
- package/dist/tools/register-spec-320.js +60 -0
- package/dist/tools/register-spec-320.js.map +1 -0
- package/dist/tools/spec-marketplace-handler.d.ts +6 -0
- package/dist/tools/spec-marketplace-handler.d.ts.map +1 -0
- package/dist/tools/spec-marketplace-handler.js +113 -0
- package/dist/tools/spec-marketplace-handler.js.map +1 -0
- package/dist/tools/spec-quality-score-handler.d.ts +7 -0
- package/dist/tools/spec-quality-score-handler.d.ts.map +1 -0
- package/dist/tools/spec-quality-score-handler.js +106 -0
- package/dist/tools/spec-quality-score-handler.js.map +1 -0
- package/dist/types/agent-ready.d.ts +58 -0
- package/dist/types/agent-ready.d.ts.map +1 -0
- package/dist/types/agent-ready.js +3 -0
- package/dist/types/agent-ready.js.map +1 -0
- package/dist/types/compliance.d.ts +44 -0
- package/dist/types/compliance.d.ts.map +1 -0
- package/dist/types/compliance.js +3 -0
- package/dist/types/compliance.js.map +1 -0
- package/dist/types/export.d.ts +5 -1
- package/dist/types/export.d.ts.map +1 -1
- package/dist/types/export.js +1 -1
- package/dist/types/export.js.map +1 -1
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/jira-linear.d.ts +216 -0
- package/dist/types/jira-linear.d.ts.map +1 -0
- package/dist/types/jira-linear.js +3 -0
- package/dist/types/jira-linear.js.map +1 -0
- package/dist/types/property-testing.d.ts +50 -0
- package/dist/types/property-testing.d.ts.map +1 -0
- package/dist/types/property-testing.js +3 -0
- package/dist/types/property-testing.js.map +1 -0
- package/dist/types/skill-eval.d.ts +41 -0
- package/dist/types/skill-eval.d.ts.map +1 -0
- package/dist/types/skill-eval.js +3 -0
- package/dist/types/skill-eval.js.map +1 -0
- package/dist/types/spec-marketplace.d.ts +31 -0
- package/dist/types/spec-marketplace.d.ts.map +1 -0
- package/dist/types/spec-marketplace.js +3 -0
- package/dist/types/spec-marketplace.js.map +1 -0
- package/dist/types/spec-quality.d.ts +36 -0
- package/dist/types/spec-quality.d.ts.map +1 -0
- package/dist/types/spec-quality.js +3 -0
- package/dist/types/spec-quality.js.map +1 -0
- package/package.json +7 -2
- package/src/config/compliance-profiles.json +62 -0
- package/src/config/license-plans.json +18 -2
- package/src/config/spec-templates/crud-rest-api/spec.md +35 -0
- package/src/config/spec-templates/crud-rest-api/template.json +10 -0
- package/src/config/spec-templates/email-notifications/spec.md +31 -0
- package/src/config/spec-templates/email-notifications/template.json +10 -0
- package/src/config/spec-templates/file-upload-s3/spec.md +31 -0
- package/src/config/spec-templates/file-upload-s3/template.json +11 -0
- package/src/config/spec-templates/jwt-auth/spec.md +35 -0
- package/src/config/spec-templates/jwt-auth/template.json +10 -0
- package/src/config/spec-templates/oauth-social-login/spec.md +31 -0
- package/src/config/spec-templates/oauth-social-login/template.json +10 -0
- package/src/config/spec-templates/rate-limiting/spec.md +31 -0
- package/src/config/spec-templates/rate-limiting/template.json +10 -0
- package/src/config/spec-templates/stripe-payments/spec.md +32 -0
- package/src/config/spec-templates/stripe-payments/template.json +10 -0
- package/src/config/spec-templates/webhook-system/spec.md +36 -0
- package/src/config/spec-templates/webhook-system/template.json +10 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-test-generator.js","sourceRoot":"","sources":["../../src/engine/property-test-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { EvalScenario, SkillEvalResult } from '../types/skill-eval.js';
|
|
2
|
+
/**
|
|
3
|
+
* Evaluate a skill file at the given path against the provided scenarios.
|
|
4
|
+
* Reads .claude/skills/{skillName}.md from the skill path.
|
|
5
|
+
*/
|
|
6
|
+
export declare function evaluateSkill(skillPath: string, scenarios: EvalScenario[]): Promise<SkillEvalResult>;
|
|
7
|
+
/**
|
|
8
|
+
* Evaluate a rule file at the given path against the provided scenarios.
|
|
9
|
+
* Reads .claude/rules/{ruleName}.md from the rule path.
|
|
10
|
+
*/
|
|
11
|
+
export declare function evaluateRule(rulePath: string, scenarios: EvalScenario[]): Promise<SkillEvalResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the absolute path to a skill file under a project root.
|
|
14
|
+
* Returns the resolved path (may not exist yet — caller decides how to handle).
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveSkillPath(projectPath: string, skillName: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the absolute path to a rule file under a project root.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveRulePath(projectPath: string, ruleName: string): string;
|
|
21
|
+
//# sourceMappingURL=skill-evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-evaluator.d.ts","sourceRoot":"","sources":["../../src/engine/skill-evaluator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAkB,eAAe,EAAE,MAAM,wBAAwB,CAAC;AA8H5F;;;GAGG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,YAAY,EAAE,GACxB,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,YAAY,EAAE,GACxB,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG7E"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// engine/skill-evaluator.ts — Evaluates skill and rule quality against test scenarios (SPEC-316)
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Internal helpers
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
/**
|
|
9
|
+
* Read a file from disk, returning empty string if it does not exist.
|
|
10
|
+
*/
|
|
11
|
+
async function readContent(filePath) {
|
|
12
|
+
if (!existsSync(filePath)) {
|
|
13
|
+
return '';
|
|
14
|
+
}
|
|
15
|
+
return readFile(filePath, 'utf-8');
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Evaluate a single scenario against the given content.
|
|
19
|
+
* A criterion passes if it appears (case-insensitive) somewhere in the content
|
|
20
|
+
* OR in the expectedOutput section of the content.
|
|
21
|
+
*/
|
|
22
|
+
function evaluateScenario(content, scenario) {
|
|
23
|
+
const lower = content.toLowerCase();
|
|
24
|
+
const expectedLower = scenario.expectedOutput.toLowerCase();
|
|
25
|
+
const failures = [];
|
|
26
|
+
for (const criterion of scenario.criteria) {
|
|
27
|
+
const criterionLower = criterion.toLowerCase();
|
|
28
|
+
const inContent = lower.includes(criterionLower);
|
|
29
|
+
const inExpected = expectedLower.includes(criterionLower);
|
|
30
|
+
if (!inContent && !inExpected) {
|
|
31
|
+
failures.push(criterion);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const total = scenario.criteria.length;
|
|
35
|
+
const passed = total - failures.length;
|
|
36
|
+
const score = total === 0 ? 1.0 : passed / total;
|
|
37
|
+
return {
|
|
38
|
+
input: scenario.input,
|
|
39
|
+
passed: failures.length === 0,
|
|
40
|
+
score,
|
|
41
|
+
failures,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build recommendations based on scenario results.
|
|
46
|
+
*/
|
|
47
|
+
function buildRecommendations(skillName, results, passRate) {
|
|
48
|
+
const recommendations = [];
|
|
49
|
+
if (passRate < 0.5) {
|
|
50
|
+
recommendations.push(`${skillName} covers fewer than half of tested scenarios — consider a major revision.`);
|
|
51
|
+
}
|
|
52
|
+
else if (passRate < 0.8) {
|
|
53
|
+
recommendations.push(`${skillName} passes ${Math.round(passRate * 100)}% of scenarios — review failing criteria.`);
|
|
54
|
+
}
|
|
55
|
+
// Collect the most common missing criteria across all failures
|
|
56
|
+
const failureCounts = new Map();
|
|
57
|
+
for (const r of results) {
|
|
58
|
+
for (const f of r.failures) {
|
|
59
|
+
failureCounts.set(f, (failureCounts.get(f) ?? 0) + 1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const sorted = [...failureCounts.entries()].sort((a, b) => b[1] - a[1]);
|
|
63
|
+
const top = sorted.slice(0, 3);
|
|
64
|
+
for (const [criterion, count] of top) {
|
|
65
|
+
recommendations.push(`Add coverage for "${criterion}" — missing in ${String(count)} scenario(s).`);
|
|
66
|
+
}
|
|
67
|
+
if (recommendations.length === 0) {
|
|
68
|
+
recommendations.push(`${skillName} meets all evaluated criteria — no changes needed.`);
|
|
69
|
+
}
|
|
70
|
+
return recommendations;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Core evaluation logic used by both evaluateSkill and evaluateRule.
|
|
74
|
+
*/
|
|
75
|
+
async function evaluate(filePath, displayName, scenarios) {
|
|
76
|
+
const content = await readContent(filePath);
|
|
77
|
+
const scenarioResults = scenarios.map((s) => evaluateScenario(content, s));
|
|
78
|
+
const passedCount = scenarioResults.filter((r) => r.passed).length;
|
|
79
|
+
const passRate = scenarios.length === 0 ? 1.0 : passedCount / scenarios.length;
|
|
80
|
+
const avgScore = scenarioResults.length === 0
|
|
81
|
+
? 1.0
|
|
82
|
+
: scenarioResults.reduce((sum, r) => sum + r.score, 0) / scenarioResults.length;
|
|
83
|
+
const recommendations = buildRecommendations(displayName, scenarioResults, passRate);
|
|
84
|
+
return {
|
|
85
|
+
skillName: displayName,
|
|
86
|
+
passRate,
|
|
87
|
+
avgScore,
|
|
88
|
+
scenarios: scenarioResults,
|
|
89
|
+
recommendations,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Public API
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
/**
|
|
96
|
+
* Evaluate a skill file at the given path against the provided scenarios.
|
|
97
|
+
* Reads .claude/skills/{skillName}.md from the skill path.
|
|
98
|
+
*/
|
|
99
|
+
export async function evaluateSkill(skillPath, scenarios) {
|
|
100
|
+
const name = skillPath.split('/').pop() ?? skillPath;
|
|
101
|
+
return evaluate(skillPath, name.replace(/\.md$/i, ''), scenarios);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Evaluate a rule file at the given path against the provided scenarios.
|
|
105
|
+
* Reads .claude/rules/{ruleName}.md from the rule path.
|
|
106
|
+
*/
|
|
107
|
+
export async function evaluateRule(rulePath, scenarios) {
|
|
108
|
+
const name = rulePath.split('/').pop() ?? rulePath;
|
|
109
|
+
return evaluate(rulePath, name.replace(/\.md$/i, ''), scenarios);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Resolve the absolute path to a skill file under a project root.
|
|
113
|
+
* Returns the resolved path (may not exist yet — caller decides how to handle).
|
|
114
|
+
*/
|
|
115
|
+
export function resolveSkillPath(projectPath, skillName) {
|
|
116
|
+
const normalized = skillName.endsWith('.md') ? skillName : `${skillName}.md`;
|
|
117
|
+
return join(projectPath, '.claude', 'skills', normalized);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Resolve the absolute path to a rule file under a project root.
|
|
121
|
+
*/
|
|
122
|
+
export function resolveRulePath(projectPath, ruleName) {
|
|
123
|
+
const normalized = ruleName.endsWith('.md') ? ruleName : `${ruleName}.md`;
|
|
124
|
+
return join(projectPath, '.claude', 'rules', normalized);
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=skill-evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-evaluator.js","sourceRoot":"","sources":["../../src/engine/skill-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-quality-scorer.d.ts","sourceRoot":"","sources":["../../src/engine/spec-quality-scorer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAIV,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AA8UlC,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmC7E"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
// engine/spec-quality-scorer.ts — Spec quality scoring logic (SPEC-314)
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { stripFrontmatter } from './frontmatter-parser.js';
|
|
4
|
+
// ── Constants ────────────────────────────────────────────────────────────────
|
|
5
|
+
const MAX_DIMENSION_SCORE = 25;
|
|
6
|
+
const VAGUE_WORDS = [
|
|
7
|
+
'works',
|
|
8
|
+
'fast',
|
|
9
|
+
'easy',
|
|
10
|
+
'good',
|
|
11
|
+
'simple',
|
|
12
|
+
'nice',
|
|
13
|
+
'better',
|
|
14
|
+
'quickly',
|
|
15
|
+
'efficiently',
|
|
16
|
+
'properly',
|
|
17
|
+
'correctly',
|
|
18
|
+
'seamlessly',
|
|
19
|
+
'robust',
|
|
20
|
+
'scalable',
|
|
21
|
+
'intuitive',
|
|
22
|
+
];
|
|
23
|
+
const CONTRADICTION_PAIRS = [
|
|
24
|
+
['always', 'never'],
|
|
25
|
+
['mandatory', 'optional'],
|
|
26
|
+
['required', 'not required'],
|
|
27
|
+
['must', 'must not'],
|
|
28
|
+
['synchronous', 'asynchronous'],
|
|
29
|
+
['blocking', 'non-blocking'],
|
|
30
|
+
];
|
|
31
|
+
// ── Internal helpers ─────────────────────────────────────────────────────────
|
|
32
|
+
function gradeFromTotal(total) {
|
|
33
|
+
if (total >= 90) {
|
|
34
|
+
return 'A';
|
|
35
|
+
}
|
|
36
|
+
if (total >= 75) {
|
|
37
|
+
return 'B';
|
|
38
|
+
}
|
|
39
|
+
if (total >= 60) {
|
|
40
|
+
return 'C';
|
|
41
|
+
}
|
|
42
|
+
if (total >= 45) {
|
|
43
|
+
return 'D';
|
|
44
|
+
}
|
|
45
|
+
return 'F';
|
|
46
|
+
}
|
|
47
|
+
async function readSpecContent(spec) {
|
|
48
|
+
if (!spec.specPath) {
|
|
49
|
+
return '';
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const raw = await readFile(spec.specPath, 'utf-8');
|
|
53
|
+
return stripFrontmatter(raw);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return '';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function readTechnicalContent(spec) {
|
|
60
|
+
if (!spec.technicalPath) {
|
|
61
|
+
return '';
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const raw = await readFile(spec.technicalPath, 'utf-8');
|
|
65
|
+
return stripFrontmatter(raw);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function extractCriteriaLines(content) {
|
|
72
|
+
return content
|
|
73
|
+
.split('\n')
|
|
74
|
+
.filter((line) => /^- \[[ x]\]/.test(line.trim()))
|
|
75
|
+
.map((line) => line.trim());
|
|
76
|
+
}
|
|
77
|
+
// ── Dimension scorers ────────────────────────────────────────────────────────
|
|
78
|
+
function scoreCompleteness(spec, content) {
|
|
79
|
+
const issues = [];
|
|
80
|
+
const recommendations = [];
|
|
81
|
+
let score = 0;
|
|
82
|
+
// Title present (5 pts)
|
|
83
|
+
if (spec.title.trim().length > 5) {
|
|
84
|
+
score += 5;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
issues.push('Title is missing or too short');
|
|
88
|
+
recommendations.push('Add a descriptive title (>5 chars)');
|
|
89
|
+
}
|
|
90
|
+
// Description / body present (5 pts)
|
|
91
|
+
const bodyLength = content.trim().length;
|
|
92
|
+
if (bodyLength > 100) {
|
|
93
|
+
score += 5;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
issues.push('Spec body is missing or too brief');
|
|
97
|
+
recommendations.push('Add a description with context and motivation');
|
|
98
|
+
}
|
|
99
|
+
// Acceptance criteria present (5 pts)
|
|
100
|
+
const criteriaLines = extractCriteriaLines(content);
|
|
101
|
+
if (criteriaLines.length >= 3) {
|
|
102
|
+
score += 5;
|
|
103
|
+
}
|
|
104
|
+
else if (criteriaLines.length >= 1) {
|
|
105
|
+
score += 2;
|
|
106
|
+
issues.push('Less than 3 acceptance criteria found');
|
|
107
|
+
recommendations.push('Add at least 3 acceptance criteria');
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
issues.push('No acceptance criteria found');
|
|
111
|
+
recommendations.push('Add acceptance criteria in checkbox format (- [ ] ...)');
|
|
112
|
+
}
|
|
113
|
+
// Scope set to non-default (5 pts) — cast to handle partial specs at runtime
|
|
114
|
+
const scope = spec.scope;
|
|
115
|
+
if (scope?.trim().length) {
|
|
116
|
+
score += 5;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
issues.push('Scope not defined');
|
|
120
|
+
recommendations.push('Set scope: trivial | feature | cross-module | architectural');
|
|
121
|
+
}
|
|
122
|
+
// Estimation present (5 pts) — check devHours is non-zero as a proxy
|
|
123
|
+
const estimation = spec.estimation;
|
|
124
|
+
const hasEstimation = (estimation?.devHours ?? 0) > 0;
|
|
125
|
+
if (hasEstimation) {
|
|
126
|
+
score += 5;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
issues.push('No estimation provided');
|
|
130
|
+
recommendations.push('Add a time estimation using the estimate tool');
|
|
131
|
+
}
|
|
132
|
+
return { score, maxScore: MAX_DIMENSION_SCORE, issues, recommendations };
|
|
133
|
+
}
|
|
134
|
+
function scoreTestability(criteriaLines) {
|
|
135
|
+
const issues = [];
|
|
136
|
+
const recommendations = [];
|
|
137
|
+
let score = MAX_DIMENSION_SCORE;
|
|
138
|
+
if (criteriaLines.length === 0) {
|
|
139
|
+
return {
|
|
140
|
+
score: 0,
|
|
141
|
+
maxScore: MAX_DIMENSION_SCORE,
|
|
142
|
+
issues: ['No acceptance criteria to evaluate testability'],
|
|
143
|
+
recommendations: ['Add verifiable acceptance criteria'],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Penalize vague words (up to -15 pts)
|
|
147
|
+
let vagueCount = 0;
|
|
148
|
+
for (const line of criteriaLines) {
|
|
149
|
+
const lower = line.toLowerCase();
|
|
150
|
+
const found = VAGUE_WORDS.filter((w) => {
|
|
151
|
+
const pattern = new RegExp(`\\b${w}\\b`);
|
|
152
|
+
return pattern.test(lower);
|
|
153
|
+
});
|
|
154
|
+
if (found.length > 0) {
|
|
155
|
+
vagueCount++;
|
|
156
|
+
issues.push(`Vague criterion (${found.join(', ')}): "${line.slice(0, 70)}"`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const vagueRatio = vagueCount / criteriaLines.length;
|
|
160
|
+
if (vagueRatio >= 0.5) {
|
|
161
|
+
score -= 15;
|
|
162
|
+
recommendations.push('Rewrite criteria using specific, measurable outcomes');
|
|
163
|
+
}
|
|
164
|
+
else if (vagueRatio > 0) {
|
|
165
|
+
score -= Math.round(vagueRatio * 10);
|
|
166
|
+
recommendations.push('Replace vague words with specific, verifiable conditions');
|
|
167
|
+
}
|
|
168
|
+
// Reward for many criteria (bonus up to +5 absorbed in initial 25)
|
|
169
|
+
if (criteriaLines.length < 3) {
|
|
170
|
+
score -= 5;
|
|
171
|
+
recommendations.push('Add more acceptance criteria (aim for 5+)');
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
score: Math.max(0, Math.min(MAX_DIMENSION_SCORE, score)),
|
|
175
|
+
maxScore: MAX_DIMENSION_SCORE,
|
|
176
|
+
issues,
|
|
177
|
+
recommendations,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function scoreAmbiguity(content, criteriaLines) {
|
|
181
|
+
const issues = [];
|
|
182
|
+
const recommendations = [];
|
|
183
|
+
let score = MAX_DIMENSION_SCORE;
|
|
184
|
+
if (content.trim().length === 0) {
|
|
185
|
+
return {
|
|
186
|
+
score: 0,
|
|
187
|
+
maxScore: MAX_DIMENSION_SCORE,
|
|
188
|
+
issues: ['No spec content to check for ambiguity'],
|
|
189
|
+
recommendations: ['Add spec content with clear requirements'],
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const lower = content.toLowerCase();
|
|
193
|
+
// Check for contradiction pairs (-3 pts each, max -9)
|
|
194
|
+
let contradictions = 0;
|
|
195
|
+
for (const [termA, termB] of CONTRADICTION_PAIRS) {
|
|
196
|
+
if (lower.includes(termA) && lower.includes(termB)) {
|
|
197
|
+
contradictions++;
|
|
198
|
+
if (contradictions <= 3) {
|
|
199
|
+
issues.push(`Potential contradiction: "${termA}" and "${termB}" both appear in spec`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (contradictions > 0) {
|
|
204
|
+
score -= Math.min(9, contradictions * 3);
|
|
205
|
+
recommendations.push('Review and resolve contradictory requirements');
|
|
206
|
+
}
|
|
207
|
+
// Check for undefined terms (TBD, TODO, FIXME) (-3 pts each, max -9)
|
|
208
|
+
const undefinedTerms = ['tbd', 'todo', 'fixme', 'placeholder', 'to be defined', 'to be decided'];
|
|
209
|
+
let undefinedCount = 0;
|
|
210
|
+
for (const term of undefinedTerms) {
|
|
211
|
+
if (lower.includes(term)) {
|
|
212
|
+
undefinedCount++;
|
|
213
|
+
issues.push(`Undefined placeholder found: "${term}"`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (undefinedCount > 0) {
|
|
217
|
+
score -= Math.min(9, undefinedCount * 3);
|
|
218
|
+
recommendations.push('Replace all TBD/TODO/FIXME markers with concrete requirements');
|
|
219
|
+
}
|
|
220
|
+
// Check for edge case coverage: criteria with error/failure/invalid/empty (-4 if missing)
|
|
221
|
+
const edgeCaseKeywords = ['error', 'fail', 'invalid', 'empty', 'null', 'missing', 'timeout'];
|
|
222
|
+
const hasEdgeCases = criteriaLines.length > 0 &&
|
|
223
|
+
criteriaLines.some((line) => {
|
|
224
|
+
const l = line.toLowerCase();
|
|
225
|
+
return edgeCaseKeywords.some((k) => l.includes(k));
|
|
226
|
+
});
|
|
227
|
+
if (criteriaLines.length >= 3 && !hasEdgeCases) {
|
|
228
|
+
score -= 4;
|
|
229
|
+
issues.push('No edge case criteria found (error, failure, invalid inputs)');
|
|
230
|
+
recommendations.push('Add criteria covering error conditions and edge cases');
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
score: Math.max(0, Math.min(MAX_DIMENSION_SCORE, score)),
|
|
234
|
+
maxScore: MAX_DIMENSION_SCORE,
|
|
235
|
+
issues,
|
|
236
|
+
recommendations,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function scoreRisk(spec, technicalContent) {
|
|
240
|
+
const issues = [];
|
|
241
|
+
const recommendations = [];
|
|
242
|
+
let score = MAX_DIMENSION_SCORE;
|
|
243
|
+
// Cross-module dependencies increase risk (-5 if many deps)
|
|
244
|
+
if (spec.dependencies.length >= 3) {
|
|
245
|
+
score -= 5;
|
|
246
|
+
issues.push(`High dependency count (${spec.dependencies.length} deps): ${spec.dependencies.join(', ')}`);
|
|
247
|
+
recommendations.push('Document dependency risks and verify all deps are done before starting');
|
|
248
|
+
}
|
|
249
|
+
else if (spec.dependencies.length > 0) {
|
|
250
|
+
score -= 2;
|
|
251
|
+
issues.push(`Has ${spec.dependencies.length} dependencies — verify they are implemented`);
|
|
252
|
+
}
|
|
253
|
+
// Architectural scope multiplies risk (-5 if architectural)
|
|
254
|
+
if (spec.scope === 'architectural') {
|
|
255
|
+
score -= 5;
|
|
256
|
+
issues.push('Architectural scope — higher risk of cross-cutting impact');
|
|
257
|
+
recommendations.push('Ensure ADRs and architecture docs are updated');
|
|
258
|
+
}
|
|
259
|
+
else if (spec.scope === 'cross-module') {
|
|
260
|
+
score -= 2;
|
|
261
|
+
issues.push('Cross-module scope — coordinate with other teams/specs');
|
|
262
|
+
}
|
|
263
|
+
// Missing NFRs in technical content (-5 if technical file exists but no NFRs)
|
|
264
|
+
if (technicalContent.trim().length > 50) {
|
|
265
|
+
const lowerTech = technicalContent.toLowerCase();
|
|
266
|
+
const nfrKeywords = [
|
|
267
|
+
'performance',
|
|
268
|
+
'security',
|
|
269
|
+
'scalability',
|
|
270
|
+
'reliability',
|
|
271
|
+
'availability',
|
|
272
|
+
'latency',
|
|
273
|
+
'throughput',
|
|
274
|
+
'sla',
|
|
275
|
+
'nfr',
|
|
276
|
+
];
|
|
277
|
+
const hasNfrs = nfrKeywords.some((k) => lowerTech.includes(k));
|
|
278
|
+
if (!hasNfrs) {
|
|
279
|
+
score -= 5;
|
|
280
|
+
issues.push('No non-functional requirements found in technical spec');
|
|
281
|
+
recommendations.push('Document NFRs: performance, security, scalability constraints');
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else if (technicalContent.trim().length === 0) {
|
|
285
|
+
score -= 5;
|
|
286
|
+
issues.push('No technical spec file found');
|
|
287
|
+
recommendations.push('Run create_spec_tech to generate a technical specification');
|
|
288
|
+
}
|
|
289
|
+
// Tags with security/perf keywords indicate risk coverage is good (bonus up to +2 absorbed)
|
|
290
|
+
const riskTags = ['security', 'performance', 'breaking-change', 'migration', 'data-loss'];
|
|
291
|
+
const hasRiskTags = spec.tags.some((tag) => riskTags.some((rt) => tag.toLowerCase().includes(rt)));
|
|
292
|
+
if (hasRiskTags && score < MAX_DIMENSION_SCORE) {
|
|
293
|
+
// Risk tags show awareness — partial recovery
|
|
294
|
+
score = Math.min(MAX_DIMENSION_SCORE, score + 2);
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
score: Math.max(0, Math.min(MAX_DIMENSION_SCORE, score)),
|
|
298
|
+
maxScore: MAX_DIMENSION_SCORE,
|
|
299
|
+
issues,
|
|
300
|
+
recommendations,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
// ── Public API ───────────────────────────────────────────────────────────────
|
|
304
|
+
export async function scoreSpecQuality(spec) {
|
|
305
|
+
const [specContent, technicalContent] = await Promise.all([
|
|
306
|
+
readSpecContent(spec),
|
|
307
|
+
readTechnicalContent(spec),
|
|
308
|
+
]);
|
|
309
|
+
const criteriaLines = extractCriteriaLines(specContent);
|
|
310
|
+
const completenessDetail = scoreCompleteness(spec, specContent);
|
|
311
|
+
const testabilityDetail = scoreTestability(criteriaLines);
|
|
312
|
+
const ambiguityDetail = scoreAmbiguity(specContent, criteriaLines);
|
|
313
|
+
const riskDetail = scoreRisk(spec, technicalContent);
|
|
314
|
+
const total = completenessDetail.score + testabilityDetail.score + ambiguityDetail.score + riskDetail.score;
|
|
315
|
+
const qualityScore = {
|
|
316
|
+
total,
|
|
317
|
+
completeness: completenessDetail.score,
|
|
318
|
+
testability: testabilityDetail.score,
|
|
319
|
+
ambiguity: ambiguityDetail.score,
|
|
320
|
+
risk: riskDetail.score,
|
|
321
|
+
grade: gradeFromTotal(total),
|
|
322
|
+
};
|
|
323
|
+
return {
|
|
324
|
+
specId: spec.id,
|
|
325
|
+
score: qualityScore,
|
|
326
|
+
dimensions: {
|
|
327
|
+
completeness: completenessDetail,
|
|
328
|
+
testability: testabilityDetail,
|
|
329
|
+
ambiguity: ambiguityDetail,
|
|
330
|
+
risk: riskDetail,
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=spec-quality-scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-quality-scorer.js","sourceRoot":"","sources":["../../src/engine/spec-quality-scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { MarketplaceTemplate, MarketplaceTemplateManifest, MarketplaceTemplateVar } from '../types/spec-marketplace.js';
|
|
2
|
+
/**
|
|
3
|
+
* List all available templates (builtin only for now).
|
|
4
|
+
*/
|
|
5
|
+
export declare function listTemplates(): Promise<MarketplaceTemplate[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Search templates by name, description, or tags. Returns all templates when query is empty.
|
|
8
|
+
*/
|
|
9
|
+
export declare function searchTemplates(query: string): Promise<MarketplaceTemplate[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Apply variable substitution to template content.
|
|
12
|
+
* Replaces all occurrences of {{variable_name}} with the provided value.
|
|
13
|
+
* Missing variables fall back to the variable's default, then to the placeholder.
|
|
14
|
+
*/
|
|
15
|
+
export declare function applyVariables(content: string, variables: Record<string, string>, variableDefs: MarketplaceTemplateVar[]): string;
|
|
16
|
+
/**
|
|
17
|
+
* Instantiate a template by name with the given variables.
|
|
18
|
+
* Returns the rendered spec.md content, or null if the template does not exist.
|
|
19
|
+
*/
|
|
20
|
+
export declare function applyTemplate(templateName: string, variables: Record<string, string>): Promise<string | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Build a MarketplaceTemplateManifest from a spec's content and the provided variable names.
|
|
23
|
+
* Used for the "publish" flow.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildPublishManifest(specId: string, templateName: string, variableNames: string[], specContent: string): MarketplaceTemplateManifest;
|
|
26
|
+
//# sourceMappingURL=spec-template-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-template-engine.d.ts","sourceRoot":"","sources":["../../src/engine/spec-template-engine.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,EACvB,MAAM,8BAA8B,CAAC;AA6CtC;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAWpE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAenF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,YAAY,EAAE,sBAAsB,EAAE,GACrC,MAAM,CASR;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EAAE,EACvB,WAAW,EAAE,MAAM,GAClB,2BAA2B,CA6B7B"}
|