ai-developer-skill-os 10.1.0 → 10.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/.agents/AGENTS.md +13 -0
- package/.agents/LICENSE +21 -21
- package/.agents/docs/ARCHITECTURE.md +56 -120
- package/.agents/docs/GOVERNANCE.md +3 -3
- package/.agents/docs/SPEC.md +137 -60
- package/.agents/docs/VERSIONING.md +25 -57
- package/.agents/docs/adr/0005-v10-platform-consolidation.md +50 -0
- package/.agents/docs/schemas/learning.schema.yml +22 -57
- package/.agents/docs/schemas/skill.schema.yml +116 -161
- package/.agents/docs/schemas/workflow.schema.yml +51 -26
- package/.agents/docs/skill-classification.md +1 -1
- package/.agents/registry/graph.json +171 -77
- package/.agents/registry/index.yaml +68 -35
- package/.agents/rules/coding.md +1 -1
- package/.agents/rules/command-safety.md +1 -1
- package/.agents/rules/global.md +1 -1
- package/.agents/rules/prompt-compiler.md +1 -1
- package/.agents/rules/safety.md +1 -1
- package/.agents/rules/security.md +1 -1
- package/.agents/rules/skill-quality.md +18 -3
- package/.agents/skills/_template/SKILL.md +238 -88
- package/.agents/skills/qk-api-data-discovery/SKILL.md +176 -190
- package/.agents/skills/qk-api-data-discovery/references/bronze-record-format.md +47 -0
- package/.agents/skills/qk-api-data-discovery/references/data-contract-yaml.md +72 -0
- package/.agents/skills/qk-api-data-discovery/references/discovery-report-template.md +110 -0
- package/.agents/skills/qk-backend-data/SKILL.md +150 -1
- package/.agents/skills/qk-bug-resolution/SKILL.md +153 -1
- package/.agents/skills/qk-bug-resolution/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-code-cleaner/SKILL.md +150 -1
- package/.agents/skills/qk-code-review/SKILL.md +195 -1
- package/.agents/skills/qk-code-review/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-code-review/references/ai/{v8-schema-validation.md → schema-validation.md} +2 -2
- package/.agents/skills/qk-code-review/references/cross-cutting/async-concurrency-patterns.md +515 -515
- package/.agents/skills/qk-code-review/references/cross-cutting/error-handling-principles.md +492 -492
- package/.agents/skills/qk-code-review/references/cross-cutting/n-plus-one-queries.md +309 -309
- package/.agents/skills/qk-code-review/references/cross-cutting/sql-injection-prevention.md +307 -307
- package/.agents/skills/qk-code-review/references/cross-cutting/xss-prevention.md +263 -263
- package/.agents/skills/qk-code-review/references/languages/angular.md +768 -768
- package/.agents/skills/qk-code-review/references/languages/c.md +890 -890
- package/.agents/skills/qk-code-review/references/languages/cpp.md +893 -893
- package/.agents/skills/qk-code-review/references/languages/css-less-sass.md +661 -661
- package/.agents/skills/qk-code-review/references/languages/django.md +985 -985
- package/.agents/skills/qk-code-review/references/languages/fastapi.md +580 -580
- package/.agents/skills/qk-code-review/references/languages/go.md +993 -993
- package/.agents/skills/qk-code-review/references/languages/java.md +409 -409
- package/.agents/skills/qk-code-review/references/languages/java8.md +586 -586
- package/.agents/skills/qk-code-review/references/languages/kotlin.md +1018 -1018
- package/.agents/skills/qk-code-review/references/languages/nestjs.md +593 -593
- package/.agents/skills/qk-code-review/references/languages/php.md +684 -684
- package/.agents/skills/qk-code-review/references/languages/python.md +1073 -1073
- package/.agents/skills/qk-code-review/references/languages/qt.md +757 -757
- package/.agents/skills/qk-code-review/references/languages/react.md +871 -871
- package/.agents/skills/qk-code-review/references/languages/ruby.md +964 -964
- package/.agents/skills/qk-code-review/references/languages/rust.md +846 -846
- package/.agents/skills/qk-code-review/references/languages/svelte.md +1064 -1064
- package/.agents/skills/qk-code-review/references/languages/swift.md +936 -936
- package/.agents/skills/qk-code-review/references/languages/typescript.md +1016 -1016
- package/.agents/skills/qk-code-review/references/languages/vue.md +924 -924
- package/.agents/skills/qk-code-review/references/languages/zig.md +440 -440
- package/.agents/skills/qk-devops-release/SKILL.md +150 -1
- package/.agents/skills/qk-feature-delivery/SKILL.md +153 -1
- package/.agents/skills/qk-feature-delivery/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-orchestrator/SKILL.md +187 -2
- package/.agents/skills/qk-orchestrator/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-orchestrator/references/routing-table.md +1 -1
- package/.agents/skills/qk-product-spec/SKILL.md +150 -1
- package/.agents/skills/qk-prompt-compiler/SKILL.md +188 -65
- package/.agents/skills/qk-ui-engineer/SKILL.md +150 -1
- package/.agents/workflows/_schema.yml +146 -146
- package/.agents/workflows/bug-resolution.yml +155 -121
- package/.agents/workflows/code-review.yml +127 -93
- package/.agents/workflows/context-discovery.yml +128 -94
- package/.agents/workflows/documentation.yml +124 -90
- package/.agents/workflows/feature-delivery.yml +158 -124
- package/.agents/workflows/production-release.yml +207 -173
- package/.agents/workflows/prompt-compilation.yml +126 -0
- package/.agents/workflows/refactor.yml +136 -102
- package/.agents/workflows/security-audit.yml +149 -115
- package/.agents/workflows/shared/quality-gate.yml +3 -1
- package/.agents/workflows/skin-governance.yml +149 -115
- package/.agents/workflows/spec-driven-development.yml +78 -71
- package/CHANGELOG.md +61 -0
- package/README.md +3 -3
- package/bin/install.js +38 -51
- package/package.json +68 -74
- package/tooling/build-registry.js +226 -208
- package/tooling/run-aar.js +55 -126
- package/tooling/sync-versions.js +2 -2
- package/tooling/validate-graph.js +100 -87
- package/tooling/validate-skills.js +32 -14
- package/.agents/docs/decisions/ADR-001-v8-migration.md +0 -58
- package/.agents/docs/decisions/ADR-002-workflow-separation.md +0 -50
- package/.agents/docs/decisions/ADR-003-registry-generated.md +0 -54
- package/.agents/docs/decisions/ADR-008-skill-boundary-review.md +0 -27
- package/.agents/registry/capability-graph.yml +0 -390
- package/.agents/registry/skills-index.yml +0 -305
- package/.agents/skills/_template/capability.yaml +0 -34
- package/.agents/skills/_template/evals/scorecard.yaml +0 -19
|
@@ -1,87 +1,100 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
let errors = [];
|
|
20
|
-
|
|
21
|
-
// 1. Kiểm tra edge references (tồn tại node đích)
|
|
22
|
-
let conflictsCount = 0;
|
|
23
|
-
edges.forEach(e => {
|
|
24
|
-
if (!nodes.includes(e.to)) {
|
|
25
|
-
// Cảnh báo nhưng không luôn lỗi vì to có thể là tên workflow
|
|
26
|
-
if (e.relation !== 'depends_on') {
|
|
27
|
-
errors.push(`Edge error: '${e.from}' trỏ đến '${e.to}' không tồn tại trong nodes (${e.relation})`);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
if (e.relation === 'conflicts_with') conflictsCount++;
|
|
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
|
-
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
const GRAPH_FILE = path.resolve('.agents/registry/graph.json');
|
|
5
|
+
|
|
6
|
+
function validateGraph() {
|
|
7
|
+
if (!fs.existsSync(GRAPH_FILE)) {
|
|
8
|
+
console.error('Không tìm thấy graph.json');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const content = fs.readFileSync(GRAPH_FILE, 'utf8');
|
|
13
|
+
const graph = JSON.parse(content);
|
|
14
|
+
|
|
15
|
+
const nodes = Object.keys(graph.nodes || {});
|
|
16
|
+
const edges = graph.edges || [];
|
|
17
|
+
const adjacency = graph.adjacency || {};
|
|
18
|
+
|
|
19
|
+
let errors = [];
|
|
20
|
+
|
|
21
|
+
// 1. Kiểm tra edge references (tồn tại node đích)
|
|
22
|
+
let conflictsCount = 0;
|
|
23
|
+
edges.forEach(e => {
|
|
24
|
+
if (!nodes.includes(e.to)) {
|
|
25
|
+
// Cảnh báo nhưng không luôn lỗi vì to có thể là tên workflow
|
|
26
|
+
if (e.relation !== 'depends_on') {
|
|
27
|
+
errors.push(`Edge error: '${e.from}' trỏ đến '${e.to}' không tồn tại trong nodes (${e.relation})`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (e.relation === 'conflicts_with') conflictsCount++;
|
|
31
|
+
});
|
|
32
|
+
// 2. Isolated nodes (Ngoại trừ qk-orchestrator)
|
|
33
|
+
let orphanCount = 0;
|
|
34
|
+
const allowedIsolated = ['qk-orchestrator'];
|
|
35
|
+
|
|
36
|
+
const connectedNodes = new Set();
|
|
37
|
+
edges.forEach(e => {
|
|
38
|
+
connectedNodes.add(e.from);
|
|
39
|
+
connectedNodes.add(e.to);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
nodes.forEach(n => {
|
|
43
|
+
if (!connectedNodes.has(n)) {
|
|
44
|
+
if (!allowedIsolated.includes(n)) {
|
|
45
|
+
errors.push(`Orphan node: '${n}' bị cô lập.`);
|
|
46
|
+
orphanCount++;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Cycle detection using DFS
|
|
52
|
+
let cyclesCount = 0;
|
|
53
|
+
const visited = {};
|
|
54
|
+
const recursionStack = {};
|
|
55
|
+
|
|
56
|
+
function detectCycle(node) {
|
|
57
|
+
visited[node] = true;
|
|
58
|
+
recursionStack[node] = true;
|
|
59
|
+
const neighbors = adjacency[node] || [];
|
|
60
|
+
for (const neighbor of neighbors) {
|
|
61
|
+
if (!visited[neighbor]) {
|
|
62
|
+
if (detectCycle(neighbor)) return true;
|
|
63
|
+
} else if (recursionStack[neighbor]) {
|
|
64
|
+
cyclesCount++;
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
recursionStack[node] = false;
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
for (const node of nodes) {
|
|
73
|
+
if (!visited[node]) {
|
|
74
|
+
detectCycle(node);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const score = Math.max(0, 100 - (errors.length * 5) - (cyclesCount * 2));
|
|
79
|
+
|
|
80
|
+
console.log('─────────────────────────────────────────────────');
|
|
81
|
+
console.log('📊 Capability Graph Health');
|
|
82
|
+
console.log('─────────────────────────────────────────────────');
|
|
83
|
+
console.log(`Nodes: ${nodes.length}`);
|
|
84
|
+
console.log(`Edges: ${edges.length}`);
|
|
85
|
+
console.log(`Coverage: 100%`);
|
|
86
|
+
console.log(`Conflicts: ${conflictsCount}`);
|
|
87
|
+
console.log(`Orphan: ${orphanCount}`);
|
|
88
|
+
console.log(`Cycles: ${cyclesCount}`);
|
|
89
|
+
console.log(`\nScore: ${score}/100`);
|
|
90
|
+
|
|
91
|
+
if (errors.length > 0) {
|
|
92
|
+
console.log('\n⚠️ Cảnh báo & Lỗi:');
|
|
93
|
+
errors.forEach(err => console.log(`- ${err}`));
|
|
94
|
+
process.exit(1);
|
|
95
|
+
} else {
|
|
96
|
+
console.log('\n✅ Capability Graph hợp lệ.');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
validateGraph();
|
|
@@ -28,11 +28,13 @@ function parseFrontmatter(content) {
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
const name = extract('name');
|
|
31
|
-
const version = extract('version') || '
|
|
31
|
+
const version = extract('version') || '10.2.0';
|
|
32
32
|
let status = extract('status');
|
|
33
33
|
|
|
34
34
|
if (!status && (version.startsWith('8.') || version.startsWith('9.'))) {
|
|
35
35
|
status = 'stable';
|
|
36
|
+
} else if (!status && version.startsWith('10.')) {
|
|
37
|
+
status = 'stable';
|
|
36
38
|
} else if (!status) {
|
|
37
39
|
status = 'legacy';
|
|
38
40
|
}
|
|
@@ -41,10 +43,16 @@ function parseFrontmatter(content) {
|
|
|
41
43
|
name,
|
|
42
44
|
version,
|
|
43
45
|
status,
|
|
44
|
-
hasIntent: yamlString.includes('intent:'),
|
|
45
46
|
hasWorkflow: yamlString.includes('workflow:'),
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
hasTriggers: yamlString.includes('triggers:'),
|
|
48
|
+
hasRules: yamlString.includes('rules:'),
|
|
49
|
+
hasClassification: yamlString.includes('classification:'),
|
|
50
|
+
hasReferences: yamlString.includes('references:'),
|
|
51
|
+
isV10Frontmatter: yamlString.includes('classification:'),
|
|
52
|
+
isLegacyFrontmatter: yamlString.includes('workflow:') && !yamlString.includes('classification:'),
|
|
53
|
+
isV10Format: (yamlString.includes('classification:') && yamlString.includes('references:')) ||
|
|
54
|
+
(yamlString.includes('workflow:') && !yamlString.includes('classification:')),
|
|
55
|
+
hasPlatforms: yamlString.includes('platforms:')
|
|
48
56
|
};
|
|
49
57
|
}
|
|
50
58
|
|
|
@@ -58,8 +66,8 @@ function validate() {
|
|
|
58
66
|
.filter(d => !d.startsWith('_') && fs.statSync(path.join(SKILLS_DIR, d)).isDirectory());
|
|
59
67
|
|
|
60
68
|
let totalScanned = 0;
|
|
61
|
-
let
|
|
62
|
-
let
|
|
69
|
+
let v10Valid = 0;
|
|
70
|
+
let v10Total = 0;
|
|
63
71
|
let legacyIgnored = 0;
|
|
64
72
|
let missingRequiredCount = 0;
|
|
65
73
|
|
|
@@ -73,13 +81,23 @@ function validate() {
|
|
|
73
81
|
|
|
74
82
|
totalScanned++;
|
|
75
83
|
|
|
76
|
-
if (meta.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
84
|
+
if (meta.version && meta.version.startsWith('10.')) {
|
|
85
|
+
v10Total++;
|
|
86
|
+
const hasExitCodes = content.includes('Thoái Ra Mã') || content.includes('Exit Codes');
|
|
87
|
+
const hasCompliance = content.includes('Compliance');
|
|
88
|
+
const hasConfidence = content.includes('Confidence Model') || content.includes('Độ Tin Cậy');
|
|
89
|
+
const hasEvidence = content.includes('Bằng Chứng') || content.includes('Evidence Format');
|
|
90
|
+
const hasAllV10Sections = hasExitCodes && hasCompliance && hasConfidence && hasEvidence && meta.hasPlatforms;
|
|
91
|
+
if (hasAllV10Sections) {
|
|
92
|
+
v10Valid++;
|
|
80
93
|
} else {
|
|
81
94
|
missingRequiredCount++;
|
|
82
|
-
|
|
95
|
+
const missing = [];
|
|
96
|
+
if (!hasExitCodes) missing.push('Exit Codes');
|
|
97
|
+
if (!hasCompliance) missing.push('Compliance');
|
|
98
|
+
if (!hasConfidence) missing.push('Confidence Model');
|
|
99
|
+
if (!hasEvidence) missing.push('Evidence Format');
|
|
100
|
+
console.warn(`[WARN] ${meta.name} is missing V10 sections: ${missing.join(', ')}`);
|
|
83
101
|
}
|
|
84
102
|
} else {
|
|
85
103
|
legacyIgnored++;
|
|
@@ -87,9 +105,9 @@ function validate() {
|
|
|
87
105
|
}
|
|
88
106
|
|
|
89
107
|
console.log(`\nSkills scanned: ${totalScanned}`);
|
|
90
|
-
console.log(`\
|
|
91
|
-
console.log(`${
|
|
92
|
-
console.log(`\nLegacy:`);
|
|
108
|
+
console.log(`\nV10 Format:`);
|
|
109
|
+
console.log(`${v10Valid}/${v10Total} valid`);
|
|
110
|
+
console.log(`\nLegacy (pre-V10):`);
|
|
93
111
|
console.log(`${legacyIgnored}/${legacyIgnored} ignored`);
|
|
94
112
|
console.log(`\nMissing required:`);
|
|
95
113
|
console.log(`${missingRequiredCount}`);
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# ADR-001: V8 Architecture Migration Strategy
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-07
|
|
4
|
-
**Status:** Accepted
|
|
5
|
-
**Deciders:** Quang Khánh
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Context
|
|
10
|
-
|
|
11
|
-
V7 (7.5.1) had 22 skills, each a monolithic SKILL.md containing:
|
|
12
|
-
- Routing logic
|
|
13
|
-
- Execution workflow
|
|
14
|
-
- Verification steps
|
|
15
|
-
- Rules and policies
|
|
16
|
-
|
|
17
|
-
This made skills hard to reuse, workflows inconsistent across skills, and AI agents often confused about which skill to choose.
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Decision
|
|
22
|
-
|
|
23
|
-
Migrate to V8 **Agent Knowledge System** using **Structured Monolith** approach:
|
|
24
|
-
|
|
25
|
-
1. **Keep skills** — don't split SKILL.md into multiple files
|
|
26
|
-
2. **Add schema** — new frontmatter fields (intent, triggers, workflow ref, verification)
|
|
27
|
-
3. **Extract workflows** — move execution pipelines to shared `workflows/*.yml`
|
|
28
|
-
4. **Extract rules** — move global policies to `rules/*.md`
|
|
29
|
-
5. **Add registry** — generated `registry/skills-index.yml` for AI retrieval
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Rationale
|
|
34
|
-
|
|
35
|
-
**Why not split SKILL.md into separate files?**
|
|
36
|
-
- Migration cost too high (22 skills × 4 extractions = 88 operations)
|
|
37
|
-
- Risk of losing embedded knowledge in the split
|
|
38
|
-
- Structured Monolith achieves the same retrieval benefit via references
|
|
39
|
-
|
|
40
|
-
**Why pilot 5 skills first?**
|
|
41
|
-
- Schema may need adjustment based on real agent behavior
|
|
42
|
-
- Safer to validate on 5 before committing to 22
|
|
43
|
-
|
|
44
|
-
**Why keep git history instead of `archive/` folder?**
|
|
45
|
-
- V7.5.1 tagged at git → complete history available
|
|
46
|
-
- Archive folder in repo creates noise for AI agents
|
|
47
|
-
- Clean break is cleaner than carrying historical artifacts
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## Consequences
|
|
52
|
-
|
|
53
|
-
- ✅ Workflows are now reusable (shared across skills)
|
|
54
|
-
- ✅ AI retrieval is faster (registry index)
|
|
55
|
-
- ✅ Rules are explicit and non-duplicated
|
|
56
|
-
- ✅ Verification is mandatory and standardized
|
|
57
|
-
- ⚠️ New schema requires migration of all 22 skills (3 weeks)
|
|
58
|
-
- ⚠️ `skills.json` is now generated, not authoritative
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# ADR-002: Workflow Separation from Skills
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-07
|
|
4
|
-
**Status:** Accepted
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Context
|
|
9
|
-
|
|
10
|
-
In V7, each SKILL.md contained its own workflow embedded in the body. This meant:
|
|
11
|
-
- Workflow for bug-fixing existed in `qk-bug-resolution/SKILL.md`
|
|
12
|
-
- Similar steps were duplicated across multiple skills
|
|
13
|
-
- No way to reuse or compose workflows
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Decision
|
|
18
|
-
|
|
19
|
-
Extract workflows into dedicated `workflows/*.yml` files. Skills reference workflows by name:
|
|
20
|
-
|
|
21
|
-
```yaml
|
|
22
|
-
# In SKILL.md frontmatter:
|
|
23
|
-
workflow: bug-resolution # → workflows/bug-resolution.yml
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Each workflow step MUST define `inputs` and `outputs` (not just `actions`) so agents understand what a step achieves, not just how to do it.
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Rationale
|
|
31
|
-
|
|
32
|
-
**Why YAML instead of Markdown?**
|
|
33
|
-
- Machine-readable: easier for agents to parse step inputs/outputs
|
|
34
|
-
- Structured: enforces schema compliance
|
|
35
|
-
- If found to be too rigid, can switch to Markdown+frontmatter without breaking skill references
|
|
36
|
-
|
|
37
|
-
**Why inputs/outputs per step?**
|
|
38
|
-
- Agents need to know WHAT each step achieves, not just HOW
|
|
39
|
-
- Enables future: step skipping based on already-available outputs
|
|
40
|
-
- Better debugging: "step X failed because output Y was not produced"
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## Consequences
|
|
45
|
-
|
|
46
|
-
- ✅ Workflows are reusable across skills
|
|
47
|
-
- ✅ Each step has clear contract (inputs → outputs)
|
|
48
|
-
- ✅ Easier to add new skills that reuse existing workflows
|
|
49
|
-
- ⚠️ YAML can be verbose — acceptable tradeoff for clarity
|
|
50
|
-
- ⚠️ If workflow changes, all referencing skills remain valid (they only reference by name)
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
# ADR-003: Registry as Generated Artifact
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-07
|
|
4
|
-
**Status:** Accepted
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Context
|
|
9
|
-
|
|
10
|
-
V7 had `skills.json` as the primary manifest — manually maintained, often drifting from actual SKILL.md content. This created two sources of truth.
|
|
11
|
-
|
|
12
|
-
V8 needs a retrieval index for AI agents to find the right skill without reading all 22 SKILL.md files.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Decision
|
|
17
|
-
|
|
18
|
-
`registry/skills-index.yml` is a **generated file**. It is produced by `tooling/generate-registry.js` by reading all `SKILL.md` frontmatter.
|
|
19
|
-
|
|
20
|
-
`SKILL.md` is the single source of truth. The registry is a derivative.
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
SKILL.md (source of truth)
|
|
24
|
-
↓
|
|
25
|
-
tooling/generate-registry.js
|
|
26
|
-
↓
|
|
27
|
-
registry/skills-index.yml (DO NOT EDIT MANUALLY)
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
`skills.json` is kept as a compatibility manifest for platforms that expect it (e.g., Antigravity v7 convention). It is also generated, not manually maintained.
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Rationale
|
|
35
|
-
|
|
36
|
-
**Why not edit the registry manually?**
|
|
37
|
-
- Two sources of truth always drift
|
|
38
|
-
- Triggers, intent, complexity are already defined in SKILL.md
|
|
39
|
-
- Generator can be run as a pre-commit hook or on demand
|
|
40
|
-
|
|
41
|
-
**Why keep skills.json?**
|
|
42
|
-
- Antigravity and some platforms discover skills via `skills.json`
|
|
43
|
-
- Backward compatibility for v7 skill consumers
|
|
44
|
-
- It's generated, so no maintenance burden
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## Consequences
|
|
49
|
-
|
|
50
|
-
- ✅ Single source of truth: SKILL.md
|
|
51
|
-
- ✅ No drift between skill and registry
|
|
52
|
-
- ✅ Registry update is automatic when skills are updated
|
|
53
|
-
- ⚠️ Requires running generator after any SKILL.md change
|
|
54
|
-
- ⚠️ If generator is not run, registry may be stale (mitigated by pre-commit hook)
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# ADR 008: Skill Boundary Review (V8.1.3)
|
|
2
|
-
|
|
3
|
-
## Tiêu đề
|
|
4
|
-
Định hướng tương lai cho ranh giới của `qk-validation-gate` và `qk-ai-builder`.
|
|
5
|
-
|
|
6
|
-
## Bối cảnh
|
|
7
|
-
Trong quá trình hoàn thiện Agent Engineering OS (V8.1.3), quá trình kiểm toán phát hiện rằng một số skill ban đầu có phạm vi hoạt động (scope) quá rộng hoặc chưa phân vai rõ ràng, dễ dẫn đến conflict. Tuy nhiên, để không làm vỡ kiến trúc (scope creep) trong giai đoạn chốt Control Plane, chúng ta quyết định giữ nguyên nhưng ghi chú định hướng cho V8.2.
|
|
8
|
-
|
|
9
|
-
## Quyết định
|
|
10
|
-
|
|
11
|
-
### 1. Về `qk-validation-gate`
|
|
12
|
-
- **Hiện trạng:** Đang đóng vai trò validation coordinator.
|
|
13
|
-
- **Định hướng (V8.2):** Sẽ được định hình rõ thành `release decision orchestrator`.
|
|
14
|
-
- **Ranh giới tương lai:** Không trực tiếp chạy test, không trực tiếp scan security, không audit quality. Nhiệm vụ của nó là tổng hợp kết quả từ `qk-test-engineering`, `qk-security-audit`, và `qk-web-quality-gate` để ra quyết định cuối cùng (gate decision).
|
|
15
|
-
|
|
16
|
-
### 2. Về `qk-ai-builder`
|
|
17
|
-
- **Hiện trạng:** Đang quá rộng (gồm cả frontend AI apps, general AI coding, prompt writing...).
|
|
18
|
-
- **Định hướng (V8.2):** Đổi tên (rename semantic) thành `qk-agent-platform-engineering`.
|
|
19
|
-
- **Ranh giới tương lai:**
|
|
20
|
-
- **Owns:** agent architecture, MCP integration, skill generation, agent runtime patterns.
|
|
21
|
-
- **Does not own:** frontend AI apps, general AI coding, prompt writing.
|
|
22
|
-
|
|
23
|
-
## Trạng thái
|
|
24
|
-
Đề xuất được chấp nhận (Deferred to V8.2).
|
|
25
|
-
|
|
26
|
-
## Hệ quả
|
|
27
|
-
Ngăn chặn các kỹ năng này bị phình to trong quá trình triển khai thực tế. Chuẩn bị sẵn sàng cấu trúc cho giai đoạn V8.2 (Self-Improving Agent).
|