@givolt/i3-composer-agent 1.0.1 → 2.1.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/README.md +72 -69
- 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 +11 -0
- package/bin/asset-fingerprint.cjs +38 -0
- package/bin/cleanup-backups.cjs +16 -0
- package/bin/i3-composer-agent.cjs +29 -14
- package/bin/install.cjs +81 -19
- package/bin/native-content.cjs +29 -0
- package/bin/wizard.cjs +2 -1
- 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 +27 -18
- package/docs/codex-setup.md +6 -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 +22 -22
- package/docs/gemini-cli-setup.md +26 -26
- package/docs/getting-started.md +36 -38
- package/docs/opencode-setup.md +31 -31
- package/docs/windsurf-setup.md +7 -7
- package/docs/workbuddy-setup.md +92 -0
- 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 +36 -20
- package/plugin.json +1 -1
- 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/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/CHANGELOG.md +0 -34
- package/NOTICE.md +0 -14
- package/docs/advanced-per-agent-configuration.md +0 -70
- package/docs/comparison.md +0 -131
- package/docs/developer-onboarding.md +0 -116
- package/docs/skill-anatomy.md +0 -203
- package/evals/README.md +0 -101
- package/evals/cases/api-and-interface-design.json +0 -45
- package/evals/cases/browser-testing-with-devtools.json +0 -44
- package/evals/cases/ci-cd-and-automation.json +0 -45
- package/evals/cases/code-review-and-quality.json +0 -49
- package/evals/cases/code-simplification.json +0 -45
- package/evals/cases/constraint-driven-development.json +0 -79
- package/evals/cases/context-engineering.json +0 -44
- package/evals/cases/debugging-and-error-recovery.json +0 -58
- package/evals/cases/deprecation-and-migration.json +0 -52
- package/evals/cases/documentation-and-adrs.json +0 -44
- package/evals/cases/doubt-driven-development.json +0 -43
- package/evals/cases/frontend-ui-engineering.json +0 -52
- package/evals/cases/git-workflow-and-versioning.json +0 -47
- package/evals/cases/idea-refine.json +0 -43
- package/evals/cases/incremental-implementation.json +0 -57
- package/evals/cases/interview-me.json +0 -42
- package/evals/cases/observability-and-instrumentation.json +0 -44
- package/evals/cases/performance-optimization.json +0 -53
- package/evals/cases/planning-and-task-breakdown.json +0 -45
- package/evals/cases/security-and-hardening.json +0 -53
- package/evals/cases/shipping-and-launch.json +0 -56
- package/evals/cases/source-driven-development.json +0 -44
- package/evals/cases/spec-driven-development.json +0 -72
- package/evals/cases/test-driven-development.json +0 -73
- package/evals/cases/using-agent-skills.json +0 -44
- package/evals/fixtures/api-and-interface-design/service-brief.md +0 -19
- package/evals/fixtures/browser-testing-with-devtools/README.md +0 -5
- package/evals/fixtures/browser-testing-with-devtools/index.html +0 -24
- package/evals/fixtures/browser-testing-with-devtools/server.js +0 -15
- package/evals/fixtures/ci-cd-and-automation/package.json +0 -8
- package/evals/fixtures/ci-cd-and-automation/src/slug.js +0 -3
- package/evals/fixtures/ci-cd-and-automation/test/slug.test.js +0 -9
- package/evals/fixtures/code-review-and-quality/user-search.diff +0 -16
- package/evals/fixtures/code-simplification/config-parser.js +0 -46
- package/evals/fixtures/code-simplification/config-parser.test.js +0 -15
- package/evals/fixtures/context-engineering/context-audit.md +0 -15
- package/evals/fixtures/debugging-and-error-recovery/pagination.js +0 -8
- package/evals/fixtures/debugging-and-error-recovery/pagination.test.js +0 -9
- package/evals/fixtures/debugging-and-error-recovery/time-pressure.md +0 -6
- package/evals/fixtures/deprecation-and-migration/api-inventory.md +0 -9
- package/evals/fixtures/documentation-and-adrs/decision-context.md +0 -16
- package/evals/fixtures/doubt-driven-development/migration-plan.md +0 -19
- package/evals/fixtures/frontend-ui-engineering/Button.tsx +0 -7
- package/evals/fixtures/frontend-ui-engineering/design-system.md +0 -11
- package/evals/fixtures/git-workflow-and-versioning/.eval/working-tree.patch +0 -21
- package/evals/fixtures/git-workflow-and-versioning/app.js +0 -7
- package/evals/fixtures/git-workflow-and-versioning/app.test.js +0 -9
- package/evals/fixtures/incremental-implementation/reports.js +0 -7
- package/evals/fixtures/incremental-implementation/reports.test.js +0 -12
- package/evals/fixtures/incremental-implementation/tasks/plan.md +0 -8
- package/evals/fixtures/incremental-implementation-pressure/draft-export.js +0 -17
- package/evals/fixtures/incremental-implementation-pressure/scenario.md +0 -9
- package/evals/fixtures/observability-and-instrumentation/operations.md +0 -11
- package/evals/fixtures/observability-and-instrumentation/payment-retry.js +0 -14
- package/evals/fixtures/performance-optimization/benchmark.js +0 -15
- package/evals/fixtures/performance-optimization/products.js +0 -14
- package/evals/fixtures/planning-and-task-breakdown/notifications-spec.md +0 -18
- package/evals/fixtures/security-and-hardening/webhook.js +0 -11
- package/evals/fixtures/security-and-hardening/webhook.test.js +0 -13
- package/evals/fixtures/shipping-and-launch/authority-pressure.md +0 -6
- package/evals/fixtures/shipping-and-launch/launch-status.md +0 -11
- package/evals/fixtures/source-driven-development/framework-task.md +0 -10
- package/evals/fixtures/spec-driven-development/billing-brief.md +0 -16
- package/evals/fixtures/spec-driven-development-decomposition/portal-brief.md +0 -22
- package/evals/fixtures/test-driven-development/BUG.md +0 -10
- package/evals/fixtures/test-driven-development/README.md +0 -28
- package/evals/fixtures/test-driven-development/package.json +0 -9
- package/evals/fixtures/test-driven-development/src/split.js +0 -8
- package/evals/fixtures/test-driven-development/test/split.test.js +0 -13
- package/evals/fixtures/test-driven-development-ecosystem/README.md +0 -9
- package/evals/fixtures/test-driven-development-ecosystem/ledger.py +0 -15
- package/evals/fixtures/test-driven-development-ecosystem/test_ledger.py +0 -19
- package/evals/fixtures/using-agent-skills/incident.md +0 -6
- package/evals/plugin/code-review-fires/graders/off-by-one.md +0 -7
- package/evals/plugin/code-review-fires/graders/severity-labels.md +0 -4
- package/evals/plugin/code-review-fires/graders/skill-fired.md +0 -5
- package/evals/plugin/code-review-fires/prompt.md +0 -31
- package/evals/plugin/code-review-stays-quiet/graders/not-fired.md +0 -8
- package/evals/plugin/code-review-stays-quiet/graders/tdd-fired.md +0 -6
- package/evals/plugin/code-review-stays-quiet/prompt.md +0 -8
- package/evals/plugin/code-review-stays-quiet-on-commit-message/graders/not-fired.md +0 -8
- package/evals/plugin/code-review-stays-quiet-on-commit-message/prompt.md +0 -25
- package/evals/skill-impact.md +0 -6
- package/rebrand/INSTALLATION-SPEC.md +0 -46
- package/rebrand/MAINTENANCE.md +0 -113
- package/rebrand/NOTICE.md +0 -14
- package/rebrand/PR-WORKFLOW.md +0 -34
- package/rebrand/UNIFICATION-SPEC.md +0 -33
- package/rebrand/VALIDATION.md +0 -32
- package/rebrand/VERSIONING.md +0 -33
- package/rebrand/apply.cjs +0 -194
- package/rebrand/brand.json +0 -13
- package/rebrand/catalog.cjs +0 -56
- package/rebrand/fork-patches.json +0 -12
- package/rebrand/overlay/.github/workflows/test-plugin-install.yml +0 -177
- package/rebrand/overlay/CHANGELOG.md +0 -34
- package/rebrand/overlay/bin/agent-targets.json +0 -726
- package/rebrand/overlay/bin/i3-composer-agent.cjs +0 -190
- package/rebrand/overlay/bin/install.cjs +0 -164
- package/rebrand/overlay/bin/skills-registry.LICENSE +0 -21
- package/rebrand/overlay/bin/wizard.cjs +0 -66
- package/rebrand/overlay/scripts/validate-brand.cjs +0 -44
- package/rebrand/overlay/tests/bundle.test.cjs +0 -85
- package/rebrand/overlay/tests/installer.test.cjs +0 -193
- package/rebrand/package.template.json +0 -82
- package/rebrand/rebrand.sh +0 -4
- package/rebrand/record-upstream.cjs +0 -37
- package/rebrand/templates/README.md +0 -124
- package/rebrand/templates/codebuddy-setup.md +0 -88
- package/rebrand/templates/codex-setup.md +0 -45
- package/rebrand/tests/pipeline.test.cjs +0 -185
- package/rebrand/upstream.json +0 -171
- package/scripts/floor-guard-reference-test.js +0 -291
- package/scripts/lib/skill-lint-test.js +0 -650
- package/scripts/lib/skill-lint.js +0 -584
- package/scripts/run-evals-test.js +0 -623
- package/scripts/run-evals.js +0 -638
- package/scripts/validate-artifact-paths-test.js +0 -179
- package/scripts/validate-artifact-paths.js +0 -128
- package/scripts/validate-brand.cjs +0 -44
- package/scripts/validate-commands-test.js +0 -216
- package/scripts/validate-commands.js +0 -222
- package/scripts/validate-reference-links-test.js +0 -495
- package/scripts/validate-reference-links.js +0 -187
- package/scripts/validate-skills.js +0 -69
- package/scripts/validate-versions-test.js +0 -32
- package/scripts/validate-versions.js +0 -35
- package/tests/bundle.test.cjs +0 -85
- package/tests/installer.test.cjs +0 -193
- /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,193 +0,0 @@
|
|
|
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/spec.md'), 'utf8');
|
|
29
|
-
assert.match(command, /Invoke the spec-driven-development skill/);
|
|
30
|
-
assert.doesNotMatch(command, /i3-composer-agent:/);
|
|
31
|
-
const ship = fs.readFileSync(path.join(base, 'commands/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, /\/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) {
|
|
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
|
-
test('existing assets are protected; confirmed replacement backs them up and preserves unrelated settings', t => {
|
|
89
|
-
const directory = workspace(t);
|
|
90
|
-
const base = path.join(directory, '.codebuddy');
|
|
91
|
-
fs.mkdirSync(path.join(base, 'commands'), { recursive: true });
|
|
92
|
-
fs.writeFileSync(path.join(base, 'commands/spec.md'), 'my custom command');
|
|
93
|
-
fs.writeFileSync(path.join(base, 'settings.json'), '{"keep":"my settings"}\n');
|
|
94
|
-
const args = ['--codebuddy', '--scope', 'project', '--yes'];
|
|
95
|
-
assert.equal(run(directory, args).status, 1);
|
|
96
|
-
assert.equal(fs.existsSync(path.join(base, 'skills')), false);
|
|
97
|
-
const result = run(directory, [...args, '--force']);
|
|
98
|
-
assert.equal(result.status, 0, result.stderr);
|
|
99
|
-
const backups = fs.readdirSync(base).filter(file => file.startsWith('.i3-composer-agent-backup-'));
|
|
100
|
-
assert.equal(backups.length, 1);
|
|
101
|
-
assert.equal(fs.readFileSync(path.join(base, backups[0], 'commands/spec.md'), 'utf8'), 'my custom command');
|
|
102
|
-
assert.equal(fs.readFileSync(path.join(base, 'settings.json'), 'utf8'), '{"keep":"my settings"}\n');
|
|
103
|
-
assert.equal(fs.existsSync(path.join(base, backups[0], 'settings.json')), false);
|
|
104
|
-
});
|
|
105
|
-
test('global installation uses injected home and config roots without touching the real user configuration', t => {
|
|
106
|
-
const directory = workspace(t);
|
|
107
|
-
const { planInstallation, executeInstallation } = require('../bin/install.cjs');
|
|
108
|
-
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') } });
|
|
109
|
-
assert.ok(plan.targets.every(target => target.skillsDirectory.startsWith(directory + path.sep)));
|
|
110
|
-
assert.ok(plan.targets.some(target => target.skillsDirectory === path.join(directory, 'custom-claude/skills')));
|
|
111
|
-
assert.ok(plan.targets.some(target => target.skillsDirectory === path.join(directory, 'config/opencode/skills')));
|
|
112
|
-
executeInstallation(plan);
|
|
113
|
-
for (const target of plan.targets) {
|
|
114
|
-
assert.equal(fs.readdirSync(target.skillsDirectory).length, upstream.skills.length);
|
|
115
|
-
assert.ok(fs.existsSync(path.join(target.referencesDirectory, 'definition-of-done.md')));
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
test('the pinned tool catalog plans all project choices and rejects unsupported global choices before writing', t => {
|
|
119
|
-
const directory = workspace(t);
|
|
120
|
-
const { registry, planInstallation } = require('../bin/install.cjs');
|
|
121
|
-
assert.equal(registry.agents.length, 79);
|
|
122
|
-
assert.equal(registry.commit, '48dc9e8eb8aa19040e91cb90ba0b642c9cbad57e');
|
|
123
|
-
const plan = planInstallation({ agents: registry.agents.map(agent => agent.id), scope: 'project', projectDir: directory });
|
|
124
|
-
assert.equal(plan.agents.length, registry.agents.length);
|
|
125
|
-
assert.ok(plan.targets.length < plan.agents.length);
|
|
126
|
-
assert.equal(new Set(plan.assets.map(asset => asset.destination)).size, plan.assets.length);
|
|
127
|
-
for (const agent of registry.agents) {
|
|
128
|
-
if (agent.globalSkillsDir) assert.ok(planInstallation({ agents: [agent.id], scope: 'global', home: directory, env: {} }).targets[0].skillsDirectory.startsWith(directory + path.sep));
|
|
129
|
-
else assert.throws(() => planInstallation({ agents: [agent.id], scope: 'global', home: directory, env: {} }), /project installation only/);
|
|
130
|
-
}
|
|
131
|
-
assert.deepEqual(fs.readdirSync(directory), []);
|
|
132
|
-
});
|
|
133
|
-
test('failed installation restores prior assets and removes all newly written files', t => {
|
|
134
|
-
const directory = workspace(t);
|
|
135
|
-
const { planInstallation, executeInstallation } = require('../bin/install.cjs');
|
|
136
|
-
const prior = path.join(directory, '.codebuddy/skills/api-and-interface-design');
|
|
137
|
-
fs.mkdirSync(prior, { recursive: true });
|
|
138
|
-
fs.writeFileSync(path.join(prior, 'custom.md'), 'prior skill content');
|
|
139
|
-
const plan = planInstallation({ agents: ['codebuddy', 'codex'], scope: 'project', projectDir: directory });
|
|
140
|
-
const realRename = fs.renameSync;
|
|
141
|
-
let failed = false;
|
|
142
|
-
fs.renameSync = (source, destination) => {
|
|
143
|
-
if (!failed && destination === plan.assets[1].destination) { failed = true; throw new Error('simulated disk failure'); }
|
|
144
|
-
return realRename(source, destination);
|
|
145
|
-
};
|
|
146
|
-
try { assert.throws(() => executeInstallation(plan, { force: true }), /simulated disk failure/); }
|
|
147
|
-
finally { fs.renameSync = realRename; }
|
|
148
|
-
assert.equal(fs.readFileSync(path.join(prior, 'custom.md'), 'utf8'), 'prior skill content');
|
|
149
|
-
assert.deepEqual(fs.readdirSync(path.dirname(prior)), ['api-and-interface-design']);
|
|
150
|
-
assert.deepEqual(fs.readdirSync(path.join(directory, '.codebuddy')), ['skills']);
|
|
151
|
-
assert.equal(fs.existsSync(path.join(directory, '.agents')), false);
|
|
152
|
-
});
|
|
153
|
-
test('replacing a skill symlink backs up the link and leaves its external source untouched', t => {
|
|
154
|
-
const directory = workspace(t);
|
|
155
|
-
const external = path.join(directory, 'external-skill');
|
|
156
|
-
const skills = path.join(directory, '.codebuddy/skills');
|
|
157
|
-
fs.mkdirSync(external);
|
|
158
|
-
fs.writeFileSync(path.join(external, 'custom.md'), 'external source');
|
|
159
|
-
fs.mkdirSync(skills, { recursive: true });
|
|
160
|
-
fs.symlinkSync(external, path.join(skills, 'spec-driven-development'), 'dir');
|
|
161
|
-
const result = run(directory, ['--codebuddy', '--scope', 'project', '--yes', '--force']);
|
|
162
|
-
assert.equal(result.status, 0, result.stderr);
|
|
163
|
-
assert.deepEqual(fs.readdirSync(external), ['custom.md']);
|
|
164
|
-
assert.equal(fs.lstatSync(path.join(skills, 'spec-driven-development')).isSymbolicLink(), false);
|
|
165
|
-
const base = path.dirname(skills);
|
|
166
|
-
const backup = fs.readdirSync(base).find(file => file.startsWith('.i3-composer-agent-backup-'));
|
|
167
|
-
assert.equal(fs.lstatSync(path.join(base, backup, 'skills/spec-driven-development')).isSymbolicLink(), true);
|
|
168
|
-
});
|
|
169
|
-
test('package destinations, shared directory symlinks and ambiguous noninteractive flags fail without writes', t => {
|
|
170
|
-
const directory = workspace(t);
|
|
171
|
-
for (const args of [ ['--codebuddy'], ['--codebuddy', '--yes'], ['--agents', 'unknown', '--scope', 'project', '--yes'], ['--codebuddy', '--scope', 'invalid', '--yes'], ['--codebuddy', '--scope', 'project', '--global', '--yes'] ]) {
|
|
172
|
-
assert.equal(run(directory, args).status, 1);
|
|
173
|
-
assert.deepEqual(fs.readdirSync(directory), []);
|
|
174
|
-
}
|
|
175
|
-
assert.equal(run(directory, ['--codebuddy', '--scope', 'project', '--yes', '--project-dir', root]).status, 1);
|
|
176
|
-
fs.mkdirSync(path.join(directory, '.codebuddy'));
|
|
177
|
-
fs.symlinkSync(path.join(root, 'skills'), path.join(directory, '.codebuddy/skills'), 'dir');
|
|
178
|
-
assert.equal(run(directory, ['--codebuddy', '--scope', 'project', '--yes', '--force']).status, 1);
|
|
179
|
-
assert.deepEqual(fs.readdirSync(path.join(directory, '.codebuddy')), ['skills']);
|
|
180
|
-
});
|
|
181
|
-
test('explicit plugin preparation remains available and does not install native host files', t => {
|
|
182
|
-
const directory = workspace(t);
|
|
183
|
-
const result = run(directory, ['--prepare', '--codebuddy']);
|
|
184
|
-
assert.equal(result.status, 0, result.stderr);
|
|
185
|
-
assert.match(result.stdout, /\/plugin install/);
|
|
186
|
-
assert.equal(fs.existsSync(path.join(directory, 'i3-composer-agent/plugin.json')), true);
|
|
187
|
-
assert.equal(fs.existsSync(path.join(directory, '.codebuddy')), false);
|
|
188
|
-
const listing = run(directory, ['--list-agents']);
|
|
189
|
-
assert.equal(listing.status, 0, listing.stderr);
|
|
190
|
-
assert.equal(listing.stdout.trim().split('\n').length, 79);
|
|
191
|
-
assert.match(listing.stdout, /codebuddy/);
|
|
192
|
-
assert.match(listing.stdout, /windsurf/);
|
|
193
|
-
});
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@givolt/i3-composer-agent",
|
|
3
|
-
"description": "i3 Composer Agent: production-grade engineering skills and lifecycle commands for AI coding agents.",
|
|
4
|
-
"license": "MIT",
|
|
5
|
-
"author": "Givolt",
|
|
6
|
-
"contributors": [
|
|
7
|
-
{
|
|
8
|
-
"name": "Addy Osmani"
|
|
9
|
-
}
|
|
10
|
-
],
|
|
11
|
-
"bin": {
|
|
12
|
-
"i3-composer-agent": "bin/i3-composer-agent.cjs"
|
|
13
|
-
},
|
|
14
|
-
"engines": {
|
|
15
|
-
"node": ">=20"
|
|
16
|
-
},
|
|
17
|
-
"publishConfig": {
|
|
18
|
-
"access": "public",
|
|
19
|
-
"registry": "https://registry.npmjs.org/"
|
|
20
|
-
},
|
|
21
|
-
"files": [
|
|
22
|
-
"bin/",
|
|
23
|
-
"skills/",
|
|
24
|
-
"references/",
|
|
25
|
-
"agents/",
|
|
26
|
-
"commands/",
|
|
27
|
-
".claude/commands/",
|
|
28
|
-
".gemini/commands/",
|
|
29
|
-
".claude-plugin/",
|
|
30
|
-
".codex-plugin/",
|
|
31
|
-
".agents/plugins/",
|
|
32
|
-
"hooks/",
|
|
33
|
-
"docs/",
|
|
34
|
-
"scripts/",
|
|
35
|
-
"evals/",
|
|
36
|
-
"rebrand/",
|
|
37
|
-
"tests/",
|
|
38
|
-
"plugin.json",
|
|
39
|
-
"NOTICE.md",
|
|
40
|
-
"CHANGELOG.md"
|
|
41
|
-
],
|
|
42
|
-
"scripts": {
|
|
43
|
-
"rebrand": "node rebrand/apply.cjs --apply",
|
|
44
|
-
"rebrand:check": "node rebrand/apply.cjs --check",
|
|
45
|
-
"validate": "node scripts/validate-brand.cjs && node scripts/validate-skills.js && node scripts/validate-versions.js && node scripts/validate-commands.js && node scripts/validate-reference-links.js && node scripts/validate-artifact-paths.js",
|
|
46
|
-
"test": "node --test scripts/*-test.js scripts/lib/*-test.js tests/*.test.cjs rebrand/tests/*.test.cjs",
|
|
47
|
-
"prepack": "npm run validate"
|
|
48
|
-
},
|
|
49
|
-
"keywords": [
|
|
50
|
-
"i3-composer",
|
|
51
|
-
"agent-skills",
|
|
52
|
-
"codebuddy",
|
|
53
|
-
"codex",
|
|
54
|
-
"claude-code"
|
|
55
|
-
],
|
|
56
|
-
"i3ComposerAgent": {
|
|
57
|
-
"pluginFiles": [
|
|
58
|
-
"bin",
|
|
59
|
-
"skills",
|
|
60
|
-
"references",
|
|
61
|
-
"agents",
|
|
62
|
-
"commands",
|
|
63
|
-
".claude/commands",
|
|
64
|
-
".gemini/commands",
|
|
65
|
-
".claude-plugin",
|
|
66
|
-
".codex-plugin",
|
|
67
|
-
".agents/plugins",
|
|
68
|
-
"hooks",
|
|
69
|
-
"docs",
|
|
70
|
-
"scripts",
|
|
71
|
-
"evals",
|
|
72
|
-
"rebrand",
|
|
73
|
-
"tests",
|
|
74
|
-
"plugin.json",
|
|
75
|
-
"package.json",
|
|
76
|
-
"README.md",
|
|
77
|
-
"LICENSE",
|
|
78
|
-
"NOTICE.md",
|
|
79
|
-
"CHANGELOG.md"
|
|
80
|
-
]
|
|
81
|
-
}
|
|
82
|
-
}
|
package/rebrand/rebrand.sh
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
const fs = require('node:fs');
|
|
5
|
-
const path = require('node:path');
|
|
6
|
-
const { execFileSync } = require('node:child_process');
|
|
7
|
-
const { describe, runtimeRoots, runtimeFiles } = require('./catalog.cjs');
|
|
8
|
-
const root = path.resolve(__dirname, '..');
|
|
9
|
-
const ref = process.argv[2];
|
|
10
|
-
if (!ref || ref.startsWith('-') || process.argv.length !== 3) {
|
|
11
|
-
console.error('Usage: node rebrand/record-upstream.cjs <reviewed upstream ref>');
|
|
12
|
-
process.exit(1);
|
|
13
|
-
}
|
|
14
|
-
try {
|
|
15
|
-
const git = args => execFileSync('git', args, { cwd: root, encoding: 'utf8', maxBuffer: 16 * 1024 * 1024 });
|
|
16
|
-
const commit = git(['rev-parse', '--verify', '--end-of-options', `${ref}^{commit}`]).trim();
|
|
17
|
-
const entries = git(['ls-tree', '-rz', commit, '--', ...runtimeRoots, ...runtimeFiles]).split('\0').filter(Boolean);
|
|
18
|
-
const blobs = new Map(entries.filter(line => /^100\d+ blob /.test(line)).map(line => {
|
|
19
|
-
const [metadata, file] = line.split('\t');
|
|
20
|
-
return [file, metadata.split(' ')[2]];
|
|
21
|
-
}));
|
|
22
|
-
const read = file => git(['cat-file', 'blob', blobs.get(file)]);
|
|
23
|
-
const snapshot = {
|
|
24
|
-
upstreamCommit: commit,
|
|
25
|
-
upstreamVersion: JSON.parse(read('plugin.json')).version,
|
|
26
|
-
...describe([...blobs.keys()], read),
|
|
27
|
-
};
|
|
28
|
-
fs.writeFileSync(path.join(__dirname, 'upstream.json'), JSON.stringify(snapshot, null, 2) + '\n');
|
|
29
|
-
const brandFile = path.join(__dirname, 'brand.json');
|
|
30
|
-
const brand = JSON.parse(fs.readFileSync(brandFile, 'utf8'));
|
|
31
|
-
brand.upstreamCommit = commit;
|
|
32
|
-
fs.writeFileSync(brandFile, JSON.stringify(brand, null, 2) + '\n');
|
|
33
|
-
console.log(JSON.stringify({ commit, version: snapshot.upstreamVersion, skills: snapshot.skills.length, commands: snapshot.commands.length }));
|
|
34
|
-
} catch (error) {
|
|
35
|
-
console.error(error.message);
|
|
36
|
-
process.exitCode = 1;
|
|
37
|
-
}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
# i3 Composer Agent v{{RELEASE_VERSION}}
|
|
2
|
-
|
|
3
|
-
**Based on agent-skills v{{UPSTREAM_VERSION}}**
|
|
4
|
-
|
|
5
|
-
**Intelligence. Integration. Innovation.**
|
|
6
|
-
|
|
7
|
-
Engineering skills, lifecycle commands, and specialist personas for AI coding agents.
|
|
8
|
-
Based on [Agent Skills](https://github.com/addyosmani/agent-skills) by Addy Osmani
|
|
9
|
-
(MIT). See [NOTICE.md](NOTICE.md) for attribution.
|
|
10
|
-
|
|
11
|
-
The npm package is `@givolt/i3-composer-agent`; the plugin and marketplace ID is
|
|
12
|
-
`i3-composer-agent`. Skill IDs retain their upstream names.
|
|
13
|
-
|
|
14
|
-
## Install with the wizard
|
|
15
|
-
|
|
16
|
-
Run in the project where you want to use the skills:
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npx @givolt/i3-composer-agent
|
|
20
|
-
# Preselect a tool; the wizard still allows multiple selections:
|
|
21
|
-
npx @givolt/i3-composer-agent --codebuddy
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
The interactive terminal wizard offers multiple tools, project or global scope,
|
|
25
|
-
an installation summary, and confirmation. Its 79 tool directory presets come
|
|
26
|
-
from the pinned [Vercel Skills CLI registry](https://github.com/vercel-labs/skills/blob/48dc9e8eb8aa19040e91cb90ba0b642c9cbad57e/src/agents.ts).
|
|
27
|
-
Choose by tool ID or comma-separated menu numbers. Use `--list-agents` to list
|
|
28
|
-
the choices. Directory presets are not an execution test of every host.
|
|
29
|
-
|
|
30
|
-
Every selected tool receives all {{SKILL_COUNT}} skills and shared references.
|
|
31
|
-
CodeBuddy and Claude Code also receive {{COMMAND_COUNT}} short command workflows
|
|
32
|
-
and {{PERSONA_COUNT}} persona files. Other tools use their native skill support;
|
|
33
|
-
short lifecycle commands depend on the host. Shared destinations are installed
|
|
34
|
-
once. License and attribution files accompany each native installation.
|
|
35
|
-
Reload the IDE window or start a new session after installation. See
|
|
36
|
-
[CodeBuddy setup](docs/codebuddy-setup.md) and [Codex setup](docs/codex-setup.md).
|
|
37
|
-
|
|
38
|
-
For an explicit installation without prompts:
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
npx @givolt/i3-composer-agent --agents codebuddy,codex --scope project --yes
|
|
42
|
-
npx @givolt/i3-composer-agent --claude --scope global --yes
|
|
43
|
-
npx @givolt/i3-composer-agent --codebuddy --scope project --dry-run
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Existing assets require confirmation; use `--force` with noninteractive installs.
|
|
47
|
-
Replacement preserves previous files in a `.i3-composer-agent-backup-*` directory
|
|
48
|
-
under each tool configuration root. Unrelated settings are left in place.
|
|
49
|
-
`npx -y` accepts npm's package download prompt; the package's own `--yes` flag
|
|
50
|
-
accepts the explicit installation plan.
|
|
51
|
-
|
|
52
|
-
## Prepare the complete plugin
|
|
53
|
-
|
|
54
|
-
For native plugin registration, including plugin hooks, explicitly prepare a
|
|
55
|
-
persistent `./i3-composer-agent/` bundle:
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
npx @givolt/i3-composer-agent --prepare --codebuddy
|
|
59
|
-
npx @givolt/i3-composer-agent --prepare --codex
|
|
60
|
-
npx @givolt/i3-composer-agent --prepare --claude
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
The bundle includes skills, commands, personas, hooks and references. Run the
|
|
64
|
-
registration commands printed by the CLI in the intended host. This preparation
|
|
65
|
-
mode does not install native skills or choose the host plugin manager's scope.
|
|
66
|
-
|
|
67
|
-
CodeBuddy Code (terminal) / Claude Code:
|
|
68
|
-
|
|
69
|
-
```text
|
|
70
|
-
/plugin marketplace add ./i3-composer-agent
|
|
71
|
-
/plugin install i3-composer-agent@i3-composer-agent
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Codex:
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
codex plugin marketplace add ./i3-composer-agent
|
|
78
|
-
codex plugin add i3-composer-agent@i3-composer-agent
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
Start a new session after enabling the plugin. Codex uses the existing Skill
|
|
82
|
-
names, such as `$spec-driven-development`; lifecycle slash-command adaptation
|
|
83
|
-
is maintained separately.
|
|
84
|
-
|
|
85
|
-
## Commands
|
|
86
|
-
|
|
87
|
-
Native CodeBuddy and Claude Code installations use short filenames such as
|
|
88
|
-
`/spec`, `/plan`, `/build` and `/ship`. Hosts supporting Claude-compatible plugin
|
|
89
|
-
commands load the same workflows under the plugin namespace:
|
|
90
|
-
|
|
91
|
-
| Command | Description |
|
|
92
|
-
| --- | --- |
|
|
93
|
-
{{COMMAND_TABLE}}
|
|
94
|
-
|
|
95
|
-
`/i3-composer-agent:build auto` runs the existing approved-plan workflow.
|
|
96
|
-
|
|
97
|
-
## Skills
|
|
98
|
-
|
|
99
|
-
| Skill | Description |
|
|
100
|
-
| --- | --- |
|
|
101
|
-
{{SKILL_TABLE}}
|
|
102
|
-
|
|
103
|
-
## Bundle options
|
|
104
|
-
|
|
105
|
-
```bash
|
|
106
|
-
npx @givolt/i3-composer-agent --extract --dir /path/to/plugin
|
|
107
|
-
npx @givolt/i3-composer-agent --codebuddy --dir /path/to/plugin --dry-run
|
|
108
|
-
npx @givolt/i3-composer-agent --codebuddy --dir /path/to/plugin --force
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Explicit `--dir` retains the original plugin preparation behavior. Replacement
|
|
112
|
-
preserves the previous i3 bundle as a backup. Repository-scoped
|
|
113
|
-
AGENTS.md and CLAUDE.md are not copied into business projects.
|
|
114
|
-
|
|
115
|
-
## Maintaining this fork
|
|
116
|
-
|
|
117
|
-
This repository is independent of the GSD-based i3 Composer Work repository.
|
|
118
|
-
`agent/source` retains upstream source and the `rebrand/` rules; `main` contains
|
|
119
|
-
the validated branded distribution. Create release candidates from the source
|
|
120
|
-
branch, replay branding, validate, then update the release branch.
|
|
121
|
-
|
|
122
|
-
See [maintenance](rebrand/MAINTENANCE.md), [source PR workflow](rebrand/PR-WORKFLOW.md),
|
|
123
|
-
[versioning](rebrand/VERSIONING.md), [changelog](CHANGELOG.md),
|
|
124
|
-
and [validation contract](rebrand/VALIDATION.md).
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# Using i3 Composer Agent with CodeBuddy
|
|
2
|
-
|
|
3
|
-
## Desktop IDE installation
|
|
4
|
-
|
|
5
|
-
Run inside your business project:
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npx @givolt/i3-composer-agent --codebuddy
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
The terminal wizard preselects CodeBuddy, still allows multiple tools, and asks
|
|
12
|
-
for project or global scope before installing. Project scope writes these paths:
|
|
13
|
-
|
|
14
|
-
- `.codebuddy/skills/` — all {{SKILL_COUNT}} skills with their original IDs.
|
|
15
|
-
- `.codebuddy/references/` — shared checklists used by skill-relative links.
|
|
16
|
-
- `.codebuddy/commands/` — all {{COMMAND_COUNT}} existing lifecycle workflows.
|
|
17
|
-
- `.codebuddy/agents/` — all {{PERSONA_COUNT}} persona definitions.
|
|
18
|
-
|
|
19
|
-
Global scope uses the same layout under `~/.codebuddy/`. Existing assets require
|
|
20
|
-
confirmed replacement and are preserved in backup directories. Settings are
|
|
21
|
-
not replaced. Reload the CodeBuddy window or start a new chat, then inspect
|
|
22
|
-
the Skills list and type `/` to inspect the command menu.
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
/spec
|
|
26
|
-
/plan
|
|
27
|
-
/build
|
|
28
|
-
/build auto
|
|
29
|
-
/review
|
|
30
|
-
/ship
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
The command wrappers reference installed skill IDs without the plugin namespace.
|
|
34
|
-
Their workflow content and approval gates are retained. File installation does
|
|
35
|
-
not itself prove that the IDE has discovered or executed every workflow.
|
|
36
|
-
|
|
37
|
-
For multiple tools or a noninteractive installation:
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
npx @givolt/i3-composer-agent --agents codebuddy,codex --scope project --yes
|
|
41
|
-
npx @givolt/i3-composer-agent --codebuddy --scope global --yes
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
CodeBuddy documents [IDE skills](https://www.codebuddy.cn/docs/ide/Features/Skills)
|
|
45
|
-
and [IDE custom commands](https://www.codebuddy.cn/docs/ide/User-guide/Slash-Commands).
|
|
46
|
-
The directory layout follows its [configuration directory reference](https://www.codebuddy.cn/docs/cli/codebuddy-dir).
|
|
47
|
-
|
|
48
|
-
## CodeBuddy Code native plugin registration
|
|
49
|
-
|
|
50
|
-
For the terminal CodeBuddy Code plugin manager, explicitly prepare the full
|
|
51
|
-
plugin instead of native skill installation:
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
npx @givolt/i3-composer-agent --prepare --codebuddy
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
In CodeBuddy Code, register the prepared directory and install the plugin:
|
|
58
|
-
|
|
59
|
-
```text
|
|
60
|
-
/plugin marketplace add ./i3-composer-agent
|
|
61
|
-
/plugin install i3-composer-agent@i3-composer-agent
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Use the absolute directory printed by the CLI if CodeBuddy has a different
|
|
65
|
-
working directory. Choose the intended installation scope in CodeBuddy Code's native
|
|
66
|
-
plugin manager. Reload plugins or start a new session after installation.
|
|
67
|
-
|
|
68
|
-
CodeBuddy Code supports the existing `.claude-plugin/plugin.json` compatibility
|
|
69
|
-
manifest. It declares `.claude/commands/` and `commands/`, preserving the nine
|
|
70
|
-
original lifecycle commands and their workflow content.
|
|
71
|
-
|
|
72
|
-
```text
|
|
73
|
-
/i3-composer-agent:spec
|
|
74
|
-
/i3-composer-agent:plan
|
|
75
|
-
/i3-composer-agent:build
|
|
76
|
-
/i3-composer-agent:build auto
|
|
77
|
-
/i3-composer-agent:review
|
|
78
|
-
/i3-composer-agent:ship
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
Skill IDs, persona names, artifact paths, and workflow gates retain their
|
|
82
|
-
upstream behavior. The plugin namespace changes to `i3-composer-agent`.
|
|
83
|
-
|
|
84
|
-
The prepared plugin includes all skills, personas, commands, hooks and shared
|
|
85
|
-
`references/`. Native skill installation above does not enable plugin hooks.
|
|
86
|
-
|
|
87
|
-
In this explicit mode the CLI prepares files and prints registration commands. Actual host discovery
|
|
88
|
-
and model execution should be verified after registering the plugin.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# Using i3 Composer Agent with Codex
|
|
2
|
-
|
|
3
|
-
For the multi-tool native skill wizard, run in your project:
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
npx @givolt/i3-composer-agent --codex
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
Choose project or global scope. Native installation uses `.agents/skills/`
|
|
10
|
-
or `~/.agents/skills/`, plus the sibling `references/` directory. It retains
|
|
11
|
-
the {{SKILL_COUNT}} original skill IDs. This mode does not add short lifecycle
|
|
12
|
-
slash commands or enable plugin hooks.
|
|
13
|
-
|
|
14
|
-
For complete plugin registration, prepare a persistent bundle explicitly:
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
npx @givolt/i3-composer-agent --prepare --codex
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
This mode copies a persistent `./i3-composer-agent/` bundle and prints these
|
|
21
|
-
native registration commands. Run them to enable the plugin:
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
codex plugin marketplace add ./i3-composer-agent
|
|
25
|
-
codex plugin add i3-composer-agent@i3-composer-agent
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Start a new Codex session after registration. All {{SKILL_COUNT}} existing skills keep their
|
|
29
|
-
original IDs. In CLI/IDE, use `/skills` or `$spec-driven-development`; in chat,
|
|
30
|
-
explicitly request the relevant skill from i3 Composer Agent.
|
|
31
|
-
|
|
32
|
-
The adapter in `.codex-plugin/plugin.json` points at the unchanged `skills/`
|
|
33
|
-
layout. Shared checklists remain under `references/`, so skill-relative links
|
|
34
|
-
resolve inside the complete plugin bundle.
|
|
35
|
-
|
|
36
|
-
The short lifecycle commands (`/spec`, `/plan`, `/build`, `/ship`) remain
|
|
37
|
-
available in hosts that load the Claude-compatible command manifest. Codex
|
|
38
|
-
lifecycle-command adaptation is separate from this brand conversion. Native
|
|
39
|
-
Codex `/plan` switches planning mode; it is not the plugin's planning wrapper.
|
|
40
|
-
|
|
41
|
-
Do not preload `using-agent-skills/SKILL.md` into always-on context: Codex routes
|
|
42
|
-
skills natively. The meta-skill can remain installed and explicitly invoked.
|
|
43
|
-
|
|
44
|
-
For local source testing, replace `./i3-composer-agent` above with the absolute
|
|
45
|
-
path to the branded checkout. The CLI does not modify existing plugin settings.
|