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.
Files changed (151) hide show
  1. package/.agents/LICENSE +21 -21
  2. package/.agents/README.md +90 -90
  3. package/.agents/docs/CHI_TIET_SKILLS.md +125 -125
  4. package/.agents/docs/MIGRATION-CLEANUP-V8.1.3.md +36 -36
  5. package/.agents/docs/MIGRATION-STATUS.md +35 -35
  6. package/.agents/docs/MIGRATION-V8.md +10 -10
  7. package/.agents/docs/V8-CERTIFICATION.md +27 -27
  8. package/.agents/docs/decisions/ADR-001-v8-migration.md +58 -58
  9. package/.agents/docs/decisions/ADR-002-workflow-separation.md +50 -50
  10. package/.agents/docs/decisions/ADR-003-registry-generated.md +54 -54
  11. package/.agents/docs/decisions/ADR-008-skill-boundary-review.md +27 -27
  12. package/.agents/registry/capability-graph.yml +67 -25
  13. package/.agents/registry/graph.json +135 -256
  14. package/.agents/registry/index.yaml +68 -95
  15. package/.agents/registry/skills-index.yml +548 -525
  16. package/.agents/rules/anti-patterns.md +45 -0
  17. package/.agents/rules/coding.md +10 -0
  18. package/.agents/rules/command-safety.md +37 -14
  19. package/.agents/rules/priorities.yml +13 -2
  20. package/.agents/rules/security.md +47 -7
  21. package/.agents/rules/skill-quality.md +32 -8
  22. package/.agents/skills/_template/SKILL.md +133 -132
  23. package/.agents/skills/_template/capability.yaml +22 -8
  24. package/.agents/skills/_template/evals/scorecard.yaml +19 -19
  25. package/.agents/skills/qk-access-policy/SKILL.md +5 -2
  26. package/.agents/skills/qk-access-policy/capability.yaml +23 -0
  27. package/.agents/skills/qk-access-policy/evals/scorecard.yaml +36 -0
  28. package/.agents/skills/qk-agent-observability/SKILL.md +112 -1
  29. package/.agents/skills/qk-agent-observability/capability.yaml +29 -0
  30. package/.agents/skills/qk-agent-observability/evals/scorecard.yaml +29 -0
  31. package/.agents/skills/qk-agent-observability/references/scorecard.yaml +80 -0
  32. package/.agents/skills/qk-ai-builder/SKILL.md +75 -6
  33. package/.agents/skills/qk-ai-builder/capability.yaml +23 -0
  34. package/.agents/skills/qk-ai-builder/evals/scorecard.yaml +30 -0
  35. package/.agents/skills/qk-api-lifecycle/SKILL.md +5 -3
  36. package/.agents/skills/qk-api-lifecycle/capability.yaml +23 -0
  37. package/.agents/skills/qk-api-lifecycle/evals/scorecard.yaml +29 -0
  38. package/.agents/skills/qk-bug-resolution/SKILL.md +4 -22
  39. package/.agents/skills/qk-bug-resolution/capability.yaml +25 -0
  40. package/.agents/skills/qk-bug-resolution/evals/scorecard.yaml +30 -0
  41. package/.agents/skills/qk-code-review/SKILL.md +188 -186
  42. package/.agents/skills/qk-code-review/capability.yaml +23 -0
  43. package/.agents/skills/qk-code-review/evals/scorecard.yaml +29 -0
  44. package/.agents/skills/qk-context-loader/SKILL.md +4 -12
  45. package/.agents/skills/qk-context-loader/capability.yaml +23 -0
  46. package/.agents/skills/qk-context-loader/evals/scorecard.yaml +28 -0
  47. package/.agents/skills/qk-data-lifecycle/SKILL.md +7 -2
  48. package/.agents/skills/qk-data-lifecycle/capability.yaml +23 -0
  49. package/.agents/skills/qk-data-lifecycle/evals/scorecard.yaml +29 -0
  50. package/.agents/skills/qk-db-optimizer/SKILL.md +4 -3
  51. package/.agents/skills/qk-db-optimizer/capability.yaml +22 -0
  52. package/.agents/skills/qk-db-optimizer/evals/scorecard.yaml +28 -0
  53. package/.agents/skills/qk-design-system-engineering/SKILL.md +235 -112
  54. package/.agents/skills/qk-design-system-engineering/capability.yaml +25 -0
  55. package/.agents/skills/qk-design-system-engineering/evals/scorecard.yaml +27 -0
  56. package/.agents/skills/qk-devops-platform/SKILL.md +241 -117
  57. package/.agents/skills/qk-devops-platform/capability.yaml +29 -0
  58. package/.agents/skills/qk-devops-platform/evals/scorecard.yaml +28 -0
  59. package/.agents/skills/qk-docs/SKILL.md +4 -2
  60. package/.agents/skills/qk-docs/capability.yaml +23 -0
  61. package/.agents/skills/qk-docs/evals/scorecard.yaml +27 -0
  62. package/.agents/skills/qk-engineering-standard/SKILL.md +5 -76
  63. package/.agents/skills/qk-engineering-standard/capability.yaml +23 -0
  64. package/.agents/skills/qk-engineering-standard/evals/scorecard.yaml +28 -0
  65. package/.agents/skills/qk-engineering-standard/references/anti-patterns.md +121 -0
  66. package/.agents/skills/qk-engineering-standard/rules/frontend.md +1 -1
  67. package/.agents/skills/qk-fe-api-integration/SKILL.md +14 -33
  68. package/.agents/skills/qk-fe-api-integration/capability.yaml +21 -0
  69. package/.agents/skills/qk-fe-api-integration/evals/scorecard.yaml +29 -0
  70. package/.agents/skills/qk-feature-delivery/SKILL.md +54 -222
  71. package/.agents/skills/qk-feature-delivery/capability.yaml +24 -0
  72. package/.agents/skills/qk-feature-delivery/evals/scorecard.yaml +28 -0
  73. package/.agents/skills/qk-frontend-architecture/SKILL.md +258 -134
  74. package/.agents/skills/qk-frontend-architecture/capability.yaml +28 -0
  75. package/.agents/skills/qk-frontend-architecture/evals/scorecard.yaml +28 -0
  76. package/.agents/skills/qk-help/SKILL.md +23 -161
  77. package/.agents/skills/qk-help/capability.yaml +20 -0
  78. package/.agents/skills/qk-help/evals/scorecard.yaml +13 -0
  79. package/.agents/skills/qk-orchestrator/SKILL.md +3 -35
  80. package/.agents/skills/qk-orchestrator/capability.yaml +22 -0
  81. package/.agents/skills/qk-orchestrator/evals/scorecard.yaml +27 -0
  82. package/.agents/skills/qk-orchestrator/references/routing-table.md +15 -3
  83. package/.agents/skills/qk-product-specification/SKILL.md +253 -130
  84. package/.agents/skills/qk-product-specification/capability.yaml +27 -0
  85. package/.agents/skills/qk-product-specification/evals/scorecard.yaml +27 -0
  86. package/.agents/skills/qk-production-release/SKILL.md +33 -68
  87. package/.agents/skills/qk-production-release/capability.yaml +27 -0
  88. package/.agents/skills/qk-production-release/evals/scorecard.yaml +28 -0
  89. package/.agents/skills/qk-project-bootstrap/SKILL.md +59 -8
  90. package/.agents/skills/qk-project-bootstrap/capability.yaml +23 -0
  91. package/.agents/skills/qk-project-bootstrap/evals/scorecard.yaml +28 -0
  92. package/.agents/skills/qk-project-health/SKILL.md +5 -3
  93. package/.agents/skills/qk-project-health/capability.yaml +23 -0
  94. package/.agents/skills/qk-project-health/evals/scorecard.yaml +27 -0
  95. package/.agents/skills/qk-project-memory/SKILL.md +4 -2
  96. package/.agents/skills/qk-project-memory/capability.yaml +23 -0
  97. package/.agents/skills/qk-project-memory/evals/scorecard.yaml +27 -0
  98. package/.agents/skills/qk-refactor/SKILL.md +117 -0
  99. package/.agents/skills/qk-refactor/capability.yaml +26 -0
  100. package/.agents/skills/qk-refactor/evals/scorecard.yaml +27 -0
  101. package/.agents/skills/qk-security-audit/SKILL.md +259 -135
  102. package/.agents/skills/qk-security-audit/capability.yaml +30 -0
  103. package/.agents/skills/qk-security-audit/evals/scorecard.yaml +27 -0
  104. package/.agents/skills/qk-system-evolution/SKILL.md +18 -68
  105. package/.agents/skills/qk-system-evolution/capability.yaml +24 -0
  106. package/.agents/skills/qk-system-evolution/evals/scorecard.yaml +26 -0
  107. package/.agents/skills/qk-test-engineering/SKILL.md +262 -139
  108. package/.agents/skills/qk-test-engineering/capability.yaml +28 -0
  109. package/.agents/skills/qk-test-engineering/evals/scorecard.yaml +26 -0
  110. package/.agents/skills/qk-ui-audit/SKILL.md +17 -90
  111. package/.agents/skills/qk-ui-audit/capability.yaml +23 -0
  112. package/.agents/skills/qk-ui-audit/evals/scorecard.yaml +26 -0
  113. package/.agents/skills/qk-ui-audit/references/anti-slop-checklist.md +2 -2
  114. package/.agents/skills/qk-ui-builder/SKILL.md +482 -509
  115. package/.agents/skills/qk-ui-builder/capability.yaml +29 -0
  116. package/.agents/skills/qk-ui-builder/references/component-cookbook.md +455 -1191
  117. package/.agents/skills/qk-ui-system-builder/SKILL.md +2 -6
  118. package/.agents/skills/qk-ui-system-builder/capability.yaml +25 -0
  119. package/.agents/skills/qk-ui-system-builder/evals/scorecard.yaml +26 -0
  120. package/.agents/skills/qk-validation-gate/SKILL.md +1 -75
  121. package/.agents/skills/qk-validation-gate/capability.yaml +23 -0
  122. package/.agents/skills/qk-validation-gate/evals/scorecard.yaml +26 -0
  123. package/.agents/skills/qk-web-quality-gate/SKILL.md +232 -114
  124. package/.agents/skills/qk-web-quality-gate/capability.yaml +24 -0
  125. package/.agents/skills/qk-web-quality-gate/evals/scorecard.yaml +26 -0
  126. package/.agents/workflows/_schema.yml +146 -109
  127. package/.agents/workflows/bug-resolution.yml +121 -101
  128. package/.agents/workflows/code-review.yml +93 -77
  129. package/.agents/workflows/documentation.yml +90 -75
  130. package/.agents/workflows/feature-delivery.yml +120 -103
  131. package/.agents/workflows/production-release.yml +173 -0
  132. package/.agents/workflows/refactor.yml +99 -81
  133. package/.agents/workflows/research.yml +75 -60
  134. package/.agents/workflows/security-audit.yml +115 -72
  135. package/.agents/workflows/skill-evolution.yml +97 -65
  136. package/.agents/workflows/spec-driven-development.yml +87 -57
  137. package/CHANGELOG.md +27 -0
  138. package/README.md +90 -90
  139. package/bin/install.js +329 -179
  140. package/package.json +4 -2
  141. package/tooling/build-registry.js +186 -186
  142. package/tooling/fix-refactor.js +8 -0
  143. package/tooling/sync-versions.js +49 -0
  144. package/tooling/validate-graph.js +87 -87
  145. package/.agents/CHANGELOG.md +0 -131
  146. package/.agents/learnings/draft/README.md +0 -37
  147. package/.agents/reports/RELEASE-CHECKLIST.md +0 -29
  148. package/.agents/reports/architecture-audit.md +0 -13
  149. package/.agents/reports/graph-health.md +0 -20
  150. package/.agents/reports/skill-audit.md +0 -215
  151. 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
- function parseArgs() {
18
- const args = process.argv.slice(2);
19
- let ide = null;
20
- let scope = null;
21
-
22
- args.forEach(arg => {
23
- if (arg.startsWith('--ide=')) {
24
- ide = arg.split('=')[1];
25
- } else if (arg.startsWith('--scope=')) {
26
- scope = arg.split('=')[1];
27
- }
28
- });
29
-
30
- return { ide, scope };
31
- }
32
-
33
- function copyRecursiveSync(src, dest) {
34
- const exists = fs.existsSync(src);
35
- const stats = exists && fs.statSync(src);
36
- const isDirectory = exists && stats.isDirectory();
37
- if (isDirectory) {
38
- if (!fs.existsSync(dest)) {
39
- fs.mkdirSync(dest, { recursive: true });
40
- }
41
- fs.readdirSync(src).forEach(function (childItemName) {
42
- copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName));
43
- });
44
- } else {
45
- fs.copyFileSync(src, dest);
46
- }
47
- }
48
-
49
- function runInstall(ideChoice, scopeChoice) {
50
- const mapIde = {
51
- '1': 'cursor',
52
- '2': 'windsurf',
53
- '3': 'cline',
54
- '4': 'antigravity',
55
- '5': 'codex',
56
- '6': 'kilo',
57
- '7': 'multi-ide'
58
- };
59
-
60
- const mapScope = {
61
- '1': 'local',
62
- '2': 'global'
63
- };
64
-
65
- const ide = mapIde[ideChoice] || ideChoice;
66
- const scope = mapScope[scopeChoice] || scopeChoice;
67
- const isGlobal = scope === 'global';
68
-
69
- let targetDir = path.join(cwd, '.agents');
70
-
71
- if (isGlobal) {
72
- const homeDir = os.homedir();
73
- if (ide === 'antigravity') {
74
- targetDir = path.join(homeDir, '.gemini', 'config');
75
- } else {
76
- targetDir = path.join(homeDir, '.ai-developer-skill-os', '.agents');
77
- }
78
- }
79
-
80
- try {
81
- console.log(`\n🚀 Đang cài đặt V${version} Agent Engineering OS...`);
82
-
83
- if (!fs.existsSync(targetDir)) {
84
- fs.mkdirSync(targetDir, { recursive: true });
85
- }
86
-
87
- if (fs.existsSync(sourceDir)) {
88
- copyRecursiveSync(sourceDir, targetDir);
89
- console.log(`✅ Đã copy toàn bộ kiến trúc .agents vào: ${targetDir}`);
90
-
91
- if (isGlobal && ide === 'antigravity') {
92
- const targetDirPosix = targetDir.replace(/\\/g, '/');
93
-
94
- function walkAndReplace(dir) {
95
- const files = fs.readdirSync(dir);
96
- for (const file of files) {
97
- const fullPath = path.join(dir, file);
98
- if (fs.statSync(fullPath).isDirectory()) {
99
- walkAndReplace(fullPath);
100
- } else if (fullPath.endsWith('.md') || fullPath.endsWith('.yml') || fullPath.endsWith('.yaml') || fullPath.endsWith('.json')) {
101
- let content = fs.readFileSync(fullPath, 'utf8');
102
- let modified = false;
103
-
104
- const dirsToRewrite = ['skills', 'registry', 'rules', 'workflows', 'knowledge', 'examples', 'docs'];
105
- for (const d of dirsToRewrite) {
106
- const regex = new RegExp(`\\.agents/${d}`, 'g');
107
- if (regex.test(content)) {
108
- content = content.replace(regex, `${targetDirPosix}/${d}`);
109
- modified = true;
110
- }
111
- }
112
-
113
- if (content.includes('.agents/skills.json')) {
114
- content = content.replace(/\.agents\/skills\.json/g, `${targetDirPosix}/skills.json`);
115
- modified = true;
116
- }
117
-
118
- if (modified) {
119
- fs.writeFileSync(fullPath, content, 'utf8');
120
- }
121
- }
122
- }
123
- }
124
-
125
- walkAndReplace(targetDir);
126
- console.log(`✅ Đã cập nhật đường dẫn tuyệt đối cho cấu hình Global Antigravity`);
127
- }
128
- } else {
129
- console.error(`❌ Lỗi: Không tìm thấy thư mục nguồn ${sourceDir}`);
130
- return;
131
- }
132
-
133
- console.log(`\n🎉 HOÀN TẤT! Kiến trúc V${version} đã sẵn sàng tại: ${targetDir}`);
134
-
135
- if (isGlobal && ide === 'antigravity') {
136
- console.log(`💡 Antigravity đã được cài Global. Từ nay bạn mở BẤT KỲ DỰ ÁN NÀO, Antigravity cũng sẽ tự động có đủ hệ thống OS mới nhất!`);
137
- }
138
-
139
- } catch (error) {
140
- console.error('❌ lỗi xảy ra trong quá trình cài đặt:', error.message);
141
- }
142
- }
143
-
144
- const args = parseArgs();
145
-
146
- if (args.ide && args.scope) {
147
- runInstall(args.ide, args.scope);
148
- } else {
149
- console.log('🚀 Đang chuẩn bị cài đặt AI Developer Skill OS V8...\n');
150
-
151
- const questionIde = `Vui lòng chọn IDE/AI Assistant bạn đang sử dụng:
152
- (1) Cursor
153
- (2) Windsurf
154
- (3) Cline / Roo Code
155
- (4) Antigravity / Gemini
156
- (5) Codex
157
- (6) Kilo Code
158
- (7) Tất cả các IDE (Multi-IDE)
159
-
160
- Nhập số (1-7): `;
161
-
162
- const questionScope = `
163
- Bạn muốn cài đặt bộ kỹ năng ở đâu?
164
- (1) Local (Gắn vào dự án hiện tại - Phù hợp làm việc nhóm)
165
- (2) Global (Cài vào máy tính dùng chung cho mọi dự án - Dành cho cá nhân)
166
-
167
- Nhập số (1-2): `;
168
-
169
- const rl = readline.createInterface({
170
- input: process.stdin,
171
- output: process.stdout
172
- });
173
-
174
- rl.question(questionIde, (answerIde) => {
175
- rl.question(questionScope, (answerScope) => {
176
- rl.close();
177
- runInstall(answerIde.trim(), answerScope.trim());
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.2.1",
4
- "description": "EDAOS v8.2 — Governed Capability Metadata & Eval Platform: Blueprints organize, manifests govern, registries accelerate.",
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",