ai-developer-skill-os 9.3.1 → 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 +73 -40
- package/.agents/DEV_PROFILE.md +36 -2
- 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 +193 -346
- package/.agents/registry/index.yaml +90 -233
- package/.agents/rules/coding.md +30 -12
- package/.agents/rules/command-safety.md +20 -9
- package/.agents/rules/global.md +234 -28
- package/.agents/rules/prompt-compiler.md +170 -0
- 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 +456 -0
- 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 +339 -0
- package/.agents/skills/qk-bug-resolution/SKILL.md +328 -248
- package/.agents/skills/qk-bug-resolution/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-code-cleaner/SKILL.md +399 -0
- package/.agents/skills/qk-code-review/SKILL.md +320 -247
- 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 +294 -0
- package/.agents/skills/qk-feature-delivery/SKILL.md +331 -247
- package/.agents/skills/qk-feature-delivery/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-orchestrator/SKILL.md +286 -152
- 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 +262 -0
- package/.agents/skills/qk-prompt-compiler/SKILL.md +444 -0
- package/.agents/skills/qk-ui-engineer/SKILL.md +286 -0
- 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 +116 -87
- package/CHANGELOG.md +77 -0
- package/README.md +125 -205
- package/bin/install.js +324 -329
- 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/README.md +0 -90
- package/.agents/docs/CHI_TIET_SKILLS.md +0 -126
- package/.agents/docs/HUONG_DAN_SU_DUNG.md +0 -120
- package/.agents/docs/MIGRATION-CLEANUP-V8.1.3.md +0 -36
- package/.agents/docs/MIGRATION-STATUS.md +0 -35
- package/.agents/docs/MIGRATION-V8.md +0 -10
- package/.agents/docs/ROADMAP-V8.2.md +0 -78
- package/.agents/docs/V8-CERTIFICATION.md +0 -27
- 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
- package/.agents/skills/qk-access-policy/SKILL.md +0 -206
- package/.agents/skills/qk-access-policy/capability.yaml +0 -23
- package/.agents/skills/qk-access-policy/evals/scorecard.yaml +0 -36
- package/.agents/skills/qk-agent-observability/SKILL.md +0 -108
- package/.agents/skills/qk-agent-observability/capability.yaml +0 -29
- package/.agents/skills/qk-agent-observability/evals/scorecard.yaml +0 -29
- package/.agents/skills/qk-agent-observability/references/scorecard.yaml +0 -80
- package/.agents/skills/qk-ai-builder/SKILL.md +0 -254
- package/.agents/skills/qk-ai-builder/capability.yaml +0 -23
- package/.agents/skills/qk-ai-builder/evals/scorecard.yaml +0 -30
- package/.agents/skills/qk-api-consumer/SKILL.md +0 -256
- package/.agents/skills/qk-api-consumer/capability.yaml +0 -21
- package/.agents/skills/qk-api-consumer/evals/scorecard.yaml +0 -29
- package/.agents/skills/qk-api-lifecycle/SKILL.md +0 -251
- package/.agents/skills/qk-api-lifecycle/capability.yaml +0 -23
- package/.agents/skills/qk-api-lifecycle/evals/scorecard.yaml +0 -29
- package/.agents/skills/qk-bug-resolution/capability.yaml +0 -25
- package/.agents/skills/qk-code-review/capability.yaml +0 -23
- package/.agents/skills/qk-context-loader/SKILL.md +0 -198
- package/.agents/skills/qk-context-loader/capability.yaml +0 -23
- package/.agents/skills/qk-context-loader/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-data-engineer/SKILL.md +0 -253
- package/.agents/skills/qk-data-lifecycle/SKILL.md +0 -197
- package/.agents/skills/qk-data-lifecycle/capability.yaml +0 -23
- package/.agents/skills/qk-data-lifecycle/evals/scorecard.yaml +0 -29
- package/.agents/skills/qk-db-optimizer/SKILL.md +0 -210
- package/.agents/skills/qk-db-optimizer/capability.yaml +0 -22
- package/.agents/skills/qk-db-optimizer/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-design-system-engineering/SKILL.md +0 -193
- package/.agents/skills/qk-design-system-engineering/capability.yaml +0 -25
- package/.agents/skills/qk-design-system-engineering/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-devops-platform/SKILL.md +0 -198
- package/.agents/skills/qk-devops-platform/capability.yaml +0 -29
- package/.agents/skills/qk-devops-platform/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-docs/SKILL.md +0 -193
- package/.agents/skills/qk-docs/capability.yaml +0 -23
- package/.agents/skills/qk-docs/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-engineering-standard/SKILL.md +0 -89
- package/.agents/skills/qk-engineering-standard/capability.yaml +0 -23
- package/.agents/skills/qk-engineering-standard/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-engineering-standard/references/anti-patterns.md +0 -121
- package/.agents/skills/qk-engineering-standard/rules/backend.md +0 -122
- package/.agents/skills/qk-engineering-standard/rules/database.md +0 -3
- package/.agents/skills/qk-engineering-standard/rules/frontend.md +0 -152
- package/.agents/skills/qk-engineering-standard/rules/security.md +0 -3
- package/.agents/skills/qk-engineering-standard/rules/testing.md +0 -3
- package/.agents/skills/qk-fe-api-integration/SKILL.md +0 -704
- package/.agents/skills/qk-fe-api-integration/capability.yaml +0 -21
- package/.agents/skills/qk-fe-api-integration/evals/scorecard.yaml +0 -29
- package/.agents/skills/qk-feature-delivery/capability.yaml +0 -24
- package/.agents/skills/qk-frontend-architecture/SKILL.md +0 -127
- package/.agents/skills/qk-frontend-architecture/capability.yaml +0 -28
- package/.agents/skills/qk-frontend-architecture/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-help/SKILL.md +0 -107
- package/.agents/skills/qk-help/capability.yaml +0 -20
- package/.agents/skills/qk-help/evals/scorecard.yaml +0 -13
- package/.agents/skills/qk-orchestrator/capability.yaml +0 -22
- package/.agents/skills/qk-product-specification/SKILL.md +0 -187
- package/.agents/skills/qk-product-specification/capability.yaml +0 -27
- package/.agents/skills/qk-product-specification/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-production-release/SKILL.md +0 -188
- package/.agents/skills/qk-production-release/capability.yaml +0 -27
- package/.agents/skills/qk-production-release/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-project-audit/SKILL.md +0 -174
- package/.agents/skills/qk-project-bootstrap/SKILL.md +0 -372
- package/.agents/skills/qk-project-bootstrap/capability.yaml +0 -23
- package/.agents/skills/qk-project-bootstrap/evals/scorecard.yaml +0 -28
- package/.agents/skills/qk-project-health/SKILL.md +0 -202
- package/.agents/skills/qk-project-health/capability.yaml +0 -23
- package/.agents/skills/qk-project-health/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-project-memory/SKILL.md +0 -303
- package/.agents/skills/qk-project-memory/capability.yaml +0 -23
- package/.agents/skills/qk-project-memory/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-refactor/SKILL.md +0 -243
- package/.agents/skills/qk-refactor/capability.yaml +0 -26
- package/.agents/skills/qk-refactor/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-security-audit/SKILL.md +0 -280
- package/.agents/skills/qk-security-audit/capability.yaml +0 -29
- package/.agents/skills/qk-security-audit/evals/scorecard.yaml +0 -27
- package/.agents/skills/qk-system-evolution/SKILL.md +0 -625
- package/.agents/skills/qk-system-evolution/capability.yaml +0 -24
- package/.agents/skills/qk-system-evolution/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-test-engineering/SKILL.md +0 -215
- package/.agents/skills/qk-test-engineering/capability.yaml +0 -28
- package/.agents/skills/qk-test-engineering/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-ui-audit/SKILL.md +0 -175
- package/.agents/skills/qk-ui-audit/capability.yaml +0 -23
- package/.agents/skills/qk-ui-audit/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-ui-audit/references/anti-slop-checklist.md +0 -136
- package/.agents/skills/qk-ui-builder/SKILL.md +0 -521
- package/.agents/skills/qk-ui-builder/capability.yaml +0 -29
- package/.agents/skills/qk-ui-builder/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-ui-builder/references/anti-patterns.md +0 -295
- package/.agents/skills/qk-ui-builder/references/color.md +0 -115
- package/.agents/skills/qk-ui-builder/references/component-cookbook.md +0 -458
- package/.agents/skills/qk-ui-builder/references/copy.md +0 -250
- package/.agents/skills/qk-ui-builder/references/interaction-and-states.md +0 -115
- package/.agents/skills/qk-ui-builder/references/layout-and-space.md +0 -111
- package/.agents/skills/qk-ui-builder/references/macrostructures/01-bento-grid.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/02-long-document.md +0 -50
- package/.agents/skills/qk-ui-builder/references/macrostructures/03-marquee-hero.md +0 -51
- package/.agents/skills/qk-ui-builder/references/macrostructures/04-stat-led.md +0 -49
- package/.agents/skills/qk-ui-builder/references/macrostructures/05-workbench.md +0 -44
- package/.agents/skills/qk-ui-builder/references/macrostructures/06-conversational-faq.md +0 -50
- package/.agents/skills/qk-ui-builder/references/macrostructures/07-manifesto.md +0 -51
- package/.agents/skills/qk-ui-builder/references/macrostructures/08-photographic.md +0 -50
- package/.agents/skills/qk-ui-builder/references/macrostructures/09-quote-led.md +0 -50
- package/.agents/skills/qk-ui-builder/references/macrostructures/11-catalogue.md +0 -49
- package/.agents/skills/qk-ui-builder/references/macrostructures/12-letter.md +0 -49
- package/.agents/skills/qk-ui-builder/references/macrostructures/13-index-first.md +0 -49
- package/.agents/skills/qk-ui-builder/references/macrostructures/14-narrative-workflow.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/15-split-studio.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/16-feature-stack.md +0 -51
- package/.agents/skills/qk-ui-builder/references/macrostructures/17-type-specimen.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/18-portfolio-grid.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/19-map-diagram.md +0 -50
- package/.agents/skills/qk-ui-builder/references/macrostructures/20-ecosystem-index.md +0 -48
- package/.agents/skills/qk-ui-builder/references/macrostructures/21-component-playground.md +0 -45
- package/.agents/skills/qk-ui-builder/references/macrostructures.md +0 -38
- package/.agents/skills/qk-ui-builder/references/motion.md +0 -95
- package/.agents/skills/qk-ui-builder/references/responsive.md +0 -115
- package/.agents/skills/qk-ui-builder/references/slop-test.md +0 -135
- package/.agents/skills/qk-ui-builder/references/structure.md +0 -280
- package/.agents/skills/qk-ui-builder/references/themes/atmospheric.md +0 -53
- package/.agents/skills/qk-ui-builder/references/themes/carnival.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/cobalt.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/editorial.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/garden.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/hum.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/lumen.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/midnight.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/modern-minimal.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/playful.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/specimen.md +0 -52
- package/.agents/skills/qk-ui-builder/references/themes/terminal.md +0 -52
- package/.agents/skills/qk-ui-builder/references/typography.md +0 -129
- package/.agents/skills/qk-ui-system-builder/SKILL.md +0 -183
- package/.agents/skills/qk-ui-system-builder/capability.yaml +0 -25
- package/.agents/skills/qk-ui-system-builder/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-upgrade/SKILL.md +0 -301
- package/.agents/skills/qk-upgrade/capability.yaml +0 -24
- package/.agents/skills/qk-upgrade/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-validation-gate/SKILL.md +0 -88
- package/.agents/skills/qk-validation-gate/capability.yaml +0 -23
- package/.agents/skills/qk-validation-gate/evals/scorecard.yaml +0 -26
- package/.agents/skills/qk-web-quality-gate/SKILL.md +0 -197
- package/.agents/skills/qk-web-quality-gate/capability.yaml +0 -24
- package/.agents/skills/qk-web-quality-gate/evals/scorecard.yaml +0 -26
- package/.agents/workflows/research.yml +0 -75
- package/.agents/workflows/skill-evolution.yml +0 -97
- package/tooling/fix-refactor.js +0 -8
package/bin/install.js
CHANGED
|
@@ -1,330 +1,325 @@
|
|
|
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
|
-
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
|
-
|
|
43
|
-
label: '
|
|
44
|
-
localDir: path.join(cwd, '.
|
|
45
|
-
globalDir:
|
|
46
|
-
postInstall: '
|
|
47
|
-
note: '
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
const
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
//
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
rl.question(scopeQuestion, async (scopeAnswer) => {
|
|
327
|
-
await runInstall(ideAnswer.trim(), scopeAnswer.trim(), rl);
|
|
328
|
-
});
|
|
329
|
-
});
|
|
330
|
-
}
|
|
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
|
+
opencode: {
|
|
43
|
+
label: 'OpenCode (Open Source)',
|
|
44
|
+
localDir: path.join(cwd, '.opencode'),
|
|
45
|
+
globalDir: path.join(homeDir, '.config', 'opencode'),
|
|
46
|
+
postInstall: 'copyOpenCodeConfig',
|
|
47
|
+
note: 'Global: ~/.config/opencode — applies to all OpenCode sessions',
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// ─── Utilities ───────────────────────────────────────────────────────────────
|
|
52
|
+
|
|
53
|
+
function copyRecursiveSync(src, dest) {
|
|
54
|
+
if (!fs.existsSync(src)) return;
|
|
55
|
+
const stats = fs.statSync(src);
|
|
56
|
+
if (stats.isDirectory()) {
|
|
57
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
58
|
+
for (const child of fs.readdirSync(src)) {
|
|
59
|
+
copyRecursiveSync(path.join(src, child), path.join(dest, child));
|
|
60
|
+
}
|
|
61
|
+
} else {
|
|
62
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
63
|
+
fs.copyFileSync(src, dest);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Read installed version from marker file. Returns null if not installed. */
|
|
68
|
+
function getInstalledVersion(targetDir) {
|
|
69
|
+
const markerPath = path.join(targetDir, VERSION_FILE);
|
|
70
|
+
if (!fs.existsSync(markerPath)) return null;
|
|
71
|
+
try {
|
|
72
|
+
return fs.readFileSync(markerPath, 'utf8').trim();
|
|
73
|
+
} catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Write version marker after successful install. */
|
|
79
|
+
function writeVersionMarker(targetDir) {
|
|
80
|
+
fs.writeFileSync(
|
|
81
|
+
path.join(targetDir, VERSION_FILE),
|
|
82
|
+
`${version}\nInstalled: ${new Date().toISOString()}\n`,
|
|
83
|
+
'utf8'
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Remove existing install from target directory. */
|
|
88
|
+
function removeExistingInstall(targetDir) {
|
|
89
|
+
if (fs.existsSync(targetDir)) {
|
|
90
|
+
fs.rmSync(targetDir, { recursive: true, force: true });
|
|
91
|
+
console.log(` 🗑️ Removed old install: ${targetDir}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Prompt user yes/no. Resolves true for yes. */
|
|
96
|
+
function confirm(rl, question) {
|
|
97
|
+
return new Promise((resolve) => {
|
|
98
|
+
rl.question(question, (ans) => resolve(['y', 'yes', ''].includes(ans.trim().toLowerCase())));
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function parseArgs() {
|
|
103
|
+
const args = process.argv.slice(2);
|
|
104
|
+
const result = { ide: null, scope: null };
|
|
105
|
+
for (const arg of args) {
|
|
106
|
+
if (arg.startsWith('--ide=')) result.ide = arg.split('=')[1];
|
|
107
|
+
else if (arg.startsWith('--scope=')) result.scope = arg.split('=')[1];
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ─── Post-install handlers ────────────────────────────────────────────────────
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Antigravity global install: rewrite relative .agents/X paths → absolute paths.
|
|
116
|
+
* Required because Antigravity reads SKILL.md files from an absolute global path.
|
|
117
|
+
*/
|
|
118
|
+
function rewriteAbsolutePaths(targetDir) {
|
|
119
|
+
const targetPosix = targetDir.replace(/\\/g, '/');
|
|
120
|
+
const DIRS_TO_REWRITE = ['skills', 'registry', 'rules', 'workflows', 'knowledge', 'docs', 'blueprints'];
|
|
121
|
+
|
|
122
|
+
const walk = (dir) => {
|
|
123
|
+
for (const file of fs.readdirSync(dir)) {
|
|
124
|
+
const fullPath = path.join(dir, file);
|
|
125
|
+
if (fs.statSync(fullPath).isDirectory()) {
|
|
126
|
+
walk(fullPath);
|
|
127
|
+
} else if (/\.(md|yml|yaml|json)$/.test(fullPath)) {
|
|
128
|
+
let content = fs.readFileSync(fullPath, 'utf8');
|
|
129
|
+
let changed = false;
|
|
130
|
+
|
|
131
|
+
for (const d of DIRS_TO_REWRITE) {
|
|
132
|
+
const re = new RegExp(`\\.agents/${d}`, 'g');
|
|
133
|
+
if (re.test(content)) {
|
|
134
|
+
content = content.replace(re, () => `${targetPosix}/${d}`);
|
|
135
|
+
changed = true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (content.includes('.agents/skills.json')) {
|
|
139
|
+
content = content.replace(/\.agents\/skills\.json/g, () => `${targetPosix}/skills.json`);
|
|
140
|
+
changed = true;
|
|
141
|
+
}
|
|
142
|
+
if (changed) fs.writeFileSync(fullPath, content, 'utf8');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
walk(targetDir);
|
|
148
|
+
console.log(' ✅ Rewrote .agents/* references → absolute paths for Antigravity global mode');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Claude Code install: copy AGENTS.md → CLAUDE.md at target root.
|
|
153
|
+
* Claude Code reads ~/.claude/CLAUDE.md as global instructions.
|
|
154
|
+
*/
|
|
155
|
+
function renameToClaude(targetDir) {
|
|
156
|
+
const agentsMd = path.join(targetDir, 'AGENTS.md');
|
|
157
|
+
const claudeMd = path.join(targetDir, 'CLAUDE.md');
|
|
158
|
+
|
|
159
|
+
if (fs.existsSync(agentsMd) && !fs.existsSync(claudeMd)) {
|
|
160
|
+
fs.copyFileSync(agentsMd, claudeMd);
|
|
161
|
+
console.log(' ✅ Copied AGENTS.md → CLAUDE.md (Claude Code entry point)');
|
|
162
|
+
} else if (fs.existsSync(claudeMd)) {
|
|
163
|
+
console.log(' ℹ️ CLAUDE.md already exists — skipped overwrite');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* OpenCode install: create .opencode/config.yaml pointing to AGENTS.md.
|
|
170
|
+
* OpenCode reads .opencode/ directory for configuration.
|
|
171
|
+
*/
|
|
172
|
+
function copyOpenCodeConfig(targetDir) {
|
|
173
|
+
const agentsMd = path.join(targetDir, 'AGENTS.md');
|
|
174
|
+
const opencodeDir = path.join(targetDir, '.opencode');
|
|
175
|
+
const configPath = path.join(opencodeDir, 'config.yaml');
|
|
176
|
+
|
|
177
|
+
if (fs.existsSync(agentsMd)) {
|
|
178
|
+
fs.mkdirSync(opencodeDir, { recursive: true });
|
|
179
|
+
fs.writeFileSync(configPath, `# OpenCode Configuration
|
|
180
|
+
# Auto-generated by AI Developer Skill OS v${version}
|
|
181
|
+
rules:
|
|
182
|
+
- path: AGENTS.md
|
|
183
|
+
always: true
|
|
184
|
+
`, 'utf8');
|
|
185
|
+
console.log(' ✅ Created .opencode/config.yaml');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// ─── Main install logic ───────────────────────────────────────────────────────
|
|
190
|
+
|
|
191
|
+
async function runInstall(ideKey, scopeKey, rl) {
|
|
192
|
+
const ideMap = { '1': 'antigravity', '2': 'claude', '3': 'opencode' };
|
|
193
|
+
const scopeMap = { '1': 'local', '2': 'global' };
|
|
194
|
+
|
|
195
|
+
const ide = ideMap[ideKey] || ideKey;
|
|
196
|
+
const scope = scopeMap[scopeKey] || scopeKey;
|
|
197
|
+
const config = IDE_CONFIG[ide];
|
|
198
|
+
|
|
199
|
+
if (!config) {
|
|
200
|
+
console.error(`❌ IDE không hợp lệ: "${ide}". Chọn: antigravity, claude, opencode`);
|
|
201
|
+
process.exit(1);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const isGlobal = scope === 'global';
|
|
205
|
+
|
|
206
|
+
if (isGlobal && config.globalDir === null) {
|
|
207
|
+
console.warn(`⚠️ ${config.label} không hỗ trợ cài Global qua file.`);
|
|
208
|
+
console.warn(` ${config.note}`);
|
|
209
|
+
console.warn(' Tiến hành cài Local thay thế...');
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const targetDir = (isGlobal && config.globalDir) ? config.globalDir : config.localDir;
|
|
213
|
+
|
|
214
|
+
console.log(`\n🚀 AI Developer Skill OS v${version}`);
|
|
215
|
+
console.log(` IDE: ${config.label}`);
|
|
216
|
+
console.log(` Scope: ${isGlobal ? 'Global' : 'Local'}`);
|
|
217
|
+
console.log(` Path: ${targetDir}`);
|
|
218
|
+
|
|
219
|
+
// ── Version check ────────────────────────────────────────────────────────
|
|
220
|
+
const installedVersion = getInstalledVersion(targetDir);
|
|
221
|
+
|
|
222
|
+
if (installedVersion) {
|
|
223
|
+
if (installedVersion === version) {
|
|
224
|
+
console.log(`\n✅ Phiên bản v${version} đã được cài đặt — không cần cập nhật.`);
|
|
225
|
+
console.log(' Dùng --force để cài lại.\n');
|
|
226
|
+
const isForce = process.argv.includes('--force');
|
|
227
|
+
if (!isForce) {
|
|
228
|
+
if (rl) rl.close();
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
console.log(' --force detected: tiến hành cài lại...');
|
|
232
|
+
} else {
|
|
233
|
+
console.log(`\n⚠️ Phát hiện phiên bản cũ: v${installedVersion}`);
|
|
234
|
+
console.log(` Phiên bản mới: v${version}`);
|
|
235
|
+
const shouldUpgrade = rl
|
|
236
|
+
? await confirm(rl, '\n Xóa bản cũ và cài bản mới? [Y/n]: ')
|
|
237
|
+
: true;
|
|
238
|
+
if (!shouldUpgrade) {
|
|
239
|
+
console.log(' Hủy cài đặt.');
|
|
240
|
+
if (rl) rl.close();
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Remove old install before fresh copy
|
|
245
|
+
removeExistingInstall(targetDir);
|
|
246
|
+
} else {
|
|
247
|
+
console.log(' (Chưa cài đặt — fresh install)\n');
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// ── Install ──────────────────────────────────────────────────────────────
|
|
251
|
+
try {
|
|
252
|
+
if (!fs.existsSync(sourceDir)) {
|
|
253
|
+
console.error(`❌ Không tìm thấy source: ${sourceDir}`);
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (ide === 'opencode') {
|
|
258
|
+
copyRecursiveSync(sourceDir, targetDir);
|
|
259
|
+
copyOpenCodeConfig(targetDir);
|
|
260
|
+
console.log(` ✅ Copied .agents/ → ${targetDir}`);
|
|
261
|
+
} else {
|
|
262
|
+
copyRecursiveSync(sourceDir, targetDir);
|
|
263
|
+
console.log(` ✅ Copied .agents/ → ${targetDir}`);
|
|
264
|
+
if (isGlobal && config.postInstall === 'rewriteAbsolutePaths') {
|
|
265
|
+
rewriteAbsolutePaths(targetDir);
|
|
266
|
+
}
|
|
267
|
+
if (config.postInstall === 'renameToClaude') {
|
|
268
|
+
renameToClaude(targetDir);
|
|
269
|
+
}
|
|
270
|
+
if (ide === 'antigravity') {
|
|
271
|
+
const geminiSource = path.resolve(__dirname, '..', 'GEMINI.md');
|
|
272
|
+
if (fs.existsSync(geminiSource)) {
|
|
273
|
+
const geminiDest = isGlobal ? path.join(homeDir, '.gemini', 'GEMINI.md') : path.join(cwd, 'GEMINI.md');
|
|
274
|
+
fs.mkdirSync(path.dirname(geminiDest), { recursive: true });
|
|
275
|
+
fs.copyFileSync(geminiSource, geminiDest);
|
|
276
|
+
console.log(` ✅ Copied GEMINI.md → ${geminiDest}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
writeVersionMarker(targetDir);
|
|
282
|
+
console.log(`\n🎉 Hoàn tất v${version}! ${config.note}\n`);
|
|
283
|
+
|
|
284
|
+
} catch (err) {
|
|
285
|
+
console.error('❌ Lỗi cài đặt:', err.message);
|
|
286
|
+
process.exit(1);
|
|
287
|
+
} finally {
|
|
288
|
+
if (rl) rl.close();
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// ─── CLI entry point ──────────────────────────────────────────────────────────
|
|
293
|
+
|
|
294
|
+
const args = parseArgs();
|
|
295
|
+
|
|
296
|
+
if (args.ide && args.scope) {
|
|
297
|
+
// Non-interactive mode (called via npm scripts)
|
|
298
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
299
|
+
await runInstall(args.ide, args.scope, rl);
|
|
300
|
+
} else {
|
|
301
|
+
// Interactive mode
|
|
302
|
+
console.log(`\n🚀 AI Developer Skill OS v${version} — Setup\n`);
|
|
303
|
+
|
|
304
|
+
const ideQuestion = `Chọn IDE/AI Assistant:
|
|
305
|
+
(1) Antigravity (Google Gemini)
|
|
306
|
+
(2) Claude Code (Anthropic)
|
|
307
|
+
(3) OpenCode (Open Source)
|
|
308
|
+
|
|
309
|
+
Nhập số (1-3): `;
|
|
310
|
+
|
|
311
|
+
const scopeQuestion = `
|
|
312
|
+
Phạm vi cài đặt:
|
|
313
|
+
(1) Local — Chỉ dự án này (.agents/ hoặc .claude/ trong thư mục hiện tại)
|
|
314
|
+
(2) Global — Toàn bộ máy tính (áp dụng cho mọi dự án)
|
|
315
|
+
|
|
316
|
+
Nhập số (1-2): `;
|
|
317
|
+
|
|
318
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
319
|
+
|
|
320
|
+
rl.question(ideQuestion, async (ideAnswer) => {
|
|
321
|
+
rl.question(scopeQuestion, async (scopeAnswer) => {
|
|
322
|
+
await runInstall(ideAnswer.trim(), scopeAnswer.trim(), rl);
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
}
|