superskills 0.1.0 → 0.2.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/README.md +48 -9
- package/dist/discovery/analyze.d.ts.map +1 -1
- package/dist/discovery/analyze.js +6 -38
- package/dist/discovery/analyze.js.map +1 -1
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +3 -26
- package/dist/discovery/index.js.map +1 -1
- package/dist/evolve/index.d.ts +12 -0
- package/dist/evolve/index.d.ts.map +1 -0
- package/dist/evolve/index.js +96 -0
- package/dist/evolve/index.js.map +1 -0
- package/dist/evolve/proposer.d.ts +34 -0
- package/dist/evolve/proposer.d.ts.map +1 -0
- package/dist/evolve/proposer.js +170 -0
- package/dist/evolve/proposer.js.map +1 -0
- package/dist/evolve/scanner.d.ts +14 -0
- package/dist/evolve/scanner.d.ts.map +1 -0
- package/dist/evolve/scanner.js +69 -0
- package/dist/evolve/scanner.js.map +1 -0
- package/dist/handoff/collector.d.ts +24 -0
- package/dist/handoff/collector.d.ts.map +1 -0
- package/dist/handoff/collector.js +161 -0
- package/dist/handoff/collector.js.map +1 -0
- package/dist/handoff/index.d.ts +11 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +38 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/renderer.d.ts +3 -0
- package/dist/handoff/renderer.d.ts.map +1 -0
- package/dist/handoff/renderer.js +71 -0
- package/dist/handoff/renderer.js.map +1 -0
- package/dist/index.js +143 -49
- package/dist/index.js.map +1 -1
- package/dist/scaffold/index.js +23 -23
- package/dist/scaffold/index.js.map +1 -1
- package/dist/scaffold/templates/skill-commands.d.ts.map +1 -1
- package/dist/scaffold/templates/skill-commands.js +20 -11
- package/dist/scaffold/templates/skill-commands.js.map +1 -1
- package/dist/scaffold/templates/teammate-prompts.d.ts.map +1 -1
- package/dist/scaffold/templates/teammate-prompts.js +20 -29
- package/dist/scaffold/templates/teammate-prompts.js.map +1 -1
- package/dist/utils/auth.d.ts +28 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +136 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/claude-cli.d.ts +11 -0
- package/dist/utils/claude-cli.d.ts.map +1 -0
- package/dist/utils/claude-cli.js +59 -0
- package/dist/utils/claude-cli.js.map +1 -0
- package/dist/utils/model-tiers.d.ts +11 -0
- package/dist/utils/model-tiers.d.ts.map +1 -0
- package/dist/utils/model-tiers.js +24 -0
- package/dist/utils/model-tiers.js.map +1 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -45,17 +45,23 @@ This is **EIID**. Discovery maps your business problem to these four layers. Eve
|
|
|
45
45
|
|
|
46
46
|
**For the CLI (new project generation):**
|
|
47
47
|
- Node.js 20 or later. Check with `node --version`.
|
|
48
|
-
-
|
|
48
|
+
- Authentication (one of):
|
|
49
|
+
- **Claude CLI** with an active subscription (Max or Pro). Detected automatically. No API key needed.
|
|
50
|
+
- **Anthropic API key**: [console.anthropic.com/settings/keys](https://console.anthropic.com/settings/keys). Free tier available.
|
|
49
51
|
|
|
50
52
|
## Install
|
|
51
53
|
|
|
54
|
+
```bash
|
|
55
|
+
npm install -g superskills
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Or install from source:
|
|
59
|
+
|
|
52
60
|
```bash
|
|
53
61
|
git clone https://github.com/Play-New/SuperSkills.git
|
|
54
62
|
cd SuperSkills && npm install && npm run build && npm link
|
|
55
63
|
```
|
|
56
64
|
|
|
57
|
-
After `npm link`, the `superskills` command works globally.
|
|
58
|
-
|
|
59
65
|
If you only need the standalone skills (no CLI), skip the install. Just clone and copy the skill folders into your project (see below).
|
|
60
66
|
|
|
61
67
|
## Add skills to an existing project
|
|
@@ -125,9 +131,9 @@ For new projects, the CLI runs the full pipeline: describe the problem, analyze
|
|
|
125
131
|
superskills
|
|
126
132
|
```
|
|
127
133
|
|
|
128
|
-
It asks about your business problem step by step. If you
|
|
134
|
+
It asks about your business problem step by step. If you have Claude CLI installed with an active subscription, it uses that automatically. Otherwise it checks for an API key, and if neither is found, it offers an interactive menu.
|
|
129
135
|
|
|
130
|
-
Optional one-time setup (
|
|
136
|
+
Optional one-time setup (configures authentication and Claude Code integration):
|
|
131
137
|
|
|
132
138
|
```bash
|
|
133
139
|
superskills init
|
|
@@ -169,6 +175,34 @@ Then open in Claude Code and run the init skills:
|
|
|
169
175
|
|
|
170
176
|
These run once. After that, hooks handle ongoing checks automatically.
|
|
171
177
|
|
|
178
|
+
## Keep skills in sync
|
|
179
|
+
|
|
180
|
+
As a project evolves (new dependencies, new delivery channels, framework changes), the skill configuration can drift. `evolve` detects this.
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
superskills evolve
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
It scans `package.json`, compares against the installed skill configuration, and proposes updates:
|
|
187
|
+
|
|
188
|
+
- **Skill implications**: "Stripe detected. Trust skill should check PCI-DSS patterns."
|
|
189
|
+
- **Negative constraints**: "Use Drizzle, NOT Prisma." Written to CLAUDE.md so Claude never suggests the wrong alternative.
|
|
190
|
+
- **MCP data connectors**: "Supabase MCP available for direct database queries." These are data connectors, not skill replacements.
|
|
191
|
+
|
|
192
|
+
The report can be appended to CLAUDE.md (`--apply`) or output as JSON (`--json`).
|
|
193
|
+
|
|
194
|
+
## Developer handoff
|
|
195
|
+
|
|
196
|
+
When a project moves from one developer to another, `handoff` generates a complete status document.
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
superskills handoff
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Writes `HANDOFF.md` with: tech stack, build/test status, EIID mapping, accumulated skill findings from CLAUDE.md, technology constraints, and dependency overview. Everything a new developer needs to understand the project state without reading the full codebase.
|
|
203
|
+
|
|
204
|
+
Options: `--no-build` and `--no-test` to skip running those checks. `--json` for machine-readable output.
|
|
205
|
+
|
|
172
206
|
## EIID in practice
|
|
173
207
|
|
|
174
208
|
Same distributor, layer by layer.
|
|
@@ -322,7 +356,7 @@ npm install
|
|
|
322
356
|
### Commands
|
|
323
357
|
|
|
324
358
|
```bash
|
|
325
|
-
npm test #
|
|
359
|
+
npm test # 166 tests across 10 files
|
|
326
360
|
npm run type-check # TypeScript strict mode
|
|
327
361
|
npm run dev # Run CLI in development mode
|
|
328
362
|
npm run build # Compile to dist/
|
|
@@ -333,18 +367,23 @@ npm run lint # ESLint
|
|
|
333
367
|
|
|
334
368
|
| Variable | Required | Default |
|
|
335
369
|
|----------|----------|---------|
|
|
336
|
-
| `ANTHROPIC_API_KEY` |
|
|
370
|
+
| `ANTHROPIC_API_KEY` | No (if Claude CLI available) | Detected via Claude CLI, env, or interactive prompt |
|
|
337
371
|
| `SUPERSKILLS_MODEL` | No | `claude-opus-4-6` |
|
|
338
372
|
|
|
339
373
|
### Tests
|
|
340
374
|
|
|
341
|
-
|
|
375
|
+
166 tests across ten files:
|
|
342
376
|
|
|
343
377
|
| File | Count | What It Tests |
|
|
344
378
|
|------|-------|--------------|
|
|
345
|
-
| `analyze.test.ts` |
|
|
379
|
+
| `analyze.test.ts` | 16 | LLM call mocking, JSON validation, markdown stripping |
|
|
380
|
+
| `auth.test.ts` | 13 | Three-tier auth cascade, LLM dispatch, caching |
|
|
346
381
|
| `catalog.test.ts` | 24 | Channel mapping, tool selection, category handling |
|
|
382
|
+
| `claude-cli.test.ts` | 11 | CLI detection, auth check, execution (child_process mocked) |
|
|
347
383
|
| `discovery-core.test.ts` | 10 | Validation pipeline, error transformation |
|
|
384
|
+
| `evolve.test.ts` | 21 | Project scanning, skill implications, negative constraints, MCP suggestions |
|
|
385
|
+
| `handoff.test.ts` | 18 | Project info collection, HANDOFF.md rendering, skill finding extraction |
|
|
386
|
+
| `model-tiers.test.ts` | 7 | Model tier defaults, env override, stable aliases |
|
|
348
387
|
| `scaffold.test.ts` | 26 | File generation, hooks, agents, skills, design tokens, Playwright, E2E |
|
|
349
388
|
| `schema.test.ts` | 20 | Zod validation edge cases, defaults, JSON Schema output |
|
|
350
389
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/discovery/analyze.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/discovery/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA0DlE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAuB3F;AA8CD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAqC1B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
2
1
|
import { StrategicAnalysisSchema, EIIDMappingSchema } from './schema.js';
|
|
2
|
+
import { executeLLMCall } from '../utils/auth.js';
|
|
3
3
|
const ANALYSIS_PROMPT = `Generate strategic analysis for the following project.
|
|
4
4
|
|
|
5
5
|
ANALYSIS FRAMEWORKS:
|
|
@@ -53,34 +53,15 @@ OUTPUT: JSON only, no markdown, no explanation.
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
STYLE: Direct statements. No "I recommend", no "you should". Facts and analysis only.`;
|
|
56
|
-
const DEFAULT_MODEL = 'claude-opus-4-6';
|
|
57
|
-
function getModel() {
|
|
58
|
-
return process.env.SUPERSKILLS_MODEL || DEFAULT_MODEL;
|
|
59
|
-
}
|
|
60
56
|
export function stripMarkdownFences(text) {
|
|
61
57
|
const match = text.match(/^\s*```(?:json)?\s*\n?([\s\S]*?)\n?\s*```\s*$/);
|
|
62
58
|
return match ? match[1] : text;
|
|
63
59
|
}
|
|
64
60
|
export async function analyzeDiscoveryInput(input) {
|
|
65
|
-
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
66
|
-
if (!apiKey) {
|
|
67
|
-
throw new Error('ANTHROPIC_API_KEY environment variable required');
|
|
68
|
-
}
|
|
69
|
-
const client = new Anthropic({ apiKey });
|
|
70
61
|
const inputText = formatInputForAnalysis(input);
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
messages: [{
|
|
75
|
-
role: 'user',
|
|
76
|
-
content: `${ANALYSIS_PROMPT}\n\n---\n\nPROJECT INFORMATION:\n\n${inputText}`
|
|
77
|
-
}]
|
|
78
|
-
});
|
|
79
|
-
const textContent = response.content.find(c => c.type === 'text');
|
|
80
|
-
if (!textContent || textContent.type !== 'text') {
|
|
81
|
-
throw new Error('No text response from API');
|
|
82
|
-
}
|
|
83
|
-
const cleaned = stripMarkdownFences(textContent.text);
|
|
62
|
+
const prompt = `${ANALYSIS_PROMPT}\n\n---\n\nPROJECT INFORMATION:\n\n${inputText}`;
|
|
63
|
+
const responseText = await executeLLMCall(prompt, { maxTokens: 4096 });
|
|
64
|
+
const cleaned = stripMarkdownFences(responseText);
|
|
84
65
|
let analysis;
|
|
85
66
|
try {
|
|
86
67
|
analysis = JSON.parse(cleaned);
|
|
@@ -139,11 +120,6 @@ function formatInputForAnalysis(input) {
|
|
|
139
120
|
return lines.join('\n');
|
|
140
121
|
}
|
|
141
122
|
export async function analyzeRawContent(content, contentType, fileName) {
|
|
142
|
-
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
143
|
-
if (!apiKey) {
|
|
144
|
-
throw new Error('ANTHROPIC_API_KEY environment variable required');
|
|
145
|
-
}
|
|
146
|
-
const client = new Anthropic({ apiKey });
|
|
147
123
|
const extractPrompt = `Extract project information from this ${contentType === 'file' ? `file (${fileName})` : 'text'}.
|
|
148
124
|
|
|
149
125
|
Return a JSON object with these fields (infer what you can, leave empty string if not found):
|
|
@@ -168,16 +144,8 @@ Return a JSON object with these fields (infer what you can, leave empty string i
|
|
|
168
144
|
Content to analyze:
|
|
169
145
|
|
|
170
146
|
${content}`;
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
max_tokens: 2048,
|
|
174
|
-
messages: [{ role: 'user', content: extractPrompt }]
|
|
175
|
-
});
|
|
176
|
-
const extractText = extractResponse.content.find(c => c.type === 'text');
|
|
177
|
-
if (!extractText || extractText.type !== 'text') {
|
|
178
|
-
throw new Error('No response from extraction');
|
|
179
|
-
}
|
|
180
|
-
const cleanedExtract = stripMarkdownFences(extractText.text);
|
|
147
|
+
const extractText = await executeLLMCall(extractPrompt, { maxTokens: 2048 });
|
|
148
|
+
const cleanedExtract = stripMarkdownFences(extractText);
|
|
181
149
|
let input;
|
|
182
150
|
try {
|
|
183
151
|
input = JSON.parse(cleanedExtract);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/discovery/analyze.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/discovery/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAsC,eAAe,EAAE,MAAM,YAAY,CAAC;AAGtF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAElF,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAsC,eAAe,EAAE,MAAM,YAAY,CAAC;AAGtF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAElF,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA6BpE"}
|
package/dist/discovery/index.js
CHANGED
|
@@ -7,29 +7,6 @@ export { processJsonInput, getInputJsonSchema, ValidationError } from './core.js
|
|
|
7
7
|
export async function runDiscovery() {
|
|
8
8
|
p.intro(pc.bgCyan(pc.black(' Discovery ')));
|
|
9
9
|
console.log(pc.dim('\n Strategic planning for AI-native projects.\n'));
|
|
10
|
-
if (!process.env.ANTHROPIC_API_KEY) {
|
|
11
|
-
p.log.info(`You need an Anthropic API key for the AI analysis step.\n` +
|
|
12
|
-
pc.dim(` Get one here (free tier available): `) +
|
|
13
|
-
pc.cyan(`https://console.anthropic.com/settings/keys\n`) +
|
|
14
|
-
pc.dim(` To skip this prompt next time: `) +
|
|
15
|
-
pc.cyan(`export ANTHROPIC_API_KEY=sk-ant-...`));
|
|
16
|
-
const key = await p.text({
|
|
17
|
-
message: 'Paste your Anthropic API key:',
|
|
18
|
-
placeholder: 'sk-ant-api03-...',
|
|
19
|
-
validate: (v) => {
|
|
20
|
-
if (!v)
|
|
21
|
-
return 'API key is required. Get one at console.anthropic.com/settings/keys';
|
|
22
|
-
if (!v.startsWith('sk-ant-'))
|
|
23
|
-
return 'Should start with sk-ant-. Check you copied the full key.';
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
if (p.isCancel(key)) {
|
|
28
|
-
p.cancel('Cancelled');
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
process.env.ANTHROPIC_API_KEY = key;
|
|
32
|
-
}
|
|
33
10
|
const inputMode = await chooseInputMode();
|
|
34
11
|
if (!inputMode)
|
|
35
12
|
return null;
|
|
@@ -57,9 +34,9 @@ async function chooseInputMode() {
|
|
|
57
34
|
const mode = await p.select({
|
|
58
35
|
message: 'How would you like to provide project information?',
|
|
59
36
|
options: [
|
|
60
|
-
{ value: '
|
|
61
|
-
{ value: '
|
|
62
|
-
{ value: '
|
|
37
|
+
{ value: 'questions', label: 'Guided flow (Recommended)', hint: 'Step-by-step questions' },
|
|
38
|
+
{ value: 'paste', label: 'Paste a brief', hint: 'Already have a description? Skips all questions' },
|
|
39
|
+
{ value: 'file', label: 'Load from file', hint: '.txt or .md' },
|
|
63
40
|
]
|
|
64
41
|
});
|
|
65
42
|
if (p.isCancel(mode)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAElF,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC;IAExE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type EvolveReport } from './proposer.js';
|
|
2
|
+
export interface EvolveOptions {
|
|
3
|
+
json?: boolean;
|
|
4
|
+
apply?: boolean;
|
|
5
|
+
output?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function runEvolve(projectDir: string, options?: EvolveOptions): Promise<EvolveReport>;
|
|
8
|
+
export { scanProject } from './scanner.js';
|
|
9
|
+
export { proposeChanges } from './proposer.js';
|
|
10
|
+
export type { EvolveReport, SkillImplication, NegativeConstraint, McpSuggestion } from './proposer.js';
|
|
11
|
+
export type { ProjectState } from './scanner.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evolve/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CA+BtG;AA+ED,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACvG,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { scanProject } from './scanner.js';
|
|
6
|
+
import { proposeChanges } from './proposer.js';
|
|
7
|
+
export async function runEvolve(projectDir, options = {}) {
|
|
8
|
+
const state = await scanProject(projectDir);
|
|
9
|
+
const report = proposeChanges(state);
|
|
10
|
+
if (options.json) {
|
|
11
|
+
const output = JSON.stringify(report, null, 2);
|
|
12
|
+
if (options.output) {
|
|
13
|
+
await fs.writeFile(options.output, output);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
console.log(output);
|
|
17
|
+
}
|
|
18
|
+
return report;
|
|
19
|
+
}
|
|
20
|
+
// Interactive display
|
|
21
|
+
displayReport(report, state.name);
|
|
22
|
+
if (options.apply && report.skillImplications.length > 0) {
|
|
23
|
+
await applyToClaudeMd(projectDir, report);
|
|
24
|
+
}
|
|
25
|
+
else if (!options.apply && hasRecommendations(report)) {
|
|
26
|
+
const shouldApply = await p.confirm({
|
|
27
|
+
message: 'Append recommendations to CLAUDE.md?',
|
|
28
|
+
initialValue: true,
|
|
29
|
+
});
|
|
30
|
+
if (!p.isCancel(shouldApply) && shouldApply) {
|
|
31
|
+
await applyToClaudeMd(projectDir, report);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return report;
|
|
35
|
+
}
|
|
36
|
+
function hasRecommendations(report) {
|
|
37
|
+
return report.skillImplications.length > 0
|
|
38
|
+
|| report.constraints.length > 0
|
|
39
|
+
|| report.mcpSuggestions.length > 0;
|
|
40
|
+
}
|
|
41
|
+
function displayReport(report, projectName) {
|
|
42
|
+
if (!hasRecommendations(report)) {
|
|
43
|
+
p.log.success('No new recommendations. Skills are up to date.');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
console.log('');
|
|
47
|
+
if (report.skillImplications.length > 0) {
|
|
48
|
+
const lines = report.skillImplications.map(s => `${pc.bold(s.skill)}: ${s.recommendation} ${pc.dim(`(${s.trigger})`)}`);
|
|
49
|
+
p.note(lines.join('\n'), `Skill recommendations for ${projectName}`);
|
|
50
|
+
}
|
|
51
|
+
if (report.constraints.length > 0) {
|
|
52
|
+
const lines = report.constraints.map(c => `Use ${pc.bold(c.use)}, NOT ${c.notUse.join(', ')}`);
|
|
53
|
+
p.note(lines.join('\n'), 'Technology constraints');
|
|
54
|
+
}
|
|
55
|
+
if (report.mcpSuggestions.length > 0) {
|
|
56
|
+
const lines = report.mcpSuggestions.map(m => `${pc.bold(m.name)}: ${m.description}`);
|
|
57
|
+
p.note(lines.join('\n'), 'MCP server suggestions (data connectors)');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function applyToClaudeMd(projectDir, report) {
|
|
61
|
+
const claudeMdPath = path.join(projectDir, 'CLAUDE.md');
|
|
62
|
+
const sections = [];
|
|
63
|
+
sections.push(`\n## Evolve Report (${new Date().toISOString().slice(0, 10)})\n`);
|
|
64
|
+
if (report.skillImplications.length > 0) {
|
|
65
|
+
sections.push('### Skill Recommendations\n');
|
|
66
|
+
for (const s of report.skillImplications) {
|
|
67
|
+
sections.push(`- **${s.skill}**: ${s.recommendation}`);
|
|
68
|
+
}
|
|
69
|
+
sections.push('');
|
|
70
|
+
}
|
|
71
|
+
if (report.constraints.length > 0) {
|
|
72
|
+
sections.push('### Technology Constraints\n');
|
|
73
|
+
for (const c of report.constraints) {
|
|
74
|
+
sections.push(`- Use ${c.use}, NOT ${c.notUse.join(', ')}.`);
|
|
75
|
+
}
|
|
76
|
+
sections.push('');
|
|
77
|
+
}
|
|
78
|
+
if (report.mcpSuggestions.length > 0) {
|
|
79
|
+
sections.push('### MCP Data Connectors\n');
|
|
80
|
+
for (const m of report.mcpSuggestions) {
|
|
81
|
+
sections.push(`- **${m.name}**: ${m.description}`);
|
|
82
|
+
}
|
|
83
|
+
sections.push('');
|
|
84
|
+
}
|
|
85
|
+
const content = sections.join('\n');
|
|
86
|
+
if (await fs.pathExists(claudeMdPath)) {
|
|
87
|
+
await fs.appendFile(claudeMdPath, content);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
await fs.writeFile(claudeMdPath, `# ${path.basename(projectDir)}\n${content}`);
|
|
91
|
+
}
|
|
92
|
+
p.log.success(`Appended to ${pc.cyan(claudeMdPath)}`);
|
|
93
|
+
}
|
|
94
|
+
export { scanProject } from './scanner.js';
|
|
95
|
+
export { proposeChanges } from './proposer.js';
|
|
96
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/evolve/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ProjectState } from './scanner.js';
|
|
2
|
+
type SkillName = 'trust' | 'design' | 'testing' | 'efficiency' | 'strategy';
|
|
3
|
+
export interface SkillImplication {
|
|
4
|
+
skill: SkillName;
|
|
5
|
+
recommendation: string;
|
|
6
|
+
trigger: string;
|
|
7
|
+
}
|
|
8
|
+
export interface NegativeConstraint {
|
|
9
|
+
use: string;
|
|
10
|
+
notUse: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface McpSuggestion {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
trigger: string;
|
|
16
|
+
}
|
|
17
|
+
export interface EvolveReport {
|
|
18
|
+
skillImplications: SkillImplication[];
|
|
19
|
+
constraints: NegativeConstraint[];
|
|
20
|
+
mcpSuggestions: McpSuggestion[];
|
|
21
|
+
}
|
|
22
|
+
declare const SKILL_IMPLICATIONS: Array<{
|
|
23
|
+
match: string | string[];
|
|
24
|
+
implications: SkillImplication[];
|
|
25
|
+
}>;
|
|
26
|
+
declare const ALTERNATIVE_GROUPS: Array<Array<[string, string]>>;
|
|
27
|
+
declare const MCP_SUGGESTIONS: Array<{
|
|
28
|
+
match: string | string[];
|
|
29
|
+
name: string;
|
|
30
|
+
description: string;
|
|
31
|
+
}>;
|
|
32
|
+
export declare function proposeChanges(state: ProjectState): EvolveReport;
|
|
33
|
+
export { SKILL_IMPLICATIONS, ALTERNATIVE_GROUPS, MCP_SUGGESTIONS };
|
|
34
|
+
//# sourceMappingURL=proposer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposer.d.ts","sourceRoot":"","sources":["../../src/evolve/proposer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,KAAK,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;AAE5E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,cAAc,EAAE,aAAa,EAAE,CAAC;CACjC;AAKD,QAAA,MAAM,kBAAkB,EAAE,KAAK,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC,CA4EA,CAAC;AAIF,QAAA,MAAM,kBAAkB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAStD,CAAC;AAGF,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAgBA,CAAC;AAIF,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAShE;AA8DD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// --- Data tables ---
|
|
2
|
+
// dependency pattern -> skill implications
|
|
3
|
+
const SKILL_IMPLICATIONS = [
|
|
4
|
+
{
|
|
5
|
+
match: 'stripe',
|
|
6
|
+
implications: [
|
|
7
|
+
{ skill: 'trust', recommendation: 'Enable PCI-DSS compliance checks for payment processing.', trigger: 'stripe' },
|
|
8
|
+
{ skill: 'efficiency', recommendation: 'Monitor Stripe API call costs and rate limits.', trigger: 'stripe' },
|
|
9
|
+
],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
match: '@supabase/supabase-js',
|
|
13
|
+
implications: [
|
|
14
|
+
{ skill: 'trust', recommendation: 'Verify Row Level Security policies on all tables.', trigger: '@supabase/supabase-js' },
|
|
15
|
+
{ skill: 'trust', recommendation: 'Check that service_role key is never exposed to the client.', trigger: '@supabase/supabase-js' },
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
match: ['redis', 'ioredis', '@upstash/redis'],
|
|
20
|
+
implications: [
|
|
21
|
+
{ skill: 'efficiency', recommendation: 'Monitor cache hit rates and memory usage.', trigger: 'redis' },
|
|
22
|
+
{ skill: 'trust', recommendation: 'Verify Redis connection uses TLS in production.', trigger: 'redis' },
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
match: 'inngest',
|
|
27
|
+
implications: [
|
|
28
|
+
{ skill: 'efficiency', recommendation: 'Monitor Inngest function execution costs and retry rates.', trigger: 'inngest' },
|
|
29
|
+
{ skill: 'testing', recommendation: 'Add integration tests for Inngest function handlers.', trigger: 'inngest' },
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
match: ['@clerk/nextjs', 'next-auth', 'lucia'],
|
|
34
|
+
implications: [
|
|
35
|
+
{ skill: 'trust', recommendation: 'Verify auth middleware covers all protected routes.', trigger: 'auth library' },
|
|
36
|
+
{ skill: 'testing', recommendation: 'Add E2E tests for login/logout/session-expiry flows.', trigger: 'auth library' },
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
match: ['openai', '@anthropic-ai/sdk'],
|
|
41
|
+
implications: [
|
|
42
|
+
{ skill: 'efficiency', recommendation: 'Track LLM API costs per feature. Set budget alerts.', trigger: 'LLM SDK' },
|
|
43
|
+
{ skill: 'trust', recommendation: 'Validate and sanitize all user input before sending to LLM.', trigger: 'LLM SDK' },
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
match: ['@sendgrid/mail', '@brevo/brevo', 'nodemailer', 'resend'],
|
|
48
|
+
implications: [
|
|
49
|
+
{ skill: 'trust', recommendation: 'Verify email templates do not leak PII in headers or tracking.', trigger: 'email library' },
|
|
50
|
+
{ skill: 'strategy', recommendation: 'Email detected as delivery channel. Verify EIID Delivery layer includes email triggers.', trigger: 'email library' },
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
match: ['@slack/web-api', '@slack/bolt'],
|
|
55
|
+
implications: [
|
|
56
|
+
{ skill: 'strategy', recommendation: 'Slack detected as delivery channel. Verify EIID Delivery layer includes Slack triggers.', trigger: 'Slack SDK' },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
match: 'playwright',
|
|
61
|
+
implications: [
|
|
62
|
+
{ skill: 'testing', recommendation: 'Ensure Playwright E2E tests cover all critical user flows.', trigger: 'playwright' },
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
match: ['prisma', 'drizzle-orm', 'kysely', 'typeorm'],
|
|
67
|
+
implications: [
|
|
68
|
+
{ skill: 'trust', recommendation: 'Verify ORM queries use parameterized inputs (no raw SQL with user data).', trigger: 'ORM' },
|
|
69
|
+
{ skill: 'efficiency', recommendation: 'Check for N+1 query patterns in data-heavy routes.', trigger: 'ORM' },
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
match: 'next',
|
|
74
|
+
implications: [
|
|
75
|
+
{ skill: 'efficiency', recommendation: 'Monitor bundle size. Check for client-side imports of server-only packages.', trigger: 'next' },
|
|
76
|
+
{ skill: 'design', recommendation: 'Verify all pages meet Core Web Vitals thresholds (LCP < 2.5s, CLS < 0.1).', trigger: 'next' },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
// Alternative groups for negative constraints
|
|
81
|
+
// Each group: array of [npmPackage, displayName]
|
|
82
|
+
const ALTERNATIVE_GROUPS = [
|
|
83
|
+
[['prisma', 'Prisma'], ['drizzle-orm', 'Drizzle'], ['typeorm', 'TypeORM'], ['kysely', 'Kysely'], ['sequelize', 'Sequelize']],
|
|
84
|
+
[['vitest', 'Vitest'], ['jest', 'Jest'], ['mocha', 'Mocha']],
|
|
85
|
+
[['eslint', 'ESLint'], ['@biomejs/biome', 'Biome'], ['oxlint', 'oxlint']],
|
|
86
|
+
[['tailwindcss', 'Tailwind CSS'], ['styled-components', 'styled-components'], ['@emotion/react', 'Emotion'], ['@vanilla-extract/css', 'vanilla-extract']],
|
|
87
|
+
[['zustand', 'Zustand'], ['jotai', 'Jotai'], ['@reduxjs/toolkit', 'Redux Toolkit'], ['valtio', 'Valtio']],
|
|
88
|
+
[['@supabase/supabase-js', 'Supabase'], ['firebase', 'Firebase'], ['@aws-amplify/core', 'AWS Amplify']],
|
|
89
|
+
[['next-auth', 'NextAuth'], ['@clerk/nextjs', 'Clerk'], ['lucia', 'Lucia'], ['@supabase/auth-helpers-nextjs', 'Supabase Auth']],
|
|
90
|
+
[['express', 'Express'], ['fastify', 'Fastify'], ['hono', 'Hono'], ['koa', 'Koa']],
|
|
91
|
+
];
|
|
92
|
+
// MCP server suggestions: dep pattern -> suggestion
|
|
93
|
+
const MCP_SUGGESTIONS = [
|
|
94
|
+
{
|
|
95
|
+
match: '@supabase/supabase-js',
|
|
96
|
+
name: 'Supabase MCP',
|
|
97
|
+
description: 'Direct database queries and auth management. Data connector, not a skill replacement.',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
match: 'stripe',
|
|
101
|
+
name: 'Stripe MCP',
|
|
102
|
+
description: 'Payment data access and webhook inspection. Data connector, not a skill replacement.',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
match: ['@slack/web-api', '@slack/bolt'],
|
|
106
|
+
name: 'Slack MCP',
|
|
107
|
+
description: 'Message and channel data access. Data connector, not a skill replacement.',
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
// --- Core logic ---
|
|
111
|
+
export function proposeChanges(state) {
|
|
112
|
+
const allDeps = { ...state.dependencies, ...state.devDependencies };
|
|
113
|
+
const depNames = Object.keys(allDeps);
|
|
114
|
+
const skillImplications = collectSkillImplications(depNames, state.claudeMdContent);
|
|
115
|
+
const constraints = collectConstraints(depNames, state.packageManager);
|
|
116
|
+
const mcpSuggestions = collectMcpSuggestions(depNames);
|
|
117
|
+
return { skillImplications, constraints, mcpSuggestions };
|
|
118
|
+
}
|
|
119
|
+
function collectSkillImplications(depNames, claudeMdContent) {
|
|
120
|
+
const results = [];
|
|
121
|
+
for (const entry of SKILL_IMPLICATIONS) {
|
|
122
|
+
const matches = Array.isArray(entry.match) ? entry.match : [entry.match];
|
|
123
|
+
const found = matches.some(m => depNames.includes(m));
|
|
124
|
+
if (!found)
|
|
125
|
+
continue;
|
|
126
|
+
for (const impl of entry.implications) {
|
|
127
|
+
// Skip if already mentioned in CLAUDE.md
|
|
128
|
+
if (claudeMdContent && claudeMdContent.includes(impl.recommendation))
|
|
129
|
+
continue;
|
|
130
|
+
results.push(impl);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return results;
|
|
134
|
+
}
|
|
135
|
+
function collectConstraints(depNames, packageManager) {
|
|
136
|
+
const results = [];
|
|
137
|
+
for (const group of ALTERNATIVE_GROUPS) {
|
|
138
|
+
const installed = group.filter(([pkg]) => depNames.includes(pkg));
|
|
139
|
+
if (installed.length !== 1)
|
|
140
|
+
continue; // skip if none or multiple installed
|
|
141
|
+
const [, useName] = installed[0];
|
|
142
|
+
const others = group
|
|
143
|
+
.filter(([pkg]) => !depNames.includes(pkg))
|
|
144
|
+
.map(([, name]) => name);
|
|
145
|
+
if (others.length > 0) {
|
|
146
|
+
results.push({ use: useName, notUse: others });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Package manager constraint
|
|
150
|
+
const pmNames = { npm: 'npm', pnpm: 'pnpm', yarn: 'Yarn', bun: 'Bun' };
|
|
151
|
+
const pmAlternatives = Object.entries(pmNames)
|
|
152
|
+
.filter(([key]) => key !== packageManager)
|
|
153
|
+
.map(([, name]) => name);
|
|
154
|
+
results.push({ use: pmNames[packageManager], notUse: pmAlternatives });
|
|
155
|
+
return results;
|
|
156
|
+
}
|
|
157
|
+
function collectMcpSuggestions(depNames) {
|
|
158
|
+
const results = [];
|
|
159
|
+
for (const entry of MCP_SUGGESTIONS) {
|
|
160
|
+
const matches = Array.isArray(entry.match) ? entry.match : [entry.match];
|
|
161
|
+
const trigger = matches.find(m => depNames.includes(m));
|
|
162
|
+
if (trigger) {
|
|
163
|
+
results.push({ name: entry.name, description: entry.description, trigger });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return results;
|
|
167
|
+
}
|
|
168
|
+
// Exported for testing
|
|
169
|
+
export { SKILL_IMPLICATIONS, ALTERNATIVE_GROUPS, MCP_SUGGESTIONS };
|
|
170
|
+
//# sourceMappingURL=proposer.js.map
|