ai-developer-skill-os 8.3.0 → 9.0.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.
Files changed (115) hide show
  1. package/.agents/AGENTS.md +21 -0
  2. package/.agents/registry/capability-graph.yml +74 -21
  3. package/.agents/registry/graph.json +138 -255
  4. package/.agents/registry/index.yaml +70 -96
  5. package/.agents/registry/skills-index.yml +70 -47
  6. package/.agents/rules/anti-patterns.md +45 -0
  7. package/.agents/rules/global.md +13 -0
  8. package/.agents/skills/_template/SKILL.md +127 -2
  9. package/.agents/skills/_template/capability.yaml +34 -20
  10. package/.agents/skills/qk-access-policy/SKILL.md +132 -2
  11. package/.agents/skills/qk-access-policy/capability.yaml +23 -0
  12. package/.agents/skills/qk-access-policy/evals/scorecard.yaml +36 -0
  13. package/.agents/skills/qk-agent-observability/SKILL.md +139 -3
  14. package/.agents/skills/qk-agent-observability/capability.yaml +29 -0
  15. package/.agents/skills/qk-agent-observability/evals/scorecard.yaml +29 -0
  16. package/.agents/skills/qk-ai-builder/SKILL.md +132 -2
  17. package/.agents/skills/qk-ai-builder/capability.yaml +23 -0
  18. package/.agents/skills/qk-ai-builder/evals/scorecard.yaml +30 -0
  19. package/.agents/skills/qk-api-lifecycle/SKILL.md +132 -2
  20. package/.agents/skills/qk-api-lifecycle/capability.yaml +23 -0
  21. package/.agents/skills/qk-api-lifecycle/evals/scorecard.yaml +29 -0
  22. package/.agents/skills/qk-bug-resolution/SKILL.md +132 -2
  23. package/.agents/skills/qk-bug-resolution/capability.yaml +25 -0
  24. package/.agents/skills/qk-bug-resolution/evals/scorecard.yaml +30 -0
  25. package/.agents/skills/qk-code-review/SKILL.md +132 -2
  26. package/.agents/skills/qk-code-review/capability.yaml +23 -0
  27. package/.agents/skills/qk-code-review/evals/scorecard.yaml +29 -0
  28. package/.agents/skills/qk-context-loader/SKILL.md +135 -4
  29. package/.agents/skills/qk-context-loader/capability.yaml +23 -0
  30. package/.agents/skills/qk-context-loader/evals/scorecard.yaml +28 -0
  31. package/.agents/skills/qk-data-lifecycle/SKILL.md +132 -2
  32. package/.agents/skills/qk-data-lifecycle/capability.yaml +23 -0
  33. package/.agents/skills/qk-data-lifecycle/evals/scorecard.yaml +29 -0
  34. package/.agents/skills/qk-db-optimizer/SKILL.md +132 -2
  35. package/.agents/skills/qk-db-optimizer/capability.yaml +22 -0
  36. package/.agents/skills/qk-db-optimizer/evals/scorecard.yaml +28 -0
  37. package/.agents/skills/qk-design-system-engineering/SKILL.md +132 -2
  38. package/.agents/skills/qk-design-system-engineering/capability.yaml +25 -0
  39. package/.agents/skills/qk-design-system-engineering/evals/scorecard.yaml +27 -0
  40. package/.agents/skills/qk-devops-platform/SKILL.md +132 -2
  41. package/.agents/skills/qk-devops-platform/capability.yaml +29 -0
  42. package/.agents/skills/qk-devops-platform/evals/scorecard.yaml +28 -0
  43. package/.agents/skills/qk-docs/SKILL.md +132 -2
  44. package/.agents/skills/qk-docs/capability.yaml +23 -0
  45. package/.agents/skills/qk-docs/evals/scorecard.yaml +27 -0
  46. package/.agents/skills/qk-engineering-standard/SKILL.md +132 -2
  47. package/.agents/skills/qk-engineering-standard/capability.yaml +23 -0
  48. package/.agents/skills/qk-engineering-standard/evals/scorecard.yaml +28 -0
  49. package/.agents/skills/qk-fe-api-integration/SKILL.md +132 -2
  50. package/.agents/skills/qk-fe-api-integration/capability.yaml +21 -0
  51. package/.agents/skills/qk-fe-api-integration/evals/scorecard.yaml +29 -0
  52. package/.agents/skills/qk-feature-delivery/SKILL.md +132 -2
  53. package/.agents/skills/qk-feature-delivery/capability.yaml +24 -0
  54. package/.agents/skills/qk-feature-delivery/evals/scorecard.yaml +28 -0
  55. package/.agents/skills/qk-frontend-architecture/SKILL.md +132 -2
  56. package/.agents/skills/qk-frontend-architecture/capability.yaml +28 -0
  57. package/.agents/skills/qk-frontend-architecture/evals/scorecard.yaml +28 -0
  58. package/.agents/skills/qk-help/SKILL.md +3 -3
  59. package/.agents/skills/qk-help/capability.yaml +20 -0
  60. package/.agents/skills/qk-help/evals/scorecard.yaml +13 -0
  61. package/.agents/skills/qk-orchestrator/SKILL.md +132 -2
  62. package/.agents/skills/qk-orchestrator/capability.yaml +22 -0
  63. package/.agents/skills/qk-orchestrator/evals/scorecard.yaml +27 -0
  64. package/.agents/skills/qk-product-specification/SKILL.md +132 -2
  65. package/.agents/skills/qk-product-specification/capability.yaml +27 -0
  66. package/.agents/skills/qk-product-specification/evals/scorecard.yaml +27 -0
  67. package/.agents/skills/qk-production-release/SKILL.md +133 -3
  68. package/.agents/skills/qk-production-release/capability.yaml +27 -0
  69. package/.agents/skills/qk-production-release/evals/scorecard.yaml +28 -0
  70. package/.agents/skills/qk-project-bootstrap/SKILL.md +147 -4
  71. package/.agents/skills/qk-project-bootstrap/capability.yaml +23 -0
  72. package/.agents/skills/qk-project-bootstrap/evals/scorecard.yaml +28 -0
  73. package/.agents/skills/qk-project-health/SKILL.md +132 -2
  74. package/.agents/skills/qk-project-health/capability.yaml +23 -0
  75. package/.agents/skills/qk-project-health/evals/scorecard.yaml +27 -0
  76. package/.agents/skills/qk-project-memory/SKILL.md +252 -277
  77. package/.agents/skills/qk-project-memory/capability.yaml +23 -0
  78. package/.agents/skills/qk-project-memory/evals/scorecard.yaml +27 -0
  79. package/.agents/skills/qk-refactor/SKILL.md +247 -0
  80. package/.agents/skills/qk-refactor/capability.yaml +26 -0
  81. package/.agents/skills/qk-refactor/evals/scorecard.yaml +27 -0
  82. package/.agents/skills/qk-security-audit/SKILL.md +132 -2
  83. package/.agents/skills/qk-security-audit/capability.yaml +30 -0
  84. package/.agents/skills/qk-security-audit/evals/scorecard.yaml +27 -0
  85. package/.agents/skills/qk-system-evolution/SKILL.md +132 -2
  86. package/.agents/skills/qk-system-evolution/capability.yaml +24 -0
  87. package/.agents/skills/qk-system-evolution/evals/scorecard.yaml +26 -0
  88. package/.agents/skills/qk-test-engineering/SKILL.md +132 -2
  89. package/.agents/skills/qk-test-engineering/capability.yaml +28 -0
  90. package/.agents/skills/qk-test-engineering/evals/scorecard.yaml +26 -0
  91. package/.agents/skills/qk-ui-audit/SKILL.md +132 -2
  92. package/.agents/skills/qk-ui-audit/capability.yaml +23 -0
  93. package/.agents/skills/qk-ui-audit/evals/scorecard.yaml +26 -0
  94. package/.agents/skills/qk-ui-builder/capability.yaml +29 -0
  95. package/.agents/skills/qk-ui-builder/evals/scorecard.yaml +26 -0
  96. package/.agents/skills/qk-ui-system-builder/SKILL.md +132 -2
  97. package/.agents/skills/qk-ui-system-builder/capability.yaml +25 -0
  98. package/.agents/skills/qk-ui-system-builder/evals/scorecard.yaml +26 -0
  99. package/.agents/skills/qk-validation-gate/SKILL.md +132 -2
  100. package/.agents/skills/qk-validation-gate/capability.yaml +23 -0
  101. package/.agents/skills/qk-validation-gate/evals/scorecard.yaml +26 -0
  102. package/.agents/skills/qk-web-quality-gate/SKILL.md +132 -2
  103. package/.agents/skills/qk-web-quality-gate/capability.yaml +24 -0
  104. package/.agents/skills/qk-web-quality-gate/evals/scorecard.yaml +26 -0
  105. package/.agents/workflows/production-release.yml +173 -0
  106. package/CHANGELOG.md +35 -0
  107. package/README.md +13 -4
  108. package/bin/install.js +1 -1
  109. package/package.json +6 -3
  110. package/tooling/build-registry.js +186 -186
  111. package/tooling/fix-refactor.js +8 -0
  112. package/tooling/sync-versions.js +299 -0
  113. package/tooling/validate-graph.js +87 -87
  114. package/tooling/validate-skills.js +1 -1
  115. package/tooling/generate-registry.js +0 -157
package/bin/install.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
 
3
3
  import fs from 'fs';
4
4
  import path from 'path';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ai-developer-skill-os",
3
- "version": "8.3.0",
4
- "description": "EDAOS v8.3 — Governed Capability Metadata & Eval Platform: Blueprints organize, manifests govern, registries accelerate.",
3
+ "version": "9.0.0",
4
+ "description": "EDAOS v9.0 — Governed Capability Platform & Universal Project Knowledge V1 (Dual-Mode Memory Architecture).",
5
5
  "main": "bin/install.js",
6
6
  "files": [
7
7
  "bin",
@@ -20,12 +20,15 @@
20
20
  "node": ">=18.0.0"
21
21
  },
22
22
  "scripts": {
23
+ "sync:v9": "node tooling/sync-versions.js",
23
24
  "build:registry": "node tooling/build-registry.js",
24
25
  "test": "vitest run",
25
26
  "test:watch": "vitest",
26
27
  "test:registry": "vitest run && node tooling/build-registry.js",
27
28
  "test:graph": "node tooling/validate-graph.js",
28
- "lint": "node bin/lint.js",
29
+ "lint": "node tooling/validate-skills.js",
30
+ "eval": "node evals/runner.js",
31
+ "eval:all": "node evals/runner.js --all",
29
32
  "test:agent": "node tests/agent-evaluation/runner/evaluate-routing.js",
30
33
  "generate:evaluation": "node tooling/generate-evaluation-cases.cjs",
31
34
  "install:antigravity": "node bin/install.js --ide=antigravity --scope=2",
@@ -1,186 +1,186 @@
1
- /**
2
- * build-registry.js
3
- * V8.2 Governed Capability Metadata & Eval Platform
4
- * Generates registry/index.yaml (lightweight lookup) and registry/graph.json (O(1) graph & cycle check)
5
- *
6
- * Usage: node tooling/build-registry.js
7
- */
8
-
9
- import fs from 'fs';
10
- import path from 'path';
11
- import { fileURLToPath } from 'url';
12
- import yaml from 'js-yaml';
13
-
14
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
-
16
- const SKILLS_DIR = path.join(__dirname, '../.agents/skills');
17
- const REGISTRY_DIR = path.join(__dirname, '../.agents/registry');
18
- const INDEX_YAML = path.join(REGISTRY_DIR, 'index.yaml');
19
- const GRAPH_JSON = path.join(REGISTRY_DIR, 'graph.json');
20
-
21
- function parseYamlFile(filePath) {
22
- try {
23
- const content = fs.readFileSync(filePath, 'utf8');
24
- const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
25
- if (match) {
26
- return yaml.load(match[1]);
27
- }
28
- return yaml.load(content);
29
- } catch (e) {
30
- console.error(`[WARN] Failed to parse YAML from ${filePath}: ${e.message}`);
31
- return null;
32
- }
33
- }
34
-
35
- function buildRegistry() {
36
- console.log('🔄 Building V8.2 Governed Capability Registry & O(1) Runtime Graph...');
37
-
38
- if (!fs.existsSync(SKILLS_DIR)) {
39
- console.error('❌ Skills directory not found:', SKILLS_DIR);
40
- process.exit(1);
41
- }
42
-
43
- fs.mkdirSync(REGISTRY_DIR, { recursive: true });
44
-
45
- const dirs = fs.readdirSync(SKILLS_DIR).filter(d =>
46
- !d.startsWith('_') && fs.statSync(path.join(SKILLS_DIR, d)).isDirectory()
47
- );
48
-
49
- const capabilities = {};
50
- const adjacency = {};
51
- const reverseAdjacency = {};
52
-
53
- for (const dir of dirs) {
54
- const capYamlPath = path.join(SKILLS_DIR, dir, 'capability.yaml');
55
- const skillMdPath = path.join(SKILLS_DIR, dir, 'SKILL.md');
56
-
57
- let meta = null;
58
- let fromCapabilityYaml = false;
59
-
60
- if (fs.existsSync(capYamlPath)) {
61
- meta = parseYamlFile(capYamlPath);
62
- fromCapabilityYaml = true;
63
- } else if (fs.existsSync(skillMdPath)) {
64
- meta = parseYamlFile(skillMdPath);
65
- }
66
-
67
- if (!meta) continue;
68
-
69
- const id = meta.id || meta.name || dir;
70
- const version = meta.version || '8.2.0';
71
- const description = meta.description || '';
72
-
73
- // Normalize tags
74
- let tags = meta.tags || meta.keywords || [];
75
- if (!Array.isArray(tags) || tags.length === 0) {
76
- // Derive simple tags from dir words
77
- tags = dir.replace(/^qk-/, '').split('-');
78
- }
79
-
80
- // Normalize dependencies
81
- let dependencies = meta.dependencies || [];
82
- if (!fromCapabilityYaml) {
83
- // Derive from V8.1 skill frontmatter decision_boundary / workflow
84
- const deps = new Set();
85
- if (meta.workflow && typeof meta.workflow === 'string') deps.add(meta.workflow);
86
- if (meta.decision_boundary?.delegates_to) {
87
- meta.decision_boundary.delegates_to.forEach(d => deps.add(d));
88
- }
89
- dependencies = Array.from(deps);
90
- }
91
-
92
- capabilities[id] = {
93
- path: `.agents/skills/${dir}`,
94
- version,
95
- tags,
96
- dependencies
97
- };
98
-
99
- adjacency[id] = dependencies;
100
- if (!reverseAdjacency[id]) reverseAdjacency[id] = [];
101
- }
102
-
103
- // Populate reverse adjacency for orphan detection
104
- for (const [id, deps] of Object.entries(adjacency)) {
105
- for (const dep of deps) {
106
- if (!reverseAdjacency[dep]) reverseAdjacency[dep] = [];
107
- reverseAdjacency[dep].push(id);
108
- }
109
- }
110
-
111
- // Detect cycles using DFS
112
- let hasCycles = false;
113
- const visited = {};
114
- const recursionStack = {};
115
-
116
- function detectCycle(node) {
117
- visited[node] = true;
118
- recursionStack[node] = true;
119
-
120
- const deps = adjacency[node] || [];
121
- for (const dep of deps) {
122
- if (!visited[dep]) {
123
- if (detectCycle(dep)) return true;
124
- } else if (recursionStack[dep]) {
125
- return true;
126
- }
127
- }
128
-
129
- recursionStack[node] = false;
130
- return false;
131
- }
132
-
133
- for (const node of Object.keys(adjacency)) {
134
- if (!visited[node]) {
135
- if (detectCycle(node)) {
136
- hasCycles = true;
137
- break;
138
- }
139
- }
140
- }
141
-
142
- // Build Graph JSON (O(1) Runtime lookups)
143
- const graphNodes = {};
144
- for (const [id, data] of Object.entries(capabilities)) {
145
- const dependents = reverseAdjacency[id] || [];
146
- const isOrphan = data.dependencies.length === 0 && dependents.length === 0 && id !== 'qk-orchestrator' && id !== 'qk-help';
147
-
148
- graphNodes[id] = {
149
- path: data.path,
150
- version: data.version,
151
- tags: data.tags,
152
- dependencies: data.dependencies,
153
- dependents,
154
- is_orphan: isOrphan
155
- };
156
- }
157
-
158
- const graphJsonData = {
159
- schema_version: 1,
160
- manifest_version: '8.2',
161
- generated_at: new Date().toISOString(),
162
- nodes: graphNodes,
163
- adjacency,
164
- stats: {
165
- total_capabilities: Object.keys(capabilities).length,
166
- has_cycles: hasCycles
167
- }
168
- };
169
-
170
- // Build Registry Index YAML (Lightweight lookup)
171
- const indexYamlContent = `# AUTO-GENERATED BY registry-builder (tooling/build-registry.js)\n# DO NOT EDIT MANUALLY. THIS IS A GENERATED RUNTIME ARTIFACT.\n` +
172
- yaml.dump({
173
- schema_version: 1,
174
- manifest_version: '8.2',
175
- generated_at: new Date().toISOString(),
176
- capabilities
177
- }, { indent: 2 });
178
-
179
- fs.writeFileSync(INDEX_YAML, indexYamlContent, 'utf8');
180
- fs.writeFileSync(GRAPH_JSON, JSON.stringify(graphJsonData, null, 2), 'utf8');
181
-
182
- console.log(`✅ Generated lightweight registry index at .agents/registry/index.yaml (${Object.keys(capabilities).length} capabilities)`);
183
- console.log(`✅ Generated O(1) adjacency graph at .agents/registry/graph.json (has_cycles: ${hasCycles})`);
184
- }
185
-
186
- buildRegistry();
1
+ /**
2
+ * build-registry.js
3
+ * V8.2 Governed Capability Metadata & Eval Platform
4
+ * Generates registry/index.yaml (lightweight lookup) and registry/graph.json (O(1) graph & cycle check)
5
+ *
6
+ * Usage: node tooling/build-registry.js
7
+ */
8
+
9
+ import fs from 'fs';
10
+ import path from 'path';
11
+ import { fileURLToPath } from 'url';
12
+ import yaml from 'js-yaml';
13
+
14
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
+
16
+ const SKILLS_DIR = path.join(__dirname, '../.agents/skills');
17
+ const REGISTRY_DIR = path.join(__dirname, '../.agents/registry');
18
+ const INDEX_YAML = path.join(REGISTRY_DIR, 'index.yaml');
19
+ const GRAPH_JSON = path.join(REGISTRY_DIR, 'graph.json');
20
+
21
+ function parseYamlFile(filePath) {
22
+ try {
23
+ const content = fs.readFileSync(filePath, 'utf8');
24
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
25
+ if (match) {
26
+ return yaml.load(match[1]);
27
+ }
28
+ return yaml.load(content);
29
+ } catch (e) {
30
+ console.error(`[WARN] Failed to parse YAML from ${filePath}: ${e.message}`);
31
+ return null;
32
+ }
33
+ }
34
+
35
+ function buildRegistry() {
36
+ console.log('🔄 Building V8.2 Governed Capability Registry & O(1) Runtime Graph...');
37
+
38
+ if (!fs.existsSync(SKILLS_DIR)) {
39
+ console.error('❌ Skills directory not found:', SKILLS_DIR);
40
+ process.exit(1);
41
+ }
42
+
43
+ fs.mkdirSync(REGISTRY_DIR, { recursive: true });
44
+
45
+ const dirs = fs.readdirSync(SKILLS_DIR).filter(d =>
46
+ !d.startsWith('_') && fs.statSync(path.join(SKILLS_DIR, d)).isDirectory()
47
+ );
48
+
49
+ const capabilities = {};
50
+ const adjacency = {};
51
+ const reverseAdjacency = {};
52
+
53
+ for (const dir of dirs) {
54
+ const capYamlPath = path.join(SKILLS_DIR, dir, 'capability.yaml');
55
+ const skillMdPath = path.join(SKILLS_DIR, dir, 'SKILL.md');
56
+
57
+ let meta = null;
58
+ let fromCapabilityYaml = false;
59
+
60
+ if (fs.existsSync(capYamlPath)) {
61
+ meta = parseYamlFile(capYamlPath);
62
+ fromCapabilityYaml = true;
63
+ } else if (fs.existsSync(skillMdPath)) {
64
+ meta = parseYamlFile(skillMdPath);
65
+ }
66
+
67
+ if (!meta) continue;
68
+
69
+ const id = meta.id || meta.name || dir;
70
+ const version = meta.version || '8.2.0';
71
+ const description = meta.description || '';
72
+
73
+ // Normalize tags
74
+ let tags = meta.tags || meta.keywords || [];
75
+ if (!Array.isArray(tags) || tags.length === 0) {
76
+ // Derive simple tags from dir words
77
+ tags = dir.replace(/^qk-/, '').split('-');
78
+ }
79
+
80
+ // Normalize dependencies
81
+ let dependencies = meta.dependencies || [];
82
+ if (!fromCapabilityYaml) {
83
+ // Derive from V8.1 skill frontmatter decision_boundary / workflow
84
+ const deps = new Set();
85
+ if (meta.workflow && typeof meta.workflow === 'string') deps.add(meta.workflow);
86
+ if (meta.decision_boundary?.delegates_to) {
87
+ meta.decision_boundary.delegates_to.forEach(d => deps.add(d));
88
+ }
89
+ dependencies = Array.from(deps);
90
+ }
91
+
92
+ capabilities[id] = {
93
+ path: `.agents/skills/${dir}`,
94
+ version,
95
+ tags,
96
+ dependencies
97
+ };
98
+
99
+ adjacency[id] = dependencies;
100
+ if (!reverseAdjacency[id]) reverseAdjacency[id] = [];
101
+ }
102
+
103
+ // Populate reverse adjacency for orphan detection
104
+ for (const [id, deps] of Object.entries(adjacency)) {
105
+ for (const dep of deps) {
106
+ if (!reverseAdjacency[dep]) reverseAdjacency[dep] = [];
107
+ reverseAdjacency[dep].push(id);
108
+ }
109
+ }
110
+
111
+ // Detect cycles using DFS
112
+ let hasCycles = false;
113
+ const visited = {};
114
+ const recursionStack = {};
115
+
116
+ function detectCycle(node) {
117
+ visited[node] = true;
118
+ recursionStack[node] = true;
119
+
120
+ const deps = adjacency[node] || [];
121
+ for (const dep of deps) {
122
+ if (!visited[dep]) {
123
+ if (detectCycle(dep)) return true;
124
+ } else if (recursionStack[dep]) {
125
+ return true;
126
+ }
127
+ }
128
+
129
+ recursionStack[node] = false;
130
+ return false;
131
+ }
132
+
133
+ for (const node of Object.keys(adjacency)) {
134
+ if (!visited[node]) {
135
+ if (detectCycle(node)) {
136
+ hasCycles = true;
137
+ break;
138
+ }
139
+ }
140
+ }
141
+
142
+ // Build Graph JSON (O(1) Runtime lookups)
143
+ const graphNodes = {};
144
+ for (const [id, data] of Object.entries(capabilities)) {
145
+ const dependents = reverseAdjacency[id] || [];
146
+ const isOrphan = data.dependencies.length === 0 && dependents.length === 0 && id !== 'qk-orchestrator' && id !== 'qk-help';
147
+
148
+ graphNodes[id] = {
149
+ path: data.path,
150
+ version: data.version,
151
+ tags: data.tags,
152
+ dependencies: data.dependencies,
153
+ dependents,
154
+ is_orphan: isOrphan
155
+ };
156
+ }
157
+
158
+ const graphJsonData = {
159
+ schema_version: 1,
160
+ manifest_version: '8.2',
161
+ generated_at: new Date().toISOString(),
162
+ nodes: graphNodes,
163
+ adjacency,
164
+ stats: {
165
+ total_capabilities: Object.keys(capabilities).length,
166
+ has_cycles: hasCycles
167
+ }
168
+ };
169
+
170
+ // Build Registry Index YAML (Lightweight lookup)
171
+ const indexYamlContent = `# AUTO-GENERATED BY registry-builder (tooling/build-registry.js)\n# DO NOT EDIT MANUALLY. THIS IS A GENERATED RUNTIME ARTIFACT.\n` +
172
+ yaml.dump({
173
+ schema_version: 1,
174
+ manifest_version: '8.2',
175
+ generated_at: new Date().toISOString(),
176
+ capabilities
177
+ }, { indent: 2 });
178
+
179
+ fs.writeFileSync(INDEX_YAML, indexYamlContent, 'utf8');
180
+ fs.writeFileSync(GRAPH_JSON, JSON.stringify(graphJsonData, null, 2), 'utf8');
181
+
182
+ console.log(`✅ Generated lightweight registry index at .agents/registry/index.yaml (${Object.keys(capabilities).length} capabilities)`);
183
+ console.log(`✅ Generated O(1) adjacency graph at .agents/registry/graph.json (has_cycles: ${hasCycles})`);
184
+ }
185
+
186
+ buildRegistry();
@@ -0,0 +1,8 @@
1
+ const fs = require('fs');
2
+
3
+ const skillMd = `---\nname: qk-refactor\nversion: 8.0.0\nstatus: stable\ndescription: "Tái cấu trúc và dọn dẹp mã nguồn để dễ bảo trì hơn mà không làm thay đổi logic hoạt động bên ngoài."\nplatforms: [antigravity, claude-code, cursor, windsurf, kilo-code]\n\ntype: capability\n\nintent:\n - refactoring\n - code-cleanup\n - complexity-reduction\n\ncomplexity:\n level: medium\n criteria:\n files_affected: "2-5"\n has_behavior_change: false\n has_external_dependency: false\n has_breaking_change: false\n\ntriggers:\n - refactor\n - tái cấu trúc\n - clean up this code\n - simplify\n - reduce complexity\n - dẫn cấu trúc code\n\nselection:\n priority: medium\n confidence_threshold: 0.80\n\nworkflow: refactor\n\nrules:\n - global\n - coding\n - safety\n\ntools:\n - filesystem\n - terminal\n\nrelated_skills:\n - qk-engineering-standard\n - qk-project-health\n\nknowledge_scope:\n owns:\n - refactoring-patterns\n - code-smells\n references:\n - architecture\n - coding-standards\n\nverification:\n required: true\n strategy: refactor\n\nexamples: []\nlearnings: []\n\nexecution_mode: deterministic\ncost: medium\nlatency: medium\nrisk: medium\nside_effects: edit_files\nproduces: [code, report]\nconsumes: [source-code]\n\ntoken_budget:\n max_files_read: 3\n max_lines_per_read: 150\n max_shell_commands: 2\n stop_early: true\n\nexit_codes: [SUCCESS, BLOCKED, FAILED, PARTIAL]\n---\n\n# qk-refactor - Safe Refactor\n\n> Language rule: Code, identifiers, file names → English. Explanations, summaries → Vietnamese.\n\n## Preconditions\n- [ ] Target file(s) or module(s) are specified\n- [ ] Tests exist for the target code (or can be created)\n\nOn missing precondition:\n EXIT: BLOCKED\n Message: "Missing: target files or test coverage"\n\n## Scope\n- Improve internal code quality without changing external behavior\n- Reduce complexity, improve naming, extract functions\n- Remove dead code and duplication\n\n## Non-Goals\n- Add new functionality\n- Change public API signatures\n- Modify behavior or business logic\n\n## Workflow\n1. Establish baseline (current behavior + tests)\n2. Plan refactor steps\n3. Execute step by step\n4. Verify behavior unchanged\n5. Run validation gate\n\n## Exit Codes\n| Code | Meaning |\n|------|---------|\n| SUCCESS | Refactor complete, behavior preserved, tests pass |\n| PARTIAL | Refactor done, some tests need attention |\n| BLOCKED | Missing preconditions |\n| FAILED | Behavior changed or tests broken |\n`;
4
+
5
+ const capYaml = `schema_version: 1\nid: "qk-refactor"\nversion: "8.0.0"\ndescription: "Tái cấu trúc và dọn dẹp mã nguồn để dễ bảo trì hơn mà không làm thay đổi logic hoạt động bên ngoài."\ndependencies:\n - "refactor"\ntools:\n - "filesystem"\n - "terminal"\nknowledge:\n owns:\n - "refactoring-patterns"\n - "code-smells"\n references:\n - "architecture"\n - "coding-standards"\neval:\n scorecard: "evals/scorecard.yaml"\ndecision_boundary:\n owns:\n - "refactoring-patterns"\n does_not_own:\n - "new-functionality"\n - "api-changes"\n conflicts_with: []\n delegates_to: []\n`;\n
6
+ fs.writeFileSync('.agents/skills/qk-refactor/SKILL.md', skillMd, 'utf8');
7
+ fs.writeFileSync('.agents/skills/qk-refactor/capability.yaml', capYaml, 'utf8');
8
+ console.log('Written qk-refactor files with correct UTF-8 encoding');