ai-developer-skill-os 8.2.1 → 8.3.1
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/.agents/LICENSE +21 -21
- package/.agents/README.md +90 -90
- package/.agents/docs/CHI_TIET_SKILLS.md +125 -125
- package/.agents/docs/MIGRATION-CLEANUP-V8.1.3.md +36 -36
- package/.agents/docs/MIGRATION-STATUS.md +35 -35
- package/.agents/docs/MIGRATION-V8.md +10 -10
- package/.agents/docs/V8-CERTIFICATION.md +27 -27
- package/.agents/docs/decisions/ADR-001-v8-migration.md +58 -58
- package/.agents/docs/decisions/ADR-002-workflow-separation.md +50 -50
- package/.agents/docs/decisions/ADR-003-registry-generated.md +54 -54
- package/.agents/docs/decisions/ADR-008-skill-boundary-review.md +27 -27
- package/.agents/registry/capability-graph.yml +67 -25
- package/.agents/registry/graph.json +135 -256
- package/.agents/registry/index.yaml +68 -95
- package/.agents/registry/skills-index.yml +548 -525
- package/.agents/rules/anti-patterns.md +45 -0
- package/.agents/rules/coding.md +10 -0
- package/.agents/rules/command-safety.md +37 -14
- package/.agents/rules/priorities.yml +13 -2
- package/.agents/rules/security.md +47 -7
- package/.agents/rules/skill-quality.md +32 -8
- package/.agents/skills/_template/SKILL.md +133 -132
- package/.agents/skills/_template/capability.yaml +22 -8
- package/.agents/skills/_template/evals/scorecard.yaml +19 -19
- package/.agents/skills/qk-access-policy/SKILL.md +5 -2
- package/.agents/skills/qk-access-policy/capability.yaml +23 -0
- package/.agents/skills/qk-access-policy/evals/scorecard.yaml +36 -0
- package/.agents/skills/qk-agent-observability/SKILL.md +112 -1
- package/.agents/skills/qk-agent-observability/capability.yaml +29 -0
- package/.agents/skills/qk-agent-observability/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-agent-observability/references/scorecard.yaml +80 -0
- package/.agents/skills/qk-ai-builder/SKILL.md +75 -6
- package/.agents/skills/qk-ai-builder/capability.yaml +23 -0
- package/.agents/skills/qk-ai-builder/evals/scorecard.yaml +30 -0
- package/.agents/skills/qk-api-lifecycle/SKILL.md +5 -3
- package/.agents/skills/qk-api-lifecycle/capability.yaml +23 -0
- package/.agents/skills/qk-api-lifecycle/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-bug-resolution/SKILL.md +4 -22
- package/.agents/skills/qk-bug-resolution/capability.yaml +25 -0
- package/.agents/skills/qk-bug-resolution/evals/scorecard.yaml +30 -0
- package/.agents/skills/qk-code-review/SKILL.md +188 -186
- package/.agents/skills/qk-code-review/capability.yaml +23 -0
- package/.agents/skills/qk-code-review/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-context-loader/SKILL.md +4 -12
- package/.agents/skills/qk-context-loader/capability.yaml +23 -0
- package/.agents/skills/qk-context-loader/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-data-lifecycle/SKILL.md +7 -2
- package/.agents/skills/qk-data-lifecycle/capability.yaml +23 -0
- package/.agents/skills/qk-data-lifecycle/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-db-optimizer/SKILL.md +4 -3
- package/.agents/skills/qk-db-optimizer/capability.yaml +22 -0
- package/.agents/skills/qk-db-optimizer/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-design-system-engineering/SKILL.md +235 -112
- package/.agents/skills/qk-design-system-engineering/capability.yaml +25 -0
- package/.agents/skills/qk-design-system-engineering/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-devops-platform/SKILL.md +241 -117
- package/.agents/skills/qk-devops-platform/capability.yaml +29 -0
- package/.agents/skills/qk-devops-platform/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-docs/SKILL.md +4 -2
- package/.agents/skills/qk-docs/capability.yaml +23 -0
- package/.agents/skills/qk-docs/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-engineering-standard/SKILL.md +5 -76
- package/.agents/skills/qk-engineering-standard/capability.yaml +23 -0
- package/.agents/skills/qk-engineering-standard/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-engineering-standard/references/anti-patterns.md +121 -0
- package/.agents/skills/qk-engineering-standard/rules/frontend.md +1 -1
- package/.agents/skills/qk-fe-api-integration/SKILL.md +14 -33
- package/.agents/skills/qk-fe-api-integration/capability.yaml +21 -0
- package/.agents/skills/qk-fe-api-integration/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-feature-delivery/SKILL.md +54 -222
- package/.agents/skills/qk-feature-delivery/capability.yaml +24 -0
- package/.agents/skills/qk-feature-delivery/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-frontend-architecture/SKILL.md +258 -134
- package/.agents/skills/qk-frontend-architecture/capability.yaml +28 -0
- package/.agents/skills/qk-frontend-architecture/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-help/SKILL.md +23 -161
- package/.agents/skills/qk-help/capability.yaml +20 -0
- package/.agents/skills/qk-help/evals/scorecard.yaml +13 -0
- package/.agents/skills/qk-orchestrator/SKILL.md +3 -35
- package/.agents/skills/qk-orchestrator/capability.yaml +22 -0
- package/.agents/skills/qk-orchestrator/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-orchestrator/references/routing-table.md +15 -3
- package/.agents/skills/qk-product-specification/SKILL.md +253 -130
- package/.agents/skills/qk-product-specification/capability.yaml +27 -0
- package/.agents/skills/qk-product-specification/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-production-release/SKILL.md +33 -68
- package/.agents/skills/qk-production-release/capability.yaml +27 -0
- package/.agents/skills/qk-production-release/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-project-bootstrap/SKILL.md +59 -8
- package/.agents/skills/qk-project-bootstrap/capability.yaml +23 -0
- package/.agents/skills/qk-project-bootstrap/evals/scorecard.yaml +28 -0
- package/.agents/skills/qk-project-health/SKILL.md +5 -3
- package/.agents/skills/qk-project-health/capability.yaml +23 -0
- package/.agents/skills/qk-project-health/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-project-memory/SKILL.md +4 -2
- package/.agents/skills/qk-project-memory/capability.yaml +23 -0
- package/.agents/skills/qk-project-memory/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-refactor/SKILL.md +117 -0
- package/.agents/skills/qk-refactor/capability.yaml +26 -0
- package/.agents/skills/qk-refactor/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-security-audit/SKILL.md +259 -135
- package/.agents/skills/qk-security-audit/capability.yaml +30 -0
- package/.agents/skills/qk-security-audit/evals/scorecard.yaml +27 -0
- package/.agents/skills/qk-system-evolution/SKILL.md +18 -68
- package/.agents/skills/qk-system-evolution/capability.yaml +24 -0
- package/.agents/skills/qk-system-evolution/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-test-engineering/SKILL.md +262 -139
- package/.agents/skills/qk-test-engineering/capability.yaml +28 -0
- package/.agents/skills/qk-test-engineering/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-ui-audit/SKILL.md +17 -90
- package/.agents/skills/qk-ui-audit/capability.yaml +23 -0
- package/.agents/skills/qk-ui-audit/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-ui-audit/references/anti-slop-checklist.md +2 -2
- package/.agents/skills/qk-ui-builder/SKILL.md +482 -509
- package/.agents/skills/qk-ui-builder/capability.yaml +29 -0
- package/.agents/skills/qk-ui-builder/references/component-cookbook.md +455 -1191
- package/.agents/skills/qk-ui-system-builder/SKILL.md +2 -6
- package/.agents/skills/qk-ui-system-builder/capability.yaml +25 -0
- package/.agents/skills/qk-ui-system-builder/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-validation-gate/SKILL.md +1 -75
- package/.agents/skills/qk-validation-gate/capability.yaml +23 -0
- package/.agents/skills/qk-validation-gate/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-web-quality-gate/SKILL.md +232 -114
- package/.agents/skills/qk-web-quality-gate/capability.yaml +24 -0
- package/.agents/skills/qk-web-quality-gate/evals/scorecard.yaml +26 -0
- package/.agents/workflows/_schema.yml +146 -109
- package/.agents/workflows/bug-resolution.yml +121 -101
- package/.agents/workflows/code-review.yml +93 -77
- package/.agents/workflows/documentation.yml +90 -75
- package/.agents/workflows/feature-delivery.yml +120 -103
- package/.agents/workflows/production-release.yml +173 -0
- package/.agents/workflows/refactor.yml +99 -81
- package/.agents/workflows/research.yml +75 -60
- package/.agents/workflows/security-audit.yml +115 -72
- package/.agents/workflows/skill-evolution.yml +97 -65
- package/.agents/workflows/spec-driven-development.yml +87 -57
- package/CHANGELOG.md +27 -0
- package/README.md +90 -90
- package/bin/install.js +329 -179
- package/package.json +4 -2
- package/tooling/build-registry.js +186 -186
- package/tooling/fix-refactor.js +8 -0
- package/tooling/sync-versions.js +49 -0
- package/tooling/validate-graph.js +87 -87
- package/.agents/CHANGELOG.md +0 -131
- package/.agents/learnings/draft/README.md +0 -37
- package/.agents/reports/RELEASE-CHECKLIST.md +0 -29
- package/.agents/reports/architecture-audit.md +0 -13
- package/.agents/reports/graph-health.md +0 -20
- package/.agents/reports/skill-audit.md +0 -215
- package/tooling/generate-registry.js +0 -157
package/bin/install.js
CHANGED
|
@@ -1,180 +1,330 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import fs from 'fs';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import readline from 'readline';
|
|
6
|
-
import { fileURLToPath } from 'url';
|
|
7
|
-
import os from 'os';
|
|
8
|
-
|
|
9
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
-
const __dirname = path.dirname(__filename);
|
|
11
|
-
const sourceDir = path.resolve(__dirname, '..', '.agents');
|
|
12
|
-
const packageJsonPath = path.resolve(__dirname, '..', 'package.json');
|
|
13
|
-
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
14
|
-
const version = pkg.version;
|
|
15
|
-
const cwd = process.cwd();
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
'
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
if (
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
(
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
2
|
+
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import readline from 'readline';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
import os from 'os';
|
|
8
|
+
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
const sourceDir = path.resolve(__dirname, '..', '.agents');
|
|
12
|
+
const packageJsonPath = path.resolve(__dirname, '..', 'package.json');
|
|
13
|
+
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
14
|
+
const version = pkg.version;
|
|
15
|
+
const cwd = process.cwd();
|
|
16
|
+
const homeDir = os.homedir();
|
|
17
|
+
|
|
18
|
+
// Version marker file written after every successful install
|
|
19
|
+
const VERSION_FILE = '.ai-skill-os-version';
|
|
20
|
+
|
|
21
|
+
// ─── IDE Configuration Map ────────────────────────────────────────────────────
|
|
22
|
+
// Each IDE has:
|
|
23
|
+
// localDir — where to install when scope=local (relative to cwd)
|
|
24
|
+
// globalDir — where to install when scope=global (absolute, user-level)
|
|
25
|
+
// postInstall — special steps after copy (null = none)
|
|
26
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
27
|
+
const IDE_CONFIG = {
|
|
28
|
+
antigravity: {
|
|
29
|
+
label: 'Antigravity (Google Gemini)',
|
|
30
|
+
localDir: path.join(cwd, '.agents'),
|
|
31
|
+
globalDir: path.join(homeDir, '.gemini', 'config'),
|
|
32
|
+
postInstall: 'rewriteAbsolutePaths',
|
|
33
|
+
note: 'Global: ~/.gemini/config — applies to all projects on this machine',
|
|
34
|
+
},
|
|
35
|
+
claude: {
|
|
36
|
+
label: 'Claude Code (Anthropic)',
|
|
37
|
+
localDir: path.join(cwd, '.claude'),
|
|
38
|
+
globalDir: path.join(homeDir, '.claude'),
|
|
39
|
+
postInstall: 'renameToClaude',
|
|
40
|
+
note: 'Global: ~/.claude/CLAUDE.md — applies to all Claude Code sessions',
|
|
41
|
+
},
|
|
42
|
+
cursor: {
|
|
43
|
+
label: 'Cursor IDE',
|
|
44
|
+
localDir: path.join(cwd, '.cursor', 'rules'),
|
|
45
|
+
globalDir: null, // Cursor has no reliable global rules path — use Settings UI
|
|
46
|
+
postInstall: 'exportCursorRules',
|
|
47
|
+
note: 'Local only: .cursor/rules/ — use Cursor Settings > Rules for AI for global rules',
|
|
48
|
+
},
|
|
49
|
+
codex: {
|
|
50
|
+
label: 'OpenAI Codex CLI',
|
|
51
|
+
localDir: path.join(cwd, '.codex'),
|
|
52
|
+
globalDir: path.join(homeDir, '.codex'),
|
|
53
|
+
postInstall: null,
|
|
54
|
+
note: 'Global: ~/.codex — applies to all Codex CLI sessions',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// ─── Utilities ───────────────────────────────────────────────────────────────
|
|
59
|
+
|
|
60
|
+
function copyRecursiveSync(src, dest) {
|
|
61
|
+
if (!fs.existsSync(src)) return;
|
|
62
|
+
const stats = fs.statSync(src);
|
|
63
|
+
if (stats.isDirectory()) {
|
|
64
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
65
|
+
for (const child of fs.readdirSync(src)) {
|
|
66
|
+
copyRecursiveSync(path.join(src, child), path.join(dest, child));
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
70
|
+
fs.copyFileSync(src, dest);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Read installed version from marker file. Returns null if not installed. */
|
|
75
|
+
function getInstalledVersion(targetDir) {
|
|
76
|
+
const markerPath = path.join(targetDir, VERSION_FILE);
|
|
77
|
+
if (!fs.existsSync(markerPath)) return null;
|
|
78
|
+
try {
|
|
79
|
+
return fs.readFileSync(markerPath, 'utf8').trim();
|
|
80
|
+
} catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Write version marker after successful install. */
|
|
86
|
+
function writeVersionMarker(targetDir) {
|
|
87
|
+
fs.writeFileSync(
|
|
88
|
+
path.join(targetDir, VERSION_FILE),
|
|
89
|
+
`${version}\nInstalled: ${new Date().toISOString()}\n`,
|
|
90
|
+
'utf8'
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Remove existing install. For Cursor: only delete the .mdc rule file. */
|
|
95
|
+
function removeExistingInstall(targetDir, ide) {
|
|
96
|
+
if (ide === 'cursor') {
|
|
97
|
+
const mdcPath = path.join(targetDir, 'ai-skill-os.mdc');
|
|
98
|
+
if (fs.existsSync(mdcPath)) fs.unlinkSync(mdcPath);
|
|
99
|
+
console.log(' 🗑️ Removed old Cursor rule: ai-skill-os.mdc');
|
|
100
|
+
} else {
|
|
101
|
+
if (fs.existsSync(targetDir)) {
|
|
102
|
+
fs.rmSync(targetDir, { recursive: true, force: true });
|
|
103
|
+
console.log(` 🗑️ Removed old install: ${targetDir}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Prompt user yes/no. Resolves true for yes. */
|
|
109
|
+
function confirm(rl, question) {
|
|
110
|
+
return new Promise((resolve) => {
|
|
111
|
+
rl.question(question, (ans) => resolve(['y', 'yes', ''].includes(ans.trim().toLowerCase())));
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function parseArgs() {
|
|
116
|
+
const args = process.argv.slice(2);
|
|
117
|
+
const result = { ide: null, scope: null };
|
|
118
|
+
for (const arg of args) {
|
|
119
|
+
if (arg.startsWith('--ide=')) result.ide = arg.split('=')[1];
|
|
120
|
+
else if (arg.startsWith('--scope=')) result.scope = arg.split('=')[1];
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ─── Post-install handlers ────────────────────────────────────────────────────
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Antigravity global install: rewrite relative .agents/X paths → absolute paths.
|
|
129
|
+
* Required because Antigravity reads SKILL.md files from an absolute global path.
|
|
130
|
+
*/
|
|
131
|
+
function rewriteAbsolutePaths(targetDir) {
|
|
132
|
+
const targetPosix = targetDir.replace(/\\/g, '/');
|
|
133
|
+
const DIRS_TO_REWRITE = ['skills', 'registry', 'rules', 'workflows', 'knowledge', 'docs', 'blueprints'];
|
|
134
|
+
|
|
135
|
+
const walk = (dir) => {
|
|
136
|
+
for (const file of fs.readdirSync(dir)) {
|
|
137
|
+
const fullPath = path.join(dir, file);
|
|
138
|
+
if (fs.statSync(fullPath).isDirectory()) {
|
|
139
|
+
walk(fullPath);
|
|
140
|
+
} else if (/\.(md|yml|yaml|json)$/.test(fullPath)) {
|
|
141
|
+
let content = fs.readFileSync(fullPath, 'utf8');
|
|
142
|
+
let changed = false;
|
|
143
|
+
|
|
144
|
+
for (const d of DIRS_TO_REWRITE) {
|
|
145
|
+
const re = new RegExp(`\\.agents/${d}`, 'g');
|
|
146
|
+
if (re.test(content)) {
|
|
147
|
+
content = content.replace(re, `${targetPosix}/${d}`);
|
|
148
|
+
changed = true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (content.includes('.agents/skills.json')) {
|
|
152
|
+
content = content.replace(/\.agents\/skills\.json/g, `${targetPosix}/skills.json`);
|
|
153
|
+
changed = true;
|
|
154
|
+
}
|
|
155
|
+
if (changed) fs.writeFileSync(fullPath, content, 'utf8');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
walk(targetDir);
|
|
161
|
+
console.log(' ✅ Rewrote .agents/* references → absolute paths for Antigravity global mode');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Claude Code install: copy AGENTS.md → CLAUDE.md at target root.
|
|
166
|
+
* Claude Code reads ~/.claude/CLAUDE.md as global instructions.
|
|
167
|
+
*/
|
|
168
|
+
function renameToClaude(targetDir) {
|
|
169
|
+
const agentsMd = path.join(targetDir, 'AGENTS.md');
|
|
170
|
+
const claudeMd = path.join(targetDir, 'CLAUDE.md');
|
|
171
|
+
|
|
172
|
+
if (fs.existsSync(agentsMd) && !fs.existsSync(claudeMd)) {
|
|
173
|
+
fs.copyFileSync(agentsMd, claudeMd);
|
|
174
|
+
console.log(' ✅ Copied AGENTS.md → CLAUDE.md (Claude Code entry point)');
|
|
175
|
+
} else if (fs.existsSync(claudeMd)) {
|
|
176
|
+
console.log(' ℹ️ CLAUDE.md already exists — skipped overwrite');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Cursor install: export AGENTS.md content as a .mdc rule file.
|
|
182
|
+
* Cursor reads .cursor/rules/*.mdc — each file needs YAML frontmatter.
|
|
183
|
+
*/
|
|
184
|
+
function exportCursorRules(targetDir) {
|
|
185
|
+
const agentsMd = path.join(sourceDir, 'AGENTS.md');
|
|
186
|
+
if (!fs.existsSync(agentsMd)) return;
|
|
187
|
+
|
|
188
|
+
const rawContent = fs.readFileSync(agentsMd, 'utf8');
|
|
189
|
+
const mdcContent = `---
|
|
190
|
+
description: "AI Developer Skill OS v${version} — global skill rules"
|
|
191
|
+
alwaysApply: true
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
${rawContent}`;
|
|
195
|
+
|
|
196
|
+
const outPath = path.join(targetDir, 'ai-skill-os.mdc');
|
|
197
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
198
|
+
fs.writeFileSync(outPath, mdcContent, 'utf8');
|
|
199
|
+
console.log(` ✅ Exported rules → ${outPath}`);
|
|
200
|
+
console.log(' ℹ️ For global rules: Cursor Settings > General > Rules for AI');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// ─── Main install logic ───────────────────────────────────────────────────────
|
|
204
|
+
|
|
205
|
+
async function runInstall(ideKey, scopeKey, rl) {
|
|
206
|
+
const ideMap = { '1': 'antigravity', '2': 'claude', '3': 'cursor', '4': 'codex' };
|
|
207
|
+
const scopeMap = { '1': 'local', '2': 'global' };
|
|
208
|
+
|
|
209
|
+
const ide = ideMap[ideKey] || ideKey;
|
|
210
|
+
const scope = scopeMap[scopeKey] || scopeKey;
|
|
211
|
+
const config = IDE_CONFIG[ide];
|
|
212
|
+
|
|
213
|
+
if (!config) {
|
|
214
|
+
console.error(`❌ IDE không hợp lệ: "${ide}". Chọn: antigravity, claude, cursor, codex`);
|
|
215
|
+
process.exit(1);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const isGlobal = scope === 'global';
|
|
219
|
+
|
|
220
|
+
if (isGlobal && config.globalDir === null) {
|
|
221
|
+
console.warn(`⚠️ ${config.label} không hỗ trợ cài Global qua file.`);
|
|
222
|
+
console.warn(` ${config.note}`);
|
|
223
|
+
console.warn(' Tiến hành cài Local thay thế...');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const targetDir = (isGlobal && config.globalDir) ? config.globalDir : config.localDir;
|
|
227
|
+
|
|
228
|
+
console.log(`\n🚀 AI Developer Skill OS v${version}`);
|
|
229
|
+
console.log(` IDE: ${config.label}`);
|
|
230
|
+
console.log(` Scope: ${isGlobal ? 'Global' : 'Local'}`);
|
|
231
|
+
console.log(` Path: ${targetDir}`);
|
|
232
|
+
|
|
233
|
+
// ── Version check ────────────────────────────────────────────────────────
|
|
234
|
+
const installedVersion = getInstalledVersion(targetDir);
|
|
235
|
+
|
|
236
|
+
if (installedVersion) {
|
|
237
|
+
if (installedVersion === version) {
|
|
238
|
+
console.log(`\n✅ Phiên bản v${version} đã được cài đặt — không cần cập nhật.`);
|
|
239
|
+
console.log(' Dùng --force để cài lại.\n');
|
|
240
|
+
const isForce = process.argv.includes('--force');
|
|
241
|
+
if (!isForce) {
|
|
242
|
+
if (rl) rl.close();
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
console.log(' --force detected: tiến hành cài lại...');
|
|
246
|
+
} else {
|
|
247
|
+
console.log(`\n⚠️ Phát hiện phiên bản cũ: v${installedVersion}`);
|
|
248
|
+
console.log(` Phiên bản mới: v${version}`);
|
|
249
|
+
const shouldUpgrade = rl
|
|
250
|
+
? await confirm(rl, '\n Xóa bản cũ và cài bản mới? [Y/n]: ')
|
|
251
|
+
: true;
|
|
252
|
+
if (!shouldUpgrade) {
|
|
253
|
+
console.log(' Hủy cài đặt.');
|
|
254
|
+
if (rl) rl.close();
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Remove old install before fresh copy
|
|
259
|
+
removeExistingInstall(targetDir, ide);
|
|
260
|
+
} else {
|
|
261
|
+
console.log(' (Chưa cài đặt — fresh install)\n');
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// ── Install ──────────────────────────────────────────────────────────────
|
|
265
|
+
try {
|
|
266
|
+
if (!fs.existsSync(sourceDir)) {
|
|
267
|
+
console.error(`❌ Không tìm thấy source: ${sourceDir}`);
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (ide === 'cursor') {
|
|
272
|
+
exportCursorRules(targetDir);
|
|
273
|
+
} else {
|
|
274
|
+
copyRecursiveSync(sourceDir, targetDir);
|
|
275
|
+
console.log(` ✅ Copied .agents/ → ${targetDir}`);
|
|
276
|
+
|
|
277
|
+
if (isGlobal && config.postInstall === 'rewriteAbsolutePaths') {
|
|
278
|
+
rewriteAbsolutePaths(targetDir);
|
|
279
|
+
}
|
|
280
|
+
if (config.postInstall === 'renameToClaude') {
|
|
281
|
+
renameToClaude(targetDir);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
writeVersionMarker(targetDir);
|
|
286
|
+
console.log(`\n🎉 Hoàn tất v${version}! ${config.note}\n`);
|
|
287
|
+
|
|
288
|
+
} catch (err) {
|
|
289
|
+
console.error('❌ Lỗi cài đặt:', err.message);
|
|
290
|
+
process.exit(1);
|
|
291
|
+
} finally {
|
|
292
|
+
if (rl) rl.close();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// ─── CLI entry point ──────────────────────────────────────────────────────────
|
|
297
|
+
|
|
298
|
+
const args = parseArgs();
|
|
299
|
+
|
|
300
|
+
if (args.ide && args.scope) {
|
|
301
|
+
// Non-interactive mode (called via npm scripts)
|
|
302
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
303
|
+
await runInstall(args.ide, args.scope, rl);
|
|
304
|
+
} else {
|
|
305
|
+
// Interactive mode
|
|
306
|
+
console.log(`\n🚀 AI Developer Skill OS v${version} — Setup\n`);
|
|
307
|
+
|
|
308
|
+
const ideQuestion = `Chọn IDE/AI Assistant:
|
|
309
|
+
(1) Antigravity (Google Gemini)
|
|
310
|
+
(2) Claude Code (Anthropic)
|
|
311
|
+
(3) Cursor IDE
|
|
312
|
+
(4) OpenAI Codex CLI
|
|
313
|
+
|
|
314
|
+
Nhập số (1-4): `;
|
|
315
|
+
|
|
316
|
+
const scopeQuestion = `
|
|
317
|
+
Phạm vi cài đặt:
|
|
318
|
+
(1) Local — Chỉ dự án này (.agents/ hoặc .claude/ trong thư mục hiện tại)
|
|
319
|
+
(2) Global — Toàn bộ máy tính (áp dụng cho mọi dự án)
|
|
320
|
+
|
|
321
|
+
Nhập số (1-2): `;
|
|
322
|
+
|
|
323
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
324
|
+
|
|
325
|
+
rl.question(ideQuestion, async (ideAnswer) => {
|
|
326
|
+
rl.question(scopeQuestion, async (scopeAnswer) => {
|
|
327
|
+
await runInstall(ideAnswer.trim(), scopeAnswer.trim(), rl);
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-developer-skill-os",
|
|
3
|
-
"version": "8.
|
|
4
|
-
"description": "EDAOS v8.
|
|
3
|
+
"version": "8.3.1",
|
|
4
|
+
"description": "EDAOS v8.3 — Governed Capability Metadata & Eval Platform: Blueprints organize, manifests govern, registries accelerate.",
|
|
5
5
|
"main": "bin/install.js",
|
|
6
6
|
"files": [
|
|
7
7
|
"bin",
|
|
@@ -26,6 +26,8 @@
|
|
|
26
26
|
"test:registry": "vitest run && node tooling/build-registry.js",
|
|
27
27
|
"test:graph": "node tooling/validate-graph.js",
|
|
28
28
|
"lint": "node bin/lint.js",
|
|
29
|
+
"eval": "node evals/runner.js",
|
|
30
|
+
"eval:all": "node evals/runner.js --all",
|
|
29
31
|
"test:agent": "node tests/agent-evaluation/runner/evaluate-routing.js",
|
|
30
32
|
"generate:evaluation": "node tooling/generate-evaluation-cases.cjs",
|
|
31
33
|
"install:antigravity": "node bin/install.js --ide=antigravity --scope=2",
|