ai-developer-skill-os 7.5.0 → 8.1.4
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/CHANGELOG.md +2 -1
- package/.agents/README.md +51 -10
- package/.agents/docs/ARCHITECTURE.md +156 -0
- package/.agents/docs/CHI_TIET_SKILLS.md +2 -1
- package/.agents/docs/MIGRATION-CLEANUP-V8.1.3.md +36 -0
- package/.agents/docs/MIGRATION-STATUS.md +35 -0
- package/.agents/docs/MIGRATION-V8.md +10 -0
- package/.agents/docs/ROADMAP-V8.2.md +78 -0
- package/.agents/docs/V8-CERTIFICATION.md +27 -0
- package/.agents/docs/VERSIONING.md +95 -0
- package/.agents/docs/decisions/ADR-001-v8-migration.md +58 -0
- package/.agents/docs/decisions/ADR-002-workflow-separation.md +50 -0
- package/.agents/docs/decisions/ADR-003-registry-generated.md +54 -0
- package/.agents/docs/decisions/ADR-008-skill-boundary-review.md +27 -0
- package/.agents/docs/schemas/learning.schema.yml +69 -0
- package/.agents/docs/schemas/skill.schema.yml +188 -0
- package/.agents/docs/schemas/workflow.schema.yml +33 -0
- package/.agents/knowledge/design-intelligence/industries/ecommerce.md +3 -0
- package/.agents/knowledge/design-intelligence/industries/fintech.md +3 -0
- package/.agents/knowledge/design-intelligence/industries/healthcare.md +3 -0
- package/.agents/learnings/draft/README.md +37 -0
- package/.agents/registry/capability-graph.yml +500 -0
- package/.agents/registry/skills-index.yml +525 -0
- package/.agents/reports/RELEASE-CHECKLIST.md +29 -0
- package/.agents/reports/architecture-audit.md +13 -0
- package/.agents/reports/graph-health.md +20 -0
- package/.agents/reports/skill-audit.md +215 -0
- package/.agents/rules/coding.md +102 -0
- package/.agents/rules/command-safety.md +21 -0
- package/.agents/rules/global.md +135 -0
- package/.agents/rules/priorities.yml +24 -0
- package/.agents/rules/safety.md +84 -0
- package/.agents/rules/security.md +13 -0
- package/.agents/rules/skill-quality.md +14 -0
- package/.agents/skills/_template/SKILL.md +132 -0
- package/.agents/skills/qk-access-policy/SKILL.md +61 -5
- package/.agents/skills/qk-agent-observability/SKILL.md +73 -0
- package/.agents/skills/qk-ai-builder/SKILL.md +62 -5
- package/.agents/skills/qk-api-lifecycle/SKILL.md +59 -6
- package/.agents/skills/qk-bug-resolution/SKILL.md +64 -6
- package/.agents/skills/qk-context-loader/SKILL.md +63 -11
- package/.agents/skills/qk-data-lifecycle/SKILL.md +61 -5
- package/.agents/skills/qk-db-optimizer/SKILL.md +61 -5
- package/.agents/skills/qk-design-system-engineering/SKILL.md +112 -0
- package/.agents/skills/qk-devops-platform/SKILL.md +117 -0
- package/.agents/skills/qk-docs/SKILL.md +62 -6
- package/.agents/skills/qk-engineering-standard/SKILL.md +62 -12
- package/.agents/skills/qk-fe-api-integration/SKILL.md +60 -6
- package/.agents/skills/qk-feature-delivery/SKILL.md +65 -6
- package/.agents/skills/qk-frontend-architecture/SKILL.md +134 -0
- package/.agents/skills/qk-help/SKILL.md +245 -193
- package/.agents/skills/qk-orchestrator/SKILL.md +67 -13
- package/.agents/skills/qk-orchestrator/references/routing-table.md +4 -3
- package/.agents/skills/qk-product-specification/SKILL.md +130 -0
- package/.agents/skills/qk-production-release/SKILL.md +59 -6
- package/.agents/skills/qk-project-bootstrap/SKILL.md +68 -7
- package/.agents/skills/qk-project-health/SKILL.md +63 -6
- package/.agents/skills/qk-project-memory/SKILL.md +109 -6
- package/.agents/skills/qk-security-audit/SKILL.md +135 -0
- package/.agents/skills/qk-system-evolution/SKILL.md +63 -12
- package/.agents/skills/qk-test-engineering/SKILL.md +139 -0
- package/.agents/skills/qk-ui-audit/SKILL.md +63 -8
- package/.agents/skills/qk-ui-builder/SKILL.md +509 -0
- package/.agents/skills/qk-ui-builder/references/anti-patterns.md +295 -0
- package/.agents/skills/qk-ui-builder/references/color.md +115 -0
- package/.agents/skills/qk-ui-builder/references/component-cookbook.md +1194 -0
- package/.agents/skills/qk-ui-builder/references/copy.md +250 -0
- package/.agents/skills/qk-ui-builder/references/interaction-and-states.md +115 -0
- package/.agents/skills/qk-ui-builder/references/layout-and-space.md +111 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/01-bento-grid.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/02-long-document.md +50 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/03-marquee-hero.md +51 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/04-stat-led.md +49 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/05-workbench.md +44 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/06-conversational-faq.md +50 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/07-manifesto.md +51 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/08-photographic.md +50 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/09-quote-led.md +50 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/11-catalogue.md +49 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/12-letter.md +49 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/13-index-first.md +49 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/14-narrative-workflow.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/15-split-studio.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/16-feature-stack.md +51 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/17-type-specimen.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/18-portfolio-grid.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/19-map-diagram.md +50 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/20-ecosystem-index.md +48 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures/21-component-playground.md +45 -0
- package/.agents/skills/qk-ui-builder/references/macrostructures.md +38 -0
- package/.agents/skills/qk-ui-builder/references/motion.md +95 -0
- package/.agents/skills/qk-ui-builder/references/responsive.md +115 -0
- package/.agents/skills/qk-ui-builder/references/slop-test.md +135 -0
- package/.agents/skills/qk-ui-builder/references/structure.md +280 -0
- package/.agents/skills/qk-ui-builder/references/themes/atmospheric.md +53 -0
- package/.agents/skills/qk-ui-builder/references/themes/carnival.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/cobalt.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/editorial.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/garden.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/hum.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/lumen.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/midnight.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/modern-minimal.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/playful.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/specimen.md +52 -0
- package/.agents/skills/qk-ui-builder/references/themes/terminal.md +52 -0
- package/.agents/skills/qk-ui-builder/references/typography.md +129 -0
- package/.agents/skills/qk-ui-system-builder/SKILL.md +61 -5
- package/.agents/skills/qk-validation-gate/SKILL.md +63 -11
- package/.agents/skills/qk-web-quality-gate/SKILL.md +114 -0
- package/.agents/workflows/_schema.yml +109 -0
- package/.agents/workflows/bug-resolution.yml +101 -0
- package/.agents/workflows/code-review.yml +77 -0
- package/.agents/workflows/documentation.yml +75 -0
- package/.agents/workflows/feature-delivery.yml +103 -0
- package/.agents/workflows/refactor.yml +81 -0
- package/.agents/workflows/research.yml +60 -0
- package/.agents/workflows/security-audit.yml +72 -0
- package/.agents/workflows/skill-evolution.yml +65 -0
- package/.agents/workflows/spec-driven-development.yml +57 -0
- package/CHANGELOG.md +91 -69
- package/README.md +50 -45
- package/bin/install.js +57 -309
- package/package.json +14 -3
- package/tooling/generate-evaluation-cases.cjs +44 -0
- package/tooling/generate-registry.js +157 -0
- package/tooling/run-aar.js +143 -0
- package/tooling/validate-graph.js +87 -0
- package/tooling/validate-skills.js +102 -0
- package/.agents/_template/BEHAVIOR_SPEC.md +0 -96
- package/.agents/_template/examples/example-en.md +0 -49
- package/.agents/_template/examples/example-vi.md +0 -49
- package/.agents/skills/qk-design-to-code/SKILL.md +0 -285
- package/.agents/skills.json +0 -819
- package/.github/workflows/ci.yml +0 -56
- package/.qk-ai-skill-os/CHANGELOG.md +0 -69
- package/.qk-ai-skill-os/LICENSE +0 -21
- package/.qk-ai-skill-os/README.md +0 -59
- package/.qk-ai-skill-os/_template/BEHAVIOR_SPEC.md +0 -96
- package/.qk-ai-skill-os/_template/examples/example-en.md +0 -49
- package/.qk-ai-skill-os/_template/examples/example-vi.md +0 -49
- package/.qk-ai-skill-os/docs/CHI_TIET_SKILLS.md +0 -125
- package/.qk-ai-skill-os/docs/GOVERNANCE.md +0 -40
- package/.qk-ai-skill-os/docs/HUONG_DAN_SU_DUNG.md +0 -120
- package/.qk-ai-skill-os/docs/SPEC.md +0 -87
- package/.qk-ai-skill-os/docs/adr/0001-intent-based-architecture.md +0 -19
- package/.qk-ai-skill-os/docs/adr/0002-kernel-freeze.md +0 -21
- package/.qk-ai-skill-os/docs/adr/0003-risk-based-verification.md +0 -20
- package/.qk-ai-skill-os/docs/adr/0004-progressive-evidence.md +0 -19
- package/.qk-ai-skill-os/docs/skill-classification.md +0 -25
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-accessibility-audit/SKILL.md +0 -121
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-agent-orchestrator/SKILL.md +0 -179
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-api-integration/SKILL.md +0 -389
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-auth-security/SKILL.md +0 -96
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-backend-architecture/SKILL.md +0 -125
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-bug-fix/SKILL.md +0 -213
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-component-generator/SKILL.md +0 -136
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-context-manager/SKILL.md +0 -175
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-database-engineer/SKILL.md +0 -104
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-deployment/SKILL.md +0 -96
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-design-system/SKILL.md +0 -137
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-form-builder/SKILL.md +0 -140
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-frontend-architecture/SKILL.md +0 -155
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-frontend-debug/SKILL.md +0 -133
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-frontend-performance/SKILL.md +0 -129
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-frontend-testing/SKILL.md +0 -146
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-git-engineer/SKILL.md +0 -304
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-help/SKILL.md +0 -68
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-migration/SKILL.md +0 -284
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-project-audit/SKILL.md +0 -280
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-refactor/SKILL.md +0 -222
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-state-management/SKILL.md +0 -140
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-table-crud-generator/SKILL.md +0 -127
- package/.qk-ai-skill-os/skills/_archive_old_skills/qk-ui-builder/SKILL.md +0 -152
- package/.qk-ai-skill-os/skills/_template/SKILL.md +0 -238
- package/.qk-ai-skill-os/skills/qk-access-policy/SKILL.md +0 -179
- package/.qk-ai-skill-os/skills/qk-ai-builder/SKILL.md +0 -221
- package/.qk-ai-skill-os/skills/qk-api-lifecycle/SKILL.md +0 -176
- package/.qk-ai-skill-os/skills/qk-bug-resolution/SKILL.md +0 -307
- package/.qk-ai-skill-os/skills/qk-context-loader/SKILL.md +0 -218
- package/.qk-ai-skill-os/skills/qk-data-lifecycle/SKILL.md +0 -192
- package/.qk-ai-skill-os/skills/qk-db-optimizer/SKILL.md +0 -196
- package/.qk-ai-skill-os/skills/qk-design-to-code/SKILL.md +0 -291
- package/.qk-ai-skill-os/skills/qk-docs/SKILL.md +0 -198
- package/.qk-ai-skill-os/skills/qk-engineering-standard/SKILL.md +0 -351
- package/.qk-ai-skill-os/skills/qk-engineering-standard/rules/backend.md +0 -122
- package/.qk-ai-skill-os/skills/qk-engineering-standard/rules/database.md +0 -3
- package/.qk-ai-skill-os/skills/qk-engineering-standard/rules/frontend.md +0 -152
- package/.qk-ai-skill-os/skills/qk-engineering-standard/rules/security.md +0 -3
- package/.qk-ai-skill-os/skills/qk-engineering-standard/rules/testing.md +0 -3
- package/.qk-ai-skill-os/skills/qk-fe-api-integration/SKILL.md +0 -326
- package/.qk-ai-skill-os/skills/qk-feature-delivery/SKILL.md +0 -305
- package/.qk-ai-skill-os/skills/qk-help/SKILL.md +0 -193
- package/.qk-ai-skill-os/skills/qk-orchestrator/SKILL.md +0 -277
- package/.qk-ai-skill-os/skills/qk-orchestrator/references/routing-table.md +0 -77
- package/.qk-ai-skill-os/skills/qk-production-release/SKILL.md +0 -290
- package/.qk-ai-skill-os/skills/qk-project-bootstrap/SKILL.md +0 -240
- package/.qk-ai-skill-os/skills/qk-project-health/SKILL.md +0 -199
- package/.qk-ai-skill-os/skills/qk-project-memory/SKILL.md +0 -172
- package/.qk-ai-skill-os/skills/qk-system-evolution/SKILL.md +0 -285
- package/.qk-ai-skill-os/skills/qk-ui-audit/SKILL.md +0 -314
- package/.qk-ai-skill-os/skills/qk-ui-audit/references/anti-slop-checklist.md +0 -136
- package/.qk-ai-skill-os/skills/qk-ui-system-builder/SKILL.md +0 -225
- package/.qk-ai-skill-os/skills/qk-validation-gate/SKILL.md +0 -361
- package/.qk-ai-skill-os/skills.json +0 -819
- package/CLAUDE.md +0 -110
- package/_template/BEHAVIOR_SPEC.md +0 -96
- package/_template/examples/example-en.md +0 -49
- package/_template/examples/example-vi.md +0 -49
- package/add_lang.js +0 -21
- package/add_lang.py +0 -25
- package/add_sections.py +0 -53
- package/bin/lint.js +0 -122
- package/docs/CHI_TIET_SKILLS.md +0 -125
- package/docs/GOVERNANCE.md +0 -40
- package/docs/HUONG_DAN_SU_DUNG.md +0 -120
- package/docs/SPEC.md +0 -87
- package/docs/adr/0001-intent-based-architecture.md +0 -19
- package/docs/adr/0002-kernel-freeze.md +0 -21
- package/docs/adr/0003-risk-based-verification.md +0 -20
- package/docs/adr/0004-progressive-evidence.md +0 -19
- package/docs/skill-classification.md +0 -25
- package/fix_seeds.js +0 -22
- package/framework/KERNEL.md +0 -83
- package/framework/bias-library/cosmetic-refactor.md +0 -21
- package/framework/bias-library/enterprise-crud.md +0 -21
- package/framework/bias-library/fake-ui-slop.md +0 -20
- package/framework/bias-library/hallucinated-tools.md +0 -20
- package/framework/bias-library/missing-ui-states.md +0 -19
- package/framework/bias-library/over-indexing.md +0 -20
- package/framework/bias-library/swallow-errors.md +0 -19
- package/framework/bias-library/ui-only-security.md +0 -17
- package/framework/decision-primitives.md +0 -47
- package/framework/dial-library/complexity-budget.md +0 -13
- package/framework/dial-library/granularity.md +0 -13
- package/framework/dial-library/optimization-strategy.md +0 -13
- package/framework/dial-library/strictness.md +0 -13
- package/framework/rule-library/delegation-only.md +0 -9
- package/framework/rule-library/minimal-diff.md +0 -9
- package/framework/skill-schema.md +0 -310
- package/knowledge/backend/nodejs.md +0 -52
- package/knowledge/frontend/react.md +0 -81
- package/migrate-to-v6.js +0 -130
- package/migrate.js +0 -147
- package/migrate.py +0 -133
- package/migrate_all.cjs +0 -96
- package/patch.js +0 -15
- package/patch.py +0 -89
- package/patch2.py +0 -83
- package/rename.js +0 -64
- package/skills/_archive_old_skills/qk-accessibility-audit/SKILL.md +0 -121
- package/skills/_archive_old_skills/qk-agent-orchestrator/SKILL.md +0 -179
- package/skills/_archive_old_skills/qk-api-integration/SKILL.md +0 -389
- package/skills/_archive_old_skills/qk-auth-security/SKILL.md +0 -96
- package/skills/_archive_old_skills/qk-backend-architecture/SKILL.md +0 -125
- package/skills/_archive_old_skills/qk-bug-fix/SKILL.md +0 -213
- package/skills/_archive_old_skills/qk-component-generator/SKILL.md +0 -136
- package/skills/_archive_old_skills/qk-context-manager/SKILL.md +0 -175
- package/skills/_archive_old_skills/qk-database-engineer/SKILL.md +0 -104
- package/skills/_archive_old_skills/qk-deployment/SKILL.md +0 -96
- package/skills/_archive_old_skills/qk-design-system/SKILL.md +0 -137
- package/skills/_archive_old_skills/qk-form-builder/SKILL.md +0 -140
- package/skills/_archive_old_skills/qk-frontend-architecture/SKILL.md +0 -155
- package/skills/_archive_old_skills/qk-frontend-debug/SKILL.md +0 -133
- package/skills/_archive_old_skills/qk-frontend-performance/SKILL.md +0 -129
- package/skills/_archive_old_skills/qk-frontend-testing/SKILL.md +0 -146
- package/skills/_archive_old_skills/qk-git-engineer/SKILL.md +0 -304
- package/skills/_archive_old_skills/qk-help/SKILL.md +0 -68
- package/skills/_archive_old_skills/qk-migration/SKILL.md +0 -284
- package/skills/_archive_old_skills/qk-project-audit/SKILL.md +0 -280
- package/skills/_archive_old_skills/qk-refactor/SKILL.md +0 -222
- package/skills/_archive_old_skills/qk-state-management/SKILL.md +0 -140
- package/skills/_archive_old_skills/qk-table-crud-generator/SKILL.md +0 -127
- package/skills/_archive_old_skills/qk-ui-builder/SKILL.md +0 -152
- package/skills/_template/SKILL.md +0 -238
- package/skills/qk-access-policy/SKILL.md +0 -179
- package/skills/qk-ai-builder/SKILL.md +0 -215
- package/skills/qk-api-lifecycle/SKILL.md +0 -176
- package/skills/qk-bug-resolution/SKILL.md +0 -307
- package/skills/qk-context-loader/SKILL.md +0 -218
- package/skills/qk-data-lifecycle/SKILL.md +0 -192
- package/skills/qk-db-optimizer/SKILL.md +0 -196
- package/skills/qk-design-to-code/SKILL.md +0 -285
- package/skills/qk-docs/SKILL.md +0 -198
- package/skills/qk-engineering-standard/SKILL.md +0 -351
- package/skills/qk-engineering-standard/rules/backend.md +0 -122
- package/skills/qk-engineering-standard/rules/database.md +0 -3
- package/skills/qk-engineering-standard/rules/frontend.md +0 -152
- package/skills/qk-engineering-standard/rules/security.md +0 -3
- package/skills/qk-engineering-standard/rules/testing.md +0 -3
- package/skills/qk-fe-api-integration/SKILL.md +0 -326
- package/skills/qk-feature-delivery/SKILL.md +0 -305
- package/skills/qk-help/SKILL.md +0 -193
- package/skills/qk-orchestrator/SKILL.md +0 -277
- package/skills/qk-orchestrator/references/routing-table.md +0 -77
- package/skills/qk-production-release/SKILL.md +0 -284
- package/skills/qk-project-bootstrap/SKILL.md +0 -234
- package/skills/qk-project-health/SKILL.md +0 -199
- package/skills/qk-project-memory/SKILL.md +0 -172
- package/skills/qk-system-evolution/SKILL.md +0 -281
- package/skills/qk-ui-audit/SKILL.md +0 -314
- package/skills/qk-ui-audit/references/anti-slop-checklist.md +0 -136
- package/skills/qk-ui-system-builder/SKILL.md +0 -221
- package/skills/qk-validation-gate/SKILL.md +0 -359
- package/skills.json +0 -819
- package/specs/contracts/behavior-contract.yaml +0 -40
- package/specs/expectations/qk-bug-resolution.yaml +0 -35
- package/specs/fixtures/user-payload.json +0 -12
- package/specs/regressions/api-integration-null-fields.yaml +0 -19
- package/specs/scenarios/fix-login-nullref.yaml +0 -3
- package/taste-skill/.claude-plugin/marketplace.json +0 -20
- package/taste-skill/.claude-plugin/plugin.json +0 -19
- package/taste-skill/.github/FUNDING.yml +0 -1
- package/taste-skill/.github/copilot-instructions.md +0 -11
- package/taste-skill/CHANGELOG.md +0 -111
- package/taste-skill/LICENSE +0 -21
- package/taste-skill/README.md +0 -212
- package/taste-skill/assets/.gitkeep +0 -0
- package/taste-skill/assets/readme-banner.webp +0 -0
- package/taste-skill/assets/readme-buttons/btn-agent-skills.webp +0 -0
- package/taste-skill/assets/readme-buttons/btn-changelog.webp +0 -0
- package/taste-skill/assets/readme-buttons/btn-mit.webp +0 -0
- package/taste-skill/assets/readme-buttons/btn-site.webp +0 -0
- package/taste-skill/assets/readme-buttons/btn-tools.webp +0 -0
- package/taste-skill/assets/readme-cta-tasteskill.svg +0 -5
- package/taste-skill/assets/sponsors/animations-dev.webp +0 -0
- package/taste-skill/assets/sponsors/emil-animations-dev.webp +0 -0
- package/taste-skill/assets/taste-skill-logo.png +0 -0
- package/taste-skill/assets/taste-skill-logo.webp +0 -0
- package/taste-skill/assets/vercel-oss-program-badge.svg +0 -44
- package/taste-skill/examples/floria-bottom.webp +0 -0
- package/taste-skill/examples/floria-full.webp +0 -0
- package/taste-skill/examples/floria-top.webp +0 -0
- package/taste-skill/research/README.md +0 -8
- package/taste-skill/research/laziness/README.md +0 -25
- package/taste-skill/research/laziness/findings/empirical-results.md +0 -58
- package/taste-skill/research/laziness/findings/references.md +0 -20
- package/taste-skill/research/laziness/remediation/architectural-patterns.md +0 -55
- package/taste-skill/research/laziness/remediation/parameter-tuning.md +0 -44
- package/taste-skill/research/laziness/remediation/prompt-engineering.md +0 -52
- package/taste-skill/research/laziness/remediation/reference-prompts.md +0 -79
- package/taste-skill/research/laziness/root-causes/cognitive-shortcuts.md +0 -23
- package/taste-skill/research/laziness/root-causes/output-limits.md +0 -39
- package/taste-skill/research/laziness/root-causes/rlhf-and-compute.md +0 -27
- package/taste-skill/research/laziness/root-causes/training-data-bias.md +0 -28
- package/taste-skill/scripts/build-emil-sponsor-row.mjs +0 -41
- package/taste-skill/scripts/convert-readme-assets-webp.mjs +0 -142
- package/taste-skill/scripts/process-readme-buttons.mjs +0 -108
- package/taste-skill/scripts/process-sponsor-badge.mjs +0 -83
- package/taste-skill/skill.sh +0 -25
- package/taste-skill/skills/brandkit/SKILL.md +0 -798
- package/taste-skill/skills/brutalist-skill/SKILL.md +0 -92
- package/taste-skill/skills/gpt-tasteskill/SKILL.md +0 -74
- package/taste-skill/skills/image-to-code-skill/SKILL.md +0 -1228
- package/taste-skill/skills/imagegen-frontend-mobile/SKILL.md +0 -1465
- package/taste-skill/skills/imagegen-frontend-web/SKILL.md +0 -987
- package/taste-skill/skills/llms.txt +0 -13
- package/taste-skill/skills/minimalist-skill/SKILL.md +0 -85
- package/taste-skill/skills/output-skill/SKILL.md +0 -49
- package/taste-skill/skills/redesign-skill/SKILL.md +0 -178
- package/taste-skill/skills/soft-skill/SKILL.md +0 -98
- package/taste-skill/skills/stitch-skill/DESIGN.md +0 -121
- package/taste-skill/skills/stitch-skill/SKILL.md +0 -184
- package/taste-skill/skills/taste-skill/SKILL.md +0 -1206
- package/taste-skill/skills/taste-skill-v1/SKILL.md +0 -226
- package/temp_fix.js +0 -61
- package/templates/DESIGN.md +0 -38
- package/templates/bug-report.md +0 -21
- package/templates/design-report.md +0 -21
- package/templates/feature-report.md +0 -20
- package/templates/review-report.md +0 -21
- package/templates/skill-template.md +0 -38
- package/tests/behavior-conformance.test.js +0 -154
- package/tests/install-script.test.js +0 -38
- package/tests/registry.test.js +0 -111
- package/update_template.js +0 -28
- package/vitest.config.js +0 -11
package/bin/install.js
CHANGED
|
@@ -3,29 +3,39 @@
|
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import readline from 'readline';
|
|
6
|
-
import os from 'os';
|
|
7
6
|
import { fileURLToPath } from 'url';
|
|
7
|
+
import os from 'os';
|
|
8
8
|
|
|
9
9
|
const __filename = fileURLToPath(import.meta.url);
|
|
10
10
|
const __dirname = path.dirname(__filename);
|
|
11
|
+
const sourceDir = path.resolve(__dirname, '..', '.agents');
|
|
12
|
+
const cwd = process.cwd();
|
|
13
|
+
|
|
14
|
+
function parseArgs() {
|
|
15
|
+
const args = process.argv.slice(2);
|
|
16
|
+
let ide = null;
|
|
17
|
+
let scope = null;
|
|
11
18
|
|
|
12
|
-
|
|
19
|
+
args.forEach(arg => {
|
|
20
|
+
if (arg.startsWith('--ide=')) {
|
|
21
|
+
ide = arg.split('=')[1];
|
|
22
|
+
} else if (arg.startsWith('--scope=')) {
|
|
23
|
+
scope = arg.split('=')[1];
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
return { ide, scope };
|
|
28
|
+
}
|
|
13
29
|
|
|
14
30
|
function copyRecursiveSync(src, dest) {
|
|
15
31
|
const exists = fs.existsSync(src);
|
|
16
32
|
const stats = exists && fs.statSync(src);
|
|
17
33
|
const isDirectory = exists && stats.isDirectory();
|
|
18
|
-
|
|
19
34
|
if (isDirectory) {
|
|
20
|
-
const dirName = path.basename(src);
|
|
21
|
-
if (dirName.startsWith('_')) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
35
|
if (!fs.existsSync(dest)) {
|
|
26
36
|
fs.mkdirSync(dest, { recursive: true });
|
|
27
37
|
}
|
|
28
|
-
fs.readdirSync(src).forEach(function(childItemName) {
|
|
38
|
+
fs.readdirSync(src).forEach(function (childItemName) {
|
|
29
39
|
copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName));
|
|
30
40
|
});
|
|
31
41
|
} else {
|
|
@@ -33,317 +43,56 @@ function copyRecursiveSync(src, dest) {
|
|
|
33
43
|
}
|
|
34
44
|
}
|
|
35
45
|
|
|
36
|
-
function
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
} else {
|
|
46
|
-
fs.rmSync(targetSkillsDir, { recursive: true, force: true });
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function ensureKiloConfig(kiloJsonPath, kiloSkillsDir, kiloThemesDir, kiloCommandsDir) {
|
|
52
|
-
if (!fs.existsSync(kiloSkillsDir)) {
|
|
53
|
-
fs.mkdirSync(kiloSkillsDir, { recursive: true });
|
|
54
|
-
}
|
|
55
|
-
if (!fs.existsSync(kiloThemesDir)) {
|
|
56
|
-
fs.mkdirSync(kiloThemesDir, { recursive: true });
|
|
57
|
-
}
|
|
58
|
-
if (!fs.existsSync(kiloCommandsDir)) {
|
|
59
|
-
fs.mkdirSync(kiloCommandsDir, { recursive: true });
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const srcSkills = path.join(sourceDir, 'skills');
|
|
63
|
-
if (fs.existsSync(srcSkills)) {
|
|
64
|
-
copyRecursiveSync(srcSkills, kiloSkillsDir);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
let kiloConfig = {};
|
|
68
|
-
if (fs.existsSync(kiloJsonPath)) {
|
|
69
|
-
try {
|
|
70
|
-
kiloConfig = JSON.parse(fs.readFileSync(kiloJsonPath, 'utf8'));
|
|
71
|
-
} catch (e) {
|
|
72
|
-
kiloConfig = {};
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const skillPaths = [kiloSkillsDir];
|
|
77
|
-
if (!kiloConfig.skills || typeof kiloConfig.skills !== 'object' || !Array.isArray(kiloConfig.skills.paths)) {
|
|
78
|
-
kiloConfig.skills = { paths: skillPaths };
|
|
79
|
-
} else {
|
|
80
|
-
const exists = kiloConfig.skills.paths.some(p => path.resolve(p) === path.resolve(kiloSkillsDir));
|
|
81
|
-
if (!exists) {
|
|
82
|
-
kiloConfig.skills.paths = [...kiloConfig.skills.paths, ...skillPaths];
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
fs.writeFileSync(kiloJsonPath, JSON.stringify(kiloConfig, null, 2) + '\n');
|
|
87
|
-
return kiloJsonPath;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function parseArgs() {
|
|
91
|
-
const args = process.argv.slice(2);
|
|
92
|
-
const parsed = { ide: null, scope: null };
|
|
93
|
-
for (const arg of args) {
|
|
94
|
-
if (arg.startsWith('--ide=')) parsed.ide = arg.split('=')[1];
|
|
95
|
-
if (arg.startsWith('--scope=')) parsed.scope = arg.split('=')[1];
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const aliasMap = {
|
|
99
|
-
'antigravity': '4',
|
|
100
|
-
'gemini': '4',
|
|
101
|
-
'cursor': '1',
|
|
102
|
-
'windsurf': '2',
|
|
103
|
-
'claude': '3',
|
|
104
|
-
'cliner': '3',
|
|
105
|
-
'roo': '3',
|
|
106
|
-
'codex': '5',
|
|
107
|
-
'kilo': '6',
|
|
108
|
-
'multi-ide': '7',
|
|
109
|
-
'all': '7'
|
|
46
|
+
function runInstall(ideChoice, scopeChoice) {
|
|
47
|
+
const mapIde = {
|
|
48
|
+
'1': 'cursor',
|
|
49
|
+
'2': 'windsurf',
|
|
50
|
+
'3': 'cline',
|
|
51
|
+
'4': 'antigravity',
|
|
52
|
+
'5': 'codex',
|
|
53
|
+
'6': 'kilo',
|
|
54
|
+
'7': 'multi-ide'
|
|
110
55
|
};
|
|
111
56
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
if (args.includes('--antigravity')) {
|
|
117
|
-
parsed.ide = '4';
|
|
118
|
-
if (!parsed.scope) parsed.scope = '2';
|
|
119
|
-
}
|
|
120
|
-
if (args.includes('--cursor')) {
|
|
121
|
-
parsed.ide = '1';
|
|
122
|
-
if (!parsed.scope) parsed.scope = '2';
|
|
123
|
-
}
|
|
124
|
-
if (args.includes('--kilo')) {
|
|
125
|
-
parsed.ide = '6';
|
|
126
|
-
if (!parsed.scope) parsed.scope = '2';
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return parsed;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function runInstall(ideCode, answerScope) {
|
|
133
|
-
let isGemini = false;
|
|
134
|
-
let isKilo = false;
|
|
135
|
-
let isMultiIde = false;
|
|
136
|
-
let ruleFileName = null;
|
|
137
|
-
|
|
138
|
-
switch(ideCode) {
|
|
139
|
-
case '1': ruleFileName = '.cursorrules'; break;
|
|
140
|
-
case '2': ruleFileName = '.windsurfrules'; break;
|
|
141
|
-
case '3': ruleFileName = '.clinerules'; break;
|
|
142
|
-
case '4': isGemini = true; break;
|
|
143
|
-
case '5': ruleFileName = '.codexrules'; break;
|
|
144
|
-
case '6': ruleFileName = '.kilorules'; isKilo = true; break;
|
|
145
|
-
case '7': isMultiIde = true; ruleFileName = null; break;
|
|
146
|
-
case '0': default: break;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const isGlobal = answerScope.trim() === '2';
|
|
57
|
+
const mapScope = {
|
|
58
|
+
'1': 'local',
|
|
59
|
+
'2': 'global'
|
|
60
|
+
};
|
|
150
61
|
|
|
151
|
-
const
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
let ruleFilePath = null;
|
|
155
|
-
let baseFolderForPrompt = '';
|
|
156
|
-
let kiloJsonPath = null;
|
|
157
|
-
let kiloSkillsDir = null;
|
|
158
|
-
let kiloThemesDir = null;
|
|
159
|
-
let kiloCommandsDir = null;
|
|
62
|
+
const ide = mapIde[ideChoice] || ideChoice;
|
|
63
|
+
const scope = mapScope[scopeChoice] || scopeChoice;
|
|
64
|
+
const isGlobal = scope === 'global';
|
|
160
65
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if (
|
|
166
|
-
|
|
167
|
-
kiloThemesDir = path.join(cwd, '.kilo', 'themes');
|
|
168
|
-
kiloCommandsDir = path.join(cwd, '.kilo', 'command');
|
|
169
|
-
kiloJsonPath = path.join(cwd, 'kilo.json');
|
|
170
|
-
}
|
|
171
|
-
} else if (isGemini) {
|
|
172
|
-
if (isGlobal) {
|
|
173
|
-
targetDir = path.join(homeDir, '.gemini', 'config');
|
|
174
|
-
ruleFilePath = path.join(targetDir, 'AGENTS.md');
|
|
175
|
-
baseFolderForPrompt = path.join(targetDir, 'skills').replace(/\\/g, '/');
|
|
66
|
+
let targetDir = path.join(cwd, '.agents');
|
|
67
|
+
|
|
68
|
+
if (isGlobal) {
|
|
69
|
+
const homeDir = os.homedir();
|
|
70
|
+
if (ide === 'antigravity') {
|
|
71
|
+
targetDir = path.join(homeDir, '.gemini', 'config', '.agents');
|
|
176
72
|
} else {
|
|
177
|
-
targetDir = path.join(
|
|
178
|
-
ruleFilePath = path.join(cwd, '.agents', 'AGENTS.md');
|
|
179
|
-
baseFolderForPrompt = '.agents/skills';
|
|
180
|
-
}
|
|
181
|
-
} else if (isKilo) {
|
|
182
|
-
if (isGlobal) {
|
|
183
|
-
targetDir = path.join(homeDir, '.qk-ai-skill-os');
|
|
184
|
-
baseFolderForPrompt = targetDir.replace(/\\/g, '/');
|
|
185
|
-
kiloSkillsDir = path.join(homeDir, '.kilo', 'skills');
|
|
186
|
-
kiloThemesDir = path.join(homeDir, '.config', 'kilo', 'themes');
|
|
187
|
-
kiloCommandsDir = path.join(homeDir, '.config', 'kilo', 'command');
|
|
188
|
-
kiloJsonPath = path.join(homeDir, '.config', 'kilo', 'kilo.json');
|
|
189
|
-
} else {
|
|
190
|
-
targetDir = path.join(cwd, '.qk-ai-skill-os');
|
|
191
|
-
baseFolderForPrompt = './.qk-ai-skill-os';
|
|
192
|
-
kiloSkillsDir = path.join(cwd, '.kilo', 'skills');
|
|
193
|
-
kiloThemesDir = path.join(cwd, '.kilo', 'themes');
|
|
194
|
-
kiloCommandsDir = path.join(cwd, '.kilo', 'command');
|
|
195
|
-
kiloJsonPath = path.join(cwd, 'kilo.json');
|
|
196
|
-
}
|
|
197
|
-
ruleFilePath = path.join(cwd, 'CLAUDE.md');
|
|
198
|
-
} else {
|
|
199
|
-
if (isGlobal) {
|
|
200
|
-
targetDir = path.join(homeDir, '.qk-ai-skill-os');
|
|
201
|
-
baseFolderForPrompt = targetDir.replace(/\\/g, '/');
|
|
202
|
-
} else {
|
|
203
|
-
targetDir = path.join(cwd, '.qk-ai-skill-os');
|
|
204
|
-
baseFolderForPrompt = './.qk-ai-skill-os';
|
|
205
|
-
}
|
|
206
|
-
if (ruleFileName) {
|
|
207
|
-
ruleFilePath = path.join(cwd, ruleFileName);
|
|
73
|
+
targetDir = path.join(homeDir, '.ai-developer-skill-os', '.agents');
|
|
208
74
|
}
|
|
209
75
|
}
|
|
210
76
|
|
|
211
|
-
const systemPrompt = `[Role]
|
|
212
|
-
You are an elite AI Software Engineer. You must strictly follow the rules in this project.
|
|
213
|
-
Vui lòng tìm đọc danh sách kỹ năng tại file \`${baseFolderForPrompt}/skills.json\`.
|
|
214
|
-
|
|
215
|
-
[Trigger Mechanism]
|
|
216
|
-
Bất cứ khi nào người dùng gõ lệnh bắt đầu bằng \`./qk-[tên-skill]\`, bạn BẮT BUỘC phải đọc file \`SKILL.md\` tương ứng trong thư mục \`${baseFolderForPrompt}/...\` (hoặc dùng tool view_file để đọc file đó) trước khi làm bất cứ việc gì. Đừng bao giờ đoán mò.
|
|
217
|
-
|
|
218
|
-
[Autonomous Execution & Transparency]
|
|
219
|
-
Khi nhận được lệnh kỹ năng, bạn BẮT BUỘC phải:
|
|
220
|
-
1. Thông báo rõ ràng: "[🚀 AI Developer Skin: Đã kích hoạt kỹ năng <tên-skill>]" ngay dòng đầu tiên.
|
|
221
|
-
2. TỰ ĐỘNG THỰC THI (End-to-End): Dùng các tools của bạn (đọc file, sửa code, chạy lệnh) để tự động hoàn thành 100% mục tiêu được giao. KHÔNG ĐƯỢC dừng lại để hỏi ý kiến trừ khi gặp lỗi chí mạng hoặc requirement quá mập mờ.
|
|
222
|
-
3. BÁO CÁO KẾT QUẢ: Sau khi hoàn tất sửa code, LUÔN trả về báo cáo theo đúng format markdown dưới đây:
|
|
223
|
-
|
|
224
|
-
\`\`\`markdown
|
|
225
|
-
🔧 <Tên Kỹ Năng> Summary
|
|
226
|
-
─────────────────────────────────────────────────
|
|
227
|
-
Scope: [Tóm tắt ngắn gọn phạm vi công việc]
|
|
228
|
-
Changes: [N file modified, N extracted, N removed]
|
|
229
|
-
|
|
230
|
-
Changes applied:
|
|
231
|
-
✅ [Loại hành động 1]: [Chi tiết những gì đã làm, ví dụ: Ngăn chặn lỗi lặp vô hạn...]
|
|
232
|
-
✅ [Loại hành động 2]: [Chi tiết những gì đã làm]
|
|
233
|
-
|
|
234
|
-
📊 Quality improvement:
|
|
235
|
-
Before: [Mô tả ngắn tình trạng trước khi sửa/làm]
|
|
236
|
-
After: [Mô tả sự cải thiện đạt được]
|
|
237
|
-
|
|
238
|
-
✅ Verification:
|
|
239
|
-
Tests: [Trạng thái test (vd: N/A, Pass)]
|
|
240
|
-
Lint/Types:[Trạng thái kiểm tra lỗi (vd: Clean)]
|
|
241
|
-
Behavior: [Kết quả hoạt động (vd: Unchanged, Improved)]
|
|
242
|
-
|
|
243
|
-
⚠️ Notes:
|
|
244
|
-
[Các lưu ý đặc biệt, rủi ro tiềm ẩn hoặc cách người dùng có thể test lại tính năng này]
|
|
245
|
-
\`\`\`
|
|
246
|
-
|
|
247
|
-
[Command Arguments]
|
|
248
|
-
Người dùng có thể truyền thêm tham số vào lệnh (ví dụ: \`./qk-ui-builder --fw=react --css=tailwind\`).
|
|
249
|
-
Nếu người dùng sử dụng tham số (argument), bạn BẮT BUỘC phải tuân thủ tuyệt đối các công nghệ/yêu cầu được chỉ định trong tham số đó thay vì dùng mặc định.`;
|
|
250
|
-
|
|
251
77
|
try {
|
|
78
|
+
console.log(`\n🚀 Đang cài đặt V8.1.4 Agent Engineering OS...`);
|
|
79
|
+
|
|
252
80
|
if (!fs.existsSync(targetDir)) {
|
|
253
81
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
254
82
|
}
|
|
255
83
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
const filesAndFolders = [
|
|
260
|
-
'skills', '_template', 'docs', 'skills.json', 'README.md', 'CHANGELOG.md', 'LICENSE'
|
|
261
|
-
];
|
|
262
|
-
|
|
263
|
-
if (isGemini && isGlobal) {
|
|
264
|
-
if (fs.existsSync(path.join(sourceDir, 'skills'))) {
|
|
265
|
-
copyRecursiveSync(path.join(sourceDir, 'skills'), path.join(targetDir, 'skills'));
|
|
266
|
-
}
|
|
267
|
-
if (fs.existsSync(path.join(sourceDir, 'skills.json'))) {
|
|
268
|
-
fs.copyFileSync(path.join(sourceDir, 'skills.json'), path.join(targetDir, 'skills', 'skills.json'));
|
|
269
|
-
}
|
|
84
|
+
if (fs.existsSync(sourceDir)) {
|
|
85
|
+
copyRecursiveSync(sourceDir, targetDir);
|
|
86
|
+
console.log(`✅ Đã copy toàn bộ kiến trúc .agents vào: ${targetDir}`);
|
|
270
87
|
} else {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
let dest = path.join(targetDir, item);
|
|
274
|
-
if (fs.existsSync(src)) {
|
|
275
|
-
copyRecursiveSync(src, dest);
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
if (ruleFilePath) {
|
|
281
|
-
const ruleDir = path.dirname(ruleFilePath);
|
|
282
|
-
if (ruleDir !== cwd && !fs.existsSync(ruleDir)) {
|
|
283
|
-
fs.mkdirSync(ruleDir, { recursive: true });
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
let writeContent = systemPrompt;
|
|
287
|
-
if (isGemini) {
|
|
288
|
-
writeContent = `\n<RULE[ai_skill_os]>\n---\ntrigger: always_on\n---\n${systemPrompt}\n</RULE[ai_skill_os]>\n`;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
if (fs.existsSync(ruleFilePath)) {
|
|
292
|
-
const existingContent = fs.readFileSync(ruleFilePath, 'utf8');
|
|
293
|
-
const marker = isGemini ? '<RULE[ai_skill_os]>' : '[Role]\nYou are an elite AI Software Engineer.';
|
|
294
|
-
const markerIndex = existingContent.indexOf(marker);
|
|
295
|
-
if (markerIndex !== -1) {
|
|
296
|
-
const before = existingContent.substring(0, markerIndex);
|
|
297
|
-
const after = existingContent.substring(markerIndex).split('\n').slice(isGemini ? 2 : 1).join('\n');
|
|
298
|
-
const lastMarkerEnd = after.indexOf(isGemini ? '</RULE[ai_skill_os]>' : '[Trigger Mechanism]');
|
|
299
|
-
const actualAfter = lastMarkerEnd !== -1 ? after.substring(lastMarkerEnd + (isGemini ? 19 : 18)).trimStart() : after;
|
|
300
|
-
fs.writeFileSync(ruleFilePath, before + writeContent.trimStart() + (actualAfter ? '\n' + actualAfter : '') + '\n');
|
|
301
|
-
console.log(`✅ Đã CẬP NHẬT cấu hình tự động trong file: ${ruleFilePath}`);
|
|
302
|
-
} else {
|
|
303
|
-
fs.appendFileSync(ruleFilePath, "\n\n" + writeContent);
|
|
304
|
-
console.log(`✅ Đã GHI THÊM cấu hình tự động vào file: ${ruleFilePath}`);
|
|
305
|
-
}
|
|
306
|
-
} else {
|
|
307
|
-
fs.writeFileSync(ruleFilePath, writeContent);
|
|
308
|
-
console.log(`✅ Đã TẠO MỚI file cấu hình: ${ruleFilePath}`);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
if (isKilo) {
|
|
313
|
-
ensureKiloConfig(kiloJsonPath, kiloSkillsDir, kiloThemesDir, kiloCommandsDir);
|
|
314
|
-
console.log(`✅ Đã cấu hình Kilo Code tại: ${kiloJsonPath}`);
|
|
315
|
-
console.log(` → Skills: ${kiloSkillsDir}`);
|
|
316
|
-
console.log(` → Themes: ${kiloThemesDir}`);
|
|
317
|
-
console.log(` → Commands: ${kiloCommandsDir}`);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
if (isMultiIde) {
|
|
321
|
-
if (kiloJsonPath && kiloSkillsDir) {
|
|
322
|
-
ensureKiloConfig(kiloJsonPath, kiloSkillsDir, kiloThemesDir, kiloCommandsDir);
|
|
323
|
-
console.log(`✅ Đã cấu hình Kilo Code (Multi-IDE) tại: ${kiloJsonPath}`);
|
|
324
|
-
console.log(` → Skills: ${kiloSkillsDir}`);
|
|
325
|
-
console.log(` → Themes: ${kiloThemesDir}`);
|
|
326
|
-
console.log(` → Commands: ${kiloCommandsDir}`);
|
|
327
|
-
} else if (ruleFilePath) {
|
|
328
|
-
console.log(`✅ Đã tạo file cấu hình Multi-IDE: ${ruleFilePath}`);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
console.log(`\n🎉 HOÀN TẤT! Dữ liệu kỹ năng đã được lưu tại: ${targetDir}`);
|
|
333
|
-
if (isGlobal && !isGemini) {
|
|
334
|
-
const name = ruleFilePath ? path.basename(ruleFilePath) : 'CLAUDE.md';
|
|
335
|
-
console.log(`💡 Lưu ý: Kỹ năng đã được cài ở cấp độ máy tính (Global). File cấu hình cục bộ (${name}) ở dự án này đang trỏ thẳng về thư mục Global đó.`);
|
|
336
|
-
} else if (isGlobal && isGemini) {
|
|
337
|
-
console.log(`💡 Lưu ý: Antigravity đã được cài Global. Từ nay bạn mở BẤT KỲ DỰ ÁN NÀO trên máy tính này, Antigravity cũng sẽ tự động có đủ 22 kỹ năng mà không cần cài lại!`);
|
|
338
|
-
} else if (isKilo) {
|
|
339
|
-
console.log(`💡 Lưu ý: Kilo Code đã sẵn sàng. Dùng \`<leader>t\` hoặc \`/themes\` để xem, và \`/skills\` để xem danh sách skill đã cài.`);
|
|
88
|
+
console.error(`❌ Lỗi: Không tìm thấy thư mục nguồn ${sourceDir}`);
|
|
89
|
+
return;
|
|
340
90
|
}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
}
|
|
91
|
+
|
|
92
|
+
console.log(`\n🎉 HOÀN TẤT! Kiến trúc V8.1.4 đã sẵn sàng tại: ${targetDir}`);
|
|
93
|
+
|
|
94
|
+
if (isGlobal && ide === 'antigravity') {
|
|
95
|
+
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!`);
|
|
347
96
|
}
|
|
348
97
|
|
|
349
98
|
} catch (error) {
|
|
@@ -353,10 +102,10 @@ Nếu người dùng sử dụng tham số (argument), bạn BẮT BUỘC phải
|
|
|
353
102
|
|
|
354
103
|
const args = parseArgs();
|
|
355
104
|
|
|
356
|
-
if (args.ide
|
|
105
|
+
if (args.ide && args.scope) {
|
|
357
106
|
runInstall(args.ide, args.scope);
|
|
358
107
|
} else {
|
|
359
|
-
console.log('🚀 Đang chuẩn bị cài đặt AI Developer Skill OS...\n');
|
|
108
|
+
console.log('🚀 Đang chuẩn bị cài đặt AI Developer Skill OS V8...\n');
|
|
360
109
|
|
|
361
110
|
const questionIde = `Vui lòng chọn IDE/AI Assistant bạn đang sử dụng:
|
|
362
111
|
(1) Cursor
|
|
@@ -366,9 +115,8 @@ if (args.ide !== null && args.scope !== null) {
|
|
|
366
115
|
(5) Codex
|
|
367
116
|
(6) Kilo Code
|
|
368
117
|
(7) Tất cả các IDE (Multi-IDE)
|
|
369
|
-
(0) Bỏ qua (Không tạo config tự động)
|
|
370
118
|
|
|
371
|
-
Nhập số (
|
|
119
|
+
Nhập số (1-7): `;
|
|
372
120
|
|
|
373
121
|
const questionScope = `
|
|
374
122
|
Bạn muốn cài đặt bộ kỹ năng ở đâu?
|
package/package.json
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-developer-skill-os",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "8.1.4",
|
|
4
|
+
"description": "Agent Engineering OS Framework with Design Intelligence, AI coding agents (Claude, Cursor, Windsurf, Antigravity) with 30 Master Skills.",
|
|
5
5
|
"main": "bin/install.js",
|
|
6
|
+
"files": [
|
|
7
|
+
"bin",
|
|
8
|
+
".agents",
|
|
9
|
+
"tooling",
|
|
10
|
+
"package.json",
|
|
11
|
+
"README.md",
|
|
12
|
+
"CHANGELOG.md"
|
|
13
|
+
],
|
|
6
14
|
"bin": {
|
|
7
15
|
"ai-developer-skill-os": "bin/install.js",
|
|
8
16
|
"ai-skill": "bin/install.js"
|
|
@@ -15,7 +23,10 @@
|
|
|
15
23
|
"test": "vitest run",
|
|
16
24
|
"test:watch": "vitest",
|
|
17
25
|
"test:registry": "vitest run --config vitest.config.js",
|
|
26
|
+
"test:graph": "node tooling/validate-graph.js",
|
|
18
27
|
"lint": "node bin/lint.js",
|
|
28
|
+
"test:agent": "node tests/agent-evaluation/runner/evaluate-routing.js",
|
|
29
|
+
"generate:evaluation": "node tooling/generate-evaluation-cases.cjs",
|
|
19
30
|
"install:antigravity": "node bin/install.js --ide=antigravity --scope=2",
|
|
20
31
|
"install:antigravity:local": "node bin/install.js --ide=antigravity --scope=1",
|
|
21
32
|
"install:cursor": "node bin/install.js --ide=cursor --scope=2",
|
|
@@ -52,4 +63,4 @@
|
|
|
52
63
|
"gray-matter": "^4.0.0",
|
|
53
64
|
"js-yaml": "^4.1.0"
|
|
54
65
|
}
|
|
55
|
-
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
const cases = [
|
|
5
|
+
{ path: 'routing/frontend.yml', id: 'frontend-001', input: 'App React 100 pages tổ chức thế nào?', skill: 'qk-frontend-architecture', forbidden: ['qk-ui-builder'] },
|
|
6
|
+
{ path: 'routing/backend.yml', id: 'backend-001', input: 'Viết middleware auth cho API', skill: 'qk-access-policy', forbidden: ['qk-api-lifecycle'] },
|
|
7
|
+
{ path: 'routing/security.yml', id: 'sec-001', input: 'Kiểm tra xem thư viện có lỗi bảo mật không', skill: 'qk-security-audit', forbidden: ['qk-validation-gate'] },
|
|
8
|
+
{ path: 'routing/devops.yml', id: 'devops-001', input: 'Thiết lập pipeline github actions', skill: 'qk-devops-platform', forbidden: ['qk-production-release'] },
|
|
9
|
+
{ path: 'boundary/design-system-conflict.yml', id: 'bound-001', input: 'Tạo màu và typography cho thương hiệu mới', skill: 'qk-design-system-engineering', forbidden: ['qk-ui-system-builder'] },
|
|
10
|
+
{ path: 'boundary/ui-builder-conflict.yml', id: 'bound-002', input: 'Code nút bấm màu đỏ theo thiết kế figma', skill: 'qk-ui-builder', forbidden: ['qk-design-system-engineering', 'qk-frontend-architecture'] },
|
|
11
|
+
{ path: 'boundary/test-strategy-conflict.yml', id: 'bound-003', input: 'Lên chiến lược viết test cho app e-commerce', skill: 'qk-test-engineering', forbidden: ['qk-validation-gate'] },
|
|
12
|
+
{ path: 'boundary/spec-conflict.yml', id: 'bound-004', input: 'Viết tiêu chí nghiệm thu cho tính năng giỏ hàng', skill: 'qk-product-specification', forbidden: ['qk-feature-delivery'] },
|
|
13
|
+
{ path: 'boundary/architecture-conflict.yml', id: 'bound-005', input: 'Chia nhỏ component React cho dễ bảo trì', skill: 'qk-frontend-architecture', forbidden: ['qk-ui-builder'] },
|
|
14
|
+
{ path: 'workflow/spec-to-code.yml', id: 'wf-001', input: 'Từ ý tưởng app chat, viết spec xong mới làm', skill: 'qk-product-specification', forbidden: ['qk-feature-delivery'] },
|
|
15
|
+
{ path: 'workflow/release-gate.yml', id: 'wf-002', input: 'Đóng gói app nhưng nhớ check bảo mật trước', skill: 'qk-validation-gate', forbidden: ['qk-production-release'] },
|
|
16
|
+
{ path: 'workflow/security-pipeline.yml', id: 'wf-003', input: 'Quét hệ thống trước khi deploy', skill: 'qk-security-audit', forbidden: ['qk-production-release'] },
|
|
17
|
+
{ path: 'regression/legacy-routing.yml', id: 'reg-001', input: 'Danh sách lệnh', skill: 'qk-orchestrator', forbidden: ['qk-help'] },
|
|
18
|
+
{ path: 'regression/db-optimize.yml', id: 'reg-002', input: 'Câu query chậm', skill: 'qk-db-optimizer', forbidden: ['qk-bug-resolution'] },
|
|
19
|
+
{ path: 'regression/health-check.yml', id: 'reg-003', input: 'Code nợ kỹ thuật nhiều quá', skill: 'qk-project-health', forbidden: ['qk-engineering-standard'] }
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
cases.forEach(c => {
|
|
23
|
+
const content = `case:
|
|
24
|
+
id: ${c.id}
|
|
25
|
+
input:
|
|
26
|
+
"${c.input}"
|
|
27
|
+
candidates:
|
|
28
|
+
- skill: ${c.skill}
|
|
29
|
+
score: 0.92
|
|
30
|
+
- skill: ${c.forbidden[0] || 'qk-validation-gate'}
|
|
31
|
+
score: 0.55
|
|
32
|
+
decision:
|
|
33
|
+
selected:
|
|
34
|
+
${c.skill}
|
|
35
|
+
rejected:
|
|
36
|
+
${c.forbidden.map(f => ` - skill: ${f}\n reason: "outside boundary or conflict"`).join('\n')}
|
|
37
|
+
conflict_policy:
|
|
38
|
+
severity: ${c.path.includes('boundary') ? 'critical' : (c.path.includes('routing') ? 'warning' : 'high')}
|
|
39
|
+
action: ${c.path.includes('boundary') ? 'block' : (c.path.includes('routing') ? 'continue_with_notice' : 'require_confirmation')}
|
|
40
|
+
expected_message: "Conflict detected in ${c.id}"
|
|
41
|
+
`;
|
|
42
|
+
fs.writeFileSync(path.join('tests/agent-evaluation/cases', c.path), content);
|
|
43
|
+
});
|
|
44
|
+
console.log('15 test cases regenerated with conflict_policy.');
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generate-registry.js
|
|
3
|
+
* Generates registry/skills-index.yml and registry/capability-graph.yml
|
|
4
|
+
*
|
|
5
|
+
* Usage: node tooling/generate-registry.js
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import yaml from 'js-yaml';
|
|
12
|
+
|
|
13
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
|
|
15
|
+
const SKILLS_DIR = path.join(__dirname, '../.agents/skills');
|
|
16
|
+
const INDEX_FILE = path.join(__dirname, '../.agents/registry/skills-index.yml');
|
|
17
|
+
const GRAPH_FILE = path.join(__dirname, '../.agents/registry/capability-graph.yml');
|
|
18
|
+
|
|
19
|
+
function parseFrontmatter(content) {
|
|
20
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
21
|
+
if (!match) return null;
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
return yaml.load(match[1]);
|
|
25
|
+
} catch (e) {
|
|
26
|
+
console.error('YAML parse error:', e.message);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function generate() {
|
|
32
|
+
const skills = [];
|
|
33
|
+
|
|
34
|
+
if (!fs.existsSync(SKILLS_DIR)) {
|
|
35
|
+
console.error('Skills directory not found:', SKILLS_DIR);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const skillDirs = fs.readdirSync(SKILLS_DIR)
|
|
40
|
+
.filter(d => !d.startsWith('_') && fs.statSync(path.join(SKILLS_DIR, d)).isDirectory());
|
|
41
|
+
|
|
42
|
+
for (const dir of skillDirs) {
|
|
43
|
+
const skillFile = path.join(SKILLS_DIR, dir, 'SKILL.md');
|
|
44
|
+
if (!fs.existsSync(skillFile)) continue;
|
|
45
|
+
|
|
46
|
+
const content = fs.readFileSync(skillFile, 'utf8');
|
|
47
|
+
const meta = parseFrontmatter(content);
|
|
48
|
+
if (!meta || !meta.name) continue;
|
|
49
|
+
|
|
50
|
+
// Default legacy if not marked stable
|
|
51
|
+
if (!meta.status && meta.version && meta.version.startsWith('8.')) {
|
|
52
|
+
meta.status = 'stable';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Schema Validation Enforcement
|
|
56
|
+
if (meta.status === 'stable' && meta.version && meta.version.startsWith('8.')) {
|
|
57
|
+
if (!meta.intent || !meta.workflow || !meta.verification || !meta.selection) {
|
|
58
|
+
console.warn(`[WARN] Rejecting ${meta.name} (v8): Missing required schema fields`);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
skills.push(meta);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// 1. Generate skills-index.yml (Backward compatibility)
|
|
67
|
+
const indexData = {
|
|
68
|
+
version: "8.1.1",
|
|
69
|
+
generated_at: new Date().toISOString(),
|
|
70
|
+
total_skills: skills.length,
|
|
71
|
+
skills: skills.map(s => ({
|
|
72
|
+
name: s.name,
|
|
73
|
+
version: s.version || "8.0.0",
|
|
74
|
+
status: s.status || "legacy",
|
|
75
|
+
description: s.description || "",
|
|
76
|
+
complexity: s.complexity?.level || "medium",
|
|
77
|
+
workflow: s.workflow || null,
|
|
78
|
+
triggers: s.triggers || [],
|
|
79
|
+
intent: s.intent || []
|
|
80
|
+
}))
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
fs.mkdirSync(path.dirname(INDEX_FILE), { recursive: true });
|
|
84
|
+
fs.writeFileSync(INDEX_FILE, `# registry/skills-index.yml\n# GENERATED FILE — DO NOT EDIT MANUALLY\n` + yaml.dump(indexData, { indent: 2 }), 'utf8');
|
|
85
|
+
|
|
86
|
+
// 2. Generate capability-graph.yml (V8.1.1)
|
|
87
|
+
const nodes = {};
|
|
88
|
+
const edges = [];
|
|
89
|
+
|
|
90
|
+
for (const s of skills) {
|
|
91
|
+
nodes[s.name] = {
|
|
92
|
+
type: s.type || 'capability',
|
|
93
|
+
maturity: s.status || 'legacy',
|
|
94
|
+
owns: s.decision_boundary?.owns || [],
|
|
95
|
+
does_not_own: s.decision_boundary?.does_not_own || [],
|
|
96
|
+
conflicts: s.decision_boundary?.conflicts_with || [],
|
|
97
|
+
workflow: s.workflow || null
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
if (s.workflow) {
|
|
101
|
+
edges.push({
|
|
102
|
+
from: s.name,
|
|
103
|
+
to: s.workflow,
|
|
104
|
+
relation: 'depends_on'
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (s.decision_boundary?.conflicts_with) {
|
|
109
|
+
for (const conflict of s.decision_boundary.conflicts_with) {
|
|
110
|
+
edges.push({
|
|
111
|
+
from: s.name,
|
|
112
|
+
to: conflict,
|
|
113
|
+
relation: 'conflicts_with'
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (s.decision_boundary?.delegates_to) {
|
|
119
|
+
for (const delegate of s.decision_boundary.delegates_to) {
|
|
120
|
+
edges.push({
|
|
121
|
+
from: s.name,
|
|
122
|
+
to: delegate,
|
|
123
|
+
relation: 'delegates_to'
|
|
124
|
+
});
|
|
125
|
+
// Derive reverse relation 'implemented_by'
|
|
126
|
+
edges.push({
|
|
127
|
+
from: delegate,
|
|
128
|
+
to: s.name,
|
|
129
|
+
relation: 'implemented_by'
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (s.related_skills) {
|
|
135
|
+
for (const related of s.related_skills) {
|
|
136
|
+
edges.push({
|
|
137
|
+
from: s.name,
|
|
138
|
+
to: related,
|
|
139
|
+
relation: 'feeds'
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const graphData = {
|
|
146
|
+
version: "8.1.3",
|
|
147
|
+
generated_at: new Date().toISOString(),
|
|
148
|
+
nodes,
|
|
149
|
+
edges
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
fs.writeFileSync(GRAPH_FILE, `# registry/capability-graph.yml\n# GENERATED FILE — DO NOT EDIT MANUALLY\n` + yaml.dump(graphData, { indent: 2 }), 'utf8');
|
|
153
|
+
|
|
154
|
+
console.log(`✅ Generated registry index and capability graph with ${skills.length} skills`);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
generate();
|