@givolt/i3-composer-agent 2.0.0 → 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-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +29 -32
- 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 +27 -12
- package/bin/install.cjs +74 -28
- package/bin/native-content.cjs +29 -0
- package/bin/wizard.cjs +2 -1
- package/docs/antigravity-setup.md +1 -1
- package/docs/codebuddy-setup.md +11 -3
- package/docs/cursor-setup.md +2 -2
- package/docs/getting-started.md +0 -2
- package/docs/opencode-setup.md +4 -4
- package/docs/workbuddy-setup.md +92 -0
- package/package.json +36 -20
- package/plugin.json +1 -1
- package/CHANGELOG.md +0 -51
- package/NOTICE.md +0 -15
- 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/i3-api-and-interface-design.json +0 -45
- package/evals/cases/i3-browser-testing-with-devtools.json +0 -44
- package/evals/cases/i3-ci-cd-and-automation.json +0 -45
- package/evals/cases/i3-code-review-and-quality.json +0 -49
- package/evals/cases/i3-code-simplification.json +0 -45
- package/evals/cases/i3-constraint-driven-development.json +0 -79
- package/evals/cases/i3-context-engineering.json +0 -44
- package/evals/cases/i3-debugging-and-error-recovery.json +0 -58
- package/evals/cases/i3-deprecation-and-migration.json +0 -52
- package/evals/cases/i3-documentation-and-adrs.json +0 -44
- package/evals/cases/i3-doubt-driven-development.json +0 -43
- package/evals/cases/i3-frontend-ui-engineering.json +0 -52
- package/evals/cases/i3-git-workflow-and-versioning.json +0 -47
- package/evals/cases/i3-idea-refine.json +0 -43
- package/evals/cases/i3-incremental-implementation.json +0 -57
- package/evals/cases/i3-interview-me.json +0 -42
- package/evals/cases/i3-observability-and-instrumentation.json +0 -44
- package/evals/cases/i3-performance-optimization.json +0 -53
- package/evals/cases/i3-planning-and-task-breakdown.json +0 -45
- package/evals/cases/i3-security-and-hardening.json +0 -53
- package/evals/cases/i3-shipping-and-launch.json +0 -56
- package/evals/cases/i3-source-driven-development.json +0 -44
- package/evals/cases/i3-spec-driven-development.json +0 -72
- package/evals/cases/i3-test-driven-development.json +0 -73
- package/evals/cases/i3-using-agent-skills.json +0 -44
- package/evals/fixtures/i3-api-and-interface-design/service-brief.md +0 -19
- package/evals/fixtures/i3-browser-testing-with-devtools/README.md +0 -5
- package/evals/fixtures/i3-browser-testing-with-devtools/index.html +0 -24
- package/evals/fixtures/i3-browser-testing-with-devtools/server.js +0 -15
- package/evals/fixtures/i3-ci-cd-and-automation/package.json +0 -8
- package/evals/fixtures/i3-ci-cd-and-automation/src/slug.js +0 -3
- package/evals/fixtures/i3-ci-cd-and-automation/test/slug.test.js +0 -9
- package/evals/fixtures/i3-code-review-and-quality/user-search.diff +0 -16
- package/evals/fixtures/i3-code-simplification/config-parser.js +0 -46
- package/evals/fixtures/i3-code-simplification/config-parser.test.js +0 -15
- package/evals/fixtures/i3-context-engineering/context-audit.md +0 -15
- package/evals/fixtures/i3-debugging-and-error-recovery/pagination.js +0 -8
- package/evals/fixtures/i3-debugging-and-error-recovery/pagination.test.js +0 -9
- package/evals/fixtures/i3-debugging-and-error-recovery/time-pressure.md +0 -6
- package/evals/fixtures/i3-deprecation-and-migration/api-inventory.md +0 -9
- package/evals/fixtures/i3-documentation-and-adrs/decision-context.md +0 -16
- package/evals/fixtures/i3-doubt-driven-development/migration-plan.md +0 -19
- package/evals/fixtures/i3-frontend-ui-engineering/Button.tsx +0 -7
- package/evals/fixtures/i3-frontend-ui-engineering/design-system.md +0 -11
- package/evals/fixtures/i3-git-workflow-and-versioning/.eval/working-tree.patch +0 -21
- package/evals/fixtures/i3-git-workflow-and-versioning/app.js +0 -7
- package/evals/fixtures/i3-git-workflow-and-versioning/app.test.js +0 -9
- package/evals/fixtures/i3-incremental-implementation/reports.js +0 -7
- package/evals/fixtures/i3-incremental-implementation/reports.test.js +0 -12
- package/evals/fixtures/i3-incremental-implementation/tasks/plan.md +0 -8
- package/evals/fixtures/i3-observability-and-instrumentation/operations.md +0 -11
- package/evals/fixtures/i3-observability-and-instrumentation/payment-retry.js +0 -14
- package/evals/fixtures/i3-performance-optimization/benchmark.js +0 -15
- package/evals/fixtures/i3-performance-optimization/products.js +0 -14
- package/evals/fixtures/i3-planning-and-task-breakdown/notifications-spec.md +0 -18
- package/evals/fixtures/i3-security-and-hardening/webhook.js +0 -11
- package/evals/fixtures/i3-security-and-hardening/webhook.test.js +0 -13
- package/evals/fixtures/i3-shipping-and-launch/authority-pressure.md +0 -6
- package/evals/fixtures/i3-shipping-and-launch/launch-status.md +0 -11
- package/evals/fixtures/i3-source-driven-development/framework-task.md +0 -10
- package/evals/fixtures/i3-spec-driven-development/billing-brief.md +0 -16
- package/evals/fixtures/i3-test-driven-development/BUG.md +0 -10
- package/evals/fixtures/i3-test-driven-development/README.md +0 -28
- package/evals/fixtures/i3-test-driven-development/package.json +0 -9
- package/evals/fixtures/i3-test-driven-development/src/split.js +0 -8
- package/evals/fixtures/i3-test-driven-development/test/split.test.js +0 -13
- package/evals/fixtures/i3-using-agent-skills/incident.md +0 -6
- package/evals/fixtures/incremental-implementation-pressure/draft-export.js +0 -17
- package/evals/fixtures/incremental-implementation-pressure/scenario.md +0 -9
- package/evals/fixtures/spec-driven-development-decomposition/portal-brief.md +0 -22
- 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/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 -47
- package/rebrand/MAINTENANCE.md +0 -114
- package/rebrand/NOTICE.md +0 -15
- package/rebrand/PR-WORKFLOW.md +0 -34
- package/rebrand/PREFIX-SPEC.md +0 -16
- package/rebrand/UNIFICATION-SPEC.md +0 -33
- package/rebrand/VALIDATION.md +0 -32
- package/rebrand/VERSIONING.md +0 -35
- package/rebrand/apply.cjs +0 -217
- package/rebrand/brand.json +0 -13
- package/rebrand/catalog.cjs +0 -70
- package/rebrand/fork-patches.json +0 -27
- package/rebrand/identifiers.cjs +0 -41
- package/rebrand/overlay/.github/workflows/test-plugin-install.yml +0 -177
- package/rebrand/overlay/CHANGELOG.md +0 -51
- 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 -180
- 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 -241
- 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 -130
- package/rebrand/templates/codebuddy-setup.md +0 -89
- package/rebrand/templates/codex-setup.md +0 -45
- package/rebrand/tests/pipeline.test.cjs +0 -253
- 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 -586
- 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 -130
- package/scripts/validate-brand.cjs +0 -44
- package/scripts/validate-commands-test.js +0 -216
- package/scripts/validate-commands.js +0 -223
- 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 -241
|
@@ -1,253 +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 baselineVersion = require('../upstream.json').upstreamVersion;
|
|
11
|
-
const upstream = require('../upstream.json');
|
|
12
|
-
const { runtimePath, rewriteReferences } = require('../identifiers.cjs');
|
|
13
|
-
|
|
14
|
-
function run(directory, executable, args) {
|
|
15
|
-
return spawnSync(executable, args, { cwd: directory, encoding: 'utf8' });
|
|
16
|
-
}
|
|
17
|
-
function git(directory, args) {
|
|
18
|
-
const result = run(directory, 'git', args);
|
|
19
|
-
assert.equal(result.status, 0, result.stderr);
|
|
20
|
-
return result.stdout.trim();
|
|
21
|
-
}
|
|
22
|
-
function node(directory, file, args = []) { return run(directory, process.execPath, [file, ...args]); }
|
|
23
|
-
function fixture(t, branch = 'release/test-candidate') {
|
|
24
|
-
const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'i3-agent-replay-'));
|
|
25
|
-
t.after(() => fs.rmSync(directory, { recursive: true, force: true }));
|
|
26
|
-
for (const name of ['skills', 'references', 'agents', 'commands', '.claude', '.gemini', '.claude-plugin', '.codex-plugin', '.agents', 'hooks', 'docs', 'scripts', 'evals', 'rebrand', 'LICENSE', 'plugin.json', 'README.md']) {
|
|
27
|
-
fs.cpSync(path.join(root, name), path.join(directory, name), { recursive: true, filter: file => !file.includes(`${path.sep}results${path.sep}`) });
|
|
28
|
-
}
|
|
29
|
-
function restore(folder) {
|
|
30
|
-
for (const entry of fs.readdirSync(folder, { withFileTypes: true })) {
|
|
31
|
-
if (entry.name === 'rebrand') continue;
|
|
32
|
-
const file = path.join(folder, entry.name);
|
|
33
|
-
if (entry.isDirectory()) restore(file);
|
|
34
|
-
else if (/\.(?:md|js|cjs|sh|toml|json|yml|patch|diff)$/.test(entry.name)) fs.writeFileSync(file, rewriteReferences(fs.readFileSync(file, 'utf8'), true));
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
restore(directory);
|
|
38
|
-
for (const source of [...upstream.skills.map(id => `skills/${id}`), ...upstream.skills.map(id => `evals/cases/${id}.json`), ...upstream.skills.map(id => `evals/fixtures/${id}`), ...upstream.runtimeFiles.filter(file => /commands\/[^/]+\.(md|toml)$/.test(file))]) {
|
|
39
|
-
const branded = runtimePath(source);
|
|
40
|
-
if (fs.existsSync(path.join(directory, branded))) fs.renameSync(path.join(directory, branded), path.join(directory, source));
|
|
41
|
-
}
|
|
42
|
-
// Model an upstream source checkout, including when this suite runs in a packed branded bundle.
|
|
43
|
-
for (const name of ['plugin.json', '.claude-plugin/plugin.json', '.codex-plugin/plugin.json']) {
|
|
44
|
-
const file = path.join(directory, name);
|
|
45
|
-
const data = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
46
|
-
data.name = 'agent-skills';
|
|
47
|
-
data.version = baselineVersion;
|
|
48
|
-
fs.writeFileSync(file, JSON.stringify(data, null, 2) + '\n');
|
|
49
|
-
}
|
|
50
|
-
git(directory, ['init', '--initial-branch', branch]);
|
|
51
|
-
git(directory, ['config', 'user.name', 'Pipeline Test']);
|
|
52
|
-
git(directory, ['config', 'user.email', 'pipeline@example.test']);
|
|
53
|
-
git(directory, ['add', '.']);
|
|
54
|
-
git(directory, ['commit', '-m', 'upstream fixture']);
|
|
55
|
-
return directory;
|
|
56
|
-
}
|
|
57
|
-
function record(directory) {
|
|
58
|
-
const result = node(directory, 'rebrand/record-upstream.cjs', ['HEAD']);
|
|
59
|
-
assert.equal(result.status, 0, result.stderr);
|
|
60
|
-
}
|
|
61
|
-
function apply(directory) {
|
|
62
|
-
const result = node(directory, 'rebrand/apply.cjs', ['--apply']);
|
|
63
|
-
assert.equal(result.status, 0, result.stderr);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
test('a source checkout generates a complete, repeatable branded distribution', t => {
|
|
67
|
-
const directory = fixture(t);
|
|
68
|
-
record(directory);
|
|
69
|
-
apply(directory);
|
|
70
|
-
const pkg = JSON.parse(fs.readFileSync(path.join(directory, 'package.json'), 'utf8'));
|
|
71
|
-
assert.equal(pkg.name, '@givolt/i3-composer-agent');
|
|
72
|
-
const brand = JSON.parse(fs.readFileSync(path.join(directory, 'rebrand/brand.json'), 'utf8'));
|
|
73
|
-
assert.equal(pkg.version, brand.releaseVersion);
|
|
74
|
-
assert.equal(fs.existsSync(path.join(directory, 'bin/i3-composer-agent.cjs')), true);
|
|
75
|
-
const validation = node(directory, 'scripts/validate-brand.cjs');
|
|
76
|
-
assert.equal(validation.status, 0, validation.stdout + validation.stderr);
|
|
77
|
-
const complete = run(directory, 'npm', ['run', 'validate']);
|
|
78
|
-
assert.equal(complete.status, 0, complete.stdout + complete.stderr);
|
|
79
|
-
const routing = node(directory, 'scripts/run-evals.js', ['--min-rank1', '95']);
|
|
80
|
-
assert.equal(routing.status, 0, routing.stdout + routing.stderr);
|
|
81
|
-
const check = node(directory, 'rebrand/apply.cjs', ['--check']);
|
|
82
|
-
assert.equal(check.status, 0, check.stdout + check.stderr);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
test('branded commands and skills use i3 identifiers with working local references', t => {
|
|
86
|
-
const directory = fixture(t);
|
|
87
|
-
record(directory);
|
|
88
|
-
apply(directory);
|
|
89
|
-
const skill = 'i3-spec-driven-development';
|
|
90
|
-
const file = path.join(directory, 'skills', skill, 'SKILL.md');
|
|
91
|
-
assert.ok(fs.existsSync(file), 'branded Skill directory must use i3-');
|
|
92
|
-
assert.match(fs.readFileSync(file, 'utf8'), /^name: i3-spec-driven-development$/m);
|
|
93
|
-
assert.equal(fs.existsSync(path.join(directory, 'skills/spec-driven-development')), false);
|
|
94
|
-
const command = fs.readFileSync(path.join(directory, '.claude/commands/i3-spec.md'), 'utf8');
|
|
95
|
-
assert.match(command, /i3-composer-agent:i3-spec-driven-development/);
|
|
96
|
-
assert.equal(fs.existsSync(path.join(directory, '.claude/commands/spec.md')), false);
|
|
97
|
-
const helper = 'skills/i3-idea-refine/scripts/idea-refine.sh';
|
|
98
|
-
assert.ok(fs.statSync(path.join(directory, helper)).mode & 0o111, 'helper execution permissions must survive renaming');
|
|
99
|
-
assert.ok(fs.readFileSync(path.join(directory, 'skills/i3-idea-refine/SKILL.md'), 'utf8').includes(helper), 'helper reference must resolve to its retained filename');
|
|
100
|
-
for (const commands of ['commands', '.gemini/commands']) {
|
|
101
|
-
assert.ok(fs.existsSync(path.join(directory, commands, 'i3-planning.toml')));
|
|
102
|
-
}
|
|
103
|
-
const hook = fs.readFileSync(path.join(directory, 'hooks/session-start.sh'), 'utf8');
|
|
104
|
-
assert.match(hook, /i3-using-agent-skills\/SKILL\.md/);
|
|
105
|
-
assert.equal(node(directory, 'scripts/validate-commands.js').status, 0);
|
|
106
|
-
const readme = fs.readFileSync(path.join(directory, 'README.md'), 'utf8');
|
|
107
|
-
assert.match(readme, /\/i3-spec/);
|
|
108
|
-
assert.match(readme, /skills\/i3-spec-driven-development\/SKILL\.md/);
|
|
109
|
-
const check = node(directory, 'rebrand/apply.cjs', ['--check']);
|
|
110
|
-
assert.equal(check.status, 0, check.stdout + check.stderr);
|
|
111
|
-
apply(directory);
|
|
112
|
-
assert.equal(fs.existsSync(path.join(directory, 'skills/i3-i3-spec-driven-development')), false);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
test('generated native installer preserves references and migrates legacy identifiers safely', t => {
|
|
116
|
-
const directory = fixture(t);
|
|
117
|
-
record(directory);
|
|
118
|
-
apply(directory);
|
|
119
|
-
const result = run(directory, process.execPath, ['--test', 'tests/installer.test.cjs']);
|
|
120
|
-
assert.equal(result.status, 0, result.stdout + result.stderr);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test('identifier rewriting preserves upstream URLs and avoids repeated prefixes', () => {
|
|
124
|
-
const content = 'Use spec-driven-development and /spec. https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md';
|
|
125
|
-
const expected = 'Use i3-spec-driven-development and /i3-spec. https://github.com/addyosmani/agent-skills/blob/main/skills/spec-driven-development/SKILL.md';
|
|
126
|
-
assert.equal(rewriteReferences(content), expected);
|
|
127
|
-
assert.equal(rewriteReferences(expected), expected);
|
|
128
|
-
assert.equal(rewriteReferences(expected, true), content);
|
|
129
|
-
assert.equal(rewriteReferences('Save specs/auth/spec.md; use .claude/commands/spec.md.'), 'Save specs/auth/spec.md; use .claude/commands/i3-spec.md.');
|
|
130
|
-
assert.equal(rewriteReferences('skills/idea-refine/scripts/idea-refine.sh'), 'skills/i3-idea-refine/scripts/idea-refine.sh');
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
test('brand fixes advance independently while preserving upstream provenance', t => {
|
|
134
|
-
const directory = fixture(t);
|
|
135
|
-
record(directory);
|
|
136
|
-
const upstreamFile = path.join(directory, 'rebrand/upstream.json');
|
|
137
|
-
const originalUpstream = fs.readFileSync(upstreamFile, 'utf8');
|
|
138
|
-
const upstream = JSON.parse(originalUpstream);
|
|
139
|
-
const brandFile = path.join(directory, 'rebrand/brand.json');
|
|
140
|
-
const brand = JSON.parse(fs.readFileSync(brandFile, 'utf8'));
|
|
141
|
-
const releaseVersion = `${Number(upstream.upstreamVersion.split('.')[0]) + 1}.0.1`;
|
|
142
|
-
brand.releaseVersion = releaseVersion;
|
|
143
|
-
fs.writeFileSync(brandFile, JSON.stringify(brand, null, 2) + '\n');
|
|
144
|
-
apply(directory);
|
|
145
|
-
const packageFile = path.join(directory, 'package.json');
|
|
146
|
-
const originalPackage = fs.readFileSync(packageFile, 'utf8');
|
|
147
|
-
const pkg = JSON.parse(originalPackage);
|
|
148
|
-
assert.equal(pkg.version, releaseVersion);
|
|
149
|
-
assert.equal(pkg.i3ComposerAgent.upstreamVersion, upstream.upstreamVersion);
|
|
150
|
-
assert.equal(pkg.i3ComposerAgent.upstreamCommit, upstream.upstreamCommit);
|
|
151
|
-
assert.equal(fs.readFileSync(upstreamFile, 'utf8'), originalUpstream);
|
|
152
|
-
const releaseLabel = `i3 Composer Agent v${releaseVersion}`;
|
|
153
|
-
const upstreamLabel = `Based on agent-skills v${upstream.upstreamVersion}`;
|
|
154
|
-
for (const output of [fs.readFileSync(path.join(directory, 'README.md'), 'utf8'), node(directory, 'bin/i3-composer-agent.cjs', ['--help']).stdout]) {
|
|
155
|
-
assert.ok(output.includes(releaseLabel), output);
|
|
156
|
-
assert.ok(output.includes(upstreamLabel), output);
|
|
157
|
-
}
|
|
158
|
-
assert.equal(node(directory, 'bin/i3-composer-agent.cjs', ['--version']).stdout.trim(), releaseVersion);
|
|
159
|
-
const dryRun = node(directory, 'bin/i3-composer-agent.cjs', ['--extract', '--dry-run', '--dir', directory + '-prepared']);
|
|
160
|
-
assert.equal(dryRun.status, 0, dryRun.stderr);
|
|
161
|
-
assert.equal(JSON.parse(dryRun.stdout).upstreamVersion, upstream.upstreamVersion);
|
|
162
|
-
assert.equal(node(directory, 'scripts/validate-brand.cjs').status, 0);
|
|
163
|
-
pkg.i3ComposerAgent.upstreamVersion = releaseVersion;
|
|
164
|
-
fs.writeFileSync(packageFile, JSON.stringify(pkg));
|
|
165
|
-
assert.notEqual(node(directory, 'scripts/validate-brand.cjs').status, 0);
|
|
166
|
-
fs.writeFileSync(packageFile, originalPackage);
|
|
167
|
-
assert.equal(node(directory, 'rebrand/apply.cjs', ['--check']).status, 0);
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
test('writing a brand transform on the protected source branch changes nothing', t => {
|
|
171
|
-
const directory = fixture(t, 'agent/source');
|
|
172
|
-
const before = fs.readFileSync(path.join(directory, 'plugin.json'));
|
|
173
|
-
const result = node(directory, 'rebrand/apply.cjs', ['--apply']);
|
|
174
|
-
assert.notEqual(result.status, 0);
|
|
175
|
-
assert.match(result.stderr, /source branch/i);
|
|
176
|
-
assert.deepEqual(fs.readFileSync(path.join(directory, 'plugin.json')), before);
|
|
177
|
-
assert.equal(fs.existsSync(path.join(directory, 'package.json')), false);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
test('a reviewed upstream catalog can grow without losing its new skill or command', t => {
|
|
181
|
-
const directory = fixture(t);
|
|
182
|
-
const skill = path.join(directory, 'skills/upstream-new-skill');
|
|
183
|
-
fs.mkdirSync(skill);
|
|
184
|
-
fs.writeFileSync(path.join(skill, 'SKILL.md'), '---\nname: upstream-new-skill\ndescription: New upstream capability.\n---\n# Upstream capability\n');
|
|
185
|
-
fs.writeFileSync(path.join(directory, '.claude/commands/upstream-new-command.md'), '---\ndescription: Invoke the new upstream capability.\n---\nUse agent-skills:upstream-new-skill.\n');
|
|
186
|
-
git(directory, ['add', 'skills', '.claude/commands']);
|
|
187
|
-
git(directory, ['commit', '-m', 'new upstream capability']);
|
|
188
|
-
record(directory);
|
|
189
|
-
apply(directory);
|
|
190
|
-
const result = node(directory, 'scripts/validate-brand.cjs');
|
|
191
|
-
assert.equal(result.status, 0, result.stderr);
|
|
192
|
-
const description = JSON.parse(fs.readFileSync(path.join(directory, '.codex-plugin/plugin.json'), 'utf8')).interface.longDescription;
|
|
193
|
-
assert.match(description, /26 engineering skills/);
|
|
194
|
-
const readme = fs.readFileSync(path.join(directory, 'README.md'), 'utf8');
|
|
195
|
-
assert.match(readme, /upstream-new-skill/);
|
|
196
|
-
assert.match(readme, /upstream-new-command/);
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
test('missing files and altered skill identifiers fail preservation validation', t => {
|
|
200
|
-
const directory = fixture(t);
|
|
201
|
-
record(directory);
|
|
202
|
-
apply(directory);
|
|
203
|
-
const file = path.join(directory, 'skills/i3-using-agent-skills/SKILL.md');
|
|
204
|
-
const original = fs.readFileSync(file, 'utf8');
|
|
205
|
-
fs.writeFileSync(file, original.replace('name: i3-using-agent-skills', 'name: renamed-meta-skill'));
|
|
206
|
-
assert.notEqual(node(directory, 'scripts/validate-brand.cjs').status, 0);
|
|
207
|
-
fs.writeFileSync(file, original);
|
|
208
|
-
fs.rmSync(file);
|
|
209
|
-
assert.notEqual(node(directory, 'scripts/validate-brand.cjs').status, 0);
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
test('checkout line endings do not masquerade as an upstream skill change', t => {
|
|
213
|
-
const directory = fixture(t);
|
|
214
|
-
record(directory);
|
|
215
|
-
const file = path.join(directory, 'skills/using-agent-skills/SKILL.md');
|
|
216
|
-
fs.writeFileSync(file, fs.readFileSync(file, 'utf8').replace(/\r?\n/g, '\r\n'));
|
|
217
|
-
const script = path.join(directory, 'scripts/validate-versions.js');
|
|
218
|
-
fs.writeFileSync(script, fs.readFileSync(script, 'utf8').replace(/\r?\n/g, '\r\n'));
|
|
219
|
-
apply(directory);
|
|
220
|
-
assert.equal(node(directory, 'scripts/validate-brand.cjs').status, 0);
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
test('a new upstream package manifest requires an explicit distribution adaptation', t => {
|
|
224
|
-
const directory = fixture(t);
|
|
225
|
-
record(directory);
|
|
226
|
-
fs.writeFileSync(path.join(directory, 'package.json'), '{"name":"agent-skills","dependencies":{"upstream-runtime":"1.0.0"}}\n');
|
|
227
|
-
const before = fs.readFileSync(path.join(directory, 'plugin.json'));
|
|
228
|
-
const result = node(directory, 'rebrand/apply.cjs', ['--apply']);
|
|
229
|
-
assert.notEqual(result.status, 0);
|
|
230
|
-
assert.match(result.stderr, /package\.json/);
|
|
231
|
-
assert.deepEqual(fs.readFileSync(path.join(directory, 'plugin.json')), before);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
test('a distribution without repository CI files remains unchanged by a replay check', t => {
|
|
235
|
-
const directory = fixture(t);
|
|
236
|
-
record(directory);
|
|
237
|
-
apply(directory);
|
|
238
|
-
fs.rmSync(path.join(directory, '.github'), { recursive: true, force: true });
|
|
239
|
-
const result = node(directory, 'rebrand/apply.cjs', ['--check']);
|
|
240
|
-
assert.equal(result.status, 0, result.stdout + result.stderr);
|
|
241
|
-
assert.equal(fs.existsSync(path.join(directory, '.github')), false);
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
test('Finder metadata does not masquerade as an upstream runtime file', t => {
|
|
245
|
-
const directory = fixture(t);
|
|
246
|
-
record(directory);
|
|
247
|
-
fs.writeFileSync(path.join(directory, 'skills/.DS_Store'), 'Finder metadata');
|
|
248
|
-
fs.writeFileSync(path.join(directory, 'skills/spec-driven-development/.DS_Store'), 'Finder metadata');
|
|
249
|
-
apply(directory);
|
|
250
|
-
assert.equal(node(directory, 'scripts/validate-brand.cjs').status, 0);
|
|
251
|
-
const result = node(directory, 'rebrand/apply.cjs', ['--check']);
|
|
252
|
-
assert.equal(result.status, 0, result.stdout + result.stderr);
|
|
253
|
-
});
|
package/rebrand/upstream.json
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"upstreamCommit": "1401c8b8030e023baeebb31781a6653fe8e93026",
|
|
3
|
-
"upstreamVersion": "0.6.12",
|
|
4
|
-
"skills": [
|
|
5
|
-
"api-and-interface-design",
|
|
6
|
-
"browser-testing-with-devtools",
|
|
7
|
-
"ci-cd-and-automation",
|
|
8
|
-
"code-review-and-quality",
|
|
9
|
-
"code-simplification",
|
|
10
|
-
"constraint-driven-development",
|
|
11
|
-
"context-engineering",
|
|
12
|
-
"debugging-and-error-recovery",
|
|
13
|
-
"deprecation-and-migration",
|
|
14
|
-
"documentation-and-adrs",
|
|
15
|
-
"doubt-driven-development",
|
|
16
|
-
"frontend-ui-engineering",
|
|
17
|
-
"git-workflow-and-versioning",
|
|
18
|
-
"idea-refine",
|
|
19
|
-
"incremental-implementation",
|
|
20
|
-
"interview-me",
|
|
21
|
-
"observability-and-instrumentation",
|
|
22
|
-
"performance-optimization",
|
|
23
|
-
"planning-and-task-breakdown",
|
|
24
|
-
"security-and-hardening",
|
|
25
|
-
"shipping-and-launch",
|
|
26
|
-
"source-driven-development",
|
|
27
|
-
"spec-driven-development",
|
|
28
|
-
"test-driven-development",
|
|
29
|
-
"using-agent-skills"
|
|
30
|
-
],
|
|
31
|
-
"commands": [
|
|
32
|
-
"build",
|
|
33
|
-
"code-simplify",
|
|
34
|
-
"constraints",
|
|
35
|
-
"plan",
|
|
36
|
-
"review",
|
|
37
|
-
"ship",
|
|
38
|
-
"spec",
|
|
39
|
-
"test",
|
|
40
|
-
"webperf"
|
|
41
|
-
],
|
|
42
|
-
"personas": [
|
|
43
|
-
"code-reviewer",
|
|
44
|
-
"security-auditor",
|
|
45
|
-
"test-engineer",
|
|
46
|
-
"web-performance-auditor"
|
|
47
|
-
],
|
|
48
|
-
"references": [
|
|
49
|
-
"references/accessibility-checklist.md",
|
|
50
|
-
"references/definition-of-done.md",
|
|
51
|
-
"references/observability-checklist.md",
|
|
52
|
-
"references/orchestration-patterns.md",
|
|
53
|
-
"references/performance-checklist.md",
|
|
54
|
-
"references/security-checklist.md",
|
|
55
|
-
"references/testing-patterns.md"
|
|
56
|
-
],
|
|
57
|
-
"runtimeFiles": [
|
|
58
|
-
".agents/plugins/marketplace.json",
|
|
59
|
-
".claude-plugin/marketplace.json",
|
|
60
|
-
".claude-plugin/plugin.json",
|
|
61
|
-
".claude/commands/build.md",
|
|
62
|
-
".claude/commands/code-simplify.md",
|
|
63
|
-
".claude/commands/constraints.md",
|
|
64
|
-
".claude/commands/plan.md",
|
|
65
|
-
".claude/commands/review.md",
|
|
66
|
-
".claude/commands/ship.md",
|
|
67
|
-
".claude/commands/spec.md",
|
|
68
|
-
".claude/commands/test.md",
|
|
69
|
-
".claude/commands/webperf.md",
|
|
70
|
-
".codex-plugin/plugin.json",
|
|
71
|
-
".gemini/commands/build.toml",
|
|
72
|
-
".gemini/commands/code-simplify.toml",
|
|
73
|
-
".gemini/commands/constraints.toml",
|
|
74
|
-
".gemini/commands/planning.toml",
|
|
75
|
-
".gemini/commands/review.toml",
|
|
76
|
-
".gemini/commands/ship.toml",
|
|
77
|
-
".gemini/commands/spec.toml",
|
|
78
|
-
".gemini/commands/test.toml",
|
|
79
|
-
".gemini/commands/webperf.toml",
|
|
80
|
-
"LICENSE",
|
|
81
|
-
"agents/code-reviewer.md",
|
|
82
|
-
"agents/security-auditor.md",
|
|
83
|
-
"agents/test-engineer.md",
|
|
84
|
-
"agents/web-performance-auditor.md",
|
|
85
|
-
"commands/build.toml",
|
|
86
|
-
"commands/code-simplify.toml",
|
|
87
|
-
"commands/constraints.toml",
|
|
88
|
-
"commands/planning.toml",
|
|
89
|
-
"commands/review.toml",
|
|
90
|
-
"commands/ship.toml",
|
|
91
|
-
"commands/spec.toml",
|
|
92
|
-
"commands/test.toml",
|
|
93
|
-
"commands/webperf.toml",
|
|
94
|
-
"hooks/SDD-CACHE.md",
|
|
95
|
-
"hooks/SIMPLIFY-IGNORE.md",
|
|
96
|
-
"hooks/sdd-cache-post.sh",
|
|
97
|
-
"hooks/sdd-cache-pre.sh",
|
|
98
|
-
"hooks/sdd-cache-test.sh",
|
|
99
|
-
"hooks/session-start-test.sh",
|
|
100
|
-
"hooks/session-start.sh",
|
|
101
|
-
"hooks/simplify-ignore-test.sh",
|
|
102
|
-
"hooks/simplify-ignore.sh",
|
|
103
|
-
"plugin.json",
|
|
104
|
-
"references/accessibility-checklist.md",
|
|
105
|
-
"references/definition-of-done.md",
|
|
106
|
-
"references/observability-checklist.md",
|
|
107
|
-
"references/orchestration-patterns.md",
|
|
108
|
-
"references/performance-checklist.md",
|
|
109
|
-
"references/security-checklist.md",
|
|
110
|
-
"references/testing-patterns.md",
|
|
111
|
-
"skills/api-and-interface-design/SKILL.md",
|
|
112
|
-
"skills/browser-testing-with-devtools/SKILL.md",
|
|
113
|
-
"skills/ci-cd-and-automation/SKILL.md",
|
|
114
|
-
"skills/code-review-and-quality/SKILL.md",
|
|
115
|
-
"skills/code-simplification/SKILL.md",
|
|
116
|
-
"skills/constraint-driven-development/SKILL.md",
|
|
117
|
-
"skills/constraint-driven-development/references/floor-guard.md",
|
|
118
|
-
"skills/context-engineering/SKILL.md",
|
|
119
|
-
"skills/debugging-and-error-recovery/SKILL.md",
|
|
120
|
-
"skills/deprecation-and-migration/SKILL.md",
|
|
121
|
-
"skills/documentation-and-adrs/SKILL.md",
|
|
122
|
-
"skills/doubt-driven-development/SKILL.md",
|
|
123
|
-
"skills/frontend-ui-engineering/SKILL.md",
|
|
124
|
-
"skills/git-workflow-and-versioning/SKILL.md",
|
|
125
|
-
"skills/idea-refine/SKILL.md",
|
|
126
|
-
"skills/idea-refine/examples.md",
|
|
127
|
-
"skills/idea-refine/frameworks.md",
|
|
128
|
-
"skills/idea-refine/refinement-criteria.md",
|
|
129
|
-
"skills/idea-refine/scripts/idea-refine.sh",
|
|
130
|
-
"skills/incremental-implementation/SKILL.md",
|
|
131
|
-
"skills/interview-me/SKILL.md",
|
|
132
|
-
"skills/observability-and-instrumentation/SKILL.md",
|
|
133
|
-
"skills/performance-optimization/SKILL.md",
|
|
134
|
-
"skills/performance-optimization/references/optimization-patterns.md",
|
|
135
|
-
"skills/planning-and-task-breakdown/SKILL.md",
|
|
136
|
-
"skills/security-and-hardening/SKILL.md",
|
|
137
|
-
"skills/security-and-hardening/references/hardening-patterns.md",
|
|
138
|
-
"skills/shipping-and-launch/SKILL.md",
|
|
139
|
-
"skills/source-driven-development/SKILL.md",
|
|
140
|
-
"skills/spec-driven-development/SKILL.md",
|
|
141
|
-
"skills/test-driven-development/SKILL.md",
|
|
142
|
-
"skills/using-agent-skills/SKILL.md"
|
|
143
|
-
],
|
|
144
|
-
"skillFrontmatter": {
|
|
145
|
-
"api-and-interface-design": "44f904d462977e9514f439ac7c057b8691613ba8160360ad9d28b830d3a24001",
|
|
146
|
-
"browser-testing-with-devtools": "e235631718d18a0527d00eb718ecece2218bbf205d742632f8197b30c052e96b",
|
|
147
|
-
"ci-cd-and-automation": "dd73253ec445a9af27ebeab74404ee7a770919e40ec9db0b34af4fa9ec36bf7c",
|
|
148
|
-
"code-review-and-quality": "bf3dda5e08190fcf00175a5053f53550bca91ca32b0a06e4b97cd33e046e8eb7",
|
|
149
|
-
"code-simplification": "cee4dc87b4bc95d77fe646d4ab9e66c9a422dd081a833d657d618aaf2967b5a2",
|
|
150
|
-
"constraint-driven-development": "0da347bd34b155ab79cad1e0ee80238f3b4b91b1a17ca0fc2f68460c02224194",
|
|
151
|
-
"context-engineering": "f4f18514e5eeb162ef9f925dea85af2c72ba79f9b157783a06c39c0bde102d3f",
|
|
152
|
-
"debugging-and-error-recovery": "658d96f63d56946214a7ec87be0347c78d6024a18f6481dc9f7310638f403629",
|
|
153
|
-
"deprecation-and-migration": "388d5e7e549f1b728213f0f50d91e9ca96210e0cb23fd9fccd30755268dd01f9",
|
|
154
|
-
"documentation-and-adrs": "6b2a9d19ebbb81570022a89f09b4810eeb0643a48c698989ee27a224f90bc026",
|
|
155
|
-
"doubt-driven-development": "df8954091f08c14b0e91bf3bf330f43d5a8408c1efe697591b7b0e8448251c71",
|
|
156
|
-
"frontend-ui-engineering": "323624fe7ec44bdb4fad3c9488e55993119912625fffa20ee5787389da2b600d",
|
|
157
|
-
"git-workflow-and-versioning": "dd28469b0f294865dbd20d622a9fee5f05ef87ab1599e973fec6d15a16f76e15",
|
|
158
|
-
"idea-refine": "07eedcfcba98c6c8f6985917830c4b3d93d4e17af05a9b2ca1b8cb54226bc1b9",
|
|
159
|
-
"incremental-implementation": "d31e04a0d7b07fc7d01e0176aafbba5607f1cfe7a29a634498305d95c2b3bd3b",
|
|
160
|
-
"interview-me": "62700902b592a4fa28f6f71f2581d4e1dee412ff288eb156ed97fac3db8b4295",
|
|
161
|
-
"observability-and-instrumentation": "652b9724e431bd7cfd4481bbab31bb079eeab2b5f70ebc04cf66743e37028721",
|
|
162
|
-
"performance-optimization": "76befb0806caad12322de8fe372d2e984f6e07c393fd8d3658537c92c7e285cf",
|
|
163
|
-
"planning-and-task-breakdown": "c3bc139dfa7af82e2d11c7cf461bbf923add7d6494d669da98925f77a7671641",
|
|
164
|
-
"security-and-hardening": "981142e38769394e6e7760250f2dd599dff21a370040f3f141c42507f04ea540",
|
|
165
|
-
"shipping-and-launch": "02cc76557e581957cb4987a53e03a8d1aa04c72dc735390d52ae4eed3ddeddf9",
|
|
166
|
-
"source-driven-development": "233bf9f16f5fe0960c988a5feb2efc475b9b24f9e145d960f8c63e44f4f34fde",
|
|
167
|
-
"spec-driven-development": "e21f25e534ffa3e2de9ac08c40f8d1d90cef17ad55702f83301cbc2a297c2dcb",
|
|
168
|
-
"test-driven-development": "38f1489687eaa60761522a8e3efaa926b52786b0e1b3c57947a6050c0da340de",
|
|
169
|
-
"using-agent-skills": "df5d4f61855ac46da3371bad8c05edb8bc9375ba191acc82b0cca257cfec946c"
|
|
170
|
-
}
|
|
171
|
-
}
|