@givolt/i3-composer-agent 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/.agents/plugins/marketplace.json +2 -2
  2. package/.claude/commands/i3-build.md +13 -1
  3. package/.claude/commands/i3-code-simplify.md +13 -1
  4. package/.claude/commands/i3-constraints.md +13 -1
  5. package/.claude/commands/i3-plan.md +13 -1
  6. package/.claude/commands/i3-review.md +13 -1
  7. package/.claude/commands/i3-ship.md +18 -2
  8. package/.claude/commands/i3-spec.md +13 -1
  9. package/.claude/commands/i3-test.md +13 -1
  10. package/.claude/commands/i3-webperf.md +13 -1
  11. package/.claude-plugin/marketplace.json +3 -3
  12. package/.claude-plugin/plugin.json +2 -2
  13. package/.codex-plugin/plugin.json +7 -6
  14. package/.gemini/commands/i3-build.toml +13 -1
  15. package/.gemini/commands/i3-code-simplify.toml +13 -1
  16. package/.gemini/commands/i3-constraints.toml +13 -1
  17. package/.gemini/commands/i3-planning.toml +13 -1
  18. package/.gemini/commands/i3-review.toml +13 -1
  19. package/.gemini/commands/i3-ship.toml +13 -1
  20. package/.gemini/commands/i3-spec.toml +13 -1
  21. package/.gemini/commands/i3-test.toml +13 -1
  22. package/.gemini/commands/i3-webperf.toml +13 -1
  23. package/README.md +101 -101
  24. package/agents/code-reviewer.md +13 -1
  25. package/agents/security-auditor.md +13 -1
  26. package/agents/test-engineer.md +13 -1
  27. package/agents/web-performance-auditor.md +13 -1
  28. package/bin/i3-composer-agent.cjs +56 -53
  29. package/bin/install.cjs +23 -15
  30. package/bin/native-content.cjs +26 -17
  31. package/bin/tool-menu.cjs +9 -0
  32. package/bin/wizard.cjs +52 -25
  33. package/commands/i3-build.toml +13 -1
  34. package/commands/i3-code-simplify.toml +13 -1
  35. package/commands/i3-constraints.toml +13 -1
  36. package/commands/i3-planning.toml +13 -1
  37. package/commands/i3-review.toml +13 -1
  38. package/commands/i3-ship.toml +13 -1
  39. package/commands/i3-spec.toml +13 -1
  40. package/commands/i3-test.toml +13 -1
  41. package/commands/i3-webperf.toml +13 -1
  42. package/docs/adoption-guide.md +8 -0
  43. package/docs/agents.md +8 -0
  44. package/docs/antigravity-setup.md +8 -0
  45. package/docs/codebuddy-setup.md +26 -60
  46. package/docs/codex-setup.md +15 -29
  47. package/docs/commandcode-setup.md +8 -0
  48. package/docs/copilot-cli-setup.md +8 -0
  49. package/docs/copilot-setup.md +8 -0
  50. package/docs/cursor-setup.md +8 -0
  51. package/docs/gemini-cli-setup.md +8 -0
  52. package/docs/getting-started.md +8 -0
  53. package/docs/opencode-setup.md +8 -0
  54. package/docs/other-hosts.md +8 -0
  55. package/docs/windsurf-setup.md +8 -0
  56. package/docs/workbuddy-setup.md +46 -63
  57. package/hooks/SDD-CACHE.md +8 -0
  58. package/hooks/SIMPLIFY-IGNORE.md +8 -0
  59. package/hooks/sdd-cache-pre.sh +5 -5
  60. package/hooks/session-start-test.sh +1 -1
  61. package/hooks/session-start.sh +3 -3
  62. package/hooks/simplify-ignore.sh +8 -8
  63. package/package.json +2 -2
  64. package/plugin.json +2 -2
  65. package/references/accessibility-checklist.md +8 -0
  66. package/references/definition-of-done.md +8 -0
  67. package/references/observability-checklist.md +8 -0
  68. package/references/orchestration-patterns.md +8 -0
  69. package/references/performance-checklist.md +8 -0
  70. package/references/security-checklist.md +8 -0
  71. package/references/testing-patterns.md +8 -0
  72. package/skills/i3-api-and-interface-design/SKILL.md +13 -1
  73. package/skills/i3-browser-testing-with-devtools/SKILL.md +13 -1
  74. package/skills/i3-ci-cd-and-automation/SKILL.md +13 -1
  75. package/skills/i3-code-review-and-quality/SKILL.md +13 -1
  76. package/skills/i3-code-simplification/SKILL.md +13 -1
  77. package/skills/i3-constraint-driven-development/SKILL.md +13 -1
  78. package/skills/i3-constraint-driven-development/references/floor-guard.md +8 -0
  79. package/skills/i3-context-engineering/SKILL.md +13 -1
  80. package/skills/i3-debugging-and-error-recovery/SKILL.md +13 -1
  81. package/skills/i3-deprecation-and-migration/SKILL.md +13 -1
  82. package/skills/i3-documentation-and-adrs/SKILL.md +13 -1
  83. package/skills/i3-doubt-driven-development/SKILL.md +13 -1
  84. package/skills/i3-frontend-ui-engineering/SKILL.md +13 -1
  85. package/skills/i3-git-workflow-and-versioning/SKILL.md +13 -1
  86. package/skills/i3-idea-refine/SKILL.md +13 -1
  87. package/skills/i3-idea-refine/examples.md +8 -0
  88. package/skills/i3-idea-refine/frameworks.md +8 -0
  89. package/skills/i3-idea-refine/refinement-criteria.md +8 -0
  90. package/skills/i3-idea-refine/scripts/idea-refine.sh +2 -2
  91. package/skills/i3-incremental-implementation/SKILL.md +13 -1
  92. package/skills/i3-interview-me/SKILL.md +13 -1
  93. package/skills/i3-observability-and-instrumentation/SKILL.md +13 -1
  94. package/skills/i3-performance-optimization/SKILL.md +13 -1
  95. package/skills/i3-performance-optimization/references/optimization-patterns.md +8 -0
  96. package/skills/i3-planning-and-task-breakdown/SKILL.md +13 -1
  97. package/skills/i3-security-and-hardening/SKILL.md +13 -1
  98. package/skills/i3-security-and-hardening/references/hardening-patterns.md +8 -0
  99. package/skills/i3-shipping-and-launch/SKILL.md +13 -1
  100. package/skills/i3-source-driven-development/SKILL.md +13 -1
  101. package/skills/i3-spec-driven-development/SKILL.md +13 -1
  102. package/skills/i3-test-driven-development/SKILL.md +13 -1
  103. package/skills/i3-using-agent-skills/SKILL.md +13 -1
package/bin/install.cjs CHANGED
@@ -17,13 +17,13 @@ function exists(file) {
17
17
  catch (error) { if (error.code === 'ENOENT') return false; throw error; }
18
18
  }
19
19
  function selectAgents(values) {
20
- const ids = [...new Set(values.flatMap(value => value.split(',')).map(id => aliases[id.trim()] || id.trim()).filter(Boolean))];
21
- for (const id of ids) if (!registry.agents.some(agent => agent.id === id)) throw new Error(`Unknown tool: ${id}. Use --list-agents.`);
20
+ const ids = [...new Set(values.flatMap(value => value.split(/[,,]/)).map(id => aliases[id.trim()] || id.trim()).filter(Boolean))];
21
+ for (const id of ids) if (!registry.agents.some(agent => agent.id === id)) throw new Error(`未知工具:${id}。请使用 --list-agents 查看支持列表。`);
22
22
  return ids;
23
23
  }
24
24
  function globalSkillsDir(agent, home, env) {
25
25
  const config = agent.globalSkillsDir;
26
- if (!config) throw new Error(`${agent.label} supports project installation only. Choose project scope or remove this tool.`);
26
+ if (!config) throw new Error(`${agent.label} 仅支持项目安装(project installation only),请选择项目范围或移除此工具。`);
27
27
  let base = home;
28
28
  if (config.base === 'config') base = env.XDG_CONFIG_HOME && path.isAbsolute(env.XDG_CONFIG_HOME) ? env.XDG_CONFIG_HOME : path.join(home, '.config');
29
29
  if (config.base === 'env') base = env[config.env]?.trim() || path.join(home, config.fallback);
@@ -43,7 +43,7 @@ function destination(file) {
43
43
  function checkDestination(file) {
44
44
  const source = fs.realpathSync(root);
45
45
  if (file === source || file.startsWith(source + path.sep) || source.startsWith(file + path.sep)) {
46
- throw new Error('Installation destinations must be outside this package directory.');
46
+ throw new Error('安装目标必须位于包目录之外。');
47
47
  }
48
48
  }
49
49
  function manifestContent(plan, asset) {
@@ -52,8 +52,8 @@ function manifestContent(plan, asset) {
52
52
  }
53
53
  function planInstallation({ agents, scope, projectDir = process.cwd(), home = os.homedir(), env = process.env }) {
54
54
  agents = selectAgents(agents);
55
- if (!agents.length) throw new Error('Choose at least one tool.');
56
- if (!['project', 'global'].includes(scope)) throw new Error('Choose --scope project or --scope global.');
55
+ if (!agents.length) throw new Error('请至少选择一个工具。');
56
+ if (!['project', 'global'].includes(scope)) throw new Error('请选择 --scope project 或 --scope global。');
57
57
  const targets = new Map();
58
58
  for (const id of agents) {
59
59
  const agent = registry.agents.find(item => item.id === id);
@@ -70,7 +70,7 @@ function planInstallation({ agents, scope, projectDir = process.cwd(), home = os
70
70
  const assets = [];
71
71
  function addDirectory(sourceDirectory, destinationDirectory, kind) {
72
72
  if (exists(destinationDirectory) && fs.lstatSync(destinationDirectory).isSymbolicLink()) {
73
- throw new Error(`Installation directory is a symlink: ${destinationDirectory}. Choose its canonical location instead.`);
73
+ throw new Error(`安装目录是符号链接(symlink): ${destinationDirectory}. 请选择其真实目录。`);
74
74
  }
75
75
  for (const entry of fs.readdirSync(path.join(root, sourceDirectory)).sort()) {
76
76
  if (entry === '.DS_Store') continue;
@@ -99,17 +99,25 @@ function planInstallation({ agents, scope, projectDir = process.cwd(), home = os
99
99
  addDirectory('.claude/commands', target.commandsDirectory, 'command');
100
100
  addDirectory('agents', target.personasDirectory, 'persona');
101
101
  const docs = path.join(target.base, 'docs');
102
- if (exists(docs) && fs.lstatSync(docs).isSymbolicLink()) throw new Error(`Installation directory is a symlink: ${docs}.`);
102
+ if (exists(docs) && fs.lstatSync(docs).isSymbolicLink()) throw new Error(`安装目录是符号链接(symlink): ${docs}.`);
103
103
  assets.push({ source: path.join(root, 'docs/agents.md'), destination: destination(path.join(target.base, 'docs/agents.md')), kind: 'documentation' });
104
104
  }
105
105
  const licenseDirectory = path.join(target.referencesDirectory, name);
106
- if (exists(licenseDirectory) && fs.lstatSync(licenseDirectory).isSymbolicLink()) throw new Error(`Installation directory is a symlink: ${licenseDirectory}.`);
106
+ if (exists(licenseDirectory) && fs.lstatSync(licenseDirectory).isSymbolicLink()) throw new Error(`安装目录是符号链接(symlink): ${licenseDirectory}.`);
107
107
  assets.push({ source: path.join(root, 'LICENSE'), destination: destination(path.join(licenseDirectory, 'LICENSE')), kind: 'attribution' });
108
108
  if (owned) {
109
109
  const legacy = fs.readdirSync(path.join(root, 'skills')).filter(id => id.startsWith('i3-')).map(id => `skills/${id.slice(3)}`);
110
110
  if (target.commandsDirectory) legacy.push(...fs.readdirSync(path.join(root, '.claude/commands')).filter(file => file.startsWith('i3-') && file.endsWith('.md')).map(file => `commands/${file.slice(3)}`));
111
111
  legacy.push(`${name}-LICENSE`, `${name}-NOTICE.md`);
112
- for (const relative of legacy) {
112
+ const current = new Set(assets.slice(start).map(asset => path.relative(target.base, asset.destination)));
113
+ for (const relative of previous.assets) {
114
+ // Only installer-owned top-level assets can be retired. Ignore malformed
115
+ // or escaping manifest paths rather than extending their deletion scope.
116
+ if (typeof relative !== 'string' || !/^(skills|commands|agents|references)\/[^/\\]+$/.test(relative)
117
+ || relative.includes('\0') || ['.', '..'].includes(relative.split('/')[1])) continue;
118
+ if (!current.has(relative)) legacy.push(relative);
119
+ }
120
+ for (const relative of new Set(legacy)) {
113
121
  const file = destination(path.join(target.base, relative));
114
122
  if (previous.assets.includes(relative) && exists(file)) assets.push({ destination: file, kind: 'legacy' });
115
123
  }
@@ -138,7 +146,7 @@ function planInstallation({ agents, scope, projectDir = process.cwd(), home = os
138
146
  return plan;
139
147
  }
140
148
  function executeInstallation(plan, { force = false } = {}) {
141
- if (plan.conflicts.length && !force) throw new Error('Existing installation assets require confirmation or --force before replacement.');
149
+ if (plan.conflicts.length && !force) throw new Error('已有安装内容需要确认或使用 --force 才能替换。');
142
150
  const contexts = new Map();
143
151
  const createdDirectories = [];
144
152
  const committed = [];
@@ -171,7 +179,7 @@ function executeInstallation(plan, { force = false } = {}) {
171
179
  fs.writeFileSync(asset.staged, manifestContent(plan, asset));
172
180
  } else {
173
181
  fs.cpSync(asset.source, asset.staged, { recursive: true, filter: file => {
174
- if (fs.lstatSync(file).isSymbolicLink()) throw new Error(`Package contains a symlink: ${file}`);
182
+ if (fs.lstatSync(file).isSymbolicLink()) throw new Error(`包内容中包含符号链接(symlink): ${file}`);
175
183
  return path.basename(file) !== '.DS_Store';
176
184
  } });
177
185
  portable(asset.staged, asset, asset.source.endsWith('.md'));
@@ -184,12 +192,12 @@ function executeInstallation(plan, { force = false } = {}) {
184
192
  const unchanged = fingerprint(asset.destination) === asset.expectedFingerprint
185
193
  && fingerprint(asset.staged) === asset.expectedFingerprint;
186
194
  if (unchanged) continue;
187
- if (!force) throw new Error(`Destination changed during installation: ${asset.destination}. Retry with confirmed replacement.`);
195
+ if (!force) throw new Error(`安装期间目标已改变: ${asset.destination}. 请重新检查并确认替换后重试。`);
188
196
  } else if (asset.mergeable) {
189
- if (fingerprint(asset.destination) !== asset.observedFingerprint && !force) throw new Error(`Manifest changed during installation: ${asset.destination}. Retry with confirmed replacement.`);
197
+ if (fingerprint(asset.destination) !== asset.observedFingerprint && !force) throw new Error(`安装期间清单已改变: ${asset.destination}. 请重新检查并确认替换后重试。`);
190
198
  }
191
199
  // A destination may have appeared since planning; never replace it implicitly.
192
- if (exists(asset.destination) && !force && !asset.mergeable) throw new Error(`Destination appeared during installation: ${asset.destination}. Retry with confirmed replacement.`);
200
+ if (exists(asset.destination) && !force && !asset.mergeable) throw new Error(`安装期间出现了新的目标: ${asset.destination}. 请重新检查并确认替换后重试。`);
193
201
  const change = { destination: asset.destination, written: false };
194
202
  if (exists(asset.destination)) {
195
203
  change.backup = path.join(context.backup, path.relative(asset.base, asset.destination));
@@ -1,29 +1,38 @@
1
1
  'use strict';
2
-
3
- // Project commands are identical for both Buddy clients, including when the
4
- // other client is added later. Global commands use the selected profile path.
2
+ function replaceBlock(content, name, replacement) {
3
+ const start = `<!-- i3:${name}:start -->`, end = `<!-- i3:${name}:end -->`;
4
+ if (content.split(start).length !== 2 || content.split(end).length !== 2 || content.indexOf(start) >= content.indexOf(end)) {
5
+ throw new Error(`i3-ship 宿主适配标记 ${name} 缺失、重复或顺序错误,请重新安装完整发行包。`);
6
+ }
7
+ const from = content.indexOf(start), to = content.indexOf(end) + end.length;
8
+ return content.slice(0, from) + `${start}\n${replacement}\n${end}` + content.slice(to);
9
+ }
10
+ // Adapt stable blocks, never their prose. Shared project commands work for
11
+ // either Buddy client; global paths belong to the selected profile.
5
12
  function nativeContent(content, asset) {
6
13
  content = content.replaceAll('i3-composer-agent:', '').replaceAll('agent-skills:', '');
7
14
  if (!asset.buddyCommand) return content;
8
15
  const projectPersonas = '.codebuddy/agents/';
9
- const userPersonas = asset.scope === 'project'
10
- ? "the current host's user-level agents directory"
16
+ const userPersonas = asset.scope === 'project' ? '当前宿主的用户级 agents 目录'
11
17
  : `\`${asset.personasDirectory.replaceAll('\\', '/')}/\``;
12
18
  content = content.replaceAll('CLAUDE.md', 'CODEBUDDY.md')
13
19
  .replaceAll('`~/.claude/agents/`', userPersonas)
14
20
  .replaceAll('.claude/agents/', projectPersonas);
15
21
  if (!asset.source.endsWith('i3-ship.md')) return content;
16
- return content
17
- .replace('Spawn three subagents concurrently using the Agent tool. **Issue all three Agent tool calls in a single assistant turn so they execute in parallel** — sequential calls defeat the purpose of this command.',
18
- 'Use the host\'s native subagent capability to run three specialist personas concurrently. Issue all three calls together when the host supports parallel execution.')
19
- .replace("In Claude Code, each call passes `subagent_type` matching the persona's `name` field:",
20
- 'Select the following persona names using the host\'s native subagent mechanism:')
21
- .replace('In other harnesses without an Agent tool, invoke each persona\'s system prompt sequentially and treat their outputs as if returned in parallel — the merge phase still works.',
22
- 'If native subagents are unavailable, read each persona prompt from the installed agents directory, perform the three reviews sequentially, and retain the same merge phase.')
23
- .replace(/Constraints \(from Claude Code's subagent model\):\n[\s\S]*?\n\n\*\*Persona resolution\.\*\*[^\n]*/,
24
- `Constraints:\n- Each specialist reviews independently and returns a report to this session.\n- Specialists do not delegate to one another.\n- Follow the host's execution and permission limits.\n\n**Persona resolution.** Read installed persona prompts from \`${asset.scope === 'project' ? projectPersonas : asset.personasDirectory.replaceAll('\\', '/') + '/'}\`. For project installations, check ${userPersonas} for the current host's user-defined personas, and follow its native precedence rules.`)
25
- .replace('The three Phase A personas run in parallel — never sequentially.',
26
- 'Run the three Phase A personas in parallel when native subagents are available; otherwise use the sequential fallback above.');
27
- }
22
+ const personas = asset.scope === 'project' ? projectPersonas : asset.personasDirectory.replaceAll('\\', '/') + '/';
23
+ content = replaceBlock(content, 'ship-dispatch', `使用宿主的原生子代理能力同时启动三个专业角色;支持并行调用时,在同一轮发出三个调用。
28
24
 
25
+ 1. **\`code-reviewer\`**:对待发布改动进行正确性、可读性、架构、安全、性能五维审查,返回标准评审报告。
26
+ 2. **\`security-auditor\`**:审查漏洞、威胁模型、OWASP Top 10、密钥、认证授权及依赖 CVE,返回标准安全报告。
27
+ 3. **\`test-engineer\`**:检查正常、边界、错误和并发路径及测试覆盖,返回标准覆盖分析。
28
+
29
+ 如果宿主的原生子代理不可用,读取安装后的角色提示,依次完成三个独立审查,保留各自报告;之后仍由主会话汇总。
30
+
31
+ 约束:
32
+ - 角色独立审查,只返回报告,不互相委派。
33
+ - 遵守当前宿主的执行、上下文和权限限制。
34
+ - 角色解析:读取 \`${personas}\`。项目安装另按宿主优先级检查${userPersonas}的自定义角色。
35
+ - 后续主会话合并重复发现,按原门槛输出 GO/NO-GO;必须提供回滚计划。严重(Critical)问题默认 NO-GO,除非用户明确接受风险。`);
36
+ return replaceBlock(content, 'ship-parallel-rule', '宿主支持原生子代理时,阶段 A 的三个角色并行运行;不支持时采用上文的顺序降级。');
37
+ }
29
38
  module.exports = { nativeContent };
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+ const registry = require('./agent-targets.json');
3
+ const commonIds = ['codebuddy', 'workbuddy', 'codex', 'claude-code', 'cursor', 'gemini-cli'];
4
+ const orderedAgents = [...commonIds.map(id => registry.agents.find(agent => agent.id === id)),
5
+ ...registry.agents.filter(agent => !commonIds.includes(agent.id))];
6
+ if (orderedAgents.some(agent => !agent) || new Set(orderedAgents.map(agent => agent.id)).size !== registry.agents.length) {
7
+ throw new Error('安装目录排序与工具登记不一致。');
8
+ }
9
+ module.exports = { orderedAgents, commonIds };
package/bin/wizard.cjs CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  const readline = require('node:readline');
4
4
  const { registry, selectAgents } = require('./install.cjs');
5
+ const { orderedAgents, commonIds } = require('./tool-menu.cjs');
5
6
 
6
7
  async function session(action) {
7
8
  const terminal = readline.createInterface({ input: process.stdin, output: process.stdout });
@@ -22,46 +23,72 @@ async function session(action) {
22
23
  }
23
24
  async function choose(options, identity) {
24
25
  console.log(identity);
25
- console.log('\nChoose tools (multiple selections are supported):');
26
- const entries = registry.agents.map((agent, index) => `${index + 1}. ${agent.label} [${agent.id}]${agent.globalSkillsDir ? '' : ' (project only)'}`);
27
- for (let index = 0; index < entries.length; index += 2) console.log(entries[index].padEnd(49) + (entries[index + 1] || ''));
28
26
  return session(async ask => {
29
- let agents;
30
- while (!agents) {
31
- const input = await ask(`Select tools by number or ID, comma-separated${options.agents.length ? ` [${options.agents.join(',')}]` : ''} (q cancels): `);
32
- if (input === null || ['q', 'cancel'].includes(input.toLowerCase())) return null;
27
+ const selected = new Set(selectAgents(options.agents));
28
+ let view = 'common', page = 0, query = '';
29
+ 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; }
33
55
  try {
34
- const values = input === 'all' ? registry.agents.map(agent => agent.id) : input ? input.split(',').map(value => {
35
- const trimmed = value.trim();
36
- return /^\d+$/.test(trimmed) ? registry.agents[Number(trimmed) - 1]?.id || trimmed : trimmed;
37
- }) : options.agents;
38
- agents = selectAgents(values);
39
- if (!agents.length) { agents = undefined; console.log('Choose at least one tool.'); }
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);
40
65
  } catch (error) { console.log(error.message); }
41
66
  }
67
+ const agents = [...selected];
68
+ if (agents.includes('workbuddy')) console.log('WorkBuddy 桌面版建议全局安装,以便技能列表和输入补全发现 Skills;项目安装仍支持命令,技能列表可能不显示。');
42
69
  let scope = options.scope;
43
70
  while (!scope) {
44
- const input = await ask('Installation scope: 1. Project (current project), 2. Global (all projects) [1] (q cancels): ');
45
- if (input === null || ['q', 'cancel'].includes(input.toLowerCase())) return null;
46
- if (['', '1', 'project'].includes(input)) scope = 'project';
47
- else if (['2', 'global'].includes(input)) scope = 'global';
48
- else console.log('Choose 1 (project) or 2 (global).');
71
+ const input = await ask('安装范围:1. 项目(当前项目),2. 全局(所有项目)[1](q/取消退出): ');
72
+ if (cancelled(input)) return null;
73
+ if (['', '1', 'project', '项目'].includes(input)) scope = 'project';
74
+ else if (['2', 'global', '全局'].includes(input)) scope = 'global';
75
+ else console.log('请选择 1(项目)或 2(全局)。');
49
76
  }
50
77
  return { agents, scope };
51
78
  });
52
79
  }
53
80
  async function confirm(plan) {
54
- console.log(`\nInstallation scope: ${plan.scope}`);
81
+ console.log(`\n安装范围:${plan.scope === 'project' ? '项目' : '全局'}`);
55
82
  for (const target of plan.targets) {
56
83
  console.log(` ${target.agents.join(', ')}: ${target.skillsDirectory}`);
57
- if (target.commandsDirectory) console.log(` Commands: ${target.commandsDirectory}`);
84
+ if (target.commandsDirectory) console.log(` 命令:${target.commandsDirectory}`);
58
85
  }
59
- if (plan.conflicts.length) console.log(`${plan.conflicts.length} existing assets will be replaced. Previous files are removed after successful installation.`);
60
- if (plan.reused.length) console.log(`${plan.reused.length} unchanged assets from the same version will be reused.`);
61
- console.log('Includes all skills and shared references. Plugin hooks require native plugin registration.');
86
+ if (plan.conflicts.length) console.log(`将替换 ${plan.conflicts.length} 个已有内容;安装成功后清理旧文件,失败则恢复。`);
87
+ if (plan.reused.length) console.log(`将复用同版本的 ${plan.reused.length} 个未修改内容。`);
88
+ console.log('包含完整技能及共享参考资料。插件 Hook 需按宿主方式注册和启用。');
62
89
  return session(async ask => {
63
- const answer = await ask('Install these files? [y/N]: ');
64
- return answer !== null && ['y', 'yes'].includes(answer.toLowerCase());
90
+ const answer = await ask('确认安装这些内容?[y/N]: ');
91
+ return answer !== null && ['y', 'yes', '是', '确认'].includes(answer.toLowerCase());
65
92
  });
66
93
  }
67
94
  module.exports = { choose, confirm };
@@ -1,6 +1,18 @@
1
- description = "Implement tasks incrementally — build, test, verify, commit. Add \"auto\" to run the whole plan in one approved pass."
1
+ description = "按任务增量实现、构建、测试、验证并提交;添加 auto 可按已获批准的完整计划执行。"
2
+ # i3-description-source: "description = \"Implement tasks incrementally — build, test, verify, commit. Add \\\"auto\\\" to run the whole plan in one approved pass.\""
2
3
 
3
4
  prompt = """
5
+ <!-- i3:zh-CN:start -->
6
+ ## 中文交互与输出
7
+
8
+ 默认使用简体中文回复,包括追问、选项说明、阶段进度、分析、规格、计划、验收、代码审查与发布报告。只有用户明确要求其他语言时才切换;输入中出现英文术语、代码或引用不构成切换语言的要求。
9
+ 下文的工程步骤、审批要求、退出条件和工具约束完整有效。英文示例中的人类可读标题、说明和占位内容在实际输出时应译为中文;保留原有信息与验证标准,不删减方法。
10
+ Skill/Command/Agent 标识、文件路径、命令参数、代码/API 名称、工具调用参数、JSON 键/类型/枚举、机器状态、测试期望字面量及引用原文保持原样。生成文档正文用中文,SPEC.md、tasks/plan.md、tasks/todo.md、CONSTRAINTS.md 等约定路径不改名。
11
+ 严重程度按原规则判断,面向用户可写“严重(Critical)”“必须修复(Required)”“小问题(Nit)”“可选(Optional)”“建议考虑(Consider)”“仅供参考(FYI)”;High/Medium/Low、APPROVE/REQUEST CHANGES 和 GO/NO-GO 保留其原始语义与机器值。不得因翻译降低门槛,角色不能互相委派。
12
+
13
+ 适用说明:按任务增量实现、构建、测试、验证并提交;添加 auto 可按已获批准的完整计划执行。
14
+ <!-- i3:zh-CN:end -->
15
+
4
16
  Invoke the i3-incremental-implementation skill alongside i3-test-driven-development.
5
17
 
6
18
  ## Modes
@@ -1,6 +1,18 @@
1
- description = "Simplify code for clarity and maintainability — reduce complexity without changing behavior"
1
+ description = "简化代码,降低复杂度,提高可读性与维护性,并保持既有行为不变。"
2
+ # i3-description-source: "description = \"Simplify code for clarity and maintainability — reduce complexity without changing behavior\""
2
3
 
3
4
  prompt = """
5
+ <!-- i3:zh-CN:start -->
6
+ ## 中文交互与输出
7
+
8
+ 默认使用简体中文回复,包括追问、选项说明、阶段进度、分析、规格、计划、验收、代码审查与发布报告。只有用户明确要求其他语言时才切换;输入中出现英文术语、代码或引用不构成切换语言的要求。
9
+ 下文的工程步骤、审批要求、退出条件和工具约束完整有效。英文示例中的人类可读标题、说明和占位内容在实际输出时应译为中文;保留原有信息与验证标准,不删减方法。
10
+ Skill/Command/Agent 标识、文件路径、命令参数、代码/API 名称、工具调用参数、JSON 键/类型/枚举、机器状态、测试期望字面量及引用原文保持原样。生成文档正文用中文,SPEC.md、tasks/plan.md、tasks/todo.md、CONSTRAINTS.md 等约定路径不改名。
11
+ 严重程度按原规则判断,面向用户可写“严重(Critical)”“必须修复(Required)”“小问题(Nit)”“可选(Optional)”“建议考虑(Consider)”“仅供参考(FYI)”;High/Medium/Low、APPROVE/REQUEST CHANGES 和 GO/NO-GO 保留其原始语义与机器值。不得因翻译降低门槛,角色不能互相委派。
12
+
13
+ 适用说明:简化代码,降低复杂度,提高可读性与维护性,并保持既有行为不变。
14
+ <!-- i3:zh-CN:end -->
15
+
4
16
  Invoke the i3-code-simplification skill.
5
17
 
6
18
  Simplify recently changed code (or the specified scope) while preserving exact behavior:
@@ -1,6 +1,18 @@
1
- description = "Define and enforce this project's quality bar — interview, sane defaults, CONSTRAINTS.md"
1
+ description = "访谈并定义项目质量门槛,提供合理默认值,写入 CONSTRAINTS.md 并落实约束。"
2
+ # i3-description-source: "description = \"Define and enforce this project's quality bar — interview, sane defaults, CONSTRAINTS.md\""
2
3
 
3
4
  prompt = """
5
+ <!-- i3:zh-CN:start -->
6
+ ## 中文交互与输出
7
+
8
+ 默认使用简体中文回复,包括追问、选项说明、阶段进度、分析、规格、计划、验收、代码审查与发布报告。只有用户明确要求其他语言时才切换;输入中出现英文术语、代码或引用不构成切换语言的要求。
9
+ 下文的工程步骤、审批要求、退出条件和工具约束完整有效。英文示例中的人类可读标题、说明和占位内容在实际输出时应译为中文;保留原有信息与验证标准,不删减方法。
10
+ Skill/Command/Agent 标识、文件路径、命令参数、代码/API 名称、工具调用参数、JSON 键/类型/枚举、机器状态、测试期望字面量及引用原文保持原样。生成文档正文用中文,SPEC.md、tasks/plan.md、tasks/todo.md、CONSTRAINTS.md 等约定路径不改名。
11
+ 严重程度按原规则判断,面向用户可写“严重(Critical)”“必须修复(Required)”“小问题(Nit)”“可选(Optional)”“建议考虑(Consider)”“仅供参考(FYI)”;High/Medium/Low、APPROVE/REQUEST CHANGES 和 GO/NO-GO 保留其原始语义与机器值。不得因翻译降低门槛,角色不能互相委派。
12
+
13
+ 适用说明:访谈并定义项目质量门槛,提供合理默认值,写入 CONSTRAINTS.md 并落实约束。
14
+ <!-- i3:zh-CN:end -->
15
+
4
16
  Invoke the i3-constraint-driven-development skill.
5
17
 
6
18
  $ARGUMENTS
@@ -1,6 +1,18 @@
1
- description = "Break work into small verifiable tasks with acceptance criteria and dependency ordering"
1
+ description = "把工作拆成带验收标准、验证步骤和依赖顺序的小任务。"
2
+ # i3-description-source: "description = \"Break work into small verifiable tasks with acceptance criteria and dependency ordering\""
2
3
 
3
4
  prompt = """
5
+ <!-- i3:zh-CN:start -->
6
+ ## 中文交互与输出
7
+
8
+ 默认使用简体中文回复,包括追问、选项说明、阶段进度、分析、规格、计划、验收、代码审查与发布报告。只有用户明确要求其他语言时才切换;输入中出现英文术语、代码或引用不构成切换语言的要求。
9
+ 下文的工程步骤、审批要求、退出条件和工具约束完整有效。英文示例中的人类可读标题、说明和占位内容在实际输出时应译为中文;保留原有信息与验证标准,不删减方法。
10
+ Skill/Command/Agent 标识、文件路径、命令参数、代码/API 名称、工具调用参数、JSON 键/类型/枚举、机器状态、测试期望字面量及引用原文保持原样。生成文档正文用中文,SPEC.md、tasks/plan.md、tasks/todo.md、CONSTRAINTS.md 等约定路径不改名。
11
+ 严重程度按原规则判断,面向用户可写“严重(Critical)”“必须修复(Required)”“小问题(Nit)”“可选(Optional)”“建议考虑(Consider)”“仅供参考(FYI)”;High/Medium/Low、APPROVE/REQUEST CHANGES 和 GO/NO-GO 保留其原始语义与机器值。不得因翻译降低门槛,角色不能互相委派。
12
+
13
+ 适用说明:把工作拆成带验收标准、验证步骤和依赖顺序的小任务。
14
+ <!-- i3:zh-CN:end -->
15
+
4
16
  Invoke the i3-planning-and-task-breakdown skill.
5
17
 
6
18
  Read the existing spec (SPEC.md or equivalent) and the relevant codebase sections. Then:
@@ -1,6 +1,18 @@
1
- description = "Conduct a five-axis code review — correctness, readability, architecture, security, performance"
1
+ description = "从正确性、可读性、架构、安全和性能五个维度审查代码。"
2
+ # i3-description-source: "description = \"Conduct a five-axis code review — correctness, readability, architecture, security, performance\""
2
3
 
3
4
  prompt = """
5
+ <!-- i3:zh-CN:start -->
6
+ ## 中文交互与输出
7
+
8
+ 默认使用简体中文回复,包括追问、选项说明、阶段进度、分析、规格、计划、验收、代码审查与发布报告。只有用户明确要求其他语言时才切换;输入中出现英文术语、代码或引用不构成切换语言的要求。
9
+ 下文的工程步骤、审批要求、退出条件和工具约束完整有效。英文示例中的人类可读标题、说明和占位内容在实际输出时应译为中文;保留原有信息与验证标准,不删减方法。
10
+ Skill/Command/Agent 标识、文件路径、命令参数、代码/API 名称、工具调用参数、JSON 键/类型/枚举、机器状态、测试期望字面量及引用原文保持原样。生成文档正文用中文,SPEC.md、tasks/plan.md、tasks/todo.md、CONSTRAINTS.md 等约定路径不改名。
11
+ 严重程度按原规则判断,面向用户可写“严重(Critical)”“必须修复(Required)”“小问题(Nit)”“可选(Optional)”“建议考虑(Consider)”“仅供参考(FYI)”;High/Medium/Low、APPROVE/REQUEST CHANGES 和 GO/NO-GO 保留其原始语义与机器值。不得因翻译降低门槛,角色不能互相委派。
12
+
13
+ 适用说明:从正确性、可读性、架构、安全和性能五个维度审查代码。
14
+ <!-- i3:zh-CN:end -->
15
+
4
16
  Invoke the i3-code-review-and-quality skill.
5
17
 
6
18
  Review the current changes (staged or recent commits) across all five axes:
@@ -1,6 +1,18 @@
1
- description = "Run the pre-launch checklist via parallel fan-out to specialist personas, then synthesize a go/no-go decision"
1
+ description = "并行调用三个专业角色执行发布前检查,主会话汇总 GO/NO-GO 决策与回滚计划。"
2
+ # i3-description-source: "description = \"Run the pre-launch checklist via parallel fan-out to specialist personas, then synthesize a go/no-go decision\""
2
3
 
3
4
  prompt = """
5
+ <!-- i3:zh-CN:start -->
6
+ ## 中文交互与输出
7
+
8
+ 默认使用简体中文回复,包括追问、选项说明、阶段进度、分析、规格、计划、验收、代码审查与发布报告。只有用户明确要求其他语言时才切换;输入中出现英文术语、代码或引用不构成切换语言的要求。
9
+ 下文的工程步骤、审批要求、退出条件和工具约束完整有效。英文示例中的人类可读标题、说明和占位内容在实际输出时应译为中文;保留原有信息与验证标准,不删减方法。
10
+ Skill/Command/Agent 标识、文件路径、命令参数、代码/API 名称、工具调用参数、JSON 键/类型/枚举、机器状态、测试期望字面量及引用原文保持原样。生成文档正文用中文,SPEC.md、tasks/plan.md、tasks/todo.md、CONSTRAINTS.md 等约定路径不改名。
11
+ 严重程度按原规则判断,面向用户可写“严重(Critical)”“必须修复(Required)”“小问题(Nit)”“可选(Optional)”“建议考虑(Consider)”“仅供参考(FYI)”;High/Medium/Low、APPROVE/REQUEST CHANGES 和 GO/NO-GO 保留其原始语义与机器值。不得因翻译降低门槛,角色不能互相委派。
12
+
13
+ 适用说明:并行调用三个专业角色执行发布前检查,主会话汇总 GO/NO-GO 决策与回滚计划。
14
+ <!-- i3:zh-CN:end -->
15
+
4
16
  Invoke the i3-shipping-and-launch skill.
5
17
 
6
18
  `/i3-ship` is a **fan-out orchestrator**. It runs three specialist personas in parallel against the current change, then merges their reports into a single go/no-go decision with a rollback plan. The personas operate independently — no shared state, no ordering — which is what makes parallel execution safe and useful here.
@@ -1,6 +1,18 @@
1
- description = "Start spec-driven development — write a structured specification before writing code"
1
+ description = "先编写结构化规格、目标、范围与验收标准,再进入实现。"
2
+ # i3-description-source: "description = \"Start spec-driven development — write a structured specification before writing code\""
2
3
 
3
4
  prompt = """
5
+ <!-- i3:zh-CN:start -->
6
+ ## 中文交互与输出
7
+
8
+ 默认使用简体中文回复,包括追问、选项说明、阶段进度、分析、规格、计划、验收、代码审查与发布报告。只有用户明确要求其他语言时才切换;输入中出现英文术语、代码或引用不构成切换语言的要求。
9
+ 下文的工程步骤、审批要求、退出条件和工具约束完整有效。英文示例中的人类可读标题、说明和占位内容在实际输出时应译为中文;保留原有信息与验证标准,不删减方法。
10
+ Skill/Command/Agent 标识、文件路径、命令参数、代码/API 名称、工具调用参数、JSON 键/类型/枚举、机器状态、测试期望字面量及引用原文保持原样。生成文档正文用中文,SPEC.md、tasks/plan.md、tasks/todo.md、CONSTRAINTS.md 等约定路径不改名。
11
+ 严重程度按原规则判断,面向用户可写“严重(Critical)”“必须修复(Required)”“小问题(Nit)”“可选(Optional)”“建议考虑(Consider)”“仅供参考(FYI)”;High/Medium/Low、APPROVE/REQUEST CHANGES 和 GO/NO-GO 保留其原始语义与机器值。不得因翻译降低门槛,角色不能互相委派。
12
+
13
+ 适用说明:先编写结构化规格、目标、范围与验收标准,再进入实现。
14
+ <!-- i3:zh-CN:end -->
15
+
4
16
  Invoke the i3-spec-driven-development skill.
5
17
 
6
18
  Begin by understanding what the user wants to build. Ask clarifying questions about:
@@ -1,6 +1,18 @@
1
- description = "Run TDD workflow — write failing tests, implement, verify. For bugs, use the Prove-It pattern."
1
+ description = "执行 TDD:先编写失败测试,再实现和验证;缺陷使用 Prove-It 模式复现。"
2
+ # i3-description-source: "description = \"Run TDD workflow — write failing tests, implement, verify. For bugs, use the Prove-It pattern.\""
2
3
 
3
4
  prompt = """
5
+ <!-- i3:zh-CN:start -->
6
+ ## 中文交互与输出
7
+
8
+ 默认使用简体中文回复,包括追问、选项说明、阶段进度、分析、规格、计划、验收、代码审查与发布报告。只有用户明确要求其他语言时才切换;输入中出现英文术语、代码或引用不构成切换语言的要求。
9
+ 下文的工程步骤、审批要求、退出条件和工具约束完整有效。英文示例中的人类可读标题、说明和占位内容在实际输出时应译为中文;保留原有信息与验证标准,不删减方法。
10
+ Skill/Command/Agent 标识、文件路径、命令参数、代码/API 名称、工具调用参数、JSON 键/类型/枚举、机器状态、测试期望字面量及引用原文保持原样。生成文档正文用中文,SPEC.md、tasks/plan.md、tasks/todo.md、CONSTRAINTS.md 等约定路径不改名。
11
+ 严重程度按原规则判断,面向用户可写“严重(Critical)”“必须修复(Required)”“小问题(Nit)”“可选(Optional)”“建议考虑(Consider)”“仅供参考(FYI)”;High/Medium/Low、APPROVE/REQUEST CHANGES 和 GO/NO-GO 保留其原始语义与机器值。不得因翻译降低门槛,角色不能互相委派。
12
+
13
+ 适用说明:执行 TDD:先编写失败测试,再实现和验证;缺陷使用 Prove-It 模式复现。
14
+ <!-- i3:zh-CN:end -->
15
+
4
16
  Invoke the i3-test-driven-development skill.
5
17
 
6
18
  For new features:
@@ -1,6 +1,18 @@
1
- description = "Run a web performance audit via the web-performance-auditor persona"
1
+ description = "调用 web-performance-auditor 角色审查网页性能与 Core Web Vitals。"
2
+ # i3-description-source: "description = \"Run a web performance audit via the web-performance-auditor persona\""
2
3
 
3
4
  prompt = """
5
+ <!-- i3:zh-CN:start -->
6
+ ## 中文交互与输出
7
+
8
+ 默认使用简体中文回复,包括追问、选项说明、阶段进度、分析、规格、计划、验收、代码审查与发布报告。只有用户明确要求其他语言时才切换;输入中出现英文术语、代码或引用不构成切换语言的要求。
9
+ 下文的工程步骤、审批要求、退出条件和工具约束完整有效。英文示例中的人类可读标题、说明和占位内容在实际输出时应译为中文;保留原有信息与验证标准,不删减方法。
10
+ Skill/Command/Agent 标识、文件路径、命令参数、代码/API 名称、工具调用参数、JSON 键/类型/枚举、机器状态、测试期望字面量及引用原文保持原样。生成文档正文用中文,SPEC.md、tasks/plan.md、tasks/todo.md、CONSTRAINTS.md 等约定路径不改名。
11
+ 严重程度按原规则判断,面向用户可写“严重(Critical)”“必须修复(Required)”“小问题(Nit)”“可选(Optional)”“建议考虑(Consider)”“仅供参考(FYI)”;High/Medium/Low、APPROVE/REQUEST CHANGES 和 GO/NO-GO 保留其原始语义与机器值。不得因翻译降低门槛,角色不能互相委派。
12
+
13
+ 适用说明:调用 web-performance-auditor 角色审查网页性能与 Core Web Vitals。
14
+ <!-- i3:zh-CN:end -->
15
+
4
16
  /i3-webperf targets web applications specifically. Do not use it for utility libraries, CLIs, or server-only code with no browser-facing output.
5
17
 
6
18
  ## Determine the mode
@@ -1,5 +1,13 @@
1
1
  # Adoption Guide: New Projects vs. Established Codebases
2
2
 
3
+ <!-- i3:zh-guide:start -->
4
+ ## 中文使用说明
5
+
6
+ 按下文完整工程步骤、检查项与验证条件执行。根据任务选择适用步骤,保留证据、风险和退出条件;正文示例中的英文标签在面向用户输出时译为中文。
7
+
8
+ 默认使用简体中文解释、追问及生成报告;用户明确要求其他语言时可切换。原方法正文、引用、阈值和审批条件完整保留。代码标识、路径、命令、工具参数、JSON 键/枚举与原文引用保持原样。
9
+ <!-- i3:zh-guide:end -->
10
+
3
11
  How to roll out i3-composer-agent depends heavily on where your codebase is in its life. A greenfield project can adopt the full lifecycle from commit one. A codebase with years of history needs an incremental path that respects what already exists, its conventions, its undocumented decisions, and its lack of test coverage in places you'd rather not touch blind.
4
12
 
5
13
  This guide covers both paths. For installation mechanics, see [getting-started.md](getting-started.md) and the per-tool setup guides. For what each skill does, see the [skill catalog in the README](../README.md#all-25-skills).
package/docs/agents.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Agent Personas
2
2
 
3
+ <!-- i3:zh-guide:start -->
4
+ ## 中文使用说明
5
+
6
+ code-reviewer 审查五维代码质量;security-auditor 审计安全;test-engineer 分析测试;web-performance-auditor 审计网页性能。输出中文报告,保留各角色权限、严重程度、证据字段和调用边界。
7
+
8
+ 默认使用简体中文解释、追问及生成报告;用户明确要求其他语言时可切换。原方法正文、引用、阈值和审批条件完整保留。代码标识、路径、命令、工具参数、JSON 键/枚举与原文引用保持原样。
9
+ <!-- i3:zh-guide:end -->
10
+
3
11
  Specialist personas that play a single role with a single perspective. Each persona is a Markdown file consumed as a system prompt by your harness (Claude Code, Cursor, Copilot, etc.).
4
12
 
5
13
  | Persona | Role | Best for |
@@ -1,5 +1,13 @@
1
1
  # Using i3-composer-agent with Antigravity CLI (agy)
2
2
 
3
+ <!-- i3:zh-guide:start -->
4
+ ## 中文使用说明
5
+
6
+ 按下文完整工程步骤、检查项与验证条件执行。根据任务选择适用步骤,保留证据、风险和退出条件;正文示例中的英文标签在面向用户输出时译为中文。
7
+
8
+ 默认使用简体中文解释、追问及生成报告;用户明确要求其他语言时可切换。原方法正文、引用、阈值和审批条件完整保留。代码标识、路径、命令、工具参数、JSON 键/枚举与原文引用保持原样。
9
+ <!-- i3:zh-guide:end -->
10
+
3
11
  The `i3-composer-agent` package can be installed as a native plugin in the Antigravity CLI (`agy`), giving the agent access to structured workflows and personas.
4
12
 
5
13
  ## Setup