self-evolve-framework 1.1.1 → 1.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/package.json +1 -1
- package/template/skills/impeccable/SKILL.md +174 -47
- package/template/skills/impeccable/agents/impeccable_asset_producer.toml +92 -0
- package/template/skills/impeccable/agents/impeccable_manual_edit_applier.toml +95 -0
- package/template/skills/impeccable/agents/openai.yaml +4 -0
- package/template/skills/impeccable/reference/adapt.md +311 -0
- package/template/skills/impeccable/reference/animate.md +201 -0
- package/template/skills/impeccable/reference/audit.md +133 -0
- package/template/skills/impeccable/reference/bolder.md +113 -0
- package/template/skills/impeccable/reference/brand.md +108 -0
- package/template/skills/impeccable/reference/clarify.md +288 -0
- package/template/skills/impeccable/reference/codex.md +105 -0
- package/template/skills/impeccable/reference/colorize.md +257 -0
- package/template/skills/impeccable/reference/craft.md +123 -0
- package/template/skills/impeccable/reference/critique.md +790 -0
- package/template/skills/impeccable/reference/delight.md +302 -0
- package/template/skills/impeccable/reference/distill.md +111 -0
- package/template/skills/impeccable/reference/document.md +429 -0
- package/template/skills/impeccable/reference/extract.md +69 -0
- package/template/skills/impeccable/reference/harden.md +347 -0
- package/template/skills/impeccable/reference/hooks.md +90 -0
- package/template/skills/impeccable/reference/init.md +172 -0
- package/template/skills/impeccable/reference/interaction-design.md +189 -0
- package/template/skills/impeccable/reference/layout.md +161 -0
- package/template/skills/impeccable/reference/live.md +720 -0
- package/template/skills/impeccable/reference/onboard.md +234 -0
- package/template/skills/impeccable/reference/optimize.md +258 -0
- package/template/skills/impeccable/reference/overdrive.md +130 -0
- package/template/skills/impeccable/reference/polish.md +241 -0
- package/template/skills/impeccable/reference/product.md +60 -0
- package/template/skills/impeccable/reference/quieter.md +99 -0
- package/template/skills/impeccable/reference/shape.md +165 -0
- package/template/skills/impeccable/reference/typeset.md +279 -0
- package/template/skills/impeccable/scripts/command-metadata.json +94 -0
- package/template/skills/impeccable/scripts/context-signals.mjs +225 -0
- package/template/skills/impeccable/scripts/context.mjs +961 -0
- package/template/skills/impeccable/scripts/critique-storage.mjs +242 -0
- package/template/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/template/skills/impeccable/scripts/detect.mjs +21 -0
- package/template/skills/impeccable/scripts/detector/browser/injected/index.mjs +1937 -0
- package/template/skills/impeccable/scripts/detector/cli/main.mjs +290 -0
- package/template/skills/impeccable/scripts/detector/design-system.mjs +750 -0
- package/template/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +5138 -0
- package/template/skills/impeccable/scripts/detector/detect-antipatterns.mjs +50 -0
- package/template/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +277 -0
- package/template/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +568 -0
- package/template/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +1015 -0
- package/template/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +234 -0
- package/template/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
- package/template/skills/impeccable/scripts/detector/findings.mjs +12 -0
- package/template/skills/impeccable/scripts/detector/node/file-system.mjs +198 -0
- package/template/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
- package/template/skills/impeccable/scripts/detector/registry/antipatterns.mjs +448 -0
- package/template/skills/impeccable/scripts/detector/rules/checks.mjs +2671 -0
- package/template/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
- package/template/skills/impeccable/scripts/detector/shared/constants.mjs +101 -0
- package/template/skills/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
- package/template/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
- package/template/skills/impeccable/scripts/hook-admin.mjs +661 -0
- package/template/skills/impeccable/scripts/hook-before-edit.mjs +476 -0
- package/template/skills/impeccable/scripts/hook-lib.mjs +1632 -0
- package/template/skills/impeccable/scripts/hook.mjs +61 -0
- package/template/skills/impeccable/scripts/lib/design-parser.mjs +842 -0
- package/template/skills/impeccable/scripts/lib/impeccable-config.mjs +638 -0
- package/template/skills/impeccable/scripts/lib/impeccable-paths.mjs +128 -0
- package/template/skills/impeccable/scripts/lib/is-generated.mjs +69 -0
- package/template/skills/impeccable/scripts/lib/target-args.mjs +42 -0
- package/template/skills/impeccable/scripts/live/browser-script-parts.mjs +49 -0
- package/template/skills/impeccable/scripts/live/completion.mjs +19 -0
- package/template/skills/impeccable/scripts/live/event-validation.mjs +137 -0
- package/template/skills/impeccable/scripts/live/insert-ui.mjs +458 -0
- package/template/skills/impeccable/scripts/live/manual-apply.mjs +939 -0
- package/template/skills/impeccable/scripts/live/manual-edit-routes.mjs +357 -0
- package/template/skills/impeccable/scripts/live/manual-edits-buffer.mjs +152 -0
- package/template/skills/impeccable/scripts/live/session-store.mjs +289 -0
- package/template/skills/impeccable/scripts/live/svelte-component.mjs +826 -0
- package/template/skills/impeccable/scripts/live/sveltekit-adapter.mjs +274 -0
- package/template/skills/impeccable/scripts/live/ui-core.mjs +180 -0
- package/template/skills/impeccable/scripts/live/vocabulary.mjs +36 -0
- package/template/skills/impeccable/scripts/live-accept.mjs +812 -0
- package/template/skills/impeccable/scripts/live-browser-dom.js +146 -0
- package/template/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/template/skills/impeccable/scripts/live-browser.js +11173 -0
- package/template/skills/impeccable/scripts/live-commit-manual-edits.mjs +1241 -0
- package/template/skills/impeccable/scripts/live-complete.mjs +75 -0
- package/template/skills/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
- package/template/skills/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
- package/template/skills/impeccable/scripts/live-inject.mjs +583 -0
- package/template/skills/impeccable/scripts/live-insert.mjs +272 -0
- package/template/skills/impeccable/scripts/live-manual-edit-evidence.mjs +363 -0
- package/template/skills/impeccable/scripts/live-poll.mjs +384 -0
- package/template/skills/impeccable/scripts/live-resume.mjs +94 -0
- package/template/skills/impeccable/scripts/live-server.mjs +1135 -0
- package/template/skills/impeccable/scripts/live-status.mjs +61 -0
- package/template/skills/impeccable/scripts/live-target.mjs +30 -0
- package/template/skills/impeccable/scripts/live-wrap.mjs +894 -0
- package/template/skills/impeccable/scripts/live.mjs +297 -0
- package/template/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/template/skills/impeccable/scripts/palette.mjs +633 -0
- package/template/skills/impeccable/scripts/pin.mjs +214 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Pin/unpin sub-commands as standalone skill shortcuts.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* node <scripts_path>/pin.mjs pin <command>
|
|
7
|
+
* node <scripts_path>/pin.mjs unpin <command>
|
|
8
|
+
*
|
|
9
|
+
* `pin audit` creates a lightweight /audit skill that redirects to /impeccable audit.
|
|
10
|
+
* `unpin audit` removes that shortcut.
|
|
11
|
+
*
|
|
12
|
+
* The script discovers harness directories (.claude/skills, .cursor/skills, etc.)
|
|
13
|
+
* in the project root and creates/removes the pin in all of them.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, readdirSync } from 'node:fs';
|
|
17
|
+
import { join, resolve, dirname } from 'node:path';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
|
|
20
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
|
|
22
|
+
// All known harness directories
|
|
23
|
+
const HARNESS_DIRS = [
|
|
24
|
+
'.claude', '.cursor', '.gemini', '.codex', '.agents',
|
|
25
|
+
'.trae', '.trae-cn', '.pi', '.opencode', '.kiro', '.rovodev',
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
// Valid sub-command names
|
|
29
|
+
const VALID_COMMANDS = [
|
|
30
|
+
'craft', 'init', 'extract', 'document', 'shape',
|
|
31
|
+
'critique', 'audit',
|
|
32
|
+
'polish', 'bolder', 'quieter', 'distill', 'harden', 'onboard', 'live',
|
|
33
|
+
'animate', 'colorize', 'typeset', 'layout', 'delight', 'overdrive',
|
|
34
|
+
'clarify', 'adapt', 'optimize',
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
// Marker to identify pinned skills (so unpin doesn't delete user skills)
|
|
38
|
+
const PIN_MARKER = '<!-- impeccable-pinned-skill -->';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Walk up from startDir to find a project root.
|
|
42
|
+
*/
|
|
43
|
+
function findProjectRoot(startDir = process.cwd()) {
|
|
44
|
+
let dir = resolve(startDir);
|
|
45
|
+
while (dir !== '/') {
|
|
46
|
+
if (
|
|
47
|
+
existsSync(join(dir, 'package.json')) ||
|
|
48
|
+
existsSync(join(dir, '.git')) ||
|
|
49
|
+
existsSync(join(dir, 'skills-lock.json'))
|
|
50
|
+
) {
|
|
51
|
+
return dir;
|
|
52
|
+
}
|
|
53
|
+
const parent = resolve(dir, '..');
|
|
54
|
+
if (parent === dir) break;
|
|
55
|
+
dir = parent;
|
|
56
|
+
}
|
|
57
|
+
return resolve(startDir);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Find harness skill directories that have an impeccable skill installed.
|
|
62
|
+
*/
|
|
63
|
+
function findHarnessDirs(projectRoot) {
|
|
64
|
+
const dirs = [];
|
|
65
|
+
for (const harness of HARNESS_DIRS) {
|
|
66
|
+
const skillsDir = join(projectRoot, harness, 'skills');
|
|
67
|
+
// Only pin in harness dirs that already have impeccable installed
|
|
68
|
+
const impeccableDir = join(skillsDir, 'impeccable');
|
|
69
|
+
if (existsSync(impeccableDir) || existsSync(join(skillsDir, 'i-impeccable'))) {
|
|
70
|
+
dirs.push(skillsDir);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return dirs;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Load command metadata (descriptions for pinned skills).
|
|
78
|
+
*/
|
|
79
|
+
function loadCommandMetadata() {
|
|
80
|
+
const metadataPath = join(__dirname, 'command-metadata.json');
|
|
81
|
+
if (existsSync(metadataPath)) {
|
|
82
|
+
return JSON.parse(readFileSync(metadataPath, 'utf-8'));
|
|
83
|
+
}
|
|
84
|
+
return {};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Generate a pinned skill's SKILL.md content.
|
|
89
|
+
*/
|
|
90
|
+
function generatePinnedSkill(command, metadata) {
|
|
91
|
+
const desc = metadata[command]?.description || `Shortcut for /impeccable ${command}.`;
|
|
92
|
+
const hint = metadata[command]?.argumentHint || '[target]';
|
|
93
|
+
|
|
94
|
+
return `---
|
|
95
|
+
name: ${command}
|
|
96
|
+
description: "${desc}"
|
|
97
|
+
argument-hint: "${hint}"
|
|
98
|
+
user-invocable: true
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
${PIN_MARKER}
|
|
102
|
+
|
|
103
|
+
This is a pinned shortcut for \`{{command_prefix}}impeccable ${command}\`.
|
|
104
|
+
|
|
105
|
+
Invoke {{command_prefix}}impeccable ${command}, passing along any arguments provided here, and follow its instructions.
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Pin a command: create shortcut skill in all harness dirs.
|
|
111
|
+
*/
|
|
112
|
+
function pin(command, projectRoot) {
|
|
113
|
+
const metadata = loadCommandMetadata();
|
|
114
|
+
const harnessDirs = findHarnessDirs(projectRoot);
|
|
115
|
+
|
|
116
|
+
if (harnessDirs.length === 0) {
|
|
117
|
+
console.log('No harness directories with impeccable installed found.');
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const content = generatePinnedSkill(command, metadata);
|
|
122
|
+
let created = 0;
|
|
123
|
+
|
|
124
|
+
for (const skillsDir of harnessDirs) {
|
|
125
|
+
// Check if skill already exists (and isn't a pin)
|
|
126
|
+
const skillDir = join(skillsDir, command);
|
|
127
|
+
if (existsSync(skillDir)) {
|
|
128
|
+
const existingMd = join(skillDir, 'SKILL.md');
|
|
129
|
+
if (existsSync(existingMd)) {
|
|
130
|
+
const existing = readFileSync(existingMd, 'utf-8');
|
|
131
|
+
if (!existing.includes(PIN_MARKER)) {
|
|
132
|
+
console.log(` SKIP: ${skillDir} (non-pinned skill already exists)`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
mkdirSync(skillDir, { recursive: true });
|
|
139
|
+
writeFileSync(join(skillDir, 'SKILL.md'), content, 'utf-8');
|
|
140
|
+
console.log(` + ${skillDir}`);
|
|
141
|
+
created++;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (created > 0) {
|
|
145
|
+
console.log(`\nPinned '${command}' as a standalone shortcut in ${created} location(s).`);
|
|
146
|
+
console.log(`You can now use /${command} directly.`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return created > 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Unpin a command: remove shortcut skill from all harness dirs.
|
|
154
|
+
*/
|
|
155
|
+
function unpin(command, projectRoot) {
|
|
156
|
+
const harnessDirs = findHarnessDirs(projectRoot);
|
|
157
|
+
let removed = 0;
|
|
158
|
+
|
|
159
|
+
for (const skillsDir of harnessDirs) {
|
|
160
|
+
const skillDir = join(skillsDir, command);
|
|
161
|
+
if (!existsSync(skillDir)) continue;
|
|
162
|
+
|
|
163
|
+
const skillMd = join(skillDir, 'SKILL.md');
|
|
164
|
+
if (!existsSync(skillMd)) continue;
|
|
165
|
+
|
|
166
|
+
// Safety: only remove if it's a pinned skill
|
|
167
|
+
const content = readFileSync(skillMd, 'utf-8');
|
|
168
|
+
if (!content.includes(PIN_MARKER)) {
|
|
169
|
+
console.log(` SKIP: ${skillDir} (not a pinned skill)`);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
rmSync(skillDir, { recursive: true, force: true });
|
|
174
|
+
console.log(` - ${skillDir}`);
|
|
175
|
+
removed++;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (removed > 0) {
|
|
179
|
+
console.log(`\nUnpinned '${command}' from ${removed} location(s).`);
|
|
180
|
+
console.log(`Use /impeccable ${command} to access it.`);
|
|
181
|
+
} else {
|
|
182
|
+
console.log(`No pinned '${command}' shortcut found.`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return removed > 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// --- CLI ---
|
|
189
|
+
const [,, action, command] = process.argv;
|
|
190
|
+
|
|
191
|
+
if (!action || !command) {
|
|
192
|
+
console.log('Usage: node pin.mjs <pin|unpin> <command>');
|
|
193
|
+
console.log(`\nAvailable commands: ${VALID_COMMANDS.join(', ')}`);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (action !== 'pin' && action !== 'unpin') {
|
|
198
|
+
console.error(`Unknown action: ${action}. Use 'pin' or 'unpin'.`);
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (!VALID_COMMANDS.includes(command)) {
|
|
203
|
+
console.error(`Unknown command: ${command}`);
|
|
204
|
+
console.error(`Available commands: ${VALID_COMMANDS.join(', ')}`);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const root = findProjectRoot();
|
|
209
|
+
|
|
210
|
+
if (action === 'pin') {
|
|
211
|
+
pin(command, root);
|
|
212
|
+
} else {
|
|
213
|
+
unpin(command, root);
|
|
214
|
+
}
|