@planu/cli 0.94.0 → 0.96.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/config/skill-catalog.json +94 -0
- package/dist/engine/browser-validator.d.ts +17 -0
- package/dist/engine/browser-validator.d.ts.map +1 -0
- package/dist/engine/browser-validator.js +167 -0
- package/dist/engine/browser-validator.js.map +1 -0
- package/dist/engine/diagram/excalidraw-generator.d.ts +7 -0
- package/dist/engine/diagram/excalidraw-generator.d.ts.map +1 -0
- package/dist/engine/diagram/excalidraw-generator.js +274 -0
- package/dist/engine/diagram/excalidraw-generator.js.map +1 -0
- package/dist/engine/github/findings-merger.d.ts +4 -0
- package/dist/engine/github/findings-merger.d.ts.map +1 -0
- package/dist/engine/github/findings-merger.js +97 -0
- package/dist/engine/github/findings-merger.js.map +1 -0
- package/dist/engine/github/quality-dimensions.d.ts +7 -0
- package/dist/engine/github/quality-dimensions.d.ts.map +1 -0
- package/dist/engine/github/quality-dimensions.js +243 -0
- package/dist/engine/github/quality-dimensions.js.map +1 -0
- package/dist/engine/github/review-analyzer.d.ts.map +1 -1
- package/dist/engine/github/review-analyzer.js +1 -0
- package/dist/engine/github/review-analyzer.js.map +1 -1
- package/dist/engine/github/review-dimensions.d.ts +8 -0
- package/dist/engine/github/review-dimensions.d.ts.map +1 -0
- package/dist/engine/github/review-dimensions.js +253 -0
- package/dist/engine/github/review-dimensions.js.map +1 -0
- package/dist/engine/github/review-helpers.d.ts +4 -0
- package/dist/engine/github/review-helpers.d.ts.map +1 -0
- package/dist/engine/github/review-helpers.js +31 -0
- package/dist/engine/github/review-helpers.js.map +1 -0
- package/dist/engine/google-workspace-exporter.d.ts +22 -0
- package/dist/engine/google-workspace-exporter.d.ts.map +1 -0
- package/dist/engine/google-workspace-exporter.js +159 -0
- package/dist/engine/google-workspace-exporter.js.map +1 -0
- package/dist/engine/skill-registry/builtin-catalog-adapter.d.ts +11 -0
- package/dist/engine/skill-registry/builtin-catalog-adapter.d.ts.map +1 -0
- package/dist/engine/skill-registry/builtin-catalog-adapter.js +95 -0
- package/dist/engine/skill-registry/builtin-catalog-adapter.js.map +1 -0
- package/dist/engine/skill-registry/index.d.ts +1 -0
- package/dist/engine/skill-registry/index.d.ts.map +1 -1
- package/dist/engine/skill-registry/index.js +1 -0
- package/dist/engine/skill-registry/index.js.map +1 -1
- package/dist/engine/skill-registry/installer.d.ts.map +1 -1
- package/dist/engine/skill-registry/installer.js +41 -0
- package/dist/engine/skill-registry/installer.js.map +1 -1
- package/dist/engine/skill-registry/unified-search.d.ts.map +1 -1
- package/dist/engine/skill-registry/unified-search.js +3 -0
- package/dist/engine/skill-registry/unified-search.js.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/browser-validate-handler.d.ts +8 -0
- package/dist/tools/browser-validate-handler.d.ts.map +1 -0
- package/dist/tools/browser-validate-handler.js +111 -0
- package/dist/tools/browser-validate-handler.js.map +1 -0
- package/dist/tools/diagram-handler.d.ts +4 -0
- package/dist/tools/diagram-handler.d.ts.map +1 -0
- package/dist/tools/diagram-handler.js +77 -0
- package/dist/tools/diagram-handler.js.map +1 -0
- package/dist/tools/github-review-handler.d.ts.map +1 -1
- package/dist/tools/github-review-handler.js +125 -0
- package/dist/tools/github-review-handler.js.map +1 -1
- package/dist/tools/google-workspace-handler.d.ts +10 -0
- package/dist/tools/google-workspace-handler.d.ts.map +1 -0
- package/dist/tools/google-workspace-handler.js +121 -0
- package/dist/tools/google-workspace-handler.js.map +1 -0
- package/dist/tools/register-browser-validate-tools.d.ts +3 -0
- package/dist/tools/register-browser-validate-tools.d.ts.map +1 -0
- package/dist/tools/register-browser-validate-tools.js +30 -0
- package/dist/tools/register-browser-validate-tools.js.map +1 -0
- package/dist/tools/register-diagram-tools.d.ts +3 -0
- package/dist/tools/register-diagram-tools.d.ts.map +1 -0
- package/dist/tools/register-diagram-tools.js +28 -0
- package/dist/tools/register-diagram-tools.js.map +1 -0
- package/dist/tools/register-github-tools.d.ts.map +1 -1
- package/dist/tools/register-github-tools.js +3 -1
- package/dist/tools/register-github-tools.js.map +1 -1
- package/dist/tools/register-google-workspace-tools.d.ts +3 -0
- package/dist/tools/register-google-workspace-tools.d.ts.map +1 -0
- package/dist/tools/register-google-workspace-tools.js +41 -0
- package/dist/tools/register-google-workspace-tools.js.map +1 -0
- package/dist/tools/schemas/github.d.ts +2 -0
- package/dist/tools/schemas/github.d.ts.map +1 -1
- package/dist/tools/schemas/github.js +3 -2
- package/dist/tools/schemas/github.js.map +1 -1
- package/dist/tools/skill-registry/search.d.ts.map +1 -1
- package/dist/tools/skill-registry/search.js +8 -0
- package/dist/tools/skill-registry/search.js.map +1 -1
- package/dist/types/browser-validator.d.ts +40 -0
- package/dist/types/browser-validator.d.ts.map +1 -0
- package/dist/types/browser-validator.js +3 -0
- package/dist/types/browser-validator.js.map +1 -0
- package/dist/types/common/tech-enums.d.ts +1 -1
- package/dist/types/common/tech-enums.d.ts.map +1 -1
- package/dist/types/diagram.d.ts +73 -0
- package/dist/types/diagram.d.ts.map +1 -0
- package/dist/types/diagram.js +2 -0
- package/dist/types/diagram.js.map +1 -0
- package/dist/types/github.d.ts +28 -1
- package/dist/types/github.d.ts.map +1 -1
- package/dist/types/google-workspace.d.ts +39 -0
- package/dist/types/google-workspace.d.ts.map +1 -0
- package/dist/types/google-workspace.js +3 -0
- package/dist/types/google-workspace.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/skill-registry.d.ts +22 -0
- package/dist/types/skill-registry.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/config/license-plans.json +4 -1
- package/src/config/skill-catalog.json +94 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// Review dimensions for expert PR analysis (SPEC-303)
|
|
2
|
+
import { parseDiffFiles } from './review-helpers.js';
|
|
3
|
+
import { runDuplication, runComplexity, runDeadCode, runQualityDimensions, } from './quality-dimensions.js';
|
|
4
|
+
export { runQualityDimensions };
|
|
5
|
+
function changedFilePaths(diff) {
|
|
6
|
+
return diff
|
|
7
|
+
.split('\n')
|
|
8
|
+
.filter((l) => l.startsWith('diff --git'))
|
|
9
|
+
.map((l) => {
|
|
10
|
+
const m = /b\/(.+)$/.exec(l);
|
|
11
|
+
return m?.[1] ?? '';
|
|
12
|
+
})
|
|
13
|
+
.filter(Boolean);
|
|
14
|
+
}
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Architecture dimension
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
function runArchitecture(diff) {
|
|
19
|
+
const findings = [];
|
|
20
|
+
const files = parseDiffFiles(diff);
|
|
21
|
+
// Track added line count per file (heuristic for "file > 400 lines")
|
|
22
|
+
const addedLines = {};
|
|
23
|
+
for (const file of files) {
|
|
24
|
+
addedLines[file.path] = (addedLines[file.path] ?? 0) + file.lines.length;
|
|
25
|
+
}
|
|
26
|
+
for (const file of files) {
|
|
27
|
+
const added = addedLines[file.path] ?? 0;
|
|
28
|
+
if (added > 400) {
|
|
29
|
+
findings.push({
|
|
30
|
+
file: file.path,
|
|
31
|
+
severity: 'warning',
|
|
32
|
+
category: 'architecture',
|
|
33
|
+
message: `File adds ${String(added)} lines in this PR (threshold: 400). Consider splitting.`,
|
|
34
|
+
suggestion: 'Break into smaller modules following single-responsibility principle.',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
for (const { lineNo, content } of file.lines) {
|
|
38
|
+
if (file.path.endsWith('.ts') || file.path.endsWith('.tsx')) {
|
|
39
|
+
const importMatch = /^\s*(?:import|export).*from\s+['"](\.[^'"]+)['"]/.exec(content);
|
|
40
|
+
if (importMatch?.[1]) {
|
|
41
|
+
const importPath = importMatch[1];
|
|
42
|
+
if (!importPath.endsWith('.js') && !importPath.endsWith('.json')) {
|
|
43
|
+
findings.push({
|
|
44
|
+
file: file.path,
|
|
45
|
+
line: lineNo,
|
|
46
|
+
severity: 'warning',
|
|
47
|
+
category: 'architecture',
|
|
48
|
+
message: `Missing .js extension in import: "${importPath}"`,
|
|
49
|
+
suggestion: `Add .js extension: "${importPath}.js"`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Circular-looking imports (file imports from parent with same name)
|
|
54
|
+
const circularMatch = /^\s*import.*from\s+['"]\.\.\/([^/'"]+)['"]/.exec(content);
|
|
55
|
+
if (circularMatch?.[1]) {
|
|
56
|
+
const importedModule = circularMatch[1];
|
|
57
|
+
const currentModule = file.path
|
|
58
|
+
.replace(/\.[^.]+$/, '')
|
|
59
|
+
.split('/')
|
|
60
|
+
.pop() ?? '';
|
|
61
|
+
if (importedModule === currentModule) {
|
|
62
|
+
findings.push({
|
|
63
|
+
file: file.path,
|
|
64
|
+
line: lineNo,
|
|
65
|
+
severity: 'warning',
|
|
66
|
+
category: 'architecture',
|
|
67
|
+
message: `Potential circular import: module imports from sibling with same name "${importedModule}"`,
|
|
68
|
+
suggestion: 'Review module boundaries to avoid circular dependencies.',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return findings;
|
|
76
|
+
}
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Security dimension
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
const SECURITY_PATTERNS = [
|
|
81
|
+
{
|
|
82
|
+
pattern: /password\s*[:=]\s*['"][^'"]{1,}['"]/i,
|
|
83
|
+
message: 'Hardcoded password detected',
|
|
84
|
+
suggestion: 'Use environment variables for secrets',
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
pattern: /api[_-]?key\s*[:=]\s*['"][^'"]{1,}['"]/i,
|
|
88
|
+
message: 'Hardcoded API key detected',
|
|
89
|
+
suggestion: 'Use environment variables for secrets',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
pattern: /Bearer\s+[A-Za-z0-9\-._~+/]{20,}/,
|
|
93
|
+
message: 'Hardcoded Bearer token detected',
|
|
94
|
+
suggestion: 'Load tokens from environment variables or a secrets manager',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
pattern: /['"`]\s*SELECT\s+.+\s*\+\s*[a-zA-Z_$]/i,
|
|
98
|
+
message: 'Possible SQL string concatenation — SQL injection risk',
|
|
99
|
+
suggestion: 'Use parameterized queries or an ORM',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
pattern: /eval\s*\(/,
|
|
103
|
+
message: 'Use of eval() detected',
|
|
104
|
+
suggestion: 'Avoid eval(); use safer alternatives like JSON.parse()',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
pattern: /dangerouslySetInnerHTML/,
|
|
108
|
+
message: 'dangerouslySetInnerHTML usage detected — XSS risk',
|
|
109
|
+
suggestion: 'Sanitize HTML with DOMPurify before using dangerouslySetInnerHTML',
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
function runSecurity(diff) {
|
|
113
|
+
const findings = [];
|
|
114
|
+
const files = parseDiffFiles(diff);
|
|
115
|
+
for (const file of files) {
|
|
116
|
+
for (const { lineNo, content } of file.lines) {
|
|
117
|
+
for (const { pattern, message, suggestion } of SECURITY_PATTERNS) {
|
|
118
|
+
if (pattern.test(content)) {
|
|
119
|
+
findings.push({
|
|
120
|
+
file: file.path,
|
|
121
|
+
line: lineNo,
|
|
122
|
+
severity: 'critical',
|
|
123
|
+
category: 'security',
|
|
124
|
+
message,
|
|
125
|
+
suggestion,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return findings;
|
|
132
|
+
}
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// Tests dimension
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
function runTests(diff) {
|
|
137
|
+
const findings = [];
|
|
138
|
+
const paths = changedFilePaths(diff);
|
|
139
|
+
const srcFiles = paths.filter((p) => p.startsWith('src/') && p.endsWith('.ts'));
|
|
140
|
+
const testFiles = new Set(paths.filter((p) => p.startsWith('tests/')));
|
|
141
|
+
for (const src of srcFiles) {
|
|
142
|
+
// src/foo/bar.ts → tests/foo/bar.test.ts
|
|
143
|
+
const relative = src.slice('src/'.length).replace(/\.ts$/, '');
|
|
144
|
+
const expected = `tests/${relative}.test.ts`;
|
|
145
|
+
if (!testFiles.has(expected)) {
|
|
146
|
+
findings.push({
|
|
147
|
+
file: src,
|
|
148
|
+
severity: 'warning',
|
|
149
|
+
category: 'tests',
|
|
150
|
+
message: `Source file changed but no corresponding test file found: ${expected}`,
|
|
151
|
+
suggestion: 'Add or update tests to cover the changed code.',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return findings;
|
|
156
|
+
}
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
// Conventions dimension
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
function runConventions(diff) {
|
|
161
|
+
const findings = [];
|
|
162
|
+
const files = parseDiffFiles(diff);
|
|
163
|
+
for (const file of files) {
|
|
164
|
+
if (!file.path.endsWith('.ts') && !file.path.endsWith('.tsx')) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
for (const { lineNo, content } of file.lines) {
|
|
168
|
+
if (/:\s*any\b/.test(content) && !content.trimStart().startsWith('//')) {
|
|
169
|
+
findings.push({
|
|
170
|
+
file: file.path,
|
|
171
|
+
line: lineNo,
|
|
172
|
+
severity: 'warning',
|
|
173
|
+
category: 'conventions',
|
|
174
|
+
message: 'Explicit `any` type used — weakens type safety',
|
|
175
|
+
suggestion: 'Replace `any` with a specific type, `unknown`, or a generic.',
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Check .github/ files for conventional commit patterns
|
|
180
|
+
if (file.path.startsWith('.github/')) {
|
|
181
|
+
for (const { lineNo, content } of file.lines) {
|
|
182
|
+
if (/commit\s+message/i.test(content) && !/conventional/i.test(content)) {
|
|
183
|
+
findings.push({
|
|
184
|
+
file: file.path,
|
|
185
|
+
line: lineNo,
|
|
186
|
+
severity: 'info',
|
|
187
|
+
category: 'conventions',
|
|
188
|
+
message: 'Commit message check found without conventional-commits enforcement',
|
|
189
|
+
suggestion: 'Ensure commitlint with conventional-commits preset is configured.',
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return findings;
|
|
196
|
+
}
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
// Spec-drift dimension
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
function runSpecDrift(diff, context) {
|
|
201
|
+
if (!context.specId) {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
const findings = [];
|
|
205
|
+
const paths = changedFilePaths(diff);
|
|
206
|
+
const specSlug = context.specId.toLowerCase().replace(/spec-\d+-?/i, '');
|
|
207
|
+
const keywords = specSlug.split(/[-_\s]+/).filter((k) => k.length > 2);
|
|
208
|
+
if (keywords.length === 0) {
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
for (const filePath of paths) {
|
|
212
|
+
const lowerPath = filePath.toLowerCase();
|
|
213
|
+
const matchesSpec = keywords.some((kw) => lowerPath.includes(kw));
|
|
214
|
+
if (!matchesSpec &&
|
|
215
|
+
filePath.startsWith('src/') &&
|
|
216
|
+
!filePath.includes('types/') &&
|
|
217
|
+
!filePath.includes('index')) {
|
|
218
|
+
findings.push({
|
|
219
|
+
file: filePath,
|
|
220
|
+
severity: 'info',
|
|
221
|
+
category: 'spec-drift',
|
|
222
|
+
message: `File may be outside the scope of ${context.specId} (keywords: ${keywords.join(', ')})`,
|
|
223
|
+
suggestion: 'Verify this change is intentional for this spec, or move to a separate PR.',
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return findings;
|
|
228
|
+
}
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
// Main orchestrator
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
232
|
+
export function runAllDimensions(diff, context) {
|
|
233
|
+
const dimensions = [
|
|
234
|
+
['architecture', () => runArchitecture(diff)],
|
|
235
|
+
['security', () => runSecurity(diff)],
|
|
236
|
+
['tests', () => runTests(diff)],
|
|
237
|
+
['conventions', () => runConventions(diff)],
|
|
238
|
+
['spec-drift', () => runSpecDrift(diff, context)],
|
|
239
|
+
['duplication', () => runDuplication(diff)],
|
|
240
|
+
['complexity', () => runComplexity(diff)],
|
|
241
|
+
['dead-code', () => runDeadCode(diff)],
|
|
242
|
+
];
|
|
243
|
+
return Promise.resolve(dimensions.map(([name, fn]) => {
|
|
244
|
+
const start = Date.now();
|
|
245
|
+
const findings = fn();
|
|
246
|
+
return {
|
|
247
|
+
dimension: name,
|
|
248
|
+
findings,
|
|
249
|
+
duration: Date.now() - start,
|
|
250
|
+
};
|
|
251
|
+
}));
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=review-dimensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-dimensions.js","sourceRoot":"","sources":["../../../src/engine/github/review-dimensions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-helpers.d.ts","sourceRoot":"","sources":["../../../src/engine/github/review-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CA+B7D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Parse a git diff string into structured per-file change lists. */
|
|
2
|
+
export function parseDiffFiles(diff) {
|
|
3
|
+
const files = [];
|
|
4
|
+
let current = null;
|
|
5
|
+
let lineNo = 0;
|
|
6
|
+
for (const line of diff.split('\n')) {
|
|
7
|
+
if (line.startsWith('diff --git')) {
|
|
8
|
+
const match = /b\/(.+)$/.exec(line);
|
|
9
|
+
if (match?.[1]) {
|
|
10
|
+
current = { path: match[1], lines: [] };
|
|
11
|
+
files.push(current);
|
|
12
|
+
lineNo = 0;
|
|
13
|
+
}
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const hunkMatch = /^@@\s+-\d+(?:,\d+)?\s+\+(\d+)/.exec(line);
|
|
17
|
+
if (hunkMatch?.[1]) {
|
|
18
|
+
lineNo = Number(hunkMatch[1]);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
22
|
+
current?.lines.push({ lineNo, content: line.slice(1) });
|
|
23
|
+
lineNo++;
|
|
24
|
+
}
|
|
25
|
+
else if (!line.startsWith('-')) {
|
|
26
|
+
lineNo++;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return files;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=review-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-helpers.js","sourceRoot":"","sources":["../../../src/engine/github/review-helpers.ts"],"names":[],"mappings":"AAGA,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,OAAO,GAA0B,IAAI,CAAC;IAC1C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,OAAO,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpB,MAAM,GAAG,CAAC,CAAC;YACb,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnB,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SpecSheetEntry } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Convert spec.md content to Google Docs-compatible markdown.
|
|
4
|
+
* Adds a header with the spec ID and normalizes heading levels.
|
|
5
|
+
*/
|
|
6
|
+
export declare function specToGoogleDocsFormat(specContent: string, specId: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Convert a specs array to Google Sheets-compatible CSV.
|
|
9
|
+
* Includes a header row with standard column names.
|
|
10
|
+
*/
|
|
11
|
+
export declare function specsToCSV(specs: SpecSheetEntry[]): string;
|
|
12
|
+
/**
|
|
13
|
+
* Generate a Google Apps Script (.gs) that creates a Google Doc from spec content.
|
|
14
|
+
* The script can be run from Google Apps Script editor to create or update the Doc.
|
|
15
|
+
*/
|
|
16
|
+
export declare function generateAppsScript(specId: string, specContent: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Convert Google Docs exported markdown back to Planu spec format.
|
|
19
|
+
* Extracts title and description to build a minimal spec.md front matter.
|
|
20
|
+
*/
|
|
21
|
+
export declare function googleDocsToSpec(docsContent: string): string;
|
|
22
|
+
//# sourceMappingURL=google-workspace-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-workspace-exporter.d.ts","sourceRoot":"","sources":["../../src/engine/google-workspace-exporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAWxD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAkClF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,CAe1D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAyD9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkC5D"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// engine/google-workspace-exporter.ts — SPEC-310: Google Workspace Sync
|
|
2
|
+
/** CSV-escape a single cell value. */
|
|
3
|
+
function csvCell(value) {
|
|
4
|
+
const escaped = value.replace(/"/g, '""');
|
|
5
|
+
if (escaped.includes(',') || escaped.includes('"') || escaped.includes('\n')) {
|
|
6
|
+
return `"${escaped}"`;
|
|
7
|
+
}
|
|
8
|
+
return escaped;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Convert spec.md content to Google Docs-compatible markdown.
|
|
12
|
+
* Adds a header with the spec ID and normalizes heading levels.
|
|
13
|
+
*/
|
|
14
|
+
export function specToGoogleDocsFormat(specContent, specId) {
|
|
15
|
+
const lines = specContent.split('\n');
|
|
16
|
+
const normalized = [];
|
|
17
|
+
// Ensure the doc starts with the spec ID as a heading
|
|
18
|
+
const firstHeading = lines.find((l) => l.startsWith('#'));
|
|
19
|
+
if (firstHeading?.includes(specId) !== true) {
|
|
20
|
+
normalized.push(`# ${specId}`);
|
|
21
|
+
normalized.push('');
|
|
22
|
+
}
|
|
23
|
+
let inFrontmatter = false;
|
|
24
|
+
let frontmatterDone = false;
|
|
25
|
+
for (const line of lines) {
|
|
26
|
+
// Skip YAML frontmatter — not Google Docs friendly
|
|
27
|
+
if (line.trim() === '---' && !frontmatterDone) {
|
|
28
|
+
if (!inFrontmatter) {
|
|
29
|
+
inFrontmatter = true;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
inFrontmatter = false;
|
|
34
|
+
frontmatterDone = true;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (inFrontmatter) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
normalized.push(line);
|
|
42
|
+
}
|
|
43
|
+
return normalized.join('\n');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Convert a specs array to Google Sheets-compatible CSV.
|
|
47
|
+
* Includes a header row with standard column names.
|
|
48
|
+
*/
|
|
49
|
+
export function specsToCSV(specs) {
|
|
50
|
+
const header = ['ID', 'Title', 'Status', 'Estimate', 'Risk'];
|
|
51
|
+
const rows = [header];
|
|
52
|
+
for (const spec of specs) {
|
|
53
|
+
rows.push([
|
|
54
|
+
csvCell(spec.id),
|
|
55
|
+
csvCell(spec.title),
|
|
56
|
+
csvCell(spec.status),
|
|
57
|
+
csvCell(spec.estimate ?? ''),
|
|
58
|
+
csvCell(spec.risk ?? ''),
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
return rows.map((row) => row.join(',')).join('\n');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Generate a Google Apps Script (.gs) that creates a Google Doc from spec content.
|
|
65
|
+
* The script can be run from Google Apps Script editor to create or update the Doc.
|
|
66
|
+
*/
|
|
67
|
+
export function generateAppsScript(specId, specContent) {
|
|
68
|
+
// Escape content for embedding in script string literal
|
|
69
|
+
const escaped = specContent
|
|
70
|
+
.replace(/\\/g, '\\\\')
|
|
71
|
+
.replace(/'/g, "\\'")
|
|
72
|
+
.replace(/\n/g, '\\n')
|
|
73
|
+
.replace(/\r/g, '');
|
|
74
|
+
return [
|
|
75
|
+
`// Google Apps Script — Planu SPEC-310`,
|
|
76
|
+
`// Auto-generated for spec: ${specId}`,
|
|
77
|
+
`// Run this in https://script.google.com to create or update a Google Doc`,
|
|
78
|
+
``,
|
|
79
|
+
`function createSpecDoc_${specId.replace(/-/g, '_')}() {`,
|
|
80
|
+
` var title = 'Planu — ${specId}';`,
|
|
81
|
+
` var content = '${escaped}';`,
|
|
82
|
+
``,
|
|
83
|
+
` // Find existing doc or create a new one`,
|
|
84
|
+
` var files = DriveApp.getFilesByName(title);`,
|
|
85
|
+
` var doc;`,
|
|
86
|
+
` if (files.hasNext()) {`,
|
|
87
|
+
` doc = DocumentApp.openById(files.next().getId());`,
|
|
88
|
+
` } else {`,
|
|
89
|
+
` doc = DocumentApp.create(title);`,
|
|
90
|
+
` }`,
|
|
91
|
+
``,
|
|
92
|
+
` var body = doc.getBody();`,
|
|
93
|
+
` body.clear();`,
|
|
94
|
+
``,
|
|
95
|
+
` // Parse and insert content`,
|
|
96
|
+
` var lines = content.split('\\n');`,
|
|
97
|
+
` for (var i = 0; i < lines.length; i++) {`,
|
|
98
|
+
` var line = lines[i];`,
|
|
99
|
+
` if (line.startsWith('# ')) {`,
|
|
100
|
+
` body.appendParagraph(line.substring(2))`,
|
|
101
|
+
` .setHeading(DocumentApp.ParagraphHeading.HEADING1);`,
|
|
102
|
+
` } else if (line.startsWith('## ')) {`,
|
|
103
|
+
` body.appendParagraph(line.substring(3))`,
|
|
104
|
+
` .setHeading(DocumentApp.ParagraphHeading.HEADING2);`,
|
|
105
|
+
` } else if (line.startsWith('### ')) {`,
|
|
106
|
+
` body.appendParagraph(line.substring(4))`,
|
|
107
|
+
` .setHeading(DocumentApp.ParagraphHeading.HEADING3);`,
|
|
108
|
+
` } else if (line.length > 0) {`,
|
|
109
|
+
` body.appendParagraph(line);`,
|
|
110
|
+
` }`,
|
|
111
|
+
` }`,
|
|
112
|
+
``,
|
|
113
|
+
` doc.saveAndClose();`,
|
|
114
|
+
` Logger.log('Doc created: ' + doc.getUrl());`,
|
|
115
|
+
` return doc.getUrl();`,
|
|
116
|
+
`}`,
|
|
117
|
+
``,
|
|
118
|
+
`function syncAllSpecs() {`,
|
|
119
|
+
` // Entry point for scheduled sync`,
|
|
120
|
+
` createSpecDoc_${specId.replace(/-/g, '_')}();`,
|
|
121
|
+
`}`,
|
|
122
|
+
].join('\n');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Convert Google Docs exported markdown back to Planu spec format.
|
|
126
|
+
* Extracts title and description to build a minimal spec.md front matter.
|
|
127
|
+
*/
|
|
128
|
+
export function googleDocsToSpec(docsContent) {
|
|
129
|
+
const lines = docsContent.split('\n');
|
|
130
|
+
let title = '';
|
|
131
|
+
let description = '';
|
|
132
|
+
const bodyLines = [];
|
|
133
|
+
let titleFound = false;
|
|
134
|
+
for (const line of lines) {
|
|
135
|
+
if (!titleFound && line.startsWith('# ')) {
|
|
136
|
+
title = line.substring(2).trim();
|
|
137
|
+
titleFound = true;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (titleFound) {
|
|
141
|
+
bodyLines.push(line);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Extract first paragraph as description
|
|
145
|
+
const firstParagraphIdx = bodyLines.findIndex((l) => l.trim().length > 0 && !l.startsWith('#'));
|
|
146
|
+
if (firstParagraphIdx >= 0) {
|
|
147
|
+
description = bodyLines[firstParagraphIdx]?.trim() ?? '';
|
|
148
|
+
}
|
|
149
|
+
const frontmatter = [
|
|
150
|
+
'---',
|
|
151
|
+
`title: "${title}"`,
|
|
152
|
+
`status: draft`,
|
|
153
|
+
`description: "${description}"`,
|
|
154
|
+
'---',
|
|
155
|
+
'',
|
|
156
|
+
];
|
|
157
|
+
return [...frontmatter, ...bodyLines].join('\n');
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=google-workspace-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google-workspace-exporter.js","sourceRoot":"","sources":["../../src/engine/google-workspace-exporter.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAIxE,sCAAsC;AACtC,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7E,OAAO,IAAI,OAAO,GAAG,CAAC;IACxB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB,EAAE,MAAc;IACxE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,sDAAsD;IACtD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,IAAI,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5C,UAAU,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,mDAAmD;QACnD,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,aAAa,GAAG,IAAI,CAAC;gBACrB,SAAS;YACX,CAAC;iBAAM,CAAC;gBACN,aAAa,GAAG,KAAK,CAAC;gBACtB,eAAe,GAAG,IAAI,CAAC;gBACvB,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,aAAa,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAuB;IAChD,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAe,CAAC,MAAM,CAAC,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC;YACR,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;SACzB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,WAAmB;IACpE,wDAAwD;IACxD,MAAM,OAAO,GAAG,WAAW;SACxB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEtB,OAAO;QACL,wCAAwC;QACxC,+BAA+B,MAAM,EAAE;QACvC,2EAA2E;QAC3E,EAAE;QACF,0BAA0B,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM;QACzD,0BAA0B,MAAM,IAAI;QACpC,oBAAoB,OAAO,IAAI;QAC/B,EAAE;QACF,4CAA4C;QAC5C,+CAA+C;QAC/C,YAAY;QACZ,0BAA0B;QAC1B,uDAAuD;QACvD,YAAY;QACZ,sCAAsC;QACtC,KAAK;QACL,EAAE;QACF,6BAA6B;QAC7B,iBAAiB;QACjB,EAAE;QACF,+BAA+B;QAC/B,qCAAqC;QACrC,4CAA4C;QAC5C,0BAA0B;QAC1B,kCAAkC;QAClC,+CAA+C;QAC/C,gEAAgE;QAChE,0CAA0C;QAC1C,+CAA+C;QAC/C,gEAAgE;QAChE,2CAA2C;QAC3C,+CAA+C;QAC/C,gEAAgE;QAChE,mCAAmC;QACnC,mCAAmC;QACnC,OAAO;QACP,KAAK;QACL,EAAE;QACF,uBAAuB;QACvB,+CAA+C;QAC/C,wBAAwB;QACxB,GAAG;QACH,EAAE;QACF,2BAA2B;QAC3B,qCAAqC;QACrC,mBAAmB,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK;QACjD,GAAG;KACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,UAAU,GAAG,IAAI,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,iBAAiB,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChG,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;QAC3B,WAAW,GAAG,SAAS,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,KAAK;QACL,WAAW,KAAK,GAAG;QACnB,eAAe;QACf,iBAAiB,WAAW,GAAG;QAC/B,KAAK;QACL,EAAE;KACH,CAAC;IAEF,OAAO,CAAC,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SkillSearchResult, BuiltInSkillEntry } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Search built-in skills from the skill catalog.
|
|
4
|
+
* Returns all matching skills regardless of query for built-in catalog browsing.
|
|
5
|
+
*/
|
|
6
|
+
export declare function searchBuiltInSkills(query: string): SkillSearchResult[];
|
|
7
|
+
/** Get a single built-in skill entry by exact name. Returns undefined if not found. */
|
|
8
|
+
export declare function getBuiltInSkillEntry(name: string): BuiltInSkillEntry | undefined;
|
|
9
|
+
/** Clear the catalog cache (for testing). */
|
|
10
|
+
export declare function clearBuiltInCatalogCache(): void;
|
|
11
|
+
//# sourceMappingURL=builtin-catalog-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin-catalog-adapter.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-registry/builtin-catalog-adapter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAgB,MAAM,sBAAsB,CAAC;AAkE/F;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAsBtE;AAED,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAEhF;AAED,6CAA6C;AAC7C,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// engine/skill-registry/builtin-catalog-adapter.ts — SPEC-307: Built-in skill catalog search
|
|
2
|
+
// Searches src/config/skill-catalog.json for built-in skills without network calls.
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { join, dirname } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
let catalogCache = null;
|
|
8
|
+
/** Load the built-in skill catalog from disk (cached after first read). */
|
|
9
|
+
function loadCatalog() {
|
|
10
|
+
if (catalogCache !== null) {
|
|
11
|
+
return catalogCache;
|
|
12
|
+
}
|
|
13
|
+
// Try compiled path first (dist/config/), then source path (src/config/)
|
|
14
|
+
const compiledPath = join(__dirname, '../../config/skill-catalog.json');
|
|
15
|
+
const sourcePath = join(__dirname, '../../../src/config/skill-catalog.json');
|
|
16
|
+
for (const configPath of [compiledPath, sourcePath]) {
|
|
17
|
+
let raw;
|
|
18
|
+
try {
|
|
19
|
+
raw = readFileSync(configPath, 'utf-8');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const catalog = JSON.parse(raw);
|
|
26
|
+
catalogCache = catalog.skills.length > 0 ? catalog.skills : [];
|
|
27
|
+
return catalogCache;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
console.warn('[skill_search] skill-catalog.json is corrupted, skipping built-in catalog');
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
/** Compute a simple relevance score for a built-in skill against a query. */
|
|
37
|
+
function scoreBuiltIn(skill, query) {
|
|
38
|
+
const q = query.toLowerCase();
|
|
39
|
+
const nameLower = skill.name.toLowerCase();
|
|
40
|
+
const descLower = skill.description.toLowerCase();
|
|
41
|
+
const categoryLower = skill.category.toLowerCase();
|
|
42
|
+
const tagMatch = skill.tags.some((t) => t.toLowerCase().includes(q));
|
|
43
|
+
let score = 0;
|
|
44
|
+
if (nameLower === q) {
|
|
45
|
+
score += 0.45;
|
|
46
|
+
}
|
|
47
|
+
else if (nameLower.includes(q)) {
|
|
48
|
+
score += 0.3;
|
|
49
|
+
}
|
|
50
|
+
if (descLower.includes(q)) {
|
|
51
|
+
score += 0.15;
|
|
52
|
+
}
|
|
53
|
+
if (categoryLower.includes(q)) {
|
|
54
|
+
score += 0.1;
|
|
55
|
+
}
|
|
56
|
+
if (tagMatch) {
|
|
57
|
+
score += 0.1;
|
|
58
|
+
}
|
|
59
|
+
// Small boost for built-in skills to surface them alongside remote results
|
|
60
|
+
score += 0.02;
|
|
61
|
+
return Math.min(score, 1);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Search built-in skills from the skill catalog.
|
|
65
|
+
* Returns all matching skills regardless of query for built-in catalog browsing.
|
|
66
|
+
*/
|
|
67
|
+
export function searchBuiltInSkills(query) {
|
|
68
|
+
const catalog = loadCatalog();
|
|
69
|
+
const q = query.toLowerCase();
|
|
70
|
+
const results = [];
|
|
71
|
+
for (const skill of catalog) {
|
|
72
|
+
const score = scoreBuiltIn(skill, q);
|
|
73
|
+
// Include if any keyword matches (score > 0.02 means something matched beyond the boost)
|
|
74
|
+
if (score > 0.03) {
|
|
75
|
+
results.push({
|
|
76
|
+
name: skill.name,
|
|
77
|
+
description: skill.description,
|
|
78
|
+
source: 'builtin',
|
|
79
|
+
installCommand: skill.installCommand,
|
|
80
|
+
tags: skill.tags,
|
|
81
|
+
relevanceScore: score,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return results;
|
|
86
|
+
}
|
|
87
|
+
/** Get a single built-in skill entry by exact name. Returns undefined if not found. */
|
|
88
|
+
export function getBuiltInSkillEntry(name) {
|
|
89
|
+
return loadCatalog().find((s) => s.name === name);
|
|
90
|
+
}
|
|
91
|
+
/** Clear the catalog cache (for testing). */
|
|
92
|
+
export function clearBuiltInCatalogCache() {
|
|
93
|
+
catalogCache = null;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=builtin-catalog-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin-catalog-adapter.js","sourceRoot":"","sources":["../../../src/engine/skill-registry/builtin-catalog-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,4 +4,5 @@ export { searchAnthropicSkills, fetchAnthropicSkillContent, clearAnthropicCache,
|
|
|
4
4
|
export { searchSkillsSh } from './skillssh-adapter.js';
|
|
5
5
|
export { searchAgentSkills } from './agentskill-adapter.js';
|
|
6
6
|
export { discoverNewRegistries } from './discovery.js';
|
|
7
|
+
export { searchBuiltInSkills, clearBuiltInCatalogCache, getBuiltInSkillEntry, } from './builtin-catalog-adapter.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-registry/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-registry/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC"}
|
|
@@ -5,4 +5,5 @@ export { searchAnthropicSkills, fetchAnthropicSkillContent, clearAnthropicCache,
|
|
|
5
5
|
export { searchSkillsSh } from './skillssh-adapter.js';
|
|
6
6
|
export { searchAgentSkills } from './agentskill-adapter.js';
|
|
7
7
|
export { discoverNewRegistries } from './discovery.js';
|
|
8
|
+
export { searchBuiltInSkills, clearBuiltInCatalogCache, getBuiltInSkillEntry, } from './builtin-catalog-adapter.js';
|
|
8
9
|
//# sourceMappingURL=index.js.map
|