@givolt/i3-composer-agent 2.0.0 → 2.1.1

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.
Files changed (158) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/.claude-plugin/plugin.json +1 -1
  4. package/.codex-plugin/plugin.json +1 -1
  5. package/README.md +37 -33
  6. package/bin/agent-targets.json +11 -0
  7. package/bin/asset-fingerprint.cjs +38 -0
  8. package/bin/cleanup-backups.cjs +16 -0
  9. package/bin/i3-composer-agent.cjs +28 -12
  10. package/bin/install.cjs +74 -28
  11. package/bin/native-content.cjs +29 -0
  12. package/bin/wizard.cjs +3 -1
  13. package/docs/antigravity-setup.md +1 -1
  14. package/docs/codebuddy-setup.md +16 -3
  15. package/docs/cursor-setup.md +2 -2
  16. package/docs/getting-started.md +0 -2
  17. package/docs/opencode-setup.md +4 -4
  18. package/docs/workbuddy-setup.md +106 -0
  19. package/package.json +36 -20
  20. package/plugin.json +1 -1
  21. package/CHANGELOG.md +0 -51
  22. package/NOTICE.md +0 -15
  23. package/docs/advanced-per-agent-configuration.md +0 -70
  24. package/docs/comparison.md +0 -131
  25. package/docs/developer-onboarding.md +0 -116
  26. package/docs/skill-anatomy.md +0 -203
  27. package/evals/README.md +0 -101
  28. package/evals/cases/i3-api-and-interface-design.json +0 -45
  29. package/evals/cases/i3-browser-testing-with-devtools.json +0 -44
  30. package/evals/cases/i3-ci-cd-and-automation.json +0 -45
  31. package/evals/cases/i3-code-review-and-quality.json +0 -49
  32. package/evals/cases/i3-code-simplification.json +0 -45
  33. package/evals/cases/i3-constraint-driven-development.json +0 -79
  34. package/evals/cases/i3-context-engineering.json +0 -44
  35. package/evals/cases/i3-debugging-and-error-recovery.json +0 -58
  36. package/evals/cases/i3-deprecation-and-migration.json +0 -52
  37. package/evals/cases/i3-documentation-and-adrs.json +0 -44
  38. package/evals/cases/i3-doubt-driven-development.json +0 -43
  39. package/evals/cases/i3-frontend-ui-engineering.json +0 -52
  40. package/evals/cases/i3-git-workflow-and-versioning.json +0 -47
  41. package/evals/cases/i3-idea-refine.json +0 -43
  42. package/evals/cases/i3-incremental-implementation.json +0 -57
  43. package/evals/cases/i3-interview-me.json +0 -42
  44. package/evals/cases/i3-observability-and-instrumentation.json +0 -44
  45. package/evals/cases/i3-performance-optimization.json +0 -53
  46. package/evals/cases/i3-planning-and-task-breakdown.json +0 -45
  47. package/evals/cases/i3-security-and-hardening.json +0 -53
  48. package/evals/cases/i3-shipping-and-launch.json +0 -56
  49. package/evals/cases/i3-source-driven-development.json +0 -44
  50. package/evals/cases/i3-spec-driven-development.json +0 -72
  51. package/evals/cases/i3-test-driven-development.json +0 -73
  52. package/evals/cases/i3-using-agent-skills.json +0 -44
  53. package/evals/fixtures/i3-api-and-interface-design/service-brief.md +0 -19
  54. package/evals/fixtures/i3-browser-testing-with-devtools/README.md +0 -5
  55. package/evals/fixtures/i3-browser-testing-with-devtools/index.html +0 -24
  56. package/evals/fixtures/i3-browser-testing-with-devtools/server.js +0 -15
  57. package/evals/fixtures/i3-ci-cd-and-automation/package.json +0 -8
  58. package/evals/fixtures/i3-ci-cd-and-automation/src/slug.js +0 -3
  59. package/evals/fixtures/i3-ci-cd-and-automation/test/slug.test.js +0 -9
  60. package/evals/fixtures/i3-code-review-and-quality/user-search.diff +0 -16
  61. package/evals/fixtures/i3-code-simplification/config-parser.js +0 -46
  62. package/evals/fixtures/i3-code-simplification/config-parser.test.js +0 -15
  63. package/evals/fixtures/i3-context-engineering/context-audit.md +0 -15
  64. package/evals/fixtures/i3-debugging-and-error-recovery/pagination.js +0 -8
  65. package/evals/fixtures/i3-debugging-and-error-recovery/pagination.test.js +0 -9
  66. package/evals/fixtures/i3-debugging-and-error-recovery/time-pressure.md +0 -6
  67. package/evals/fixtures/i3-deprecation-and-migration/api-inventory.md +0 -9
  68. package/evals/fixtures/i3-documentation-and-adrs/decision-context.md +0 -16
  69. package/evals/fixtures/i3-doubt-driven-development/migration-plan.md +0 -19
  70. package/evals/fixtures/i3-frontend-ui-engineering/Button.tsx +0 -7
  71. package/evals/fixtures/i3-frontend-ui-engineering/design-system.md +0 -11
  72. package/evals/fixtures/i3-git-workflow-and-versioning/.eval/working-tree.patch +0 -21
  73. package/evals/fixtures/i3-git-workflow-and-versioning/app.js +0 -7
  74. package/evals/fixtures/i3-git-workflow-and-versioning/app.test.js +0 -9
  75. package/evals/fixtures/i3-incremental-implementation/reports.js +0 -7
  76. package/evals/fixtures/i3-incremental-implementation/reports.test.js +0 -12
  77. package/evals/fixtures/i3-incremental-implementation/tasks/plan.md +0 -8
  78. package/evals/fixtures/i3-observability-and-instrumentation/operations.md +0 -11
  79. package/evals/fixtures/i3-observability-and-instrumentation/payment-retry.js +0 -14
  80. package/evals/fixtures/i3-performance-optimization/benchmark.js +0 -15
  81. package/evals/fixtures/i3-performance-optimization/products.js +0 -14
  82. package/evals/fixtures/i3-planning-and-task-breakdown/notifications-spec.md +0 -18
  83. package/evals/fixtures/i3-security-and-hardening/webhook.js +0 -11
  84. package/evals/fixtures/i3-security-and-hardening/webhook.test.js +0 -13
  85. package/evals/fixtures/i3-shipping-and-launch/authority-pressure.md +0 -6
  86. package/evals/fixtures/i3-shipping-and-launch/launch-status.md +0 -11
  87. package/evals/fixtures/i3-source-driven-development/framework-task.md +0 -10
  88. package/evals/fixtures/i3-spec-driven-development/billing-brief.md +0 -16
  89. package/evals/fixtures/i3-test-driven-development/BUG.md +0 -10
  90. package/evals/fixtures/i3-test-driven-development/README.md +0 -28
  91. package/evals/fixtures/i3-test-driven-development/package.json +0 -9
  92. package/evals/fixtures/i3-test-driven-development/src/split.js +0 -8
  93. package/evals/fixtures/i3-test-driven-development/test/split.test.js +0 -13
  94. package/evals/fixtures/i3-using-agent-skills/incident.md +0 -6
  95. package/evals/fixtures/incremental-implementation-pressure/draft-export.js +0 -17
  96. package/evals/fixtures/incremental-implementation-pressure/scenario.md +0 -9
  97. package/evals/fixtures/spec-driven-development-decomposition/portal-brief.md +0 -22
  98. package/evals/fixtures/test-driven-development-ecosystem/README.md +0 -9
  99. package/evals/fixtures/test-driven-development-ecosystem/ledger.py +0 -15
  100. package/evals/fixtures/test-driven-development-ecosystem/test_ledger.py +0 -19
  101. package/evals/plugin/code-review-fires/graders/off-by-one.md +0 -7
  102. package/evals/plugin/code-review-fires/graders/severity-labels.md +0 -4
  103. package/evals/plugin/code-review-fires/graders/skill-fired.md +0 -5
  104. package/evals/plugin/code-review-fires/prompt.md +0 -31
  105. package/evals/plugin/code-review-stays-quiet/graders/not-fired.md +0 -8
  106. package/evals/plugin/code-review-stays-quiet/graders/tdd-fired.md +0 -6
  107. package/evals/plugin/code-review-stays-quiet/prompt.md +0 -8
  108. package/evals/plugin/code-review-stays-quiet-on-commit-message/graders/not-fired.md +0 -8
  109. package/evals/plugin/code-review-stays-quiet-on-commit-message/prompt.md +0 -25
  110. package/evals/skill-impact.md +0 -6
  111. package/rebrand/INSTALLATION-SPEC.md +0 -47
  112. package/rebrand/MAINTENANCE.md +0 -114
  113. package/rebrand/NOTICE.md +0 -15
  114. package/rebrand/PR-WORKFLOW.md +0 -34
  115. package/rebrand/PREFIX-SPEC.md +0 -16
  116. package/rebrand/UNIFICATION-SPEC.md +0 -33
  117. package/rebrand/VALIDATION.md +0 -32
  118. package/rebrand/VERSIONING.md +0 -35
  119. package/rebrand/apply.cjs +0 -217
  120. package/rebrand/brand.json +0 -13
  121. package/rebrand/catalog.cjs +0 -70
  122. package/rebrand/fork-patches.json +0 -27
  123. package/rebrand/identifiers.cjs +0 -41
  124. package/rebrand/overlay/.github/workflows/test-plugin-install.yml +0 -177
  125. package/rebrand/overlay/CHANGELOG.md +0 -51
  126. package/rebrand/overlay/bin/agent-targets.json +0 -726
  127. package/rebrand/overlay/bin/i3-composer-agent.cjs +0 -190
  128. package/rebrand/overlay/bin/install.cjs +0 -180
  129. package/rebrand/overlay/bin/skills-registry.LICENSE +0 -21
  130. package/rebrand/overlay/bin/wizard.cjs +0 -66
  131. package/rebrand/overlay/scripts/validate-brand.cjs +0 -44
  132. package/rebrand/overlay/tests/bundle.test.cjs +0 -85
  133. package/rebrand/overlay/tests/installer.test.cjs +0 -241
  134. package/rebrand/package.template.json +0 -82
  135. package/rebrand/rebrand.sh +0 -4
  136. package/rebrand/record-upstream.cjs +0 -37
  137. package/rebrand/templates/README.md +0 -130
  138. package/rebrand/templates/codebuddy-setup.md +0 -89
  139. package/rebrand/templates/codex-setup.md +0 -45
  140. package/rebrand/tests/pipeline.test.cjs +0 -253
  141. package/rebrand/upstream.json +0 -171
  142. package/scripts/floor-guard-reference-test.js +0 -291
  143. package/scripts/lib/skill-lint-test.js +0 -650
  144. package/scripts/lib/skill-lint.js +0 -586
  145. package/scripts/run-evals-test.js +0 -623
  146. package/scripts/run-evals.js +0 -638
  147. package/scripts/validate-artifact-paths-test.js +0 -179
  148. package/scripts/validate-artifact-paths.js +0 -130
  149. package/scripts/validate-brand.cjs +0 -44
  150. package/scripts/validate-commands-test.js +0 -216
  151. package/scripts/validate-commands.js +0 -223
  152. package/scripts/validate-reference-links-test.js +0 -495
  153. package/scripts/validate-reference-links.js +0 -187
  154. package/scripts/validate-skills.js +0 -69
  155. package/scripts/validate-versions-test.js +0 -32
  156. package/scripts/validate-versions.js +0 -35
  157. package/tests/bundle.test.cjs +0 -85
  158. 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
- });
@@ -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
- }