@givolt/i3-composer-agent 2.2.1 → 2.2.3

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.
@@ -0,0 +1,329 @@
1
+ {
2
+ "description": "Published native file inventory through 2.2.1; directory ownership never includes user additions.",
3
+ "files": [
4
+ "agents/code-reviewer.md",
5
+ "agents/security-auditor.md",
6
+ "agents/test-engineer.md",
7
+ "agents/web-performance-auditor.md",
8
+ "commands/build.md",
9
+ "commands/code-simplify.md",
10
+ "commands/constraints.md",
11
+ "commands/i3-build.md",
12
+ "commands/i3-code-simplify.md",
13
+ "commands/i3-constraints.md",
14
+ "commands/i3-plan.md",
15
+ "commands/i3-review.md",
16
+ "commands/i3-ship.md",
17
+ "commands/i3-spec.md",
18
+ "commands/i3-test.md",
19
+ "commands/i3-webperf.md",
20
+ "commands/plan.md",
21
+ "commands/review.md",
22
+ "commands/ship.md",
23
+ "commands/spec.md",
24
+ "commands/test.md",
25
+ "commands/webperf.md",
26
+ "docs/agents.md",
27
+ "i3-composer-agent-LICENSE",
28
+ "i3-composer-agent-NOTICE.md",
29
+ "i3-composer-agent/.agents/plugins/marketplace.json",
30
+ "i3-composer-agent/.claude-plugin/marketplace.json",
31
+ "i3-composer-agent/.claude-plugin/plugin.json",
32
+ "i3-composer-agent/.claude/commands/i3-build.md",
33
+ "i3-composer-agent/.claude/commands/i3-code-simplify.md",
34
+ "i3-composer-agent/.claude/commands/i3-constraints.md",
35
+ "i3-composer-agent/.claude/commands/i3-plan.md",
36
+ "i3-composer-agent/.claude/commands/i3-review.md",
37
+ "i3-composer-agent/.claude/commands/i3-ship.md",
38
+ "i3-composer-agent/.claude/commands/i3-spec.md",
39
+ "i3-composer-agent/.claude/commands/i3-test.md",
40
+ "i3-composer-agent/.claude/commands/i3-webperf.md",
41
+ "i3-composer-agent/.codex-plugin/plugin.json",
42
+ "i3-composer-agent/.gemini/commands/i3-build.toml",
43
+ "i3-composer-agent/.gemini/commands/i3-code-simplify.toml",
44
+ "i3-composer-agent/.gemini/commands/i3-constraints.toml",
45
+ "i3-composer-agent/.gemini/commands/i3-planning.toml",
46
+ "i3-composer-agent/.gemini/commands/i3-review.toml",
47
+ "i3-composer-agent/.gemini/commands/i3-ship.toml",
48
+ "i3-composer-agent/.gemini/commands/i3-spec.toml",
49
+ "i3-composer-agent/.gemini/commands/i3-test.toml",
50
+ "i3-composer-agent/.gemini/commands/i3-webperf.toml",
51
+ "i3-composer-agent/LICENSE",
52
+ "i3-composer-agent/README.md",
53
+ "i3-composer-agent/agents/code-reviewer.md",
54
+ "i3-composer-agent/agents/security-auditor.md",
55
+ "i3-composer-agent/agents/test-engineer.md",
56
+ "i3-composer-agent/agents/web-performance-auditor.md",
57
+ "i3-composer-agent/bin/agent-targets.json",
58
+ "i3-composer-agent/bin/asset-fingerprint.cjs",
59
+ "i3-composer-agent/bin/cleanup-backups.cjs",
60
+ "i3-composer-agent/bin/i3-composer-agent.cjs",
61
+ "i3-composer-agent/bin/install.cjs",
62
+ "i3-composer-agent/bin/native-content.cjs",
63
+ "i3-composer-agent/bin/skills-registry.LICENSE",
64
+ "i3-composer-agent/bin/tool-menu.cjs",
65
+ "i3-composer-agent/bin/tool-selector.cjs",
66
+ "i3-composer-agent/bin/wizard.cjs",
67
+ "i3-composer-agent/commands/i3-build.toml",
68
+ "i3-composer-agent/commands/i3-code-simplify.toml",
69
+ "i3-composer-agent/commands/i3-constraints.toml",
70
+ "i3-composer-agent/commands/i3-planning.toml",
71
+ "i3-composer-agent/commands/i3-review.toml",
72
+ "i3-composer-agent/commands/i3-ship.toml",
73
+ "i3-composer-agent/commands/i3-spec.toml",
74
+ "i3-composer-agent/commands/i3-test.toml",
75
+ "i3-composer-agent/commands/i3-webperf.toml",
76
+ "i3-composer-agent/docs/adoption-guide.md",
77
+ "i3-composer-agent/docs/agents.md",
78
+ "i3-composer-agent/docs/antigravity-setup.md",
79
+ "i3-composer-agent/docs/codebuddy-setup.md",
80
+ "i3-composer-agent/docs/codex-setup.md",
81
+ "i3-composer-agent/docs/commandcode-setup.md",
82
+ "i3-composer-agent/docs/copilot-cli-setup.md",
83
+ "i3-composer-agent/docs/copilot-setup.md",
84
+ "i3-composer-agent/docs/cursor-setup.md",
85
+ "i3-composer-agent/docs/gemini-cli-setup.md",
86
+ "i3-composer-agent/docs/getting-started.md",
87
+ "i3-composer-agent/docs/opencode-setup.md",
88
+ "i3-composer-agent/docs/other-hosts.md",
89
+ "i3-composer-agent/docs/windsurf-setup.md",
90
+ "i3-composer-agent/docs/workbuddy-setup.md",
91
+ "i3-composer-agent/evals/README.md",
92
+ "i3-composer-agent/evals/cases/i3-api-and-interface-design.json",
93
+ "i3-composer-agent/evals/cases/i3-browser-testing-with-devtools.json",
94
+ "i3-composer-agent/evals/cases/i3-ci-cd-and-automation.json",
95
+ "i3-composer-agent/evals/cases/i3-code-review-and-quality.json",
96
+ "i3-composer-agent/evals/cases/i3-code-simplification.json",
97
+ "i3-composer-agent/evals/cases/i3-constraint-driven-development.json",
98
+ "i3-composer-agent/evals/cases/i3-context-engineering.json",
99
+ "i3-composer-agent/evals/cases/i3-debugging-and-error-recovery.json",
100
+ "i3-composer-agent/evals/cases/i3-deprecation-and-migration.json",
101
+ "i3-composer-agent/evals/cases/i3-documentation-and-adrs.json",
102
+ "i3-composer-agent/evals/cases/i3-doubt-driven-development.json",
103
+ "i3-composer-agent/evals/cases/i3-frontend-ui-engineering.json",
104
+ "i3-composer-agent/evals/cases/i3-git-workflow-and-versioning.json",
105
+ "i3-composer-agent/evals/cases/i3-idea-refine.json",
106
+ "i3-composer-agent/evals/cases/i3-incremental-implementation.json",
107
+ "i3-composer-agent/evals/cases/i3-interview-me.json",
108
+ "i3-composer-agent/evals/cases/i3-observability-and-instrumentation.json",
109
+ "i3-composer-agent/evals/cases/i3-performance-optimization.json",
110
+ "i3-composer-agent/evals/cases/i3-planning-and-task-breakdown.json",
111
+ "i3-composer-agent/evals/cases/i3-security-and-hardening.json",
112
+ "i3-composer-agent/evals/cases/i3-shipping-and-launch.json",
113
+ "i3-composer-agent/evals/cases/i3-source-driven-development.json",
114
+ "i3-composer-agent/evals/cases/i3-spec-driven-development.json",
115
+ "i3-composer-agent/evals/cases/i3-test-driven-development.json",
116
+ "i3-composer-agent/evals/cases/i3-using-agent-skills.json",
117
+ "i3-composer-agent/evals/fixtures/i3-api-and-interface-design/service-brief.md",
118
+ "i3-composer-agent/evals/fixtures/i3-browser-testing-with-devtools/README.md",
119
+ "i3-composer-agent/evals/fixtures/i3-browser-testing-with-devtools/index.html",
120
+ "i3-composer-agent/evals/fixtures/i3-browser-testing-with-devtools/server.js",
121
+ "i3-composer-agent/evals/fixtures/i3-ci-cd-and-automation/package.json",
122
+ "i3-composer-agent/evals/fixtures/i3-ci-cd-and-automation/src/slug.js",
123
+ "i3-composer-agent/evals/fixtures/i3-ci-cd-and-automation/test/slug.test.js",
124
+ "i3-composer-agent/evals/fixtures/i3-code-review-and-quality/user-search.diff",
125
+ "i3-composer-agent/evals/fixtures/i3-code-simplification/config-parser.js",
126
+ "i3-composer-agent/evals/fixtures/i3-code-simplification/config-parser.test.js",
127
+ "i3-composer-agent/evals/fixtures/i3-context-engineering/context-audit.md",
128
+ "i3-composer-agent/evals/fixtures/i3-debugging-and-error-recovery/pagination.js",
129
+ "i3-composer-agent/evals/fixtures/i3-debugging-and-error-recovery/pagination.test.js",
130
+ "i3-composer-agent/evals/fixtures/i3-debugging-and-error-recovery/time-pressure.md",
131
+ "i3-composer-agent/evals/fixtures/i3-deprecation-and-migration/api-inventory.md",
132
+ "i3-composer-agent/evals/fixtures/i3-documentation-and-adrs/decision-context.md",
133
+ "i3-composer-agent/evals/fixtures/i3-doubt-driven-development/migration-plan.md",
134
+ "i3-composer-agent/evals/fixtures/i3-frontend-ui-engineering/Button.tsx",
135
+ "i3-composer-agent/evals/fixtures/i3-frontend-ui-engineering/design-system.md",
136
+ "i3-composer-agent/evals/fixtures/i3-git-workflow-and-versioning/.eval/working-tree.patch",
137
+ "i3-composer-agent/evals/fixtures/i3-git-workflow-and-versioning/app.js",
138
+ "i3-composer-agent/evals/fixtures/i3-git-workflow-and-versioning/app.test.js",
139
+ "i3-composer-agent/evals/fixtures/i3-incremental-implementation/reports.js",
140
+ "i3-composer-agent/evals/fixtures/i3-incremental-implementation/reports.test.js",
141
+ "i3-composer-agent/evals/fixtures/i3-incremental-implementation/tasks/plan.md",
142
+ "i3-composer-agent/evals/fixtures/i3-observability-and-instrumentation/operations.md",
143
+ "i3-composer-agent/evals/fixtures/i3-observability-and-instrumentation/payment-retry.js",
144
+ "i3-composer-agent/evals/fixtures/i3-performance-optimization/benchmark.js",
145
+ "i3-composer-agent/evals/fixtures/i3-performance-optimization/products.js",
146
+ "i3-composer-agent/evals/fixtures/i3-planning-and-task-breakdown/notifications-spec.md",
147
+ "i3-composer-agent/evals/fixtures/i3-security-and-hardening/webhook.js",
148
+ "i3-composer-agent/evals/fixtures/i3-security-and-hardening/webhook.test.js",
149
+ "i3-composer-agent/evals/fixtures/i3-shipping-and-launch/authority-pressure.md",
150
+ "i3-composer-agent/evals/fixtures/i3-shipping-and-launch/launch-status.md",
151
+ "i3-composer-agent/evals/fixtures/i3-source-driven-development/framework-task.md",
152
+ "i3-composer-agent/evals/fixtures/i3-spec-driven-development/billing-brief.md",
153
+ "i3-composer-agent/evals/fixtures/i3-test-driven-development/BUG.md",
154
+ "i3-composer-agent/evals/fixtures/i3-test-driven-development/README.md",
155
+ "i3-composer-agent/evals/fixtures/i3-test-driven-development/package.json",
156
+ "i3-composer-agent/evals/fixtures/i3-test-driven-development/src/split.js",
157
+ "i3-composer-agent/evals/fixtures/i3-test-driven-development/test/split.test.js",
158
+ "i3-composer-agent/evals/fixtures/i3-using-agent-skills/incident.md",
159
+ "i3-composer-agent/evals/fixtures/incremental-implementation-pressure/draft-export.js",
160
+ "i3-composer-agent/evals/fixtures/incremental-implementation-pressure/scenario.md",
161
+ "i3-composer-agent/evals/fixtures/spec-driven-development-decomposition/portal-brief.md",
162
+ "i3-composer-agent/evals/fixtures/test-driven-development-ecosystem/README.md",
163
+ "i3-composer-agent/evals/fixtures/test-driven-development-ecosystem/ledger.py",
164
+ "i3-composer-agent/evals/fixtures/test-driven-development-ecosystem/test_ledger.py",
165
+ "i3-composer-agent/evals/plugin/code-review-fires/graders/off-by-one.md",
166
+ "i3-composer-agent/evals/plugin/code-review-fires/graders/severity-labels.md",
167
+ "i3-composer-agent/evals/plugin/code-review-fires/graders/skill-fired.md",
168
+ "i3-composer-agent/evals/plugin/code-review-fires/prompt.md",
169
+ "i3-composer-agent/evals/plugin/code-review-stays-quiet-on-commit-message/graders/not-fired.md",
170
+ "i3-composer-agent/evals/plugin/code-review-stays-quiet-on-commit-message/prompt.md",
171
+ "i3-composer-agent/evals/plugin/code-review-stays-quiet/graders/not-fired.md",
172
+ "i3-composer-agent/evals/plugin/code-review-stays-quiet/graders/tdd-fired.md",
173
+ "i3-composer-agent/evals/plugin/code-review-stays-quiet/prompt.md",
174
+ "i3-composer-agent/evals/zh-CN/cases/i3-api-and-interface-design.json",
175
+ "i3-composer-agent/evals/zh-CN/cases/i3-browser-testing-with-devtools.json",
176
+ "i3-composer-agent/evals/zh-CN/cases/i3-ci-cd-and-automation.json",
177
+ "i3-composer-agent/evals/zh-CN/cases/i3-code-review-and-quality.json",
178
+ "i3-composer-agent/evals/zh-CN/cases/i3-code-simplification.json",
179
+ "i3-composer-agent/evals/zh-CN/cases/i3-constraint-driven-development.json",
180
+ "i3-composer-agent/evals/zh-CN/cases/i3-context-engineering.json",
181
+ "i3-composer-agent/evals/zh-CN/cases/i3-debugging-and-error-recovery.json",
182
+ "i3-composer-agent/evals/zh-CN/cases/i3-deprecation-and-migration.json",
183
+ "i3-composer-agent/evals/zh-CN/cases/i3-documentation-and-adrs.json",
184
+ "i3-composer-agent/evals/zh-CN/cases/i3-doubt-driven-development.json",
185
+ "i3-composer-agent/evals/zh-CN/cases/i3-frontend-ui-engineering.json",
186
+ "i3-composer-agent/evals/zh-CN/cases/i3-git-workflow-and-versioning.json",
187
+ "i3-composer-agent/evals/zh-CN/cases/i3-idea-refine.json",
188
+ "i3-composer-agent/evals/zh-CN/cases/i3-incremental-implementation.json",
189
+ "i3-composer-agent/evals/zh-CN/cases/i3-interview-me.json",
190
+ "i3-composer-agent/evals/zh-CN/cases/i3-observability-and-instrumentation.json",
191
+ "i3-composer-agent/evals/zh-CN/cases/i3-performance-optimization.json",
192
+ "i3-composer-agent/evals/zh-CN/cases/i3-planning-and-task-breakdown.json",
193
+ "i3-composer-agent/evals/zh-CN/cases/i3-security-and-hardening.json",
194
+ "i3-composer-agent/evals/zh-CN/cases/i3-shipping-and-launch.json",
195
+ "i3-composer-agent/evals/zh-CN/cases/i3-source-driven-development.json",
196
+ "i3-composer-agent/evals/zh-CN/cases/i3-spec-driven-development.json",
197
+ "i3-composer-agent/evals/zh-CN/cases/i3-test-driven-development.json",
198
+ "i3-composer-agent/evals/zh-CN/cases/i3-using-agent-skills.json",
199
+ "i3-composer-agent/hooks/SDD-CACHE.md",
200
+ "i3-composer-agent/hooks/SIMPLIFY-IGNORE.md",
201
+ "i3-composer-agent/hooks/sdd-cache-post.sh",
202
+ "i3-composer-agent/hooks/sdd-cache-pre.sh",
203
+ "i3-composer-agent/hooks/sdd-cache-test.sh",
204
+ "i3-composer-agent/hooks/session-start-test.sh",
205
+ "i3-composer-agent/hooks/session-start.sh",
206
+ "i3-composer-agent/hooks/simplify-ignore-test.sh",
207
+ "i3-composer-agent/hooks/simplify-ignore.sh",
208
+ "i3-composer-agent/package.json",
209
+ "i3-composer-agent/plugin.json",
210
+ "i3-composer-agent/references/accessibility-checklist.md",
211
+ "i3-composer-agent/references/definition-of-done.md",
212
+ "i3-composer-agent/references/observability-checklist.md",
213
+ "i3-composer-agent/references/orchestration-patterns.md",
214
+ "i3-composer-agent/references/performance-checklist.md",
215
+ "i3-composer-agent/references/security-checklist.md",
216
+ "i3-composer-agent/references/testing-patterns.md",
217
+ "i3-composer-agent/scripts/lib/skill-lint.js",
218
+ "i3-composer-agent/scripts/run-evals.js",
219
+ "i3-composer-agent/scripts/validate-artifact-paths.js",
220
+ "i3-composer-agent/scripts/validate-commands.js",
221
+ "i3-composer-agent/scripts/validate-reference-links.js",
222
+ "i3-composer-agent/scripts/validate-skills.js",
223
+ "i3-composer-agent/scripts/validate-versions.js",
224
+ "i3-composer-agent/skills/i3-api-and-interface-design/SKILL.md",
225
+ "i3-composer-agent/skills/i3-browser-testing-with-devtools/SKILL.md",
226
+ "i3-composer-agent/skills/i3-ci-cd-and-automation/SKILL.md",
227
+ "i3-composer-agent/skills/i3-code-review-and-quality/SKILL.md",
228
+ "i3-composer-agent/skills/i3-code-simplification/SKILL.md",
229
+ "i3-composer-agent/skills/i3-constraint-driven-development/SKILL.md",
230
+ "i3-composer-agent/skills/i3-constraint-driven-development/references/floor-guard.md",
231
+ "i3-composer-agent/skills/i3-context-engineering/SKILL.md",
232
+ "i3-composer-agent/skills/i3-debugging-and-error-recovery/SKILL.md",
233
+ "i3-composer-agent/skills/i3-deprecation-and-migration/SKILL.md",
234
+ "i3-composer-agent/skills/i3-documentation-and-adrs/SKILL.md",
235
+ "i3-composer-agent/skills/i3-doubt-driven-development/SKILL.md",
236
+ "i3-composer-agent/skills/i3-frontend-ui-engineering/SKILL.md",
237
+ "i3-composer-agent/skills/i3-git-workflow-and-versioning/SKILL.md",
238
+ "i3-composer-agent/skills/i3-idea-refine/SKILL.md",
239
+ "i3-composer-agent/skills/i3-idea-refine/examples.md",
240
+ "i3-composer-agent/skills/i3-idea-refine/frameworks.md",
241
+ "i3-composer-agent/skills/i3-idea-refine/refinement-criteria.md",
242
+ "i3-composer-agent/skills/i3-idea-refine/scripts/idea-refine.sh",
243
+ "i3-composer-agent/skills/i3-incremental-implementation/SKILL.md",
244
+ "i3-composer-agent/skills/i3-interview-me/SKILL.md",
245
+ "i3-composer-agent/skills/i3-observability-and-instrumentation/SKILL.md",
246
+ "i3-composer-agent/skills/i3-performance-optimization/SKILL.md",
247
+ "i3-composer-agent/skills/i3-performance-optimization/references/optimization-patterns.md",
248
+ "i3-composer-agent/skills/i3-planning-and-task-breakdown/SKILL.md",
249
+ "i3-composer-agent/skills/i3-security-and-hardening/SKILL.md",
250
+ "i3-composer-agent/skills/i3-security-and-hardening/references/hardening-patterns.md",
251
+ "i3-composer-agent/skills/i3-shipping-and-launch/SKILL.md",
252
+ "i3-composer-agent/skills/i3-source-driven-development/SKILL.md",
253
+ "i3-composer-agent/skills/i3-spec-driven-development/SKILL.md",
254
+ "i3-composer-agent/skills/i3-test-driven-development/SKILL.md",
255
+ "i3-composer-agent/skills/i3-using-agent-skills/SKILL.md",
256
+ "references/accessibility-checklist.md",
257
+ "references/definition-of-done.md",
258
+ "references/i3-composer-agent/LICENSE",
259
+ "references/observability-checklist.md",
260
+ "references/orchestration-patterns.md",
261
+ "references/performance-checklist.md",
262
+ "references/security-checklist.md",
263
+ "references/testing-patterns.md",
264
+ "skills/api-and-interface-design/SKILL.md",
265
+ "skills/browser-testing-with-devtools/SKILL.md",
266
+ "skills/ci-cd-and-automation/SKILL.md",
267
+ "skills/code-review-and-quality/SKILL.md",
268
+ "skills/code-simplification/SKILL.md",
269
+ "skills/constraint-driven-development/SKILL.md",
270
+ "skills/constraint-driven-development/references/floor-guard.md",
271
+ "skills/context-engineering/SKILL.md",
272
+ "skills/debugging-and-error-recovery/SKILL.md",
273
+ "skills/deprecation-and-migration/SKILL.md",
274
+ "skills/documentation-and-adrs/SKILL.md",
275
+ "skills/doubt-driven-development/SKILL.md",
276
+ "skills/frontend-ui-engineering/SKILL.md",
277
+ "skills/git-workflow-and-versioning/SKILL.md",
278
+ "skills/i3-api-and-interface-design/SKILL.md",
279
+ "skills/i3-browser-testing-with-devtools/SKILL.md",
280
+ "skills/i3-ci-cd-and-automation/SKILL.md",
281
+ "skills/i3-code-review-and-quality/SKILL.md",
282
+ "skills/i3-code-simplification/SKILL.md",
283
+ "skills/i3-constraint-driven-development/SKILL.md",
284
+ "skills/i3-constraint-driven-development/references/floor-guard.md",
285
+ "skills/i3-context-engineering/SKILL.md",
286
+ "skills/i3-debugging-and-error-recovery/SKILL.md",
287
+ "skills/i3-deprecation-and-migration/SKILL.md",
288
+ "skills/i3-documentation-and-adrs/SKILL.md",
289
+ "skills/i3-doubt-driven-development/SKILL.md",
290
+ "skills/i3-frontend-ui-engineering/SKILL.md",
291
+ "skills/i3-git-workflow-and-versioning/SKILL.md",
292
+ "skills/i3-idea-refine/SKILL.md",
293
+ "skills/i3-idea-refine/examples.md",
294
+ "skills/i3-idea-refine/frameworks.md",
295
+ "skills/i3-idea-refine/refinement-criteria.md",
296
+ "skills/i3-idea-refine/scripts/idea-refine.sh",
297
+ "skills/i3-incremental-implementation/SKILL.md",
298
+ "skills/i3-interview-me/SKILL.md",
299
+ "skills/i3-observability-and-instrumentation/SKILL.md",
300
+ "skills/i3-performance-optimization/SKILL.md",
301
+ "skills/i3-performance-optimization/references/optimization-patterns.md",
302
+ "skills/i3-planning-and-task-breakdown/SKILL.md",
303
+ "skills/i3-security-and-hardening/SKILL.md",
304
+ "skills/i3-security-and-hardening/references/hardening-patterns.md",
305
+ "skills/i3-shipping-and-launch/SKILL.md",
306
+ "skills/i3-source-driven-development/SKILL.md",
307
+ "skills/i3-spec-driven-development/SKILL.md",
308
+ "skills/i3-test-driven-development/SKILL.md",
309
+ "skills/i3-using-agent-skills/SKILL.md",
310
+ "skills/idea-refine/SKILL.md",
311
+ "skills/idea-refine/examples.md",
312
+ "skills/idea-refine/frameworks.md",
313
+ "skills/idea-refine/refinement-criteria.md",
314
+ "skills/idea-refine/scripts/idea-refine.sh",
315
+ "skills/incremental-implementation/SKILL.md",
316
+ "skills/interview-me/SKILL.md",
317
+ "skills/observability-and-instrumentation/SKILL.md",
318
+ "skills/performance-optimization/SKILL.md",
319
+ "skills/performance-optimization/references/optimization-patterns.md",
320
+ "skills/planning-and-task-breakdown/SKILL.md",
321
+ "skills/security-and-hardening/SKILL.md",
322
+ "skills/security-and-hardening/references/hardening-patterns.md",
323
+ "skills/shipping-and-launch/SKILL.md",
324
+ "skills/source-driven-development/SKILL.md",
325
+ "skills/spec-driven-development/SKILL.md",
326
+ "skills/test-driven-development/SKILL.md",
327
+ "skills/using-agent-skills/SKILL.md"
328
+ ]
329
+ }
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const { frontmatterYamlErrors } = require('./skill-lint.js');
6
+
7
+ function validateAgents({ root, catalog }) {
8
+ let errors = 0;
9
+ for (const name of catalog.agents) {
10
+ const relative = `agents/${name}.md`;
11
+ const text = fs.readFileSync(path.join(root, relative), 'utf8');
12
+ const issues = frontmatterYamlErrors(text);
13
+ const frontmatter = text.match(/^---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/)?.[1] || '';
14
+ if (!/^description:\s*\S/m.test(frontmatter)) issues.push('缺少 description');
15
+ if (!new RegExp(`^name:\\s*["']?${name}["']?\\s*$`, 'm').test(frontmatter)) issues.push('角色 name 与文件名不一致');
16
+ if (!text.replace(/^---[\s\S]*?\n---/, '').trim()) issues.push('缺少提示正文');
17
+ console.log(`${issues.length ? '✗' : '✓'} ${relative}`);
18
+ for (const issue of issues) { console.error(` ${issue}`); errors++; }
19
+ }
20
+ return errors;
21
+ }
22
+ module.exports = { validateAgents };
@@ -10,7 +10,6 @@ function replaceBlock(content, name, replacement) {
10
10
  // Adapt stable blocks, never their prose. Shared project commands work for
11
11
  // either Buddy client; global paths belong to the selected profile.
12
12
  function nativeContent(content, asset) {
13
- if (asset.kind === 'support') return content;
14
13
  content = content.replaceAll('i3-composer-agent:', '').replaceAll('agent-skills:', '');
15
14
  if (!asset.buddyCommand) return content;
16
15
  const projectPersonas = '.codebuddy/agents/';
@@ -0,0 +1,169 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const { nativeContent } = require('./native-content.cjs');
6
+ const name = 'i3-composer-agent';
7
+
8
+ function replaceOnce(text, before, after, label) {
9
+ if (text.split(before).length !== 2) throw new Error(`原生适配规则 ${label} 与发行包不匹配,请检查脚本变更。`);
10
+ return text.replace(before, after);
11
+ }
12
+
13
+ function nativeScript(text, relative) {
14
+ // Copied upstream test fixtures keep their original repository paths; the
15
+ // real installed runners always require the installation manifest.
16
+ const setup = "const INSTALLATION = (require('node:fs').existsSync(require('node:path').join(__dirname, 'lib', 'installation.js')) || require('node:path').basename(require('node:path').resolve(__dirname, '..')) === 'i3-composer-agent') ? require('./lib/installation.js').loadInstallation() : null;";
17
+ if (relative.startsWith('scripts/lib/') || relative === 'scripts/run-regressions.js') return text;
18
+ if (relative === 'scripts/validate-versions.js' || relative === 'scripts/validate-versions-test.js') {
19
+ return replaceOnce(text, 'const manifestPaths = [', setup + "\nconst MANIFEST_ROOT = INSTALLATION ? INSTALLATION.resources.adapters : require('node:path').resolve(__dirname, '..');\nconst manifestPaths = [", relative)
20
+ .replace('readFileSync(manifestPath, "utf8")', 'readFileSync(require("node:path").join(INSTALLATION && manifestPath === "package.json" ? INSTALLATION.toolkitRoot : MANIFEST_ROOT, manifestPath), "utf8")')
21
+ .replace('const expectedVersion = readManifestVersion("plugin.json");', 'const expectedVersion = readManifestVersion("plugin.json");\nif (INSTALLATION && expectedVersion !== INSTALLATION.manifest.version) throw new Error("插件版本与实际安装版本不一致");');
22
+ }
23
+ if (relative === 'scripts/floor-guard-reference-test.js') {
24
+ return replaceOnce(text, 'const REFERENCE = path.join(', setup + '\nconst REFERENCE = path.join(', relative)
25
+ .replace("__dirname, '..', 'skills',", "(INSTALLATION ? INSTALLATION.root : path.resolve(__dirname, '..')), 'skills',");
26
+ }
27
+ if (/-test\.js$/.test(relative)) return text;
28
+ if (relative === 'scripts/validate-skills.js') {
29
+ text = replaceOnce(text, "const SKILLS_DIR = path.resolve(__dirname, '..', 'skills');", setup + "\nconst SKILLS_DIR = INSTALLATION ? INSTALLATION.skillsDirectory : path.resolve(__dirname, '..', 'skills');", relative);
30
+ return replaceOnce(text, 'fs.readdirSync(SKILLS_DIR)', '(INSTALLATION ? INSTALLATION.catalog.skills : fs.readdirSync(SKILLS_DIR))', relative);
31
+ }
32
+ const rootDeclaration = relative === 'scripts/run-evals.js'
33
+ ? "const ROOT = path.join(__dirname, '..');" : "const ROOT = path.resolve(__dirname, '..');";
34
+ text = replaceOnce(text, rootDeclaration, setup + "\nconst ROOT = INSTALLATION ? INSTALLATION.root : path.resolve(__dirname, '..');", relative);
35
+ if (relative === 'scripts/run-evals.js') {
36
+ text = text.replaceAll("path.join(ROOT, 'evals',", "path.join(INSTALLATION ? INSTALLATION.resources.evals : path.join(ROOT, 'evals'),")
37
+ .replaceAll("path.join(ROOT, 'evals/zh-CN/cases')", "path.join(INSTALLATION ? INSTALLATION.resources.evals : path.join(ROOT, 'evals'), 'zh-CN/cases')");
38
+ return replaceOnce(text, 'fs.readdirSync(SKILLS_DIR)', '(INSTALLATION ? INSTALLATION.catalog.skills : fs.readdirSync(SKILLS_DIR))', relative);
39
+ }
40
+ if (relative === 'scripts/validate-reference-links.js') {
41
+ text = replaceOnce(text, 'fs.readdirSync(SKILLS_DIR)', '(INSTALLATION ? INSTALLATION.catalog.skills : fs.readdirSync(SKILLS_DIR))', relative);
42
+ return replaceOnce(text, 'references\\/[A-Za-z0-9._-]+\\.md', '(?:i3-composer-agent\\/)?references\\/(?:[A-Za-z0-9._-]+\\/)*[A-Za-z0-9._-]+\\.md', relative);
43
+ }
44
+ if (relative === 'scripts/validate-commands.js') {
45
+ text = replaceOnce(text, "path.join(ROOT, '.claude', 'commands')", "path.join(ROOT, INSTALLATION ? 'commands' : '.claude/commands')", relative);
46
+ text = replaceOnce(text, "path.join(ROOT, '.gemini', 'commands')", "path.join(INSTALLATION ? INSTALLATION.resources.adapters : ROOT, '.gemini', 'commands')", relative);
47
+ text = replaceOnce(text, "path.join(ROOT, 'commands')", "path.join(INSTALLATION ? INSTALLATION.resources.adapters : ROOT, 'commands')", relative);
48
+ text = replaceOnce(text, 'fs.readdirSync(dir)', "(INSTALLATION ? (ext === '.md' ? INSTALLATION.catalog.commands.map(name => name + '.md') : fs.readdirSync(dir).filter(file => INSTALLATION.catalog.commands.includes(NAME_MAP_REVERSE[path.basename(file, ext)] ?? path.basename(file, ext)))) : fs.readdirSync(dir))", relative);
49
+ return replaceOnce(text, ' let errors = 0;', " let errors = INSTALLATION ? require('./lib/validate-agents.js').validateAgents(INSTALLATION) : 0;", relative);
50
+ }
51
+ if (relative === 'scripts/validate-artifact-paths.js') {
52
+ const guarded = text.match(/const GUARDED_FILES = \[[\s\S]*?\n\];/)?.[0];
53
+ if (!guarded) throw new Error(`缺少原生产物检查配置:${relative}`);
54
+ text = text.replace(guarded, 'const GUARDED_FILES = INSTALLATION ? [\n' +
55
+ " ...INSTALLATION.catalog.commands.map(name => 'commands/' + name + '.md'),\n" +
56
+ " 'skills/i3-spec-driven-development/SKILL.md', 'skills/i3-planning-and-task-breakdown/SKILL.md',\n" +
57
+ " ...INSTALLATION.manifest.assets.filter(file => /^(?:i3-composer-agent\\/docs\\/(getting-started|adoption-guide|copilot-setup)\\.md|i3-composer-agent\\/adapters\\/(?:\\.gemini\\/commands|commands)\\/i3-(spec|planning|build)\\.toml)$/.test(file)),\n" +
58
+ '] : ' + guarded.slice('const GUARDED_FILES = '.length));
59
+ return text.replace(/^GUARDED_FILES\.push\(.*\);$/m, "if (!INSTALLATION) $&");
60
+ }
61
+ throw new Error(`尚未适配的公共脚本:${relative}`);
62
+ }
63
+
64
+ function renderAsset(buffer, asset) {
65
+ const relative = asset.sourceRelative || '';
66
+ if (relative.startsWith('evals/fixtures/')) return buffer;
67
+ let text = buffer.toString('utf8');
68
+ if (asset.kind === 'toolkit-package') {
69
+ const pkg = JSON.parse(text);
70
+ return Buffer.from(JSON.stringify({ name: pkg.name, version: pkg.version, private: true,
71
+ type: 'commonjs', engines: pkg.engines, scripts: Object.fromEntries(
72
+ Object.entries(pkg.scripts).filter(([key]) => ['test', 'validate', 'eval', 'test:regression'].includes(key))) }, null, 2) + '\n');
73
+ }
74
+ if (asset.kind === 'toolkit-readme') return Buffer.from(
75
+ '# i3 Composer Agent 配套工具\n\n' +
76
+ '本目录提供评测、校验、回归测试、Hook、共享参考资料和使用指南。技能、命令和 Agent 位于上一级的对应目录,只有一份;这里的评测读取宿主实际安装的内容。\n\n' +
77
+ '进入本目录后运行:\n\n```bash\nnpm test\nnode scripts/run-evals.js --locale zh-CN --min-rank1 95\n```\n\n' +
78
+ '`npm test` 执行内容校验、中英文确定性评测及全部脚本回归测试,不需要 npm install。模型行为评测需要另行配置执行宿主;详见 [evals/README.md](evals/README.md)。\n\n' +
79
+ '`adapters/` 保留其他命令格式和插件清单,供原版一致性校验与回归测试使用,不自动注册或启用插件。Hook 需按宿主支持的事件单独启用;缓存与代码块保护分别详见 [hooks/SDD-CACHE.md](hooks/SDD-CACHE.md) 和 [hooks/SIMPLIFY-IGNORE.md](hooks/SIMPLIFY-IGNORE.md)。\n');
80
+ if (asset.kind === 'runtime') return Buffer.from(text.replace('__I3_INSTALL_VERSION__', asset.version));
81
+ if (asset.kind === 'script') return Buffer.from(nativeScript(text, relative));
82
+ if (relative === 'hooks/session-start.sh') {
83
+ return Buffer.from(replaceOnce(text, 'SKILLS_DIR="$(dirname "$SCRIPT_DIR")/skills"',
84
+ 'SKILLS_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")/skills"', relative));
85
+ }
86
+ if (/^hooks\/.*-test\.sh$/.test(relative)) {
87
+ // Tests use their sibling hooks, including when invoked from another cwd.
88
+ text = text.replace(/(set -[^\n]+\n)/, '$1\nI3_HOOK_TEST_DIR="$(cd "$(dirname "$0")" && pwd)"\n');
89
+ text = text.replace(/"hooks\/\$script"/g, '"$I3_HOOK_TEST_DIR/$script"')
90
+ .replace(/(?<![A-Za-z0-9_/-])hooks\/([a-z-]+\.sh)(?![A-Za-z0-9_-])/g, '"$I3_HOOK_TEST_DIR/$1"');
91
+ return Buffer.from(text);
92
+ }
93
+ if (!relative.endsWith('.md')) return buffer;
94
+ if (['skill', 'command', 'persona', 'reference'].includes(asset.kind)) text = nativeContent(text, asset);
95
+ if (asset.kind === 'skill') {
96
+ text = text.replace(/^bash (skills\/[a-z0-9-]+\/scripts\/[a-z0-9.-]+\.sh)$/gm, (command, source) => {
97
+ const mapped = asset.mapping?.[source];
98
+ if (!mapped) throw new Error(`技能引用了未安装的脚本:${source}`);
99
+ const file = path.join(asset.base, mapped).replaceAll('\\', '/');
100
+ return "bash '" + file.replaceAll("'", "'\\''") + "'";
101
+ });
102
+ }
103
+ // Shared references move; skill-local references and executable assets stay.
104
+ text = text.replace(/((?:\.\.\/){2,})references\//g, '$1' + name + '/references/');
105
+ // Resolve actual Markdown links through the same source-to-destination map.
106
+ text = text.replace(/(\]\()([^\s)#]+)(#[^\s)]+)?(\))/g, (match, open, link, fragment = '', close) => {
107
+ if (/^(?:[a-z]+:|\/)/i.test(link)) return match;
108
+ const source = path.posix.normalize(path.posix.join(path.posix.dirname(relative), link));
109
+ const mapped = asset.mapping?.[source];
110
+ if (!mapped) return match;
111
+ return open + path.posix.relative(path.posix.dirname(asset.relative), mapped) + fragment + close;
112
+ });
113
+ if (asset.kind === 'command' || asset.kind === 'persona') {
114
+ text = text.replaceAll('docs/agents.md', name + '/docs/agents.md');
115
+ }
116
+ if (relative.startsWith('hooks/')) text = text.replace(/\bhooks\//g, name + '/hooks/');
117
+ return Buffer.from(text);
118
+ }
119
+
120
+ // Enumerate individual files so user-created files inside installed directories
121
+ // never become implicitly owned. Package allowlists remain authoritative.
122
+ function nativeAssets(root, target, packageFiles, version) {
123
+ const assets = [];
124
+ const mapping = {};
125
+ function visit(sourceRelative, relative, kind) {
126
+ const source = path.join(root, sourceRelative);
127
+ const stat = fs.lstatSync(source);
128
+ if (stat.isSymbolicLink()) throw new Error(`包内容中包含符号链接(symlink):${source}`);
129
+ if (stat.isDirectory()) {
130
+ for (const entry of fs.readdirSync(source).sort()) {
131
+ if (['.DS_Store', 'results', 'node_modules', '.git', '__pycache__'].includes(entry)) continue;
132
+ visit(`${sourceRelative}/${entry}`, `${relative}/${entry}`, kind);
133
+ }
134
+ } else if (stat.isFile()) {
135
+ if (assets.some(asset => asset.relative === relative)) return;
136
+ mapping[sourceRelative] = relative;
137
+ assets.push({ source, sourceRelative, relative, destination: path.join(target.base, relative), kind, version });
138
+ } else throw new Error(`不支持的包文件:${source}`);
139
+ }
140
+ visit('skills', 'skills', 'skill');
141
+ visit('.claude/commands', 'commands', 'command');
142
+ visit('agents', 'agents', 'persona');
143
+ visit('references', name + '/references', 'reference');
144
+ visit('README.md', name + '/docs/README.md', 'docs');
145
+ visit('README.md', name + '/README.md', 'toolkit-readme');
146
+ visit('package.json', name + '/package.json', 'toolkit-package');
147
+ for (const file of packageFiles) {
148
+ const category = file.split('/')[0];
149
+ if (!['evals', 'hooks', 'scripts', 'docs'].includes(category)) continue;
150
+ const relative = name + '/' + file;
151
+ visit(file, relative, category === 'scripts' ? 'script' : category);
152
+ }
153
+ visit('bin/native-runtime.cjs', name + '/scripts/lib/installation.js', 'runtime');
154
+ visit('bin/native-command-validation.cjs', name + '/scripts/lib/validate-agents.js', 'runtime');
155
+ for (const file of ['commands', '.gemini/commands', 'plugin.json', '.codex-plugin/plugin.json',
156
+ '.claude-plugin/plugin.json', '.claude-plugin/marketplace.json', '.agents/plugins/marketplace.json']) {
157
+ visit(file, name + '/adapters/' + file, 'adapter');
158
+ }
159
+ target.catalog = {
160
+ skills: fs.readdirSync(path.join(root, 'skills')).filter(id => fs.existsSync(path.join(root, 'skills', id, 'SKILL.md'))).sort(),
161
+ commands: fs.readdirSync(path.join(root, '.claude/commands')).filter(file => file.endsWith('.md')).map(file => file.slice(0, -3)).sort(),
162
+ agents: fs.readdirSync(path.join(root, 'agents')).filter(file => file.endsWith('.md')).map(file => file.slice(0, -3)).sort(),
163
+ };
164
+ target.resources = Object.fromEntries(['references', 'evals', 'hooks', 'scripts', 'docs', 'adapters'].map(category => [category, name + '/' + category]));
165
+ for (const asset of assets) { asset.mapping = mapping; asset.base = target.base; }
166
+ return assets;
167
+ }
168
+
169
+ module.exports = { nativeAssets, renderAsset };
@@ -0,0 +1,99 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const { fingerprint } = require('./asset-fingerprint.cjs');
6
+ const inventory = require('./legacy-native-files.json').files;
7
+ const name = 'i3-composer-agent';
8
+ const publishedFiles = new Set(inventory);
9
+
10
+ function ownsAsset(previous, relative) {
11
+ return previous.assets.some(file => file === relative
12
+ || (!(previous.layoutVersion >= 2) && publishedFiles.has(relative) && relative.startsWith(file + '/')));
13
+ }
14
+
15
+ function allowed(relative) {
16
+ return typeof relative === 'string' && !relative.includes('\0') && !relative.includes(':') && !relative.includes('\\')
17
+ && !relative.split('/').some(part => ['', '.', '..'].includes(part))
18
+ && (/^(skills|commands|agents|references|evals|hooks|scripts|docs)\//.test(relative)
19
+ || relative.startsWith(`${name}/`) || [`${name}-LICENSE`, `${name}-NOTICE.md`].includes(relative));
20
+ }
21
+
22
+ function fileAt(base, relative) {
23
+ if (!allowed(relative)) return undefined;
24
+ let file = base;
25
+ for (const part of relative.split('/')) {
26
+ file = path.join(file, part);
27
+ try { if (fs.lstatSync(file).isSymbolicLink()) return undefined; }
28
+ catch (error) { if (error.code === 'ENOENT') return undefined; throw error; }
29
+ }
30
+ return file;
31
+ }
32
+
33
+ function migrationAssets(target, previous, current) {
34
+ if (!previous) return [];
35
+ const assets = [];
36
+ const oldFiles = new Set();
37
+ const retired = new Set();
38
+ const base = target.base;
39
+ function retire(relative) {
40
+ if (retired.has(relative) || current.has(relative)) return;
41
+ const file = fileAt(base, relative);
42
+ if (!file || !fs.statSync(file).isFile()) return;
43
+ retired.add(relative);
44
+ assets.push({ base, destination: file, relative, kind: 'legacy' });
45
+ }
46
+ for (const relative of previous.assets) {
47
+ const file = fileAt(base, relative);
48
+ if (!file) continue;
49
+ if (fs.statSync(file).isFile()) oldFiles.add(relative);
50
+ else if (!(previous.layoutVersion >= 2)) {
51
+ // Old manifests registered directories, not their contents. Expand only
52
+ // paths in the published inventory, never the current filesystem tree.
53
+ for (const known of inventory) if (known.startsWith(relative + '/')) oldFiles.add(known);
54
+ }
55
+ }
56
+ for (const relative of oldFiles) retire(relative);
57
+
58
+ // Evaluation output is user data, not an installed package asset. Move it
59
+ // transactionally, including plugin and locale-specific result folders.
60
+ if (previous.layoutVersion === 2) {
61
+ const oldEvals = path.join(base, 'evals', name);
62
+ function visit(directory, relative = '') {
63
+ if (!fs.existsSync(directory)) return;
64
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
65
+ const source = path.join(directory, entry.name);
66
+ const subpath = relative ? `${relative}/${entry.name}` : entry.name;
67
+ if (entry.isSymbolicLink()) continue;
68
+ if (entry.isDirectory()) visit(source, subpath);
69
+ else if (entry.isFile() && subpath.split('/').includes('results')) {
70
+ const destinationRelative = `${name}/evals/${subpath}`;
71
+ const destination = path.join(base, destinationRelative);
72
+ let reusable = false;
73
+ if (fs.existsSync(destination)) {
74
+ reusable = fingerprint(source) === fingerprint(destination);
75
+ if (!reusable) throw new Error(`评测结果迁移冲突,请先处理同名文件:${destination}`);
76
+ }
77
+ assets.push({ base, source, destination, relative: destinationRelative, kind: 'result', reusable,
78
+ expectedFingerprint: fingerprint(source) });
79
+ retire(`evals/${name}/${subpath}`);
80
+ }
81
+ }
82
+ }
83
+ if (fileAt(base, `evals/${name}`)) visit(oldEvals);
84
+ }
85
+ return assets;
86
+ }
87
+
88
+ function pruneRetiredDirectories(assets) {
89
+ const directories = new Set();
90
+ for (const asset of assets.filter(item => item.kind === 'legacy')) {
91
+ for (let directory = path.dirname(asset.destination); directory !== asset.base && directory.startsWith(asset.base + path.sep); directory = path.dirname(directory)) directories.add(directory);
92
+ }
93
+ for (const directory of [...directories].sort((a, b) => b.length - a.length)) {
94
+ try { fs.rmdirSync(directory); }
95
+ catch (error) { if (!['ENOENT', 'ENOTEMPTY', 'EEXIST'].includes(error.code)) throw error; }
96
+ }
97
+ }
98
+
99
+ module.exports = { migrationAssets, pruneRetiredDirectories, ownsAsset };