@givolt/i3-composer-agent 2.2.0 → 2.2.2
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 +77 -17
- package/bin/asset-fingerprint.cjs +3 -4
- package/bin/i3-composer-agent.cjs +15 -7
- package/bin/install.cjs +48 -57
- package/bin/legacy-native-files.json +329 -0
- package/bin/native-command-validation.cjs +27 -0
- package/bin/native-layout.cjs +135 -0
- package/bin/native-migration.cjs +93 -0
- package/bin/native-runtime.cjs +57 -0
- package/bin/native-version-validation.cjs +8 -0
- package/bin/tool-selector.cjs +164 -0
- package/bin/wizard.cjs +9 -44
- package/docs/codebuddy-setup.md +12 -3
- package/docs/codex-setup.md +9 -4
- package/docs/workbuddy-setup.md +13 -4
- package/evals/README.md +95 -0
- package/evals/cases/i3-api-and-interface-design.json +45 -0
- package/evals/cases/i3-browser-testing-with-devtools.json +44 -0
- package/evals/cases/i3-ci-cd-and-automation.json +45 -0
- package/evals/cases/i3-code-review-and-quality.json +49 -0
- package/evals/cases/i3-code-simplification.json +45 -0
- package/evals/cases/i3-constraint-driven-development.json +79 -0
- package/evals/cases/i3-context-engineering.json +44 -0
- package/evals/cases/i3-debugging-and-error-recovery.json +58 -0
- package/evals/cases/i3-deprecation-and-migration.json +52 -0
- package/evals/cases/i3-documentation-and-adrs.json +44 -0
- package/evals/cases/i3-doubt-driven-development.json +43 -0
- package/evals/cases/i3-frontend-ui-engineering.json +52 -0
- package/evals/cases/i3-git-workflow-and-versioning.json +47 -0
- package/evals/cases/i3-idea-refine.json +43 -0
- package/evals/cases/i3-incremental-implementation.json +57 -0
- package/evals/cases/i3-interview-me.json +42 -0
- package/evals/cases/i3-observability-and-instrumentation.json +44 -0
- package/evals/cases/i3-performance-optimization.json +53 -0
- package/evals/cases/i3-planning-and-task-breakdown.json +45 -0
- package/evals/cases/i3-security-and-hardening.json +53 -0
- package/evals/cases/i3-shipping-and-launch.json +56 -0
- package/evals/cases/i3-source-driven-development.json +44 -0
- package/evals/cases/i3-spec-driven-development.json +72 -0
- package/evals/cases/i3-test-driven-development.json +73 -0
- package/evals/cases/i3-using-agent-skills.json +44 -0
- package/evals/fixtures/i3-api-and-interface-design/service-brief.md +19 -0
- package/evals/fixtures/i3-browser-testing-with-devtools/README.md +5 -0
- package/evals/fixtures/i3-browser-testing-with-devtools/index.html +24 -0
- package/evals/fixtures/i3-browser-testing-with-devtools/server.js +15 -0
- package/evals/fixtures/i3-ci-cd-and-automation/package.json +8 -0
- package/evals/fixtures/i3-ci-cd-and-automation/src/slug.js +3 -0
- package/evals/fixtures/i3-ci-cd-and-automation/test/slug.test.js +9 -0
- package/evals/fixtures/i3-code-review-and-quality/user-search.diff +16 -0
- package/evals/fixtures/i3-code-simplification/config-parser.js +46 -0
- package/evals/fixtures/i3-code-simplification/config-parser.test.js +15 -0
- package/evals/fixtures/i3-context-engineering/context-audit.md +15 -0
- package/evals/fixtures/i3-debugging-and-error-recovery/pagination.js +8 -0
- package/evals/fixtures/i3-debugging-and-error-recovery/pagination.test.js +9 -0
- package/evals/fixtures/i3-debugging-and-error-recovery/time-pressure.md +6 -0
- package/evals/fixtures/i3-deprecation-and-migration/api-inventory.md +9 -0
- package/evals/fixtures/i3-documentation-and-adrs/decision-context.md +16 -0
- package/evals/fixtures/i3-doubt-driven-development/migration-plan.md +19 -0
- package/evals/fixtures/i3-frontend-ui-engineering/Button.tsx +7 -0
- package/evals/fixtures/i3-frontend-ui-engineering/design-system.md +11 -0
- package/evals/fixtures/i3-git-workflow-and-versioning/.eval/working-tree.patch +21 -0
- package/evals/fixtures/i3-git-workflow-and-versioning/app.js +7 -0
- package/evals/fixtures/i3-git-workflow-and-versioning/app.test.js +9 -0
- package/evals/fixtures/i3-incremental-implementation/reports.js +7 -0
- package/evals/fixtures/i3-incremental-implementation/reports.test.js +12 -0
- package/evals/fixtures/i3-incremental-implementation/tasks/plan.md +8 -0
- package/evals/fixtures/i3-observability-and-instrumentation/operations.md +11 -0
- package/evals/fixtures/i3-observability-and-instrumentation/payment-retry.js +14 -0
- package/evals/fixtures/i3-performance-optimization/benchmark.js +15 -0
- package/evals/fixtures/i3-performance-optimization/products.js +14 -0
- package/evals/fixtures/i3-planning-and-task-breakdown/notifications-spec.md +18 -0
- package/evals/fixtures/i3-security-and-hardening/webhook.js +11 -0
- package/evals/fixtures/i3-security-and-hardening/webhook.test.js +13 -0
- package/evals/fixtures/i3-shipping-and-launch/authority-pressure.md +6 -0
- package/evals/fixtures/i3-shipping-and-launch/launch-status.md +11 -0
- package/evals/fixtures/i3-source-driven-development/framework-task.md +10 -0
- package/evals/fixtures/i3-spec-driven-development/billing-brief.md +16 -0
- package/evals/fixtures/i3-test-driven-development/BUG.md +10 -0
- package/evals/fixtures/i3-test-driven-development/README.md +28 -0
- package/evals/fixtures/i3-test-driven-development/package.json +9 -0
- package/evals/fixtures/i3-test-driven-development/src/split.js +8 -0
- package/evals/fixtures/i3-test-driven-development/test/split.test.js +13 -0
- package/evals/fixtures/i3-using-agent-skills/incident.md +6 -0
- package/evals/fixtures/incremental-implementation-pressure/draft-export.js +17 -0
- package/evals/fixtures/incremental-implementation-pressure/scenario.md +9 -0
- package/evals/fixtures/spec-driven-development-decomposition/portal-brief.md +22 -0
- package/evals/fixtures/test-driven-development-ecosystem/README.md +9 -0
- package/evals/fixtures/test-driven-development-ecosystem/ledger.py +15 -0
- package/evals/fixtures/test-driven-development-ecosystem/test_ledger.py +19 -0
- package/evals/plugin/code-review-fires/graders/off-by-one.md +7 -0
- package/evals/plugin/code-review-fires/graders/severity-labels.md +4 -0
- package/evals/plugin/code-review-fires/graders/skill-fired.md +5 -0
- package/evals/plugin/code-review-fires/prompt.md +31 -0
- package/evals/plugin/code-review-stays-quiet/graders/not-fired.md +8 -0
- package/evals/plugin/code-review-stays-quiet/graders/tdd-fired.md +6 -0
- package/evals/plugin/code-review-stays-quiet/prompt.md +8 -0
- package/evals/plugin/code-review-stays-quiet-on-commit-message/graders/not-fired.md +8 -0
- package/evals/plugin/code-review-stays-quiet-on-commit-message/prompt.md +25 -0
- package/evals/skill-impact.md +6 -0
- package/evals/zh-CN/cases/i3-api-and-interface-design.json +46 -0
- package/evals/zh-CN/cases/i3-browser-testing-with-devtools.json +45 -0
- package/evals/zh-CN/cases/i3-ci-cd-and-automation.json +46 -0
- package/evals/zh-CN/cases/i3-code-review-and-quality.json +46 -0
- package/evals/zh-CN/cases/i3-code-simplification.json +46 -0
- package/evals/zh-CN/cases/i3-constraint-driven-development.json +70 -0
- package/evals/zh-CN/cases/i3-context-engineering.json +45 -0
- package/evals/zh-CN/cases/i3-debugging-and-error-recovery.json +60 -0
- package/evals/zh-CN/cases/i3-deprecation-and-migration.json +45 -0
- package/evals/zh-CN/cases/i3-documentation-and-adrs.json +45 -0
- package/evals/zh-CN/cases/i3-doubt-driven-development.json +45 -0
- package/evals/zh-CN/cases/i3-frontend-ui-engineering.json +45 -0
- package/evals/zh-CN/cases/i3-git-workflow-and-versioning.json +45 -0
- package/evals/zh-CN/cases/i3-idea-refine.json +44 -0
- package/evals/zh-CN/cases/i3-incremental-implementation.json +59 -0
- package/evals/zh-CN/cases/i3-interview-me.json +43 -0
- package/evals/zh-CN/cases/i3-observability-and-instrumentation.json +46 -0
- package/evals/zh-CN/cases/i3-performance-optimization.json +46 -0
- package/evals/zh-CN/cases/i3-planning-and-task-breakdown.json +46 -0
- package/evals/zh-CN/cases/i3-security-and-hardening.json +46 -0
- package/evals/zh-CN/cases/i3-shipping-and-launch.json +59 -0
- package/evals/zh-CN/cases/i3-source-driven-development.json +45 -0
- package/evals/zh-CN/cases/i3-spec-driven-development.json +62 -0
- package/evals/zh-CN/cases/i3-test-driven-development.json +76 -0
- package/evals/zh-CN/cases/i3-using-agent-skills.json +45 -0
- package/package.json +236 -5
- package/plugin.json +1 -1
- package/scripts/lib/skill-lint.js +586 -0
- package/scripts/run-evals.js +659 -0
- package/scripts/validate-artifact-paths.js +130 -0
- package/scripts/validate-commands.js +224 -0
- package/scripts/validate-reference-links.js +187 -0
- package/scripts/validate-skills.js +70 -0
- package/scripts/validate-versions.js +35 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
try {
|
|
5
|
+
const { loadInstallation } = require('./lib/installation.cjs');
|
|
6
|
+
const { manifest } = loadInstallation();
|
|
7
|
+
console.log(`安装版本 ${manifest.version},布局 ${manifest.layoutVersion};${manifest.assets.length} 个登记文件均存在。`);
|
|
8
|
+
} catch (error) { console.error(error.message); process.exitCode = 1; }
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const readline = require('node:readline');
|
|
4
|
+
const { orderedAgents, commonIds } = require('./tool-menu.cjs');
|
|
5
|
+
|
|
6
|
+
// Terminal columns are not JavaScript string lengths: Chinese characters use
|
|
7
|
+
// two cells. Keep every rendered line within the viewport before repainting.
|
|
8
|
+
function cellWidth(character) {
|
|
9
|
+
const code = character.codePointAt(0);
|
|
10
|
+
if (/\p{Mark}/u.test(character) || code === 0x200d) return 0;
|
|
11
|
+
return code >= 0x1100 && (code <= 0x115f || code === 0x2329 || code === 0x232a
|
|
12
|
+
|| (code >= 0x2e80 && code <= 0xa4cf && code !== 0x303f)
|
|
13
|
+
|| (code >= 0xac00 && code <= 0xd7a3) || (code >= 0xf900 && code <= 0xfaff)
|
|
14
|
+
|| (code >= 0xfe10 && code <= 0xfe19) || (code >= 0xfe30 && code <= 0xfe6f)
|
|
15
|
+
|| (code >= 0xff00 && code <= 0xff60) || (code >= 0xffe0 && code <= 0xffe6)
|
|
16
|
+
|| (code >= 0x1f300 && code <= 0x1faff) || (code >= 0x20000 && code <= 0x3fffd)) ? 2 : 1;
|
|
17
|
+
}
|
|
18
|
+
function width(text) { return [...text].reduce((size, character) => size + cellWidth(character), 0); }
|
|
19
|
+
function clip(text, columns) {
|
|
20
|
+
if (width(text) <= columns) return text;
|
|
21
|
+
const suffix = columns >= 3 ? '...' : '';
|
|
22
|
+
let result = '', size = 0;
|
|
23
|
+
for (const character of text) {
|
|
24
|
+
size += cellWidth(character);
|
|
25
|
+
if (size > columns - suffix.length) break;
|
|
26
|
+
result += character;
|
|
27
|
+
}
|
|
28
|
+
return result + suffix;
|
|
29
|
+
}
|
|
30
|
+
function wrap(text, columns) {
|
|
31
|
+
const lines = [];
|
|
32
|
+
let line = '', size = 0;
|
|
33
|
+
for (const character of text) {
|
|
34
|
+
const cells = cellWidth(character);
|
|
35
|
+
if (line && size + cells > columns) { lines.push(line); line = ''; size = 0; }
|
|
36
|
+
line += character; size += cells;
|
|
37
|
+
}
|
|
38
|
+
lines.push(line);
|
|
39
|
+
return lines;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function selectTools(initialSelection, input = process.stdin, output = process.stdout) {
|
|
43
|
+
const selected = new Set(initialSelection);
|
|
44
|
+
let view = 'common', cursor = 0, commonCursor = 0, query = '', searching = false, message = '';
|
|
45
|
+
let frame = [], pageSize = 10, finished = false;
|
|
46
|
+
const wasRaw = Boolean(input.isRaw), wasFlowing = input.readableFlowing;
|
|
47
|
+
const choices = () => view === 'common' ? [...orderedAgents.slice(0, commonIds.length), null]
|
|
48
|
+
: view === 'more' ? orderedAgents.slice(commonIds.length)
|
|
49
|
+
: orderedAgents.filter(agent => `${agent.label} ${agent.id}`.toLowerCase().includes(query.toLowerCase()));
|
|
50
|
+
const selectedLabels = () => [...selected].map(id => orderedAgents.find(agent => agent.id === id).label).join('、');
|
|
51
|
+
|
|
52
|
+
function clearFrame() {
|
|
53
|
+
if (!frame.length) return;
|
|
54
|
+
const columns = output.columns || 80;
|
|
55
|
+
const rows = frame.reduce((count, line) => count + Math.max(1, Math.ceil(width(line) / columns)), 0);
|
|
56
|
+
readline.moveCursor(output, 0, -rows);
|
|
57
|
+
readline.cursorTo(output, 0);
|
|
58
|
+
readline.clearScreenDown(output);
|
|
59
|
+
frame = [];
|
|
60
|
+
}
|
|
61
|
+
function render() {
|
|
62
|
+
if (finished) return;
|
|
63
|
+
const columns = Math.max(1, (output.columns || 80) - 1), rows = output.rows || 24;
|
|
64
|
+
const entries = choices();
|
|
65
|
+
cursor = Math.max(0, Math.min(cursor, entries.length - 1));
|
|
66
|
+
const summary = wrap(`已选(${selected.size}):${selectedLabels() || '无'}`, columns);
|
|
67
|
+
const summaryLimit = rows < 16 ? 1 : 3;
|
|
68
|
+
if (summary.length > summaryLimit) {
|
|
69
|
+
summary.length = summaryLimit;
|
|
70
|
+
summary[summaryLimit - 1] = clip(summary[summaryLimit - 1], Math.max(0, columns - 3)) + '...';
|
|
71
|
+
}
|
|
72
|
+
const hints = searching
|
|
73
|
+
? ['输入关键词实时搜索', 'Enter/↓ 浏览结果 · Esc返回 · Ctrl-C取消']
|
|
74
|
+
: ['↑↓ 移动/跨页 · 空格勾选 · Enter确认', 'm 更多 · / 搜索 · b/← 返回 · q/Esc取消'];
|
|
75
|
+
const footer = ['', ...summary, ...hints.flatMap(line => wrap(line, columns)), message];
|
|
76
|
+
const searchLine = view === 'search' ? [`搜索:${query}${searching ? '|' : ''}`] : [];
|
|
77
|
+
pageSize = Math.max(1, Math.min(10, rows - footer.length - searchLine.length - 2));
|
|
78
|
+
const page = Math.floor(cursor / pageSize), pages = Math.max(1, Math.ceil(entries.length / pageSize));
|
|
79
|
+
const title = view === 'common' ? '选择常用工具(支持多选):'
|
|
80
|
+
: `${view === 'more' ? '更多工具' : '搜索结果'}:第 ${page + 1}/${pages} 页,共 ${entries.length} 项`;
|
|
81
|
+
const lines = [title, ...searchLine];
|
|
82
|
+
for (let index = page * pageSize; index < Math.min(entries.length, (page + 1) * pageSize); index++) {
|
|
83
|
+
const agent = entries[index], pointer = index === cursor ? '>' : ' ';
|
|
84
|
+
lines.push(agent ? `${pointer} [${selected.has(agent.id) ? 'x' : ' '}] ${orderedAgents.indexOf(agent) + 1}. ${agent.label} [${agent.id}]${agent.globalSkillsDir ? '' : '(仅项目)'}`
|
|
85
|
+
: `${pointer} 更多工具(空格展开)`);
|
|
86
|
+
}
|
|
87
|
+
if (!entries.length) lines.push('没有匹配工具;按 / 重新搜索,或 Esc 返回。');
|
|
88
|
+
clearFrame();
|
|
89
|
+
frame = [...lines, ...footer].map(line => clip(line, columns));
|
|
90
|
+
output.write(frame.join('\n') + '\n');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
function finish(value, error) {
|
|
95
|
+
if (finished) return;
|
|
96
|
+
finished = true;
|
|
97
|
+
input.off('keypress', keypress);
|
|
98
|
+
input.off('end', cancel);
|
|
99
|
+
input.off('error', fail);
|
|
100
|
+
output.off('resize', redraw);
|
|
101
|
+
process.off('SIGINT', cancel);
|
|
102
|
+
input.setRawMode(wasRaw);
|
|
103
|
+
if (!wasFlowing) input.pause();
|
|
104
|
+
try {
|
|
105
|
+
clearFrame();
|
|
106
|
+
output.write('\x1b[?25h');
|
|
107
|
+
if (value) output.write(`已选择工具:${selectedLabels()}\n`);
|
|
108
|
+
} catch (outputError) { error ||= outputError; }
|
|
109
|
+
if (error) reject(error); else resolve(value);
|
|
110
|
+
}
|
|
111
|
+
function cancel() { finish(null); }
|
|
112
|
+
function fail(error) { finish(null, error); }
|
|
113
|
+
function redraw() { try { render(); } catch (error) { fail(error); } }
|
|
114
|
+
function openMore() {
|
|
115
|
+
if (view === 'common') commonCursor = cursor;
|
|
116
|
+
view = 'more'; cursor = 0; searching = false;
|
|
117
|
+
}
|
|
118
|
+
function back() { view = 'common'; cursor = commonCursor; searching = false; query = ''; }
|
|
119
|
+
function keypress(text, key = {}) {
|
|
120
|
+
if (finished) return;
|
|
121
|
+
try {
|
|
122
|
+
message = '';
|
|
123
|
+
if (key.ctrl && ['c', 'd'].includes(key.name)) { cancel(); return; }
|
|
124
|
+
if (searching) {
|
|
125
|
+
if (key.name === 'escape') back();
|
|
126
|
+
else if (['return', 'enter', 'down'].includes(key.name)) searching = false;
|
|
127
|
+
else if (key.name === 'backspace') { query = [...query].slice(0, -1).join(''); cursor = 0; }
|
|
128
|
+
else if (text && !key.ctrl && !key.meta && !/[\x00-\x1f\x7f]/.test(text)) { query += text; cursor = 0; }
|
|
129
|
+
} else if (key.name === 'escape') {
|
|
130
|
+
if (view === 'search') back(); else { cancel(); return; }
|
|
131
|
+
} else if (text === 'q') { cancel(); return; }
|
|
132
|
+
else if (['return', 'enter'].includes(key.name)) {
|
|
133
|
+
if (selected.size) { finish([...selected]); return; }
|
|
134
|
+
message = '请至少用空格选择一个工具。';
|
|
135
|
+
} else if (key.name === 'space' || text === ' ') {
|
|
136
|
+
const entry = choices()[cursor];
|
|
137
|
+
if (entry) { if (selected.has(entry.id)) selected.delete(entry.id); else selected.add(entry.id); }
|
|
138
|
+
else if (view === 'common') openMore();
|
|
139
|
+
} else if (['up', 'down', 'pageup', 'pagedown'].includes(key.name) || ['n', 'p'].includes(text)) {
|
|
140
|
+
const direction = ['up', 'pageup'].includes(key.name) || text === 'p' ? -1 : 1;
|
|
141
|
+
const step = ['pageup', 'pagedown'].includes(key.name) || ['n', 'p'].includes(text) ? pageSize : 1;
|
|
142
|
+
cursor = Math.max(0, Math.min(choices().length - 1, cursor + direction * step));
|
|
143
|
+
} else if (text === 'm' || (key.name === 'right' && view === 'common')) openMore();
|
|
144
|
+
else if (text === 'b' || key.name === 'left') back();
|
|
145
|
+
else if (text === '/') { if (view === 'common') commonCursor = cursor; view = 'search'; query = ''; cursor = 0; searching = true; }
|
|
146
|
+
render();
|
|
147
|
+
} catch (error) { fail(error); }
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
readline.emitKeypressEvents(input);
|
|
151
|
+
input.setRawMode(true);
|
|
152
|
+
input.on('keypress', keypress);
|
|
153
|
+
input.once('end', cancel);
|
|
154
|
+
input.once('error', fail);
|
|
155
|
+
output.on('resize', redraw);
|
|
156
|
+
process.once('SIGINT', cancel);
|
|
157
|
+
output.write('\x1b[?25l');
|
|
158
|
+
render();
|
|
159
|
+
input.resume();
|
|
160
|
+
} catch (error) { fail(error); }
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
module.exports = { selectTools };
|
package/bin/wizard.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const readline = require('node:readline');
|
|
4
|
-
const {
|
|
5
|
-
const {
|
|
4
|
+
const { selectAgents } = require('./install.cjs');
|
|
5
|
+
const { selectTools } = require('./tool-selector.cjs');
|
|
6
6
|
|
|
7
7
|
async function session(action) {
|
|
8
8
|
const terminal = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
@@ -23,49 +23,11 @@ async function session(action) {
|
|
|
23
23
|
}
|
|
24
24
|
async function choose(options, identity) {
|
|
25
25
|
console.log(identity);
|
|
26
|
+
const agents = await selectTools(selectAgents(options.agents));
|
|
27
|
+
if (!agents) return null;
|
|
28
|
+
if (agents.includes('workbuddy')) console.log('WorkBuddy 桌面版建议全局安装,以便技能列表和输入补全发现 Skills;项目安装仍支持命令,技能列表可能不显示。');
|
|
26
29
|
return session(async ask => {
|
|
27
|
-
const selected = new Set(selectAgents(options.agents));
|
|
28
|
-
let view = 'common', page = 0, query = '';
|
|
29
30
|
const cancelled = input => input === null || ['q', 'cancel', '取消'].includes(input.toLowerCase());
|
|
30
|
-
while (true) {
|
|
31
|
-
const matches = view === 'common' ? orderedAgents.slice(0, commonIds.length)
|
|
32
|
-
: view === 'search' ? orderedAgents.filter(agent => `${agent.id} ${agent.label}`.toLowerCase().includes(query.toLowerCase()))
|
|
33
|
-
: orderedAgents.slice(commonIds.length);
|
|
34
|
-
const pages = Math.max(1, Math.ceil(matches.length / 10));
|
|
35
|
-
page = Math.max(0, Math.min(page, pages - 1));
|
|
36
|
-
console.log(view === 'common' ? '\n选择常用工具(支持多选):'
|
|
37
|
-
: `\n${view === 'search' ? `搜索“${query}”` : '更多工具'}:第 ${page + 1}/${pages} 页,共 ${matches.length} 项`);
|
|
38
|
-
for (const agent of view === 'common' ? matches : matches.slice(page * 10, page * 10 + 10)) {
|
|
39
|
-
console.log(`${orderedAgents.indexOf(agent) + 1}. ${agent.label} [${agent.id}]${selected.has(agent.id) ? ' ✓ 已选' : ''}${agent.globalSkillsDir ? '' : '(仅项目安装)'}`);
|
|
40
|
-
}
|
|
41
|
-
if (view === 'common') console.log('7. 更多(m)');
|
|
42
|
-
else console.log('n 下一页 · p 上一页 · b 返回常用工具');
|
|
43
|
-
console.log(`已选:${[...selected].join(', ') || '无'};/关键词 搜索全部 ${registry.agents.length} 个工具;回车或完成确认;-编号/ID 移除选择。`);
|
|
44
|
-
const input = await ask('输入编号/ID,可用逗号多选(q/取消退出): ');
|
|
45
|
-
if (cancelled(input)) return null;
|
|
46
|
-
if (['', 'done', '完成'].includes(input.toLowerCase())) {
|
|
47
|
-
if (selected.size) break;
|
|
48
|
-
console.log('请至少选择一个工具。'); continue;
|
|
49
|
-
}
|
|
50
|
-
if (['m', 'more', '更多'].includes(input.toLowerCase()) || (view === 'common' && input === '7')) { view = 'more'; page = 0; continue; }
|
|
51
|
-
if (['b', 'back', '返回'].includes(input.toLowerCase())) { view = 'common'; page = 0; continue; }
|
|
52
|
-
if (view !== 'common' && ['n', '下一页'].includes(input.toLowerCase())) { page = Math.min(pages - 1, page + 1); continue; }
|
|
53
|
-
if (view !== 'common' && ['p', '上一页'].includes(input.toLowerCase())) { page = Math.max(0, page - 1); continue; }
|
|
54
|
-
if (input.startsWith('/')) { view = 'search'; query = input.slice(1).trim(); page = 0; continue; }
|
|
55
|
-
try {
|
|
56
|
-
const values = ['all', '全部'].includes(input.toLowerCase()) ? orderedAgents.map(agent => agent.id) : input.split(/[,,]/);
|
|
57
|
-
const additions = [], removals = [];
|
|
58
|
-
for (const value of values) {
|
|
59
|
-
const remove = value.trim().startsWith('-'), raw = value.trim().replace(/^-/, '');
|
|
60
|
-
const id = /^\d+$/.test(raw) ? orderedAgents[Number(raw) - 1]?.id || raw : raw;
|
|
61
|
-
(remove ? removals : additions).push(...selectAgents([id]));
|
|
62
|
-
}
|
|
63
|
-
for (const id of additions) selected.add(id);
|
|
64
|
-
for (const id of removals) selected.delete(id);
|
|
65
|
-
} catch (error) { console.log(error.message); }
|
|
66
|
-
}
|
|
67
|
-
const agents = [...selected];
|
|
68
|
-
if (agents.includes('workbuddy')) console.log('WorkBuddy 桌面版建议全局安装,以便技能列表和输入补全发现 Skills;项目安装仍支持命令,技能列表可能不显示。');
|
|
69
31
|
let scope = options.scope;
|
|
70
32
|
while (!scope) {
|
|
71
33
|
const input = await ask('安装范围:1. 项目(当前项目),2. 全局(所有项目)[1](q/取消退出): ');
|
|
@@ -82,10 +44,13 @@ async function confirm(plan) {
|
|
|
82
44
|
for (const target of plan.targets) {
|
|
83
45
|
console.log(` ${target.agents.join(', ')}: ${target.skillsDirectory}`);
|
|
84
46
|
if (target.commandsDirectory) console.log(` 命令:${target.commandsDirectory}`);
|
|
47
|
+
console.log(` 评测:${target.evalsDirectory}`);
|
|
48
|
+
console.log(` 脚本:${target.scriptsDirectory}`);
|
|
49
|
+
console.log(` Hook:${target.hooksDirectory}`);
|
|
85
50
|
}
|
|
86
51
|
if (plan.conflicts.length) console.log(`将替换 ${plan.conflicts.length} 个已有内容;安装成功后清理旧文件,失败则恢复。`);
|
|
87
52
|
if (plan.reused.length) console.log(`将复用同版本的 ${plan.reused.length} 个未修改内容。`);
|
|
88
|
-
console.log('
|
|
53
|
+
console.log('包含技能、共享资料和完整评测/Hook/脚本配套。安装不执行评测;Hook 需按宿主方式启用。');
|
|
89
54
|
return session(async ask => {
|
|
90
55
|
const answer = await ask('确认安装这些内容?[y/N]: ');
|
|
91
56
|
return answer !== null && ['y', 'yes', '是', '确认'].includes(answer.toLowerCase());
|
package/docs/codebuddy-setup.md
CHANGED
|
@@ -11,6 +11,8 @@ npx @givolt/i3-composer-agent --codebuddy
|
|
|
11
11
|
向导预选 CodeBuddy,可增加其他工具,再选择项目或全局范围。
|
|
12
12
|
项目安装提供 `.codebuddy/skills/`(25 个技能)、`references/`、
|
|
13
13
|
`commands/`(9 个命令)和 `agents/`(4 个角色)。
|
|
14
|
+
同级 `evals/`、`hooks/`、`scripts/`、`docs/`、`references/` 各自通过 `i3-composer-agent/` 分组资料,
|
|
15
|
+
只有一份实际技能、命令和角色,评测与宿主共用。
|
|
14
16
|
全局使用 `~/.codebuddy/` 的相同结构。默认中文说明和回复;技能/命令标识不改名。
|
|
15
17
|
安装成功清理旧内容,失败恢复;设置与自定义命令保留。
|
|
16
18
|
|
|
@@ -37,9 +39,16 @@ CodeBuddy 与 WorkBuddy 项目共用 `.codebuddy/`;同版本追加客户端会
|
|
|
37
39
|
全局目录彼此独立。WorkBuddy 桌面版建议全局安装,详见 [WorkBuddy 说明](workbuddy-setup.md)。
|
|
38
40
|
升级或同名冲突先查看 `--dry-run`,再确认或使用 `--yes --force`。
|
|
39
41
|
|
|
40
|
-
##
|
|
42
|
+
## 配套检查
|
|
41
43
|
|
|
42
|
-
|
|
44
|
+
在业务项目运行 `node .codebuddy/scripts/i3-composer-agent/run-evals.cjs --min-rank1 95`,
|
|
45
|
+
可检查中英文触发,不调用模型;全局安装使用脚本的全局绝对路径。五项校验、行为评测和样例用法见
|
|
46
|
+
[评测说明](../evals/README.md)。Hook 文件已安装,需要按宿主协议单独启用。
|
|
47
|
+
|
|
48
|
+
## 通过 CodeBuddy Code 插件管理器安装
|
|
49
|
+
|
|
50
|
+
这是另一种由宿主插件管理器管理的安装方式;已完成原生安装时无需再次执行。
|
|
51
|
+
`--prepare` 只导出文件并显示注册步骤,不自动注册插件或启用 Hook:
|
|
43
52
|
|
|
44
53
|
```bash
|
|
45
54
|
npx @givolt/i3-composer-agent --prepare --codebuddy
|
|
@@ -55,7 +64,7 @@ npx @givolt/i3-composer-agent --prepare --codebuddy
|
|
|
55
64
|
按宿主选择范围并启用后新建会话。兼容清单声明 `.claude/commands/` 与 `commands/`。
|
|
56
65
|
插件命令示例为 `/i3-composer-agent:i3-spec`、`/i3-composer-agent:i3-plan`、
|
|
57
66
|
`/i3-composer-agent:i3-build auto` 和 `/i3-composer-agent:i3-ship`。
|
|
58
|
-
|
|
67
|
+
默认安装和导出均包含完整评测、Hook 与脚本;Hook 不自动启用。
|
|
59
68
|
文件落盘、宿主发现和模型实际执行应分别验证。
|
|
60
69
|
|
|
61
70
|
目录遵循 [配置目录参考](https://www.codebuddy.cn/docs/cli/codebuddy-dir),可参照
|
package/docs/codex-setup.md
CHANGED
|
@@ -6,11 +6,15 @@
|
|
|
6
6
|
npx @givolt/i3-composer-agent --codex
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
项目范围写入 `.agents/skills/`,全局写入 `~/.agents/skills/`,并安装同级 `references/`。
|
|
9
|
+
项目范围写入 `.agents/skills/`,全局写入 `~/.agents/skills/`,并安装同级 `references/i3-composer-agent/`。
|
|
10
10
|
提供全部 25 个 `i3-` 技能,中文选择说明与默认中文回复在每个入口独立生效。
|
|
11
|
-
|
|
11
|
+
同级 `evals/`、`hooks/`、`scripts/`、`docs/` 各自以 `i3-composer-agent/` 分组资料。
|
|
12
|
+
命令与角色文件也会提供,供按需阅读,其自动发现由宿主决定。
|
|
13
|
+
从项目目录执行 `node .agents/scripts/i3-composer-agent/run-evals.cjs --min-rank1 95`
|
|
14
|
+
检查实际安装技能的中英文触发,不调用模型;五项结构校验详见
|
|
15
|
+
[评测说明](../evals/README.md)。原生调用使用技能 ID,Hook 文件需按宿主能力单独启用。
|
|
12
16
|
|
|
13
|
-
##
|
|
17
|
+
## 通过插件管理器安装
|
|
14
18
|
|
|
15
19
|
```bash
|
|
16
20
|
npx @givolt/i3-composer-agent --prepare --codex
|
|
@@ -18,7 +22,8 @@ codex plugin marketplace add ./i3-composer-agent
|
|
|
18
22
|
codex plugin add i3-composer-agent@i3-composer-agent
|
|
19
23
|
```
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
准备模式另行导出持久目录并显示注册命令,不自动注册或启用 Hook。
|
|
26
|
+
已完成原生安装时无需再次准备。选择插件安装方式并注册启用后新建会话,
|
|
22
27
|
通过 `/skills`、`$i3-spec-driven-development` 等技能名称,或在聊天中明确指定技能调用。
|
|
23
28
|
插件适配清单指向 `skills/`;共享资料保留相对链接可解析的 `references/` 布局。
|
|
24
29
|
|
package/docs/workbuddy-setup.md
CHANGED
|
@@ -13,13 +13,22 @@ npx @givolt/i3-composer-agent --agents codebuddy,workbuddy --scope global --yes
|
|
|
13
13
|
- `~/.workbuddy/skills/`:25 个 `i3-` 技能,选择说明和默认回复中文。
|
|
14
14
|
- `~/.workbuddy/commands/`:9 个 `/i3-*` 短命令。
|
|
15
15
|
- `~/.workbuddy/agents/`:4 个专业角色。
|
|
16
|
-
- `~/.workbuddy/references
|
|
17
|
-
- `~/.workbuddy/docs/agents.md`:角色说明。
|
|
16
|
+
- `~/.workbuddy/references/i3-composer-agent/`:共享参考。
|
|
17
|
+
- `~/.workbuddy/docs/i3-composer-agent/agents.md`:角色说明。
|
|
18
|
+
- `~/.workbuddy/evals/i3-composer-agent/`:中英文用例、样例与评测结果。
|
|
19
|
+
- `~/.workbuddy/hooks/i3-composer-agent/`:Hook 文件与说明。
|
|
20
|
+
- `~/.workbuddy/scripts/i3-composer-agent/`:评测、校验与依赖库。
|
|
18
21
|
- `~/.workbuddy/.i3-composer-agent.json`:安装内容所有权及客户端清单。
|
|
19
22
|
|
|
20
23
|
自定义 profile 可设置 `WORKBUDDY_CONFIG_DIR`,安装后打开对应 profile。
|
|
21
24
|
WorkBuddy 的目录选择使用自己的配置,不借用 `CODEBUDDY_CONFIG_DIR`。
|
|
22
25
|
|
|
26
|
+
## 配套检查
|
|
27
|
+
|
|
28
|
+
运行 `node ~/.workbuddy/scripts/i3-composer-agent/run-evals.cjs --min-rank1 95`,检查实际安装技能的中英文触发,
|
|
29
|
+
不会调用模型。项目安装将 `~/.workbuddy/` 换成 `.codebuddy/`。五项校验、行为评测用例、样例和
|
|
30
|
+
脚本用法见 [评测说明](../evals/README.md)。Hook 文件默认提供,启用需适配宿主事件协议。
|
|
31
|
+
|
|
23
32
|
## 发现和调用
|
|
24
33
|
|
|
25
34
|
安装后新建会话,查看 Skills 列表并输入 `/` 查看命令:
|
|
@@ -65,8 +74,8 @@ npx @givolt/i3-composer-agent --workbuddy --scope global --dry-run
|
|
|
65
74
|
npx @givolt/i3-composer-agent --workbuddy --scope global --yes --force
|
|
66
75
|
```
|
|
67
76
|
|
|
68
|
-
|
|
69
|
-
|
|
77
|
+
升级和已登记文件修改需确认;未归属的资料冲突或不同内容的同名评测结果需要先处理;成功替换后清理旧文件与所属历史备份,失败恢复。
|
|
78
|
+
原生安装同时提供 Skills、Commands、Agents 和完整 evals/hooks/scripts 配套。
|
|
70
79
|
`--prepare --workbuddy` 不支持,原生安装不会启用插件 Hook。
|
|
71
80
|
|
|
72
81
|
可参照 [任务栏命令说明](https://www.codebuddy.cn/docs/workbuddy/From-Beginner-to-Expert-Guide/Function-Description/Task-Bar)、
|
package/evals/README.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# 技能评测与配套脚本
|
|
2
|
+
|
|
3
|
+
本目录随默认安装、npm 包和插件导出一起提供,评测 i3 Composer Agent 技能的结构、
|
|
4
|
+
触发与行为。评测不在安装时自动执行。它检查技能库自身,不能代替业务项目测试、
|
|
5
|
+
宿主发现验证或真实模型验收。
|
|
6
|
+
|
|
7
|
+
## 运行位置
|
|
8
|
+
|
|
9
|
+
原生安装的技能位于宿主基址的 `skills/`;评测资料位于 `evals/i3-composer-agent/`,
|
|
10
|
+
脚本位于 `scripts/i3-composer-agent/`。安装清单记录预期技能和文件,评测只读取这份实际安装内容。
|
|
11
|
+
例如 CodeBuddy 项目基址是 `.codebuddy/`,WorkBuddy 全局基址是 `~/.workbuddy/`。
|
|
12
|
+
下面原生示例从业务项目根目录运行;从其他位置运行时,将脚本路径换成绝对路径即可。
|
|
13
|
+
Node.js 20 或以上,无需额外 npm 依赖;`.cjs` 入口兼容业务项目的 ESM/CommonJS 设置。
|
|
14
|
+
|
|
15
|
+
## 不调用模型的检查
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
node .codebuddy/scripts/i3-composer-agent/validate-skills.cjs
|
|
19
|
+
node .codebuddy/scripts/i3-composer-agent/validate-versions.cjs
|
|
20
|
+
node .codebuddy/scripts/i3-composer-agent/validate-commands.cjs
|
|
21
|
+
node .codebuddy/scripts/i3-composer-agent/validate-reference-links.cjs
|
|
22
|
+
node .codebuddy/scripts/i3-composer-agent/validate-artifact-paths.cjs
|
|
23
|
+
node .codebuddy/scripts/i3-composer-agent/run-evals.cjs --locale zh-CN --min-rank1 95
|
|
24
|
+
node .codebuddy/scripts/i3-composer-agent/run-evals.cjs --locale en --min-rank1 95
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
五项校验分别检查技能格式、安装版本及登记文件、实际命令和角色格式、引用锚点、规格/计划产物路径。
|
|
28
|
+
缺少安装清单、已登记技能或必需资源会报错;其他插件和用户新增技能不进入本包的评测目录项。
|
|
29
|
+
`cases/` 保留英文用例,`zh-CN/cases/` 提供中文用例,`fixtures/` 是行为评测的真实输入,
|
|
30
|
+
`plugin/` 保留插件评测提示与评分标准。`skill-impact.md` 记录因评测未通过而放弃的技能改动。
|
|
31
|
+
|
|
32
|
+
若使用 `--prepare` / `--extract` 的独立插件,进入导出目录运行原有入口:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm test
|
|
36
|
+
npm run validate
|
|
37
|
+
node scripts/run-evals.js --locale zh-CN --min-rank1 95
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
独立插件的校验还会检查插件清单和三种命令格式的一致性。原生安装不复制这些注册清单,
|
|
41
|
+
不需要在业务项目或宿主基址执行 `npm test`。
|
|
42
|
+
|
|
43
|
+
触发评测使用词法评分检查正例、负例、描述冲突、用例结构及样例是否齐全。
|
|
44
|
+
中英文各自满足指定门槛;这不能证明模型在实际宿主中一定选择正确技能。
|
|
45
|
+
失败时应调查技能描述或实现,不能为了通过检查降低门槛或删改失败用例。
|
|
46
|
+
|
|
47
|
+
## 主动运行模型行为评测
|
|
48
|
+
|
|
49
|
+
先预览,不调用模型、不生成评测结果:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
node .codebuddy/scripts/i3-composer-agent/run-evals.cjs --behavioral i3-test-driven-development --locale zh-CN --dry-run
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
确认需要后,移除 `--dry-run` 才会调用已登录的 Claude Code,并消耗该账户的模型额度:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
node .codebuddy/scripts/i3-composer-agent/run-evals.cjs --behavioral i3-test-driven-development --locale zh-CN
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
执行型用例需要 Git,并在临时 Git 项目中复制 `fixtures/` 的真实输入;
|
|
62
|
+
对话型用例评估对话,不要求项目文件。执行器使用 `acceptEdits` 及明确的工具列表,
|
|
63
|
+
可能编辑文件、运行命令、访问网络;各样例还可能需要自身的语言运行环境。
|
|
64
|
+
评分依据执行轨迹或对话与 `expectations`,不会把“声称完成”当成实际执行证据。
|
|
65
|
+
模型输出按不可信数据评分,执行和评分均有限时。临时项目完成后清理。
|
|
66
|
+
|
|
67
|
+
`--locale en` 运行英文用例,省略该参数运行两种语言。可通过 `I3_EVAL_MODEL`
|
|
68
|
+
和 `I3_EVAL_GRADER_MODEL` 指定执行/评分模型;报告同时记录宿主和模型信息。
|
|
69
|
+
原生结果写入 `evals/i3-composer-agent/results/`;独立插件写入 `evals/results/`。
|
|
70
|
+
结果不会进入发行包和文件替换清单,升级保留;旧配套目录的结果会迁入新位置,同名异内容时停止迁移。
|
|
71
|
+
|
|
72
|
+
## 插件级评测
|
|
73
|
+
|
|
74
|
+
插件清单中的 `experimental.evals` 指向随包提供的 `evals/plugin/`。
|
|
75
|
+
原生安装也保留这些用例作为资料;要运行依赖插件清单的命令,需要独立插件导出。
|
|
76
|
+
它包含整体插件的触发/不触发提示和评分规则;支持 `plugin eval` 的 Claude Code
|
|
77
|
+
可从 `--prepare` / `--extract` 的独立插件导出目录主动运行:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
claude plugin eval . --no-publish
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
该检查同样会调用模型;具体参数以当前 Claude Code 的帮助为准。
|
|
84
|
+
`--no-publish` 保持结果本地,报告写入 `evals/plugin/results/`。
|
|
85
|
+
用是否触发、回答质量及对照结果一起判断效果;调用一次成功不能代替多次行为验收。
|
|
86
|
+
|
|
87
|
+
## Hooks
|
|
88
|
+
|
|
89
|
+
原生的 `hooks/i3-composer-agent/`(独立插件为 `hooks/`)默认交付会话注入、文档缓存、代码块保护脚本及说明。
|
|
90
|
+
安装文件不会自动注册事件。中文回复与普通技能调用不依赖启用 Hook。
|
|
91
|
+
会话注入仅适用于缺少原生技能路由的宿主;已有路由时不要重复注入。
|
|
92
|
+
缓存及保护的当前配置示例针对 Claude Code,详见
|
|
93
|
+
[文档缓存](../hooks/SDD-CACHE.md) 和 [代码块保护](../hooks/SIMPLIFY-IGNORE.md)。
|
|
94
|
+
其他宿主须按各自事件协议适配。脚本需要 Bash、jq 及说明中的 curl/哈希工具;
|
|
95
|
+
Windows PowerShell 本身不提供这些依赖。
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "i3-api-and-interface-design",
|
|
3
|
+
"trigger": {
|
|
4
|
+
"positive": [
|
|
5
|
+
{
|
|
6
|
+
"prompt": "Design a REST endpoint for creating invoices, including error responses and versioning",
|
|
7
|
+
"top_k": 3
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"prompt": "What should the public interface of this payments module expose to other teams?",
|
|
11
|
+
"top_k": 3
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"prompt": "Help me define the contract between the frontend and the orders service",
|
|
15
|
+
"top_k": 3
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"negative": [
|
|
19
|
+
{
|
|
20
|
+
"prompt": "My unit test is failing with a null pointer exception",
|
|
21
|
+
"owner": "i3-debugging-and-error-recovery"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"prompt": "Make this landing page responsive on mobile",
|
|
25
|
+
"owner": "i3-frontend-ui-engineering"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"evals": [
|
|
30
|
+
{
|
|
31
|
+
"id": 1,
|
|
32
|
+
"prompt": "Design the public API for a URL-shortening service: create, resolve, stats. Produce the endpoint contracts.",
|
|
33
|
+
"expected_output": "Endpoint contracts with methods, paths, request/response shapes, and explicit error semantics",
|
|
34
|
+
"files": [
|
|
35
|
+
"i3-api-and-interface-design"
|
|
36
|
+
],
|
|
37
|
+
"expectations": [
|
|
38
|
+
"Error responses are specified with status codes and a consistent error shape, not just happy paths",
|
|
39
|
+
"Input validation at the boundary is addressed for user-supplied URLs",
|
|
40
|
+
"Versioning or compatibility strategy is stated",
|
|
41
|
+
"The response does not silently invent unstated requirements"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "i3-browser-testing-with-devtools",
|
|
3
|
+
"trigger": {
|
|
4
|
+
"positive": [
|
|
5
|
+
{
|
|
6
|
+
"prompt": "Use Chrome DevTools to figure out why the checkout button click does nothing",
|
|
7
|
+
"top_k": 3
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"prompt": "Inspect the network requests the dashboard makes when it first loads",
|
|
11
|
+
"top_k": 3
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"prompt": "Verify in a real browser that the form submits and the data persists in localStorage",
|
|
15
|
+
"top_k": 3
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"negative": [
|
|
19
|
+
{
|
|
20
|
+
"prompt": "Write a spec for the new billing feature before we start",
|
|
21
|
+
"owner": "i3-spec-driven-development"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"prompt": "Break this PRD into ordered implementation tasks",
|
|
25
|
+
"owner": "i3-planning-and-task-breakdown"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"evals": [
|
|
30
|
+
{
|
|
31
|
+
"id": 1,
|
|
32
|
+
"prompt": "The signup form renders but submitting it appears to do nothing. Verify the real behavior in the browser and report findings.",
|
|
33
|
+
"expected_output": "Runtime evidence from the browser: console errors, network activity, DOM state, and a diagnosis",
|
|
34
|
+
"files": [
|
|
35
|
+
"i3-browser-testing-with-devtools"
|
|
36
|
+
],
|
|
37
|
+
"expectations": [
|
|
38
|
+
"Findings are grounded in observed runtime data (console, network, DOM), not static code reading alone",
|
|
39
|
+
"The report distinguishes what was observed from what is inferred",
|
|
40
|
+
"A concrete next step or fix hypothesis is provided"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "i3-ci-cd-and-automation",
|
|
3
|
+
"trigger": {
|
|
4
|
+
"positive": [
|
|
5
|
+
{
|
|
6
|
+
"prompt": "Set up a GitHub Actions pipeline that runs the tests on every pull request",
|
|
7
|
+
"top_k": 3
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"prompt": "Add a deploy stage to the pipeline with a manual approval gate",
|
|
11
|
+
"top_k": 3
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"prompt": "Automate the quality gates so nothing merges without passing checks",
|
|
15
|
+
"top_k": 3
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"negative": [
|
|
19
|
+
{
|
|
20
|
+
"prompt": "Refactor this function so it is easier to read",
|
|
21
|
+
"owner": "i3-code-simplification"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"prompt": "Add structured logging to the checkout service",
|
|
25
|
+
"owner": "i3-observability-and-instrumentation"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"evals": [
|
|
30
|
+
{
|
|
31
|
+
"id": 1,
|
|
32
|
+
"prompt": "Create a CI pipeline for a Node project: install, lint, test on every PR, and block merge on failure.",
|
|
33
|
+
"expected_output": "A working workflow definition with correct triggers, steps, and failure behavior",
|
|
34
|
+
"files": [
|
|
35
|
+
"i3-ci-cd-and-automation"
|
|
36
|
+
],
|
|
37
|
+
"expectations": [
|
|
38
|
+
"The workflow triggers on pull requests",
|
|
39
|
+
"Failure of any quality gate fails the pipeline run",
|
|
40
|
+
"Steps are ordered logically and cache or setup steps are sane",
|
|
41
|
+
"No secrets are hardcoded in the workflow"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "i3-code-review-and-quality",
|
|
3
|
+
"trigger": {
|
|
4
|
+
"positive": [
|
|
5
|
+
{
|
|
6
|
+
"prompt": "Review this pull request before I merge it",
|
|
7
|
+
"top_k": 3
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"prompt": "Do a quality pass on this diff for correctness and readability",
|
|
11
|
+
"top_k": 3
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"prompt": "Can you review the changes another model just wrote for me?",
|
|
15
|
+
"top_k": 3
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"prompt": "Review this diff before I merge it. It adds paging to the orders endpoint.",
|
|
19
|
+
"top_k": 3
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"negative": [
|
|
23
|
+
{
|
|
24
|
+
"prompt": "Deploy this to production now",
|
|
25
|
+
"owner": "i3-shipping-and-launch"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"prompt": "Write a failing test for the bug before fixing it",
|
|
29
|
+
"owner": "i3-test-driven-development"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"evals": [
|
|
34
|
+
{
|
|
35
|
+
"id": 1,
|
|
36
|
+
"prompt": "Review the provided diff that adds a user-search endpoint. Deliver a structured review.",
|
|
37
|
+
"expected_output": "A multi-axis review with severity-labelled findings and file:line references",
|
|
38
|
+
"files": [
|
|
39
|
+
"i3-code-review-and-quality"
|
|
40
|
+
],
|
|
41
|
+
"expectations": [
|
|
42
|
+
"Findings cover more than one axis (correctness, readability, architecture, security, performance)",
|
|
43
|
+
"Every finding carries a severity label from the skill's taxonomy",
|
|
44
|
+
"Security of user input is explicitly considered for the new endpoint",
|
|
45
|
+
"The review leads with high-leverage findings rather than nits"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|