@planu/cli 1.3.0 → 1.4.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 +4 -1
- package/dist/engine/doc-compliance-checker.d.ts +23 -0
- package/dist/engine/doc-compliance-checker.d.ts.map +1 -0
- package/dist/engine/doc-compliance-checker.js +168 -0
- package/dist/engine/doc-compliance-checker.js.map +1 -0
- package/dist/engine/skill-generator/sections-docs.d.ts +13 -0
- package/dist/engine/skill-generator/sections-docs.d.ts.map +1 -0
- package/dist/engine/skill-generator/sections-docs.js +59 -0
- package/dist/engine/skill-generator/sections-docs.js.map +1 -0
- package/dist/engine/skill-generator/skills-content.d.ts +1 -1
- package/dist/engine/skill-generator/skills-content.d.ts.map +1 -1
- package/dist/engine/skill-generator/skills-content.js +3 -2
- package/dist/engine/skill-generator/skills-content.js.map +1 -1
- package/dist/engine/skill-generator/skills.d.ts +1 -0
- package/dist/engine/skill-generator/skills.d.ts.map +1 -1
- package/dist/engine/skill-generator/skills.js +1 -0
- package/dist/engine/skill-generator/skills.js.map +1 -1
- package/dist/engine/skill-generator.d.ts.map +1 -1
- package/dist/engine/skill-generator.js +21 -2
- package/dist/engine/skill-generator.js.map +1 -1
- package/dist/engine/web-fetcher/docs-intelligence.d.ts +8 -0
- package/dist/engine/web-fetcher/docs-intelligence.d.ts.map +1 -0
- package/dist/engine/web-fetcher/docs-intelligence.js +154 -0
- package/dist/engine/web-fetcher/docs-intelligence.js.map +1 -0
- package/dist/engine/web-fetcher/registry-auto-discovery.d.ts +20 -0
- package/dist/engine/web-fetcher/registry-auto-discovery.d.ts.map +1 -0
- package/dist/engine/web-fetcher/registry-auto-discovery.js +184 -0
- package/dist/engine/web-fetcher/registry-auto-discovery.js.map +1 -0
- package/dist/engine/web-fetcher/stack-detector.d.ts +4 -0
- package/dist/engine/web-fetcher/stack-detector.d.ts.map +1 -0
- package/dist/engine/web-fetcher/stack-detector.js +155 -0
- package/dist/engine/web-fetcher/stack-detector.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/create-spec/spec-builder.d.ts.map +1 -1
- package/dist/tools/create-spec/spec-builder.js +20 -0
- package/dist/tools/create-spec/spec-builder.js.map +1 -1
- package/dist/tools/create-spec-hu/docs-criteria-adapter.d.ts +14 -0
- package/dist/tools/create-spec-hu/docs-criteria-adapter.d.ts.map +1 -0
- package/dist/tools/create-spec-hu/docs-criteria-adapter.js +50 -0
- package/dist/tools/create-spec-hu/docs-criteria-adapter.js.map +1 -0
- package/dist/tools/create-spec-hu.d.ts +1 -1
- package/dist/tools/create-spec-hu.d.ts.map +1 -1
- package/dist/tools/create-spec-hu.js +5 -1
- package/dist/tools/create-spec-hu.js.map +1 -1
- package/dist/tools/create-spec.d.ts.map +1 -1
- package/dist/tools/create-spec.js +2 -2
- package/dist/tools/create-spec.js.map +1 -1
- package/dist/tools/doc-compliance-handler.d.ts +3 -0
- package/dist/tools/doc-compliance-handler.d.ts.map +1 -0
- package/dist/tools/doc-compliance-handler.js +48 -0
- package/dist/tools/doc-compliance-handler.js.map +1 -0
- package/dist/tools/docs-registry-handler.d.ts +6 -0
- package/dist/tools/docs-registry-handler.d.ts.map +1 -0
- package/dist/tools/docs-registry-handler.js +73 -0
- package/dist/tools/docs-registry-handler.js.map +1 -0
- package/dist/tools/register-doc-compliance-tools.d.ts +3 -0
- package/dist/tools/register-doc-compliance-tools.d.ts.map +1 -0
- package/dist/tools/register-doc-compliance-tools.js +18 -0
- package/dist/tools/register-doc-compliance-tools.js.map +1 -0
- package/dist/tools/register-docs-registry-tools.d.ts +3 -0
- package/dist/tools/register-docs-registry-tools.d.ts.map +1 -0
- package/dist/tools/register-docs-registry-tools.js +35 -0
- package/dist/tools/register-docs-registry-tools.js.map +1 -0
- package/dist/types/docs.d.ts +70 -0
- package/dist/types/docs.d.ts.map +1 -1
- package/dist/types/mcp.d.ts +17 -0
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/types/spec/core.d.ts +2 -0
- package/dist/types/spec/core.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/config/license-plans.json +4 -1
|
@@ -409,7 +409,10 @@
|
|
|
409
409
|
"review_pr_against_spec",
|
|
410
410
|
"pr_agent_status",
|
|
411
411
|
"generate_e2e_tests",
|
|
412
|
-
"e2e_test_status"
|
|
412
|
+
"e2e_test_status",
|
|
413
|
+
"validate_docs_registry",
|
|
414
|
+
"discover_docs_url",
|
|
415
|
+
"doc_compliance_report"
|
|
413
416
|
],
|
|
414
417
|
"alwaysAllowed": [
|
|
415
418
|
"activate_license",
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { DocComplianceReport, DocComplianceIssue, StructuredDocsResult } from '../types/index.js';
|
|
2
|
+
export type { DocComplianceReport, DocComplianceIssue };
|
|
3
|
+
/**
|
|
4
|
+
* Checks if any anti-pattern from official docs appears in spec content.
|
|
5
|
+
* Returns a DocComplianceIssue for each match found.
|
|
6
|
+
*/
|
|
7
|
+
export declare function detectAntiPatterns(tech: string, docsResult: StructuredDocsResult, specContent: string): DocComplianceIssue[];
|
|
8
|
+
/**
|
|
9
|
+
* Identifies best practices from official docs that are NOT covered in the spec.
|
|
10
|
+
* Returns a list of missing best practice descriptions.
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectMissingBestPractices(tech: string, docsResult: StructuredDocsResult, specContent: string): DocComplianceIssue[];
|
|
13
|
+
/**
|
|
14
|
+
* Calculates a compliance score 0-100 based on issues found.
|
|
15
|
+
* High severity issues cost more points.
|
|
16
|
+
*/
|
|
17
|
+
export declare function calculateComplianceScore(issues: DocComplianceIssue[], totalChecks: number): number;
|
|
18
|
+
/**
|
|
19
|
+
* Main entry point: checks a spec file against official documentation.
|
|
20
|
+
* Reads the spec file, detects techs, fetches docs, and checks for issues.
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkDocCompliance(specPath: string, specId: string): Promise<DocComplianceReport>;
|
|
23
|
+
//# sourceMappingURL=doc-compliance-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-compliance-checker.d.ts","sourceRoot":"","sources":["../../src/engine/doc-compliance-checker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAK3B,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;AAExD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,oBAAoB,EAChC,WAAW,EAAE,MAAM,GAClB,kBAAkB,EAAE,CA0BtB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,oBAAoB,EAChC,WAAW,EAAE,MAAM,GAClB,kBAAkB,EAAE,CA6BtB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,kBAAkB,EAAE,EAC5B,WAAW,EAAE,MAAM,GAClB,MAAM,CAQR;AAYD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,CAAC,CAwF9B"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// engine/doc-compliance-checker.ts — SPEC-385
|
|
2
|
+
// Checks a spec against official documentation for anti-patterns and missing best practices.
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import { detectTechsFromText } from './web-fetcher/stack-detector.js';
|
|
5
|
+
import { fetchDocsBatch } from './web-fetcher/docs-intelligence.js';
|
|
6
|
+
/**
|
|
7
|
+
* Checks if any anti-pattern from official docs appears in spec content.
|
|
8
|
+
* Returns a DocComplianceIssue for each match found.
|
|
9
|
+
*/
|
|
10
|
+
export function detectAntiPatterns(tech, docsResult, specContent) {
|
|
11
|
+
const issues = [];
|
|
12
|
+
const lower = specContent.toLowerCase();
|
|
13
|
+
for (const ap of docsResult.antiPatterns) {
|
|
14
|
+
// Extract key terms from the anti-pattern description (first 5 words)
|
|
15
|
+
const keyTerms = ap
|
|
16
|
+
.toLowerCase()
|
|
17
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
18
|
+
.split(/\s+/)
|
|
19
|
+
.filter((w) => w.length > 3)
|
|
20
|
+
.slice(0, 5);
|
|
21
|
+
const matchCount = keyTerms.filter((term) => lower.includes(term)).length;
|
|
22
|
+
if (matchCount >= 2) {
|
|
23
|
+
issues.push({
|
|
24
|
+
tech,
|
|
25
|
+
issueType: 'anti-pattern',
|
|
26
|
+
description: ap,
|
|
27
|
+
source: docsResult.docsUrl,
|
|
28
|
+
severity: 'high',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return issues;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Identifies best practices from official docs that are NOT covered in the spec.
|
|
36
|
+
* Returns a list of missing best practice descriptions.
|
|
37
|
+
*/
|
|
38
|
+
export function detectMissingBestPractices(tech, docsResult, specContent) {
|
|
39
|
+
const issues = [];
|
|
40
|
+
const lower = specContent.toLowerCase();
|
|
41
|
+
for (const bp of docsResult.bestPractices.slice(0, 5)) {
|
|
42
|
+
const keyTerms = bp
|
|
43
|
+
.toLowerCase()
|
|
44
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
45
|
+
.split(/\s+/)
|
|
46
|
+
.filter((w) => w.length > 3)
|
|
47
|
+
.slice(0, 5);
|
|
48
|
+
if (keyTerms.length === 0) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const matchCount = keyTerms.filter((term) => lower.includes(term)).length;
|
|
52
|
+
// If fewer than 1/3 of key terms appear, best practice is likely missing
|
|
53
|
+
if (matchCount < Math.max(1, Math.ceil(keyTerms.length / 3))) {
|
|
54
|
+
issues.push({
|
|
55
|
+
tech,
|
|
56
|
+
issueType: 'missing-best-practice',
|
|
57
|
+
description: `Missing: ${bp}`,
|
|
58
|
+
source: docsResult.docsUrl,
|
|
59
|
+
severity: 'medium',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return issues;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Calculates a compliance score 0-100 based on issues found.
|
|
67
|
+
* High severity issues cost more points.
|
|
68
|
+
*/
|
|
69
|
+
export function calculateComplianceScore(issues, totalChecks) {
|
|
70
|
+
if (totalChecks === 0) {
|
|
71
|
+
return 100;
|
|
72
|
+
}
|
|
73
|
+
const penalty = issues.reduce((sum, issue) => {
|
|
74
|
+
return sum + (issue.severity === 'high' ? 15 : issue.severity === 'medium' ? 8 : 3);
|
|
75
|
+
}, 0);
|
|
76
|
+
return Math.max(0, Math.min(100, 100 - penalty));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Extracts spec title from frontmatter or first heading.
|
|
80
|
+
*/
|
|
81
|
+
function extractSpecTitle(specContent, fallback) {
|
|
82
|
+
const titleMatch = /^title:\s*"?([^"\n]+)"?/m.exec(specContent) ??
|
|
83
|
+
/^#\s+(?:SPEC-\d+[:\s]+)?(.+)/m.exec(specContent);
|
|
84
|
+
return titleMatch?.[1]?.trim() ?? fallback;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Main entry point: checks a spec file against official documentation.
|
|
88
|
+
* Reads the spec file, detects techs, fetches docs, and checks for issues.
|
|
89
|
+
*/
|
|
90
|
+
export async function checkDocCompliance(specPath, specId) {
|
|
91
|
+
// Read spec content
|
|
92
|
+
let specContent;
|
|
93
|
+
let specTitle;
|
|
94
|
+
try {
|
|
95
|
+
specContent = await readFile(specPath, 'utf-8');
|
|
96
|
+
specTitle = extractSpecTitle(specContent, specId);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// fallback to specId as search text
|
|
100
|
+
specContent = specId;
|
|
101
|
+
specTitle = specId;
|
|
102
|
+
}
|
|
103
|
+
// Detect technologies
|
|
104
|
+
const detected = detectTechsFromText(specContent);
|
|
105
|
+
const techs = detected
|
|
106
|
+
.filter((t) => t.confidence === 'high' || t.confidence === 'medium')
|
|
107
|
+
.map((t) => t.name)
|
|
108
|
+
.slice(0, 6);
|
|
109
|
+
if (techs.length === 0) {
|
|
110
|
+
return {
|
|
111
|
+
specId,
|
|
112
|
+
specTitle,
|
|
113
|
+
checkedAt: new Date().toISOString(),
|
|
114
|
+
techs: [],
|
|
115
|
+
issues: [],
|
|
116
|
+
bestPracticesCovered: [],
|
|
117
|
+
complianceScore: 100,
|
|
118
|
+
summary: 'No technologies detected in spec — skipping doc compliance check.',
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// Fetch docs for detected techs
|
|
122
|
+
const docsMap = await fetchDocsBatch(techs, { timeout: 5_000, concurrency: 3 });
|
|
123
|
+
// Run checks
|
|
124
|
+
const allIssues = [];
|
|
125
|
+
const bestPracticesCovered = [];
|
|
126
|
+
let totalChecks = 0;
|
|
127
|
+
for (const [tech, docsResult] of docsMap) {
|
|
128
|
+
if (docsResult.source === 'fallback') {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const antiPatternIssues = detectAntiPatterns(tech, docsResult, specContent);
|
|
132
|
+
const missingBpIssues = detectMissingBestPractices(tech, docsResult, specContent);
|
|
133
|
+
allIssues.push(...antiPatternIssues);
|
|
134
|
+
allIssues.push(...missingBpIssues);
|
|
135
|
+
totalChecks += docsResult.antiPatterns.length + docsResult.bestPractices.slice(0, 5).length;
|
|
136
|
+
// Track covered best practices
|
|
137
|
+
const lower = specContent.toLowerCase();
|
|
138
|
+
for (const bp of docsResult.bestPractices.slice(0, 5)) {
|
|
139
|
+
const keyTerms = bp
|
|
140
|
+
.toLowerCase()
|
|
141
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
142
|
+
.split(/\s+/)
|
|
143
|
+
.filter((w) => w.length > 3)
|
|
144
|
+
.slice(0, 5);
|
|
145
|
+
const matchCount = keyTerms.filter((term) => lower.includes(term)).length;
|
|
146
|
+
if (matchCount >= Math.max(1, Math.ceil(keyTerms.length / 3))) {
|
|
147
|
+
bestPracticesCovered.push(`[${tech}] ${bp.slice(0, 80)}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const complianceScore = calculateComplianceScore(allIssues, totalChecks);
|
|
152
|
+
const highIssues = allIssues.filter((i) => i.severity === 'high').length;
|
|
153
|
+
const mediumIssues = allIssues.filter((i) => i.severity === 'medium').length;
|
|
154
|
+
const summary = allIssues.length === 0
|
|
155
|
+
? `Spec is fully compliant with official docs for: ${techs.join(', ')}.`
|
|
156
|
+
: `Found ${highIssues} high + ${mediumIssues} medium issues against official docs for: ${techs.join(', ')}.`;
|
|
157
|
+
return {
|
|
158
|
+
specId,
|
|
159
|
+
specTitle,
|
|
160
|
+
checkedAt: new Date().toISOString(),
|
|
161
|
+
techs,
|
|
162
|
+
issues: allIssues,
|
|
163
|
+
bestPracticesCovered,
|
|
164
|
+
complianceScore,
|
|
165
|
+
summary,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=doc-compliance-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-compliance-checker.js","sourceRoot":"","sources":["../../src/engine/doc-compliance-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { StructuredDocsResult } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a "Official Documentation References" markdown section for a skill.
|
|
4
|
+
* Includes best practices, anti-patterns, and tooling from official docs.
|
|
5
|
+
* Returns empty string if no useful data (source is 'fallback').
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildDocAwareSection(tech: string, docs: StructuredDocsResult): string;
|
|
8
|
+
/**
|
|
9
|
+
* Builds doc-aware sections for multiple techs.
|
|
10
|
+
* Returns concatenated sections, skipping empty ones (fallback sources).
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildDocAwareSections(docsMap: Map<string, StructuredDocsResult>): string;
|
|
13
|
+
//# sourceMappingURL=sections-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections-docs.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-generator/sections-docs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAwCrF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,MAAM,CAexF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// engine/skill-generator/sections-docs.ts — SPEC-384
|
|
2
|
+
// Builds an official documentation section for generated skills.
|
|
3
|
+
/**
|
|
4
|
+
* Builds a "Official Documentation References" markdown section for a skill.
|
|
5
|
+
* Includes best practices, anti-patterns, and tooling from official docs.
|
|
6
|
+
* Returns empty string if no useful data (source is 'fallback').
|
|
7
|
+
*/
|
|
8
|
+
export function buildDocAwareSection(tech, docs) {
|
|
9
|
+
if (docs.source === 'fallback') {
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
const lines = [`## ${tech} — Official Documentation`];
|
|
13
|
+
if (docs.docsUrl) {
|
|
14
|
+
lines.push(``, `> Source: ${docs.docsUrl}`);
|
|
15
|
+
}
|
|
16
|
+
if (docs.bestPractices.length > 0) {
|
|
17
|
+
lines.push('', '### Best Practices');
|
|
18
|
+
for (const bp of docs.bestPractices.slice(0, 5)) {
|
|
19
|
+
lines.push(`- ${bp}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (docs.antiPatterns.length > 0) {
|
|
23
|
+
lines.push('', '### Anti-Patterns to Avoid');
|
|
24
|
+
for (const ap of docs.antiPatterns.slice(0, 3)) {
|
|
25
|
+
lines.push(`- ⚠️ ${ap}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (docs.toolingRecommendations.length > 0) {
|
|
29
|
+
lines.push('', '### Recommended Tooling');
|
|
30
|
+
for (const tool of docs.toolingRecommendations.slice(0, 3)) {
|
|
31
|
+
lines.push(`- ${tool}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (docs.versionNotes.length > 0) {
|
|
35
|
+
lines.push('', '### Version Notes');
|
|
36
|
+
for (const note of docs.versionNotes.slice(0, 2)) {
|
|
37
|
+
lines.push(`- ${note}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return lines.join('\n');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Builds doc-aware sections for multiple techs.
|
|
44
|
+
* Returns concatenated sections, skipping empty ones (fallback sources).
|
|
45
|
+
*/
|
|
46
|
+
export function buildDocAwareSections(docsMap) {
|
|
47
|
+
const sections = [];
|
|
48
|
+
for (const [tech, docs] of docsMap) {
|
|
49
|
+
const section = buildDocAwareSection(tech, docs);
|
|
50
|
+
if (section) {
|
|
51
|
+
sections.push(section);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (sections.length === 0) {
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
return ['', '---', '', '## Official Documentation References', '', ...sections].join('\n');
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=sections-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections-docs.js","sourceRoot":"","sources":["../../../src/engine/skill-generator/sections-docs.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,iEAAiE;AAIjE;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,IAA0B;IAC3E,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,MAAM,IAAI,2BAA2B,CAAC,CAAC;IAEhE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;QACrC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,4BAA4B,CAAC,CAAC;QAC7C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA0C;IAC9E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,sCAAsC,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AgentPlatform, SkillFile, ProjectKnowledge, PlatformConfig } from '../../types/index.js';
|
|
2
2
|
export declare function generateProjectRulesSkill(config: PlatformConfig, name: string, description: string, knowledge: ProjectKnowledge): SkillFile;
|
|
3
|
-
export declare function generateDomainSkill(config: PlatformConfig, name: string, description: string, knowledge: ProjectKnowledge, specContent?: string): SkillFile;
|
|
3
|
+
export declare function generateDomainSkill(config: PlatformConfig, name: string, description: string, knowledge: ProjectKnowledge, specContent?: string, docSection?: string): SkillFile;
|
|
4
4
|
export declare function generateWorkflowSkill(config: PlatformConfig, name: string, description: string, knowledge: ProjectKnowledge): SkillFile;
|
|
5
5
|
export declare function generateConventionSkill(config: PlatformConfig, name: string, description: string, knowledge: ProjectKnowledge): SkillFile;
|
|
6
6
|
export declare function generateSddWorkflowSkillContent(knowledge: ProjectKnowledge): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-content.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-generator/skills-content.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,GAC1B,SAAS,CA4BX;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,EAC3B,WAAW,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"skills-content.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-generator/skills-content.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,GAC1B,SAAS,CA4BX;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,EAC3B,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,SAAS,CAwCX;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,GAC1B,SAAS,CAgCX;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,GAC1B,SAAS,CA0BX;AAED,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CA2BnF;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,SAAS,EAAE,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAkCR"}
|
|
@@ -24,10 +24,10 @@ export function generateProjectRulesSkill(config, name, description, knowledge)
|
|
|
24
24
|
: config.rulesFile;
|
|
25
25
|
return { path, content, format: config.format };
|
|
26
26
|
}
|
|
27
|
-
export function generateDomainSkill(config, name, description, knowledge, specContent) {
|
|
27
|
+
export function generateDomainSkill(config, name, description, knowledge, specContent, docSection) {
|
|
28
28
|
const slug = name.toLowerCase().replace(/\s+/g, '-');
|
|
29
29
|
const agentSlug = `${slug}-agent`;
|
|
30
|
-
const
|
|
30
|
+
const baseContent = [
|
|
31
31
|
`# ${name}`,
|
|
32
32
|
'',
|
|
33
33
|
description,
|
|
@@ -59,6 +59,7 @@ export function generateDomainSkill(config, name, description, knowledge, specCo
|
|
|
59
59
|
`- **Orchestration**: See \`scripts/orchestrate-${slug}.sh\` (generated alongside this skill)`,
|
|
60
60
|
'- The sub-agent handles subtask delegation; this skill manages commit, tracking, pipeline',
|
|
61
61
|
].join('\n');
|
|
62
|
+
const content = docSection ? `${baseContent}\n\n${docSection}` : baseContent;
|
|
62
63
|
const path = config.skillsDir ? `${config.skillsDir}${slug}.md` : `skills/${slug}.md`;
|
|
63
64
|
return { path, content, format: 'markdown' };
|
|
64
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-content.js","sourceRoot":"","sources":["../../../src/engine/skill-generator/skills-content.ts"],"names":[],"mappings":"AAAA,wDAAwD;AASxD,MAAM,UAAU,yBAAyB,CACvC,MAAsB,EACtB,IAAY,EACZ,WAAmB,EACnB,SAA2B;IAE3B,MAAM,OAAO,GAAG;QACd,KAAK,IAAI,EAAE;QACX,EAAE;QACF,WAAW;QACX,EAAE;QACF,UAAU;QACV,eAAe,SAAS,CAAC,QAAQ,EAAE;QACnC,gBAAgB,SAAS,CAAC,SAAS,IAAI,MAAM,EAAE;QAC/C,eAAe,SAAS,CAAC,QAAQ,EAAE;QACnC,mBAAmB,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE;QACnD,EAAE;QACF,UAAU;QACV,EAAE;QACF,GAAG,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;QAClE,EAAE;QACF,WAAW;QACX,EAAE;QACF,GAAG,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,CAC5E;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS;QAC3B,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK;QACpE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IAErB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAsB,EACtB,IAAY,EACZ,WAAmB,EACnB,SAA2B,EAC3B,WAAoB;
|
|
1
|
+
{"version":3,"file":"skills-content.js","sourceRoot":"","sources":["../../../src/engine/skill-generator/skills-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { generateProjectRulesSkill, generateDomainSkill, generateWorkflowSkill, generateConventionSkill, generateSddWorkflowSkillContent, buildInstallInstructions, } from './skills-content.js';
|
|
2
2
|
export { generateOrchestrationScript } from './skills-orchestration.js';
|
|
3
|
+
export { buildDocAwareSection, buildDocAwareSections } from './sections-docs.js';
|
|
3
4
|
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-generator/skills.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-generator/skills.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -2,4 +2,5 @@
|
|
|
2
2
|
// Split for file-size compliance (400L limit).
|
|
3
3
|
export { generateProjectRulesSkill, generateDomainSkill, generateWorkflowSkill, generateConventionSkill, generateSddWorkflowSkillContent, buildInstallInstructions, } from './skills-content.js';
|
|
4
4
|
export { generateOrchestrationScript } from './skills-orchestration.js';
|
|
5
|
+
export { buildDocAwareSection, buildDocAwareSections } from './sections-docs.js';
|
|
5
6
|
//# sourceMappingURL=skills.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/engine/skill-generator/skills.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,+CAA+C;AAE/C,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/engine/skill-generator/skills.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,+CAA+C;AAE/C,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-generator.d.ts","sourceRoot":"","sources":["../../src/engine/skill-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EAEnB,gBAAgB,EAChB,YAAY,EAEZ,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAyB3B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAI1E;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,eAAe,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,EACvE,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,EAC3B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"skill-generator.d.ts","sourceRoot":"","sources":["../../src/engine/skill-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EAEnB,gBAAgB,EAChB,YAAY,EAEZ,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAyB3B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAI1E;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,eAAe,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,EACvE,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,EAC3B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAmE9B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,gBAAgB,EAC3B,YAAY,CAAC,EAAE,YAAY,EAC3B,OAAO,GAAE;IACP,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACnC,GACL,OAAO,CAAC,mBAAmB,CAAC,CAgH9B"}
|
|
@@ -29,11 +29,30 @@ export async function generateSkill(platform, skillType, name, description, know
|
|
|
29
29
|
case 'project-rules':
|
|
30
30
|
files.push(generateProjectRulesSkill(config, name, description, knowledge));
|
|
31
31
|
break;
|
|
32
|
-
case 'domain-skill':
|
|
33
|
-
|
|
32
|
+
case 'domain-skill': {
|
|
33
|
+
let docSection = '';
|
|
34
|
+
try {
|
|
35
|
+
const { detectTechsFromText } = await import('./web-fetcher/stack-detector.js');
|
|
36
|
+
const { fetchDocsBatch } = await import('./web-fetcher/docs-intelligence.js');
|
|
37
|
+
const { buildDocAwareSections } = await import('./skill-generator/sections-docs.js');
|
|
38
|
+
const detected = detectTechsFromText(`${name} ${description}`);
|
|
39
|
+
const techNames = detected
|
|
40
|
+
.filter((t) => t.confidence === 'high' || t.confidence === 'medium')
|
|
41
|
+
.map((t) => t.name)
|
|
42
|
+
.slice(0, 4);
|
|
43
|
+
if (techNames.length > 0) {
|
|
44
|
+
const docsMap = await fetchDocsBatch(techNames, { timeout: 3_000, concurrency: 2 });
|
|
45
|
+
docSection = buildDocAwareSections(docsMap);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Silent fallback — doc enrichment is best-effort
|
|
50
|
+
}
|
|
51
|
+
files.push(generateDomainSkill(config, name, description, knowledge, specContent, docSection || undefined));
|
|
34
52
|
// 3-layer automation: include orchestration script for implementation skills
|
|
35
53
|
files.push(_generateOrchestrationScript(name, knowledge));
|
|
36
54
|
break;
|
|
55
|
+
}
|
|
37
56
|
case 'workflow':
|
|
38
57
|
files.push(generateWorkflowSkill(config, name, description, knowledge));
|
|
39
58
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/engine/skill-generator.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,4EAA4E;AAa5E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,+BAA+B,IAAI,gCAAgC,EACnE,6BAA6B,GAC9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,wBAAwB,EACxB,2BAA2B,IAAI,4BAA4B,GAC5D,MAAM,6BAA6B,CAAC;AAErC,8DAA8D;AAC9D,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAE1E,qBAAqB;AAErB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAuB,EACvB,SAAuE,EACvE,IAAY,EACZ,WAAmB,EACnB,SAA2B,EAC3B,WAAoB;IAEpB,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,QAAQ;YACR,KAAK,EAAE,EAAE;YACT,mBAAmB,EAAE,aAAa,QAAQ,yBAAyB;YACnE,OAAO,EAAE,qBAAqB,QAAQ,EAAE;SACzC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,eAAe;YAClB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;YAC5E,MAAM;QACR,KAAK,cAAc;
|
|
1
|
+
{"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/engine/skill-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { StructuredDocsResult } from '../../types/index.js';
|
|
2
|
+
export declare function extractStructuredDocs(html: string, tech: string): StructuredDocsResult;
|
|
3
|
+
export declare function buildFallbackResult(tech: string): StructuredDocsResult;
|
|
4
|
+
export declare function fetchDocsBatch(techs: string[], options?: {
|
|
5
|
+
timeout?: number;
|
|
6
|
+
concurrency?: number;
|
|
7
|
+
}): Promise<Map<string, StructuredDocsResult>>;
|
|
8
|
+
//# sourceMappingURL=docs-intelligence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-intelligence.d.ts","sourceRoot":"","sources":["../../../src/engine/web-fetcher/docs-intelligence.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AA+DjE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAwCtF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAatE;AA4BD,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAwB5C"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// Planu — Web Fetcher: Universal Docs Intelligence Engine (SPEC-382)
|
|
2
|
+
import { consultDocsImpl } from './docs-fetcher.js';
|
|
3
|
+
const BEST_PRACTICE_PATTERNS = [
|
|
4
|
+
/\bbest practice[s]?\b/i,
|
|
5
|
+
/\brecommended?\b/i,
|
|
6
|
+
/\byou should\b/i,
|
|
7
|
+
/\balways\b.{0,40}\b(use|prefer|ensure|check)/i,
|
|
8
|
+
/\bprefer\b.{0,40}\bover\b/i,
|
|
9
|
+
/\buse\b.{0,20}\bfor\b.{0,40}/i,
|
|
10
|
+
];
|
|
11
|
+
const ANTI_PATTERN_PATTERNS = [
|
|
12
|
+
/\bavoid\b/i,
|
|
13
|
+
/\bdeprecated\b/i,
|
|
14
|
+
/\bdo not\b/i,
|
|
15
|
+
/\bnever\b/i,
|
|
16
|
+
/\bnot recommended\b/i,
|
|
17
|
+
/\bobsolete\b/i,
|
|
18
|
+
];
|
|
19
|
+
const CONVENTION_PATTERNS = [
|
|
20
|
+
/\bconvention\b/i,
|
|
21
|
+
/\bstyle\b.{0,20}\bguid/i,
|
|
22
|
+
/\bnaming\b/i,
|
|
23
|
+
/\bformat\b.{0,20}\bshould\b/i,
|
|
24
|
+
/\bfollow.{0,20}\bpattern\b/i,
|
|
25
|
+
/\bfile structure\b/i,
|
|
26
|
+
];
|
|
27
|
+
const VERSION_PATTERNS = [
|
|
28
|
+
/\bv?\d+(\.\d+){0,2}\b.{0,60}\b(migration|upgrade|breaking|changed)\b/i,
|
|
29
|
+
/\b(migration|upgrade|breaking change)\b.{0,60}\bv?\d+(\.\d+){0,2}\b/i,
|
|
30
|
+
/\bdeprecated in\b.{0,30}\bv?\d+/i,
|
|
31
|
+
];
|
|
32
|
+
const TOOL_NAME_PATTERNS = /\b(npm|pnpm|yarn|npx|pip|cargo|brew|apt|go get)\b.{0,80}/i;
|
|
33
|
+
function splitIntoLines(text) {
|
|
34
|
+
return text
|
|
35
|
+
.split(/[\n.!?]/)
|
|
36
|
+
.map((l) => l.trim())
|
|
37
|
+
.filter((l) => l.length > 15 && l.length < 300);
|
|
38
|
+
}
|
|
39
|
+
function stripHtml(html) {
|
|
40
|
+
return html
|
|
41
|
+
.replace(/<script[\s\S]*?<\/script>/gi, '')
|
|
42
|
+
.replace(/<style[\s\S]*?<\/style>/gi, '')
|
|
43
|
+
.replace(/<[^>]+>/g, ' ')
|
|
44
|
+
.replace(/&[a-z]+;/gi, ' ')
|
|
45
|
+
.replace(/\s+/g, ' ')
|
|
46
|
+
.trim();
|
|
47
|
+
}
|
|
48
|
+
function matchesAny(line, patterns) {
|
|
49
|
+
return patterns.some((p) => p.test(line));
|
|
50
|
+
}
|
|
51
|
+
function dedup(items) {
|
|
52
|
+
return [...new Set(items)];
|
|
53
|
+
}
|
|
54
|
+
export function extractStructuredDocs(html, tech) {
|
|
55
|
+
const text = stripHtml(html);
|
|
56
|
+
const lines = splitIntoLines(text);
|
|
57
|
+
const bestPractices = [];
|
|
58
|
+
const antiPatterns = [];
|
|
59
|
+
const conventions = [];
|
|
60
|
+
const versionNotes = [];
|
|
61
|
+
const toolingRecommendations = [];
|
|
62
|
+
for (const line of lines) {
|
|
63
|
+
if (matchesAny(line, ANTI_PATTERN_PATTERNS)) {
|
|
64
|
+
antiPatterns.push(line);
|
|
65
|
+
}
|
|
66
|
+
else if (matchesAny(line, BEST_PRACTICE_PATTERNS)) {
|
|
67
|
+
bestPractices.push(line);
|
|
68
|
+
}
|
|
69
|
+
else if (matchesAny(line, CONVENTION_PATTERNS)) {
|
|
70
|
+
conventions.push(line);
|
|
71
|
+
}
|
|
72
|
+
if (matchesAny(line, VERSION_PATTERNS)) {
|
|
73
|
+
versionNotes.push(line);
|
|
74
|
+
}
|
|
75
|
+
if (TOOL_NAME_PATTERNS.test(line)) {
|
|
76
|
+
toolingRecommendations.push(line);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
tech,
|
|
81
|
+
docsUrl: '',
|
|
82
|
+
bestPractices: dedup(bestPractices).slice(0, 10),
|
|
83
|
+
antiPatterns: dedup(antiPatterns).slice(0, 10),
|
|
84
|
+
conventions: dedup(conventions).slice(0, 10),
|
|
85
|
+
versionNotes: dedup(versionNotes).slice(0, 5),
|
|
86
|
+
toolingRecommendations: dedup(toolingRecommendations).slice(0, 5),
|
|
87
|
+
source: 'discovered',
|
|
88
|
+
fetchedAt: new Date().toISOString(),
|
|
89
|
+
stale: false,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export function buildFallbackResult(tech) {
|
|
93
|
+
return {
|
|
94
|
+
tech,
|
|
95
|
+
docsUrl: '',
|
|
96
|
+
bestPractices: [],
|
|
97
|
+
antiPatterns: [],
|
|
98
|
+
conventions: [],
|
|
99
|
+
versionNotes: [],
|
|
100
|
+
toolingRecommendations: [],
|
|
101
|
+
source: 'fallback',
|
|
102
|
+
fetchedAt: new Date().toISOString(),
|
|
103
|
+
stale: true,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async function fetchOneTech(tech, timeoutMs) {
|
|
107
|
+
try {
|
|
108
|
+
const controller = new AbortController();
|
|
109
|
+
const timer = setTimeout(() => {
|
|
110
|
+
controller.abort();
|
|
111
|
+
}, timeoutMs);
|
|
112
|
+
let result;
|
|
113
|
+
try {
|
|
114
|
+
const docsResult = await consultDocsImpl(tech, tech);
|
|
115
|
+
const html = [docsResult.summary, ...docsResult.bestPractices].join('\n');
|
|
116
|
+
result = extractStructuredDocs(html, tech);
|
|
117
|
+
result.docsUrl = docsResult.docsUrl;
|
|
118
|
+
result.source = docsResult.source === 'local-fallback' ? 'fallback' : 'registry';
|
|
119
|
+
result.stale = docsResult.stale ?? false;
|
|
120
|
+
result.fetchedAt = docsResult.fetchedAt ?? new Date().toISOString();
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
clearTimeout(timer);
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return buildFallbackResult(tech);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export async function fetchDocsBatch(techs, options) {
|
|
132
|
+
const timeoutMs = options?.timeout ?? 10_000;
|
|
133
|
+
const concurrency = options?.concurrency ?? 3;
|
|
134
|
+
const results = new Map();
|
|
135
|
+
for (let i = 0; i < techs.length; i += concurrency) {
|
|
136
|
+
const batch = techs.slice(i, i + concurrency);
|
|
137
|
+
const settled = await Promise.allSettled(batch.map((tech) => fetchOneTech(tech, timeoutMs)));
|
|
138
|
+
for (let j = 0; j < batch.length; j++) {
|
|
139
|
+
const tech = batch[j];
|
|
140
|
+
if (tech === undefined) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const outcome = settled[j];
|
|
144
|
+
if (outcome === undefined || outcome.status === 'rejected') {
|
|
145
|
+
results.set(tech, buildFallbackResult(tech));
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
results.set(tech, outcome.value);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return results;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=docs-intelligence.js.map
|