@givolt/i3-composer-agent 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +1 -1
- package/.claude/commands/{build.md → i3-build.md} +10 -10
- package/.claude/commands/{code-simplify.md → i3-code-simplify.md} +2 -2
- package/.claude/commands/{constraints.md → i3-constraints.md} +4 -4
- package/.claude/commands/{plan.md → i3-plan.md} +1 -1
- package/.claude/commands/{review.md → i3-review.md} +3 -3
- package/.claude/commands/{ship.md → i3-ship.md} +4 -4
- package/.claude/commands/{spec.md → i3-spec.md} +1 -1
- package/.claude/commands/{test.md → i3-test.md} +2 -2
- package/.claude/commands/{webperf.md → i3-webperf.md} +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.gemini/commands/{build.toml → i3-build.toml} +10 -10
- package/.gemini/commands/{code-simplify.toml → i3-code-simplify.toml} +2 -2
- package/.gemini/commands/{constraints.toml → i3-constraints.toml} +4 -4
- package/.gemini/commands/{planning.toml → i3-planning.toml} +1 -1
- package/{commands/review.toml → .gemini/commands/i3-review.toml} +3 -3
- package/.gemini/commands/{ship.toml → i3-ship.toml} +4 -4
- package/.gemini/commands/{spec.toml → i3-spec.toml} +1 -1
- package/{commands/test.toml → .gemini/commands/i3-test.toml} +2 -2
- package/.gemini/commands/{webperf.toml → i3-webperf.toml} +1 -1
- package/CHANGELOG.md +29 -1
- package/NOTICE.md +8 -2
- package/README.md +98 -54
- package/agents/code-reviewer.md +2 -2
- package/agents/security-auditor.md +1 -1
- package/agents/test-engineer.md +1 -1
- package/agents/web-performance-auditor.md +3 -3
- package/bin/agent-targets.json +726 -0
- package/bin/i3-composer-agent.cjs +84 -16
- package/bin/install.cjs +180 -0
- package/bin/skills-registry.LICENSE +21 -0
- package/bin/wizard.cjs +66 -0
- package/commands/{build.toml → i3-build.toml} +10 -10
- package/commands/{code-simplify.toml → i3-code-simplify.toml} +2 -2
- package/commands/{constraints.toml → i3-constraints.toml} +4 -4
- package/commands/{planning.toml → i3-planning.toml} +1 -1
- package/{.gemini/commands/review.toml → commands/i3-review.toml} +3 -3
- package/commands/{ship.toml → i3-ship.toml} +4 -4
- package/commands/{spec.toml → i3-spec.toml} +1 -1
- package/{.gemini/commands/test.toml → commands/i3-test.toml} +2 -2
- package/commands/{webperf.toml → i3-webperf.toml} +1 -1
- package/docs/adoption-guide.md +35 -35
- package/docs/agents.md +12 -12
- package/docs/antigravity-setup.md +14 -14
- package/docs/codebuddy-setup.md +64 -16
- package/docs/codex-setup.md +17 -6
- package/docs/commandcode-setup.md +5 -5
- package/docs/copilot-cli-setup.md +5 -5
- package/docs/copilot-setup.md +22 -22
- package/docs/cursor-setup.md +20 -20
- package/docs/developer-onboarding.md +5 -5
- package/docs/gemini-cli-setup.md +26 -26
- package/docs/getting-started.md +36 -36
- package/docs/opencode-setup.md +27 -27
- package/docs/skill-anatomy.md +3 -3
- package/docs/windsurf-setup.md +7 -7
- package/evals/cases/{api-and-interface-design.json → i3-api-and-interface-design.json} +4 -4
- package/evals/cases/{browser-testing-with-devtools.json → i3-browser-testing-with-devtools.json} +4 -4
- package/evals/cases/{ci-cd-and-automation.json → i3-ci-cd-and-automation.json} +4 -4
- package/evals/cases/{code-review-and-quality.json → i3-code-review-and-quality.json} +4 -4
- package/evals/cases/{code-simplification.json → i3-code-simplification.json} +4 -4
- package/evals/cases/{constraint-driven-development.json → i3-constraint-driven-development.json} +4 -4
- package/evals/cases/{context-engineering.json → i3-context-engineering.json} +4 -4
- package/evals/cases/{debugging-and-error-recovery.json → i3-debugging-and-error-recovery.json} +5 -5
- package/evals/cases/{deprecation-and-migration.json → i3-deprecation-and-migration.json} +4 -4
- package/evals/cases/{documentation-and-adrs.json → i3-documentation-and-adrs.json} +4 -4
- package/evals/cases/{doubt-driven-development.json → i3-doubt-driven-development.json} +3 -3
- package/evals/cases/{frontend-ui-engineering.json → i3-frontend-ui-engineering.json} +4 -4
- package/evals/cases/{git-workflow-and-versioning.json → i3-git-workflow-and-versioning.json} +3 -3
- package/evals/cases/{idea-refine.json → i3-idea-refine.json} +3 -3
- package/evals/cases/{incremental-implementation.json → i3-incremental-implementation.json} +4 -4
- package/evals/cases/{interview-me.json → i3-interview-me.json} +3 -3
- package/evals/cases/{observability-and-instrumentation.json → i3-observability-and-instrumentation.json} +3 -3
- package/evals/cases/{performance-optimization.json → i3-performance-optimization.json} +4 -4
- package/evals/cases/{planning-and-task-breakdown.json → i3-planning-and-task-breakdown.json} +4 -4
- package/evals/cases/{security-and-hardening.json → i3-security-and-hardening.json} +4 -4
- package/evals/cases/{shipping-and-launch.json → i3-shipping-and-launch.json} +4 -4
- package/evals/cases/{source-driven-development.json → i3-source-driven-development.json} +4 -4
- package/evals/cases/{spec-driven-development.json → i3-spec-driven-development.json} +5 -5
- package/evals/cases/{test-driven-development.json → i3-test-driven-development.json} +5 -5
- package/evals/cases/{using-agent-skills.json → i3-using-agent-skills.json} +4 -4
- package/evals/fixtures/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/.eval/working-tree.patch +3 -3
- package/evals/plugin/code-review-fires/graders/skill-fired.md +1 -1
- package/evals/plugin/code-review-stays-quiet/graders/not-fired.md +1 -1
- package/evals/plugin/code-review-stays-quiet/graders/tdd-fired.md +1 -1
- package/evals/plugin/code-review-stays-quiet/prompt.md +2 -2
- package/evals/plugin/code-review-stays-quiet-on-commit-message/graders/not-fired.md +1 -1
- package/evals/plugin/code-review-stays-quiet-on-commit-message/prompt.md +2 -2
- package/hooks/SDD-CACHE.md +3 -3
- package/hooks/SIMPLIFY-IGNORE.md +2 -2
- package/hooks/session-start-test.sh +1 -1
- package/hooks/session-start.sh +3 -3
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/rebrand/INSTALLATION-SPEC.md +47 -0
- package/rebrand/MAINTENANCE.md +5 -3
- package/rebrand/NOTICE.md +8 -2
- package/rebrand/PREFIX-SPEC.md +16 -0
- package/rebrand/UNIFICATION-SPEC.md +2 -2
- package/rebrand/VALIDATION.md +6 -2
- package/rebrand/VERSIONING.md +8 -5
- package/rebrand/apply.cjs +33 -10
- package/rebrand/brand.json +1 -1
- package/rebrand/catalog.cjs +16 -2
- package/rebrand/fork-patches.json +15 -0
- package/rebrand/identifiers.cjs +41 -0
- package/rebrand/overlay/CHANGELOG.md +29 -1
- package/rebrand/overlay/bin/agent-targets.json +726 -0
- package/rebrand/overlay/bin/i3-composer-agent.cjs +84 -16
- package/rebrand/overlay/bin/install.cjs +180 -0
- package/rebrand/overlay/bin/skills-registry.LICENSE +21 -0
- package/rebrand/overlay/bin/wizard.cjs +66 -0
- package/rebrand/overlay/scripts/validate-brand.cjs +3 -3
- package/rebrand/overlay/tests/installer.test.cjs +241 -0
- package/rebrand/templates/README.md +62 -18
- package/rebrand/templates/codebuddy-setup.md +64 -16
- package/rebrand/templates/codex-setup.md +17 -6
- package/rebrand/tests/pipeline.test.cjs +71 -3
- package/references/accessibility-checklist.md +1 -1
- package/references/definition-of-done.md +7 -7
- package/references/observability-checklist.md +3 -3
- package/references/orchestration-patterns.md +17 -17
- package/references/performance-checklist.md +2 -2
- package/references/security-checklist.md +1 -1
- package/references/testing-patterns.md +1 -1
- package/scripts/floor-guard-reference-test.js +2 -2
- package/scripts/lib/skill-lint.js +2 -0
- package/scripts/run-evals-test.js +2 -2
- package/scripts/validate-artifact-paths-test.js +3 -3
- package/scripts/validate-artifact-paths.js +4 -2
- package/scripts/validate-brand.cjs +3 -3
- package/scripts/validate-commands.js +1 -0
- package/scripts/validate-reference-links-test.js +11 -11
- package/scripts/validate-reference-links.js +1 -1
- package/skills/{api-and-interface-design → i3-api-and-interface-design}/SKILL.md +2 -2
- package/skills/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/SKILL.md +1 -1
- package/skills/{ci-cd-and-automation → i3-ci-cd-and-automation}/SKILL.md +2 -2
- package/skills/{code-review-and-quality → i3-code-review-and-quality}/SKILL.md +5 -5
- package/skills/{code-simplification → i3-code-simplification}/SKILL.md +1 -1
- package/skills/{constraint-driven-development → i3-constraint-driven-development}/SKILL.md +15 -15
- package/skills/{context-engineering → i3-context-engineering}/SKILL.md +1 -1
- package/skills/{debugging-and-error-recovery → i3-debugging-and-error-recovery}/SKILL.md +2 -2
- package/skills/{deprecation-and-migration → i3-deprecation-and-migration}/SKILL.md +2 -2
- package/skills/{documentation-and-adrs → i3-documentation-and-adrs}/SKILL.md +1 -1
- package/skills/{doubt-driven-development → i3-doubt-driven-development}/SKILL.md +8 -8
- package/skills/{frontend-ui-engineering → i3-frontend-ui-engineering}/SKILL.md +1 -1
- package/skills/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/SKILL.md +4 -4
- package/skills/{idea-refine → i3-idea-refine}/SKILL.md +2 -2
- package/skills/{idea-refine → i3-idea-refine}/scripts/idea-refine.sh +1 -1
- package/skills/{incremental-implementation → i3-incremental-implementation}/SKILL.md +3 -3
- package/skills/{interview-me → i3-interview-me}/SKILL.md +12 -12
- package/skills/{observability-and-instrumentation → i3-observability-and-instrumentation}/SKILL.md +5 -5
- package/skills/{performance-optimization → i3-performance-optimization}/SKILL.md +1 -1
- package/skills/{performance-optimization → i3-performance-optimization}/references/optimization-patterns.md +1 -1
- package/skills/{planning-and-task-breakdown → i3-planning-and-task-breakdown}/SKILL.md +2 -2
- package/skills/{security-and-hardening → i3-security-and-hardening}/SKILL.md +3 -3
- package/skills/{security-and-hardening → i3-security-and-hardening}/references/hardening-patterns.md +1 -1
- package/skills/{shipping-and-launch → i3-shipping-and-launch}/SKILL.md +2 -2
- package/skills/{source-driven-development → i3-source-driven-development}/SKILL.md +2 -2
- package/skills/{spec-driven-development → i3-spec-driven-development}/SKILL.md +7 -7
- package/skills/{test-driven-development → i3-test-driven-development}/SKILL.md +2 -2
- package/skills/{using-agent-skills → i3-using-agent-skills}/SKILL.md +67 -67
- package/tests/installer.test.cjs +241 -0
- /package/evals/fixtures/{api-and-interface-design → i3-api-and-interface-design}/service-brief.md +0 -0
- /package/evals/fixtures/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/README.md +0 -0
- /package/evals/fixtures/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/index.html +0 -0
- /package/evals/fixtures/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/server.js +0 -0
- /package/evals/fixtures/{ci-cd-and-automation → i3-ci-cd-and-automation}/package.json +0 -0
- /package/evals/fixtures/{ci-cd-and-automation → i3-ci-cd-and-automation}/src/slug.js +0 -0
- /package/evals/fixtures/{ci-cd-and-automation → i3-ci-cd-and-automation}/test/slug.test.js +0 -0
- /package/evals/fixtures/{code-review-and-quality → i3-code-review-and-quality}/user-search.diff +0 -0
- /package/evals/fixtures/{code-simplification → i3-code-simplification}/config-parser.js +0 -0
- /package/evals/fixtures/{code-simplification → i3-code-simplification}/config-parser.test.js +0 -0
- /package/evals/fixtures/{context-engineering → i3-context-engineering}/context-audit.md +0 -0
- /package/evals/fixtures/{debugging-and-error-recovery → i3-debugging-and-error-recovery}/pagination.js +0 -0
- /package/evals/fixtures/{debugging-and-error-recovery → i3-debugging-and-error-recovery}/pagination.test.js +0 -0
- /package/evals/fixtures/{debugging-and-error-recovery → i3-debugging-and-error-recovery}/time-pressure.md +0 -0
- /package/evals/fixtures/{deprecation-and-migration → i3-deprecation-and-migration}/api-inventory.md +0 -0
- /package/evals/fixtures/{documentation-and-adrs → i3-documentation-and-adrs}/decision-context.md +0 -0
- /package/evals/fixtures/{doubt-driven-development → i3-doubt-driven-development}/migration-plan.md +0 -0
- /package/evals/fixtures/{frontend-ui-engineering → i3-frontend-ui-engineering}/Button.tsx +0 -0
- /package/evals/fixtures/{frontend-ui-engineering → i3-frontend-ui-engineering}/design-system.md +0 -0
- /package/evals/fixtures/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/app.js +0 -0
- /package/evals/fixtures/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/app.test.js +0 -0
- /package/evals/fixtures/{incremental-implementation → i3-incremental-implementation}/reports.js +0 -0
- /package/evals/fixtures/{incremental-implementation → i3-incremental-implementation}/reports.test.js +0 -0
- /package/evals/fixtures/{incremental-implementation → i3-incremental-implementation}/tasks/plan.md +0 -0
- /package/evals/fixtures/{observability-and-instrumentation → i3-observability-and-instrumentation}/operations.md +0 -0
- /package/evals/fixtures/{observability-and-instrumentation → i3-observability-and-instrumentation}/payment-retry.js +0 -0
- /package/evals/fixtures/{performance-optimization → i3-performance-optimization}/benchmark.js +0 -0
- /package/evals/fixtures/{performance-optimization → i3-performance-optimization}/products.js +0 -0
- /package/evals/fixtures/{planning-and-task-breakdown → i3-planning-and-task-breakdown}/notifications-spec.md +0 -0
- /package/evals/fixtures/{security-and-hardening → i3-security-and-hardening}/webhook.js +0 -0
- /package/evals/fixtures/{security-and-hardening → i3-security-and-hardening}/webhook.test.js +0 -0
- /package/evals/fixtures/{shipping-and-launch → i3-shipping-and-launch}/authority-pressure.md +0 -0
- /package/evals/fixtures/{shipping-and-launch → i3-shipping-and-launch}/launch-status.md +0 -0
- /package/evals/fixtures/{source-driven-development → i3-source-driven-development}/framework-task.md +0 -0
- /package/evals/fixtures/{spec-driven-development → i3-spec-driven-development}/billing-brief.md +0 -0
- /package/evals/fixtures/{test-driven-development → i3-test-driven-development}/BUG.md +0 -0
- /package/evals/fixtures/{test-driven-development → i3-test-driven-development}/README.md +0 -0
- /package/evals/fixtures/{test-driven-development → i3-test-driven-development}/package.json +0 -0
- /package/evals/fixtures/{test-driven-development → i3-test-driven-development}/src/split.js +0 -0
- /package/evals/fixtures/{test-driven-development → i3-test-driven-development}/test/split.test.js +0 -0
- /package/evals/fixtures/{using-agent-skills → i3-using-agent-skills}/incident.md +0 -0
- /package/skills/{constraint-driven-development → i3-constraint-driven-development}/references/floor-guard.md +0 -0
- /package/skills/{idea-refine → i3-idea-refine}/examples.md +0 -0
- /package/skills/{idea-refine → i3-idea-refine}/frameworks.md +0 -0
- /package/skills/{idea-refine → i3-idea-refine}/refinement-criteria.md +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: using-agent-skills
|
|
2
|
+
name: i3-using-agent-skills
|
|
3
3
|
description: Discovers and invokes agent skills. Use when starting a session, or when you need to decide which skill or workflow applies to the piece of work at hand. This is the meta-skill that governs how all other skills are discovered and invoked.
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -16,30 +16,30 @@ When a task arrives, identify the development phase and apply the corresponding
|
|
|
16
16
|
```
|
|
17
17
|
Task arrives
|
|
18
18
|
│
|
|
19
|
-
├── Don't know what you want yet? ──────→ interview-me
|
|
20
|
-
├── Have a rough concept, need variants? → idea-refine
|
|
21
|
-
├── New project/feature/change? ──→ spec-driven-development
|
|
22
|
-
├── No quality bar written down? ──→ constraint-driven-development
|
|
23
|
-
├── Have a spec, need tasks? ──────→ planning-and-task-breakdown
|
|
24
|
-
├── Implementing code? ────────────→ incremental-implementation
|
|
25
|
-
│ ├── UI work? ─────────────────→ frontend-ui-engineering
|
|
26
|
-
│ ├── API work? ────────────────→ api-and-interface-design
|
|
27
|
-
│ ├── Need better context? ─────→ context-engineering
|
|
28
|
-
│ ├── Need doc-verified code? ───→ source-driven-development
|
|
29
|
-
│ └── Stakes high / unfamiliar code? ──→ doubt-driven-development
|
|
30
|
-
├── Writing/running tests? ────────→ test-driven-development
|
|
31
|
-
│ └── Browser-based? ───────────→ browser-testing-with-devtools
|
|
32
|
-
├── Something broke? ──────────────→ debugging-and-error-recovery
|
|
33
|
-
├── Reviewing code? ───────────────→ code-review-and-quality
|
|
34
|
-
│ ├── Too complex? ─────────────→ code-simplification
|
|
35
|
-
│ ├── Security concerns? ───────→ security-and-hardening
|
|
36
|
-
│ └── Performance concerns? ────→ performance-optimization
|
|
37
|
-
├── Committing/branching? ─────────→ git-workflow-and-versioning
|
|
38
|
-
├── CI/CD pipeline work? ──────────→ ci-cd-and-automation
|
|
39
|
-
├── Deprecating/migrating? ────────→ deprecation-and-migration
|
|
40
|
-
├── Writing docs/ADRs? ───────────→ documentation-and-adrs
|
|
41
|
-
├── Adding logs/metrics/alerts? ───→ observability-and-instrumentation
|
|
42
|
-
└── Deploying/launching? ─────────→ shipping-and-launch
|
|
19
|
+
├── Don't know what you want yet? ──────→ i3-interview-me
|
|
20
|
+
├── Have a rough concept, need variants? → i3-idea-refine
|
|
21
|
+
├── New project/feature/change? ──→ i3-spec-driven-development
|
|
22
|
+
├── No quality bar written down? ──→ i3-constraint-driven-development
|
|
23
|
+
├── Have a spec, need tasks? ──────→ i3-planning-and-task-breakdown
|
|
24
|
+
├── Implementing code? ────────────→ i3-incremental-implementation
|
|
25
|
+
│ ├── UI work? ─────────────────→ i3-frontend-ui-engineering
|
|
26
|
+
│ ├── API work? ────────────────→ i3-api-and-interface-design
|
|
27
|
+
│ ├── Need better context? ─────→ i3-context-engineering
|
|
28
|
+
│ ├── Need doc-verified code? ───→ i3-source-driven-development
|
|
29
|
+
│ └── Stakes high / unfamiliar code? ──→ i3-doubt-driven-development
|
|
30
|
+
├── Writing/running tests? ────────→ i3-test-driven-development
|
|
31
|
+
│ └── Browser-based? ───────────→ i3-browser-testing-with-devtools
|
|
32
|
+
├── Something broke? ──────────────→ i3-debugging-and-error-recovery
|
|
33
|
+
├── Reviewing code? ───────────────→ i3-code-review-and-quality
|
|
34
|
+
│ ├── Too complex? ─────────────→ i3-code-simplification
|
|
35
|
+
│ ├── Security concerns? ───────→ i3-security-and-hardening
|
|
36
|
+
│ └── Performance concerns? ────→ i3-performance-optimization
|
|
37
|
+
├── Committing/branching? ─────────→ i3-git-workflow-and-versioning
|
|
38
|
+
├── CI/CD pipeline work? ──────────→ i3-ci-cd-and-automation
|
|
39
|
+
├── Deprecating/migrating? ────────→ i3-deprecation-and-migration
|
|
40
|
+
├── Writing docs/ADRs? ───────────→ i3-documentation-and-adrs
|
|
41
|
+
├── Adding logs/metrics/alerts? ───→ i3-observability-and-instrumentation
|
|
42
|
+
└── Deploying/launching? ─────────→ i3-shipping-and-launch
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
## Core Operating Behaviors
|
|
@@ -134,59 +134,59 @@ These are the subtle errors that look like productivity but create problems:
|
|
|
134
134
|
|
|
135
135
|
2. **Skills are workflows, not suggestions.** Follow the steps in order. Don't skip verification steps.
|
|
136
136
|
|
|
137
|
-
3. **Multiple skills can apply.** A feature implementation might involve `idea-refine` → `spec-driven-development` → `planning-and-task-breakdown` → `incremental-implementation` → `test-driven-development` → `code-review-and-quality` → `code-simplification` → `shipping-and-launch` in sequence.
|
|
137
|
+
3. **Multiple skills can apply.** A feature implementation might involve `i3-idea-refine` → `i3-spec-driven-development` → `i3-planning-and-task-breakdown` → `i3-incremental-implementation` → `i3-test-driven-development` → `i3-code-review-and-quality` → `i3-code-simplification` → `i3-shipping-and-launch` in sequence.
|
|
138
138
|
|
|
139
|
-
4. **When in doubt, start with a spec.** If the task is non-trivial and there's no spec, begin with `spec-driven-development`.
|
|
139
|
+
4. **When in doubt, start with a spec.** If the task is non-trivial and there's no spec, begin with `i3-spec-driven-development`.
|
|
140
140
|
|
|
141
141
|
## Lifecycle Sequence
|
|
142
142
|
|
|
143
143
|
For a complete feature, the typical skill sequence is:
|
|
144
144
|
|
|
145
145
|
```
|
|
146
|
-
1. interview-me → Extract what the user actually wants
|
|
147
|
-
2. idea-refine → Refine vague ideas
|
|
148
|
-
3. spec-driven-development → Define what we're building
|
|
149
|
-
4. planning-and-task-breakdown → Break into verifiable chunks
|
|
150
|
-
5. context-engineering → Load the right context
|
|
151
|
-
6. source-driven-development → Verify against official docs
|
|
152
|
-
7. incremental-implementation → Build slice by slice
|
|
153
|
-
8. observability-and-instrumentation → Instrument as you build (runs parallel with 7-9, not after)
|
|
154
|
-
9. doubt-driven-development → Cross-examine non-trivial decisions in-flight
|
|
155
|
-
10. test-driven-development → Prove each slice works
|
|
156
|
-
11. code-review-and-quality → Review before merge
|
|
157
|
-
12. code-simplification → Reduce unnecessary complexity while preserving behavior
|
|
158
|
-
13. git-workflow-and-versioning → Clean commit history
|
|
159
|
-
14. documentation-and-adrs → Document decisions
|
|
160
|
-
15. deprecation-and-migration → Retire old systems and move users safely when needed
|
|
161
|
-
16. shipping-and-launch → Deploy safely
|
|
146
|
+
1. i3-interview-me → Extract what the user actually wants
|
|
147
|
+
2. i3-idea-refine → Refine vague ideas
|
|
148
|
+
3. i3-spec-driven-development → Define what we're building
|
|
149
|
+
4. i3-planning-and-task-breakdown → Break into verifiable chunks
|
|
150
|
+
5. i3-context-engineering → Load the right context
|
|
151
|
+
6. i3-source-driven-development → Verify against official docs
|
|
152
|
+
7. i3-incremental-implementation → Build slice by slice
|
|
153
|
+
8. i3-observability-and-instrumentation → Instrument as you build (runs parallel with 7-9, not after)
|
|
154
|
+
9. i3-doubt-driven-development → Cross-examine non-trivial decisions in-flight
|
|
155
|
+
10. i3-test-driven-development → Prove each slice works
|
|
156
|
+
11. i3-code-review-and-quality → Review before merge
|
|
157
|
+
12. i3-code-simplification → Reduce unnecessary complexity while preserving behavior
|
|
158
|
+
13. i3-git-workflow-and-versioning → Clean commit history
|
|
159
|
+
14. i3-documentation-and-adrs → Document decisions
|
|
160
|
+
15. i3-deprecation-and-migration → Retire old systems and move users safely when needed
|
|
161
|
+
16. i3-shipping-and-launch → Deploy safely
|
|
162
162
|
```
|
|
163
163
|
|
|
164
|
-
Not every task needs every skill. A bug fix might only need: `debugging-and-error-recovery` → `test-driven-development` → `code-review-and-quality`.
|
|
164
|
+
Not every task needs every skill. A bug fix might only need: `i3-debugging-and-error-recovery` → `i3-test-driven-development` → `i3-code-review-and-quality`.
|
|
165
165
|
|
|
166
166
|
## Quick Reference
|
|
167
167
|
|
|
168
168
|
| Phase | Skill | One-Line Summary |
|
|
169
169
|
|-------|-------|-----------------|
|
|
170
|
-
| Define | interview-me | Surface what the user actually wants before any plan, spec, or code exists |
|
|
171
|
-
| Define | idea-refine | Refine ideas through structured divergent and convergent thinking |
|
|
172
|
-
| Define | spec-driven-development | Requirements and acceptance criteria before code |
|
|
173
|
-
| Plan | planning-and-task-breakdown | Decompose into small, verifiable tasks |
|
|
174
|
-
| Build | incremental-implementation | Thin vertical slices, test each before expanding |
|
|
175
|
-
| Build | source-driven-development | Verify against official docs before implementing |
|
|
176
|
-
| Build | doubt-driven-development | Adversarial fresh-context review of every non-trivial decision |
|
|
177
|
-
| Build | context-engineering | Right context at the right time |
|
|
178
|
-
| Build | frontend-ui-engineering | Production-quality UI with accessibility |
|
|
179
|
-
| Build | api-and-interface-design | Stable interfaces with clear contracts |
|
|
180
|
-
| Verify | test-driven-development | Failing test first, then make it pass |
|
|
181
|
-
| Verify | browser-testing-with-devtools | Chrome DevTools MCP for runtime verification |
|
|
182
|
-
| Verify | debugging-and-error-recovery | Reproduce → localize → fix → guard |
|
|
183
|
-
| Review | code-review-and-quality | Five-axis review with quality gates |
|
|
184
|
-
| Review | code-simplification | Preserve behavior while reducing unnecessary complexity |
|
|
185
|
-
| Review | security-and-hardening | OWASP prevention, input validation, least privilege |
|
|
186
|
-
| Review | performance-optimization | Measure first, optimize only what matters |
|
|
187
|
-
| Ship | git-workflow-and-versioning | Atomic commits, clean history |
|
|
188
|
-
| Ship | ci-cd-and-automation | Automated quality gates on every change |
|
|
189
|
-
| Ship | deprecation-and-migration | Remove old systems and migrate users safely |
|
|
190
|
-
| Ship | documentation-and-adrs | Document the why, not just the what |
|
|
191
|
-
| Ship | observability-and-instrumentation | Structured logs, RED metrics, traces, symptom-based alerts |
|
|
192
|
-
| Ship | shipping-and-launch | Pre-launch checklist, monitoring, rollback plan |
|
|
170
|
+
| Define | i3-interview-me | Surface what the user actually wants before any plan, spec, or code exists |
|
|
171
|
+
| Define | i3-idea-refine | Refine ideas through structured divergent and convergent thinking |
|
|
172
|
+
| Define | i3-spec-driven-development | Requirements and acceptance criteria before code |
|
|
173
|
+
| Plan | i3-planning-and-task-breakdown | Decompose into small, verifiable tasks |
|
|
174
|
+
| Build | i3-incremental-implementation | Thin vertical slices, test each before expanding |
|
|
175
|
+
| Build | i3-source-driven-development | Verify against official docs before implementing |
|
|
176
|
+
| Build | i3-doubt-driven-development | Adversarial fresh-context review of every non-trivial decision |
|
|
177
|
+
| Build | i3-context-engineering | Right context at the right time |
|
|
178
|
+
| Build | i3-frontend-ui-engineering | Production-quality UI with accessibility |
|
|
179
|
+
| Build | i3-api-and-interface-design | Stable interfaces with clear contracts |
|
|
180
|
+
| Verify | i3-test-driven-development | Failing test first, then make it pass |
|
|
181
|
+
| Verify | i3-browser-testing-with-devtools | Chrome DevTools MCP for runtime verification |
|
|
182
|
+
| Verify | i3-debugging-and-error-recovery | Reproduce → localize → fix → guard |
|
|
183
|
+
| Review | i3-code-review-and-quality | Five-axis review with quality gates |
|
|
184
|
+
| Review | i3-code-simplification | Preserve behavior while reducing unnecessary complexity |
|
|
185
|
+
| Review | i3-security-and-hardening | OWASP prevention, input validation, least privilege |
|
|
186
|
+
| Review | i3-performance-optimization | Measure first, optimize only what matters |
|
|
187
|
+
| Ship | i3-git-workflow-and-versioning | Atomic commits, clean history |
|
|
188
|
+
| Ship | i3-ci-cd-and-automation | Automated quality gates on every change |
|
|
189
|
+
| Ship | i3-deprecation-and-migration | Remove old systems and migrate users safely |
|
|
190
|
+
| Ship | i3-documentation-and-adrs | Document the why, not just the what |
|
|
191
|
+
| Ship | i3-observability-and-instrumentation | Structured logs, RED metrics, traces, symptom-based alerts |
|
|
192
|
+
| Ship | i3-shipping-and-launch | Pre-launch checklist, monitoring, rollback plan |
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const test = require('node:test');
|
|
4
|
+
const assert = require('node:assert/strict');
|
|
5
|
+
const fs = require('node:fs');
|
|
6
|
+
const os = require('node:os');
|
|
7
|
+
const path = require('node:path');
|
|
8
|
+
const { spawnSync } = require('node:child_process');
|
|
9
|
+
const root = path.resolve(__dirname, '..');
|
|
10
|
+
const cli = path.join(root, 'bin/i3-composer-agent.cjs');
|
|
11
|
+
const upstream = require('../rebrand/upstream.json');
|
|
12
|
+
function workspace(t) {
|
|
13
|
+
const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'i3-agent-install-'));
|
|
14
|
+
t.after(() => fs.rmSync(directory, { recursive: true, force: true }));
|
|
15
|
+
return fs.realpathSync(directory);
|
|
16
|
+
}
|
|
17
|
+
function run(directory, args) {
|
|
18
|
+
return spawnSync(process.execPath, [cli, ...args], { cwd: directory, encoding: 'utf8' });
|
|
19
|
+
}
|
|
20
|
+
test('native CodeBuddy installation includes short commands, personas and usable references', t => {
|
|
21
|
+
const directory = workspace(t);
|
|
22
|
+
const result = run(directory, ['--codebuddy', '--scope', 'project', '--yes']);
|
|
23
|
+
assert.equal(result.status, 0, result.stderr);
|
|
24
|
+
const base = path.join(directory, '.codebuddy');
|
|
25
|
+
assert.equal(fs.readdirSync(path.join(base, 'skills')).length, upstream.skills.length);
|
|
26
|
+
assert.equal(fs.readdirSync(path.join(base, 'commands')).length, upstream.commands.length);
|
|
27
|
+
assert.equal(fs.readdirSync(path.join(base, 'agents')).length, upstream.personas.length);
|
|
28
|
+
const command = fs.readFileSync(path.join(base, 'commands/i3-spec.md'), 'utf8');
|
|
29
|
+
assert.match(command, /Invoke the i3-spec-driven-development skill/);
|
|
30
|
+
assert.doesNotMatch(command, /i3-composer-agent:/);
|
|
31
|
+
const ship = fs.readFileSync(path.join(base, 'commands/i3-ship.md'), 'utf8');
|
|
32
|
+
assert.match(ship, /\.codebuddy\/agents\//);
|
|
33
|
+
assert.doesNotMatch(ship, /\.claude\/agents\//);
|
|
34
|
+
assert.ok(fs.existsSync(path.join(base, 'references/definition-of-done.md')));
|
|
35
|
+
assert.equal(fs.readFileSync(path.join(base, 'i3-composer-agent-LICENSE'), 'utf8'), fs.readFileSync(path.join(root, 'LICENSE'), 'utf8'));
|
|
36
|
+
assert.match(fs.readFileSync(path.join(base, 'i3-composer-agent-NOTICE.md'), 'utf8'), /Addy Osmani/);
|
|
37
|
+
assert.equal(fs.existsSync(path.join(directory, 'AGENTS.md')), false);
|
|
38
|
+
assert.equal(fs.existsSync(path.join(directory, 'i3-composer-agent')), false);
|
|
39
|
+
assert.match(result.stdout, /\/i3-spec/);
|
|
40
|
+
});
|
|
41
|
+
test('multiple tools retain their own destinations and share universal skills without duplicate work', t => {
|
|
42
|
+
const directory = workspace(t);
|
|
43
|
+
const result = run(directory, ['--agents', 'codebuddy,codex,cursor,claude-code', '--scope', 'project', '--yes']);
|
|
44
|
+
assert.equal(result.status, 0, result.stderr);
|
|
45
|
+
for (const base of ['.codebuddy', '.agents', '.claude']) {
|
|
46
|
+
assert.equal(fs.readdirSync(path.join(directory, base, 'skills')).length, upstream.skills.length);
|
|
47
|
+
assert.ok(fs.existsSync(path.join(directory, base, 'references/testing-patterns.md')));
|
|
48
|
+
}
|
|
49
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(directory, '.agents/.i3-composer-agent.json')));
|
|
50
|
+
assert.deepEqual(manifest.agents.sort(), ['codex', 'cursor']);
|
|
51
|
+
assert.equal(fs.existsSync(path.join(directory, '.agents/commands')), false);
|
|
52
|
+
});
|
|
53
|
+
test('installation dry run describes scope and destinations without changing project files', t => {
|
|
54
|
+
const directory = workspace(t);
|
|
55
|
+
const result = run(directory, ['--agents', 'codebuddy,codex', '--scope', 'project', '--dry-run']);
|
|
56
|
+
assert.equal(result.status, 0, result.stderr);
|
|
57
|
+
const plan = JSON.parse(result.stdout);
|
|
58
|
+
assert.equal(plan.mode, 'install');
|
|
59
|
+
assert.equal(plan.scope, 'project');
|
|
60
|
+
assert.equal(plan.targets.length, 2);
|
|
61
|
+
assert.deepEqual(fs.readdirSync(directory), []);
|
|
62
|
+
});
|
|
63
|
+
test('all copied Markdown reference links and stable skill frontmatter remain valid', t => {
|
|
64
|
+
const directory = workspace(t);
|
|
65
|
+
assert.equal(run(directory, ['--codebuddy', '--scope', 'project', '--yes']).status, 0);
|
|
66
|
+
const base = path.join(directory, '.codebuddy');
|
|
67
|
+
function visit(folder) {
|
|
68
|
+
for (const entry of fs.readdirSync(folder, { withFileTypes: true })) {
|
|
69
|
+
const file = path.join(folder, entry.name);
|
|
70
|
+
if (entry.isDirectory()) visit(file);
|
|
71
|
+
else if (entry.name.endsWith('.md')) {
|
|
72
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
73
|
+
for (const match of content.matchAll(/\]\(([^)]+)\)/g)) {
|
|
74
|
+
const relative = match[1].split('#')[0];
|
|
75
|
+
if (relative.includes('references/') && !/^[a-z]+:/i.test(relative)) {
|
|
76
|
+
assert.ok(fs.existsSync(path.resolve(path.dirname(file), relative)), `${file}: ${relative}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
visit(path.join(base, 'skills'));
|
|
83
|
+
for (const id of upstream.skills.map(id => `i3-${id}`)) {
|
|
84
|
+
const head = content => content.match(/^---\r?\n[\s\S]*?\r?\n---/)[0];
|
|
85
|
+
assert.equal(head(fs.readFileSync(path.join(base, 'skills', id, 'SKILL.md'), 'utf8')), head(fs.readFileSync(path.join(root, 'skills', id, 'SKILL.md'), 'utf8')));
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
function legacyInstallation(directory) {
|
|
89
|
+
const base = path.join(directory, '.codebuddy');
|
|
90
|
+
fs.mkdirSync(path.join(base, 'commands'), { recursive: true });
|
|
91
|
+
fs.mkdirSync(path.join(base, 'skills/spec-driven-development'), { recursive: true });
|
|
92
|
+
fs.writeFileSync(path.join(base, 'commands/spec.md'), 'original owned command');
|
|
93
|
+
fs.writeFileSync(path.join(base, 'skills/spec-driven-development/SKILL.md'), 'original owned Skill');
|
|
94
|
+
fs.writeFileSync(path.join(base, 'commands/build.md'), 'unowned custom command');
|
|
95
|
+
fs.writeFileSync(path.join(base, '.i3-composer-agent.json'), JSON.stringify({ name: 'i3-composer-agent', version: '1.0.1', assets: ['commands/spec.md', 'skills/spec-driven-development'] }));
|
|
96
|
+
return base;
|
|
97
|
+
}
|
|
98
|
+
test('prefix migration retires only owned legacy paths and preserves their backups', t => {
|
|
99
|
+
const directory = workspace(t);
|
|
100
|
+
const base = legacyInstallation(directory);
|
|
101
|
+
const args = ['--codebuddy', '--scope', 'project', '--yes'];
|
|
102
|
+
assert.equal(run(directory, args).status, 1);
|
|
103
|
+
assert.equal(fs.readFileSync(path.join(base, 'commands/spec.md'), 'utf8'), 'original owned command');
|
|
104
|
+
const result = run(directory, [...args, '--force']);
|
|
105
|
+
assert.equal(result.status, 0, result.stderr);
|
|
106
|
+
assert.equal(fs.existsSync(path.join(base, 'commands/spec.md')), false);
|
|
107
|
+
assert.equal(fs.existsSync(path.join(base, 'skills/spec-driven-development')), false);
|
|
108
|
+
assert.ok(fs.existsSync(path.join(base, 'commands/i3-spec.md')));
|
|
109
|
+
assert.match(fs.readFileSync(path.join(base, 'skills/i3-spec-driven-development/SKILL.md'), 'utf8'), /^name: i3-spec-driven-development$/m);
|
|
110
|
+
assert.equal(fs.readFileSync(path.join(base, 'commands/build.md'), 'utf8'), 'unowned custom command');
|
|
111
|
+
const backup = fs.readdirSync(base).find(file => file.startsWith('.i3-composer-agent-backup-'));
|
|
112
|
+
assert.equal(fs.readFileSync(path.join(base, backup, 'commands/spec.md'), 'utf8'), 'original owned command');
|
|
113
|
+
assert.equal(fs.readFileSync(path.join(base, backup, 'skills/spec-driven-development/SKILL.md'), 'utf8'), 'original owned Skill');
|
|
114
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(base, '.i3-composer-agent.json'), 'utf8'));
|
|
115
|
+
assert.equal(manifest.entryPrefix, 'i3-');
|
|
116
|
+
assert.ok(!manifest.assets.includes('commands/spec.md'));
|
|
117
|
+
});
|
|
118
|
+
test('a failure after retiring legacy paths rolls the migration back', t => {
|
|
119
|
+
const directory = workspace(t);
|
|
120
|
+
const base = legacyInstallation(directory);
|
|
121
|
+
const before = fs.readFileSync(path.join(base, '.i3-composer-agent.json'), 'utf8');
|
|
122
|
+
const { planInstallation, executeInstallation } = require('../bin/install.cjs');
|
|
123
|
+
const plan = planInstallation({ agents: ['codebuddy'], scope: 'project', projectDir: directory });
|
|
124
|
+
const realRename = fs.renameSync;
|
|
125
|
+
fs.renameSync = (source, destination) => {
|
|
126
|
+
if (destination === path.join(base, '.i3-composer-agent.json') && source.includes('-stage-')) throw new Error('simulated manifest failure');
|
|
127
|
+
return realRename(source, destination);
|
|
128
|
+
};
|
|
129
|
+
try { assert.throws(() => executeInstallation(plan, { force: true }), /simulated manifest failure/); }
|
|
130
|
+
finally { fs.renameSync = realRename; }
|
|
131
|
+
assert.equal(fs.readFileSync(path.join(base, '.i3-composer-agent.json'), 'utf8'), before);
|
|
132
|
+
assert.equal(fs.readFileSync(path.join(base, 'commands/spec.md'), 'utf8'), 'original owned command');
|
|
133
|
+
assert.equal(fs.readFileSync(path.join(base, 'skills/spec-driven-development/SKILL.md'), 'utf8'), 'original owned Skill');
|
|
134
|
+
assert.equal(fs.existsSync(path.join(base, 'commands/i3-spec.md')), false);
|
|
135
|
+
});
|
|
136
|
+
test('existing assets are protected; confirmed replacement backs them up and preserves unrelated settings', t => {
|
|
137
|
+
const directory = workspace(t);
|
|
138
|
+
const base = path.join(directory, '.codebuddy');
|
|
139
|
+
fs.mkdirSync(path.join(base, 'commands'), { recursive: true });
|
|
140
|
+
fs.writeFileSync(path.join(base, 'commands/i3-spec.md'), 'my custom command');
|
|
141
|
+
fs.writeFileSync(path.join(base, 'settings.json'), '{"keep":"my settings"}\n');
|
|
142
|
+
const args = ['--codebuddy', '--scope', 'project', '--yes'];
|
|
143
|
+
assert.equal(run(directory, args).status, 1);
|
|
144
|
+
assert.equal(fs.existsSync(path.join(base, 'skills')), false);
|
|
145
|
+
const result = run(directory, [...args, '--force']);
|
|
146
|
+
assert.equal(result.status, 0, result.stderr);
|
|
147
|
+
const backups = fs.readdirSync(base).filter(file => file.startsWith('.i3-composer-agent-backup-'));
|
|
148
|
+
assert.equal(backups.length, 1);
|
|
149
|
+
assert.equal(fs.readFileSync(path.join(base, backups[0], 'commands/i3-spec.md'), 'utf8'), 'my custom command');
|
|
150
|
+
assert.equal(fs.readFileSync(path.join(base, 'settings.json'), 'utf8'), '{"keep":"my settings"}\n');
|
|
151
|
+
assert.equal(fs.existsSync(path.join(base, backups[0], 'settings.json')), false);
|
|
152
|
+
});
|
|
153
|
+
test('global installation uses injected home and config roots without touching the real user configuration', t => {
|
|
154
|
+
const directory = workspace(t);
|
|
155
|
+
const { planInstallation, executeInstallation } = require('../bin/install.cjs');
|
|
156
|
+
const plan = planInstallation({ agents: ['codebuddy', 'codex', 'claude-code', 'opencode'], scope: 'global', home: directory, env: { XDG_CONFIG_HOME: path.join(directory, 'config'), CLAUDE_CONFIG_DIR: path.join(directory, 'custom-claude') } });
|
|
157
|
+
assert.ok(plan.targets.every(target => target.skillsDirectory.startsWith(directory + path.sep)));
|
|
158
|
+
assert.ok(plan.targets.some(target => target.skillsDirectory === path.join(directory, 'custom-claude/skills')));
|
|
159
|
+
assert.ok(plan.targets.some(target => target.skillsDirectory === path.join(directory, 'config/opencode/skills')));
|
|
160
|
+
executeInstallation(plan);
|
|
161
|
+
for (const target of plan.targets) {
|
|
162
|
+
assert.equal(fs.readdirSync(target.skillsDirectory).length, upstream.skills.length);
|
|
163
|
+
assert.ok(fs.existsSync(path.join(target.referencesDirectory, 'definition-of-done.md')));
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
test('the pinned tool catalog plans all project choices and rejects unsupported global choices before writing', t => {
|
|
167
|
+
const directory = workspace(t);
|
|
168
|
+
const { registry, planInstallation } = require('../bin/install.cjs');
|
|
169
|
+
assert.equal(registry.agents.length, 79);
|
|
170
|
+
assert.equal(registry.commit, '48dc9e8eb8aa19040e91cb90ba0b642c9cbad57e');
|
|
171
|
+
const plan = planInstallation({ agents: registry.agents.map(agent => agent.id), scope: 'project', projectDir: directory });
|
|
172
|
+
assert.equal(plan.agents.length, registry.agents.length);
|
|
173
|
+
assert.ok(plan.targets.length < plan.agents.length);
|
|
174
|
+
assert.equal(new Set(plan.assets.map(asset => asset.destination)).size, plan.assets.length);
|
|
175
|
+
for (const agent of registry.agents) {
|
|
176
|
+
if (agent.globalSkillsDir) assert.ok(planInstallation({ agents: [agent.id], scope: 'global', home: directory, env: {} }).targets[0].skillsDirectory.startsWith(directory + path.sep));
|
|
177
|
+
else assert.throws(() => planInstallation({ agents: [agent.id], scope: 'global', home: directory, env: {} }), /project installation only/);
|
|
178
|
+
}
|
|
179
|
+
assert.deepEqual(fs.readdirSync(directory), []);
|
|
180
|
+
});
|
|
181
|
+
test('failed installation restores prior assets and removes all newly written files', t => {
|
|
182
|
+
const directory = workspace(t);
|
|
183
|
+
const { planInstallation, executeInstallation } = require('../bin/install.cjs');
|
|
184
|
+
const prior = path.join(directory, '.codebuddy/skills/i3-api-and-interface-design');
|
|
185
|
+
fs.mkdirSync(prior, { recursive: true });
|
|
186
|
+
fs.writeFileSync(path.join(prior, 'custom.md'), 'prior skill content');
|
|
187
|
+
const plan = planInstallation({ agents: ['codebuddy', 'codex'], scope: 'project', projectDir: directory });
|
|
188
|
+
const realRename = fs.renameSync;
|
|
189
|
+
let failed = false;
|
|
190
|
+
fs.renameSync = (source, destination) => {
|
|
191
|
+
if (!failed && destination === plan.assets[1].destination) { failed = true; throw new Error('simulated disk failure'); }
|
|
192
|
+
return realRename(source, destination);
|
|
193
|
+
};
|
|
194
|
+
try { assert.throws(() => executeInstallation(plan, { force: true }), /simulated disk failure/); }
|
|
195
|
+
finally { fs.renameSync = realRename; }
|
|
196
|
+
assert.equal(fs.readFileSync(path.join(prior, 'custom.md'), 'utf8'), 'prior skill content');
|
|
197
|
+
assert.deepEqual(fs.readdirSync(path.dirname(prior)), ['i3-api-and-interface-design']);
|
|
198
|
+
assert.deepEqual(fs.readdirSync(path.join(directory, '.codebuddy')), ['skills']);
|
|
199
|
+
assert.equal(fs.existsSync(path.join(directory, '.agents')), false);
|
|
200
|
+
});
|
|
201
|
+
test('replacing a skill symlink backs up the link and leaves its external source untouched', t => {
|
|
202
|
+
const directory = workspace(t);
|
|
203
|
+
const external = path.join(directory, 'external-skill');
|
|
204
|
+
const skills = path.join(directory, '.codebuddy/skills');
|
|
205
|
+
fs.mkdirSync(external);
|
|
206
|
+
fs.writeFileSync(path.join(external, 'custom.md'), 'external source');
|
|
207
|
+
fs.mkdirSync(skills, { recursive: true });
|
|
208
|
+
fs.symlinkSync(external, path.join(skills, 'i3-spec-driven-development'), 'dir');
|
|
209
|
+
const result = run(directory, ['--codebuddy', '--scope', 'project', '--yes', '--force']);
|
|
210
|
+
assert.equal(result.status, 0, result.stderr);
|
|
211
|
+
assert.deepEqual(fs.readdirSync(external), ['custom.md']);
|
|
212
|
+
assert.equal(fs.lstatSync(path.join(skills, 'i3-spec-driven-development')).isSymbolicLink(), false);
|
|
213
|
+
const base = path.dirname(skills);
|
|
214
|
+
const backup = fs.readdirSync(base).find(file => file.startsWith('.i3-composer-agent-backup-'));
|
|
215
|
+
assert.equal(fs.lstatSync(path.join(base, backup, 'skills/i3-spec-driven-development')).isSymbolicLink(), true);
|
|
216
|
+
});
|
|
217
|
+
test('package destinations, shared directory symlinks and ambiguous noninteractive flags fail without writes', t => {
|
|
218
|
+
const directory = workspace(t);
|
|
219
|
+
for (const args of [ ['--codebuddy'], ['--codebuddy', '--yes'], ['--agents', 'unknown', '--scope', 'project', '--yes'], ['--codebuddy', '--scope', 'invalid', '--yes'], ['--codebuddy', '--scope', 'project', '--global', '--yes'] ]) {
|
|
220
|
+
assert.equal(run(directory, args).status, 1);
|
|
221
|
+
assert.deepEqual(fs.readdirSync(directory), []);
|
|
222
|
+
}
|
|
223
|
+
assert.equal(run(directory, ['--codebuddy', '--scope', 'project', '--yes', '--project-dir', root]).status, 1);
|
|
224
|
+
fs.mkdirSync(path.join(directory, '.codebuddy'));
|
|
225
|
+
fs.symlinkSync(path.join(root, 'skills'), path.join(directory, '.codebuddy/skills'), 'dir');
|
|
226
|
+
assert.equal(run(directory, ['--codebuddy', '--scope', 'project', '--yes', '--force']).status, 1);
|
|
227
|
+
assert.deepEqual(fs.readdirSync(path.join(directory, '.codebuddy')), ['skills']);
|
|
228
|
+
});
|
|
229
|
+
test('explicit plugin preparation remains available and does not install native host files', t => {
|
|
230
|
+
const directory = workspace(t);
|
|
231
|
+
const result = run(directory, ['--prepare', '--codebuddy']);
|
|
232
|
+
assert.equal(result.status, 0, result.stderr);
|
|
233
|
+
assert.match(result.stdout, /\/plugin install/);
|
|
234
|
+
assert.equal(fs.existsSync(path.join(directory, 'i3-composer-agent/plugin.json')), true);
|
|
235
|
+
assert.equal(fs.existsSync(path.join(directory, '.codebuddy')), false);
|
|
236
|
+
const listing = run(directory, ['--list-agents']);
|
|
237
|
+
assert.equal(listing.status, 0, listing.stderr);
|
|
238
|
+
assert.equal(listing.stdout.trim().split('\n').length, 79);
|
|
239
|
+
assert.match(listing.stdout, /codebuddy/);
|
|
240
|
+
assert.match(listing.stdout, /windsurf/);
|
|
241
|
+
});
|
/package/evals/fixtures/{api-and-interface-design → i3-api-and-interface-design}/service-brief.md
RENAMED
|
File without changes
|
/package/evals/fixtures/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/README.md
RENAMED
|
File without changes
|
|
File without changes
|
/package/evals/fixtures/{browser-testing-with-devtools → i3-browser-testing-with-devtools}/server.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/evals/fixtures/{code-review-and-quality → i3-code-review-and-quality}/user-search.diff
RENAMED
|
File without changes
|
|
File without changes
|
/package/evals/fixtures/{code-simplification → i3-code-simplification}/config-parser.test.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/evals/fixtures/{deprecation-and-migration → i3-deprecation-and-migration}/api-inventory.md
RENAMED
|
File without changes
|
/package/evals/fixtures/{documentation-and-adrs → i3-documentation-and-adrs}/decision-context.md
RENAMED
|
File without changes
|
/package/evals/fixtures/{doubt-driven-development → i3-doubt-driven-development}/migration-plan.md
RENAMED
|
File without changes
|
|
File without changes
|
/package/evals/fixtures/{frontend-ui-engineering → i3-frontend-ui-engineering}/design-system.md
RENAMED
|
File without changes
|
/package/evals/fixtures/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/app.js
RENAMED
|
File without changes
|
/package/evals/fixtures/{git-workflow-and-versioning → i3-git-workflow-and-versioning}/app.test.js
RENAMED
|
File without changes
|
/package/evals/fixtures/{incremental-implementation → i3-incremental-implementation}/reports.js
RENAMED
|
File without changes
|
/package/evals/fixtures/{incremental-implementation → i3-incremental-implementation}/reports.test.js
RENAMED
|
File without changes
|
/package/evals/fixtures/{incremental-implementation → i3-incremental-implementation}/tasks/plan.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/evals/fixtures/{performance-optimization → i3-performance-optimization}/benchmark.js
RENAMED
|
File without changes
|
/package/evals/fixtures/{performance-optimization → i3-performance-optimization}/products.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/evals/fixtures/{security-and-hardening → i3-security-and-hardening}/webhook.test.js
RENAMED
|
File without changes
|
/package/evals/fixtures/{shipping-and-launch → i3-shipping-and-launch}/authority-pressure.md
RENAMED
|
File without changes
|
|
File without changes
|
/package/evals/fixtures/{source-driven-development → i3-source-driven-development}/framework-task.md
RENAMED
|
File without changes
|
/package/evals/fixtures/{spec-driven-development → i3-spec-driven-development}/billing-brief.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/evals/fixtures/{test-driven-development → i3-test-driven-development}/test/split.test.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|