@flyin-ai/alloy 0.1.1 → 0.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +28 -90
  2. package/commands/alloy/apply.md +274 -119
  3. package/commands/alloy/archive.md +116 -60
  4. package/commands/alloy/discard.md +57 -15
  5. package/commands/alloy/finish.md +92 -70
  6. package/commands/alloy/fix.md +272 -53
  7. package/commands/alloy/plan.md +125 -63
  8. package/commands/alloy/references/interaction-style.md +82 -0
  9. package/commands/alloy/references/main-branch-detection.md +32 -0
  10. package/commands/alloy/references/phase-routing.md +21 -0
  11. package/commands/alloy/references/skill-precheck.md +46 -0
  12. package/commands/alloy/start.md +187 -62
  13. package/commands/alloy/status.md +1 -1
  14. package/dist/cli/commands/doctor.d.ts +1 -0
  15. package/dist/cli/commands/doctor.js +28 -6
  16. package/dist/cli/commands/doctor.js.map +1 -1
  17. package/dist/cli/commands/init.js +40 -37
  18. package/dist/cli/commands/init.js.map +1 -1
  19. package/dist/cli/commands/internal/config.d.ts +1 -0
  20. package/dist/cli/commands/internal/config.js +45 -0
  21. package/dist/cli/commands/internal/config.js.map +1 -0
  22. package/dist/cli/commands/internal/guard.js +2 -41
  23. package/dist/cli/commands/internal/guard.js.map +1 -1
  24. package/dist/cli/commands/internal/record.js +10 -47
  25. package/dist/cli/commands/internal/record.js.map +1 -1
  26. package/dist/cli/commands/internal/skill-usage.d.ts +1 -0
  27. package/dist/cli/commands/internal/skill-usage.js +78 -0
  28. package/dist/cli/commands/internal/skill-usage.js.map +1 -0
  29. package/dist/cli/commands/internal/state.js +105 -6
  30. package/dist/cli/commands/internal/state.js.map +1 -1
  31. package/dist/cli/commands/status.d.ts +1 -0
  32. package/dist/cli/commands/status.js +50 -11
  33. package/dist/cli/commands/status.js.map +1 -1
  34. package/dist/cli/commands/update.js +20 -17
  35. package/dist/cli/commands/update.js.map +1 -1
  36. package/dist/cli/index.js +73 -31
  37. package/dist/cli/index.js.map +1 -1
  38. package/dist/cli/utils/hash.d.ts +3 -0
  39. package/dist/cli/utils/hash.js +42 -0
  40. package/dist/cli/utils/hash.js.map +1 -0
  41. package/dist/cli/utils/state.d.ts +4 -2
  42. package/dist/cli/utils/state.js +34 -2
  43. package/dist/cli/utils/state.js.map +1 -1
  44. package/dist/core/artifacts.d.ts +3 -0
  45. package/dist/core/artifacts.js +45 -0
  46. package/dist/core/artifacts.js.map +1 -0
  47. package/dist/core/detect-installations.d.ts +19 -0
  48. package/dist/core/detect-installations.js +65 -0
  49. package/dist/core/detect-installations.js.map +1 -0
  50. package/dist/core/openspec.d.ts +2 -1
  51. package/dist/core/openspec.js +30 -12
  52. package/dist/core/openspec.js.map +1 -1
  53. package/dist/core/skills.js +16 -0
  54. package/dist/core/skills.js.map +1 -1
  55. package/dist/core/superpowers.d.ts +8 -1
  56. package/dist/core/superpowers.js +41 -20
  57. package/dist/core/superpowers.js.map +1 -1
  58. package/dist/core/types.d.ts +20 -0
  59. package/dist/utils/format.d.ts +31 -0
  60. package/dist/utils/format.js +101 -0
  61. package/dist/utils/format.js.map +1 -0
  62. package/dist/utils/output.d.ts +16 -0
  63. package/dist/utils/output.js +38 -0
  64. package/dist/utils/output.js.map +1 -0
  65. package/dist/utils/prompt.d.ts +0 -1
  66. package/dist/utils/prompt.js +11 -83
  67. package/dist/utils/prompt.js.map +1 -1
  68. package/openspec/schemas/alloy/instructions/retrospective.md +17 -35
  69. package/openspec/schemas/alloy/templates/design.md +2 -0
  70. package/openspec/schemas/alloy/templates/draft.md +2 -0
  71. package/openspec/schemas/alloy/templates/plans.md +2 -0
  72. package/openspec/schemas/alloy/templates/proposal.md +2 -0
  73. package/openspec/schemas/alloy/templates/retrospective.md +39 -19
  74. package/openspec/schemas/alloy/templates/specs.md +2 -0
  75. package/openspec/schemas/alloy/templates/tasks.md +2 -0
  76. package/package.json +8 -2
@@ -27,21 +27,56 @@ function coerceValue(field, value) {
27
27
  }
28
28
  return value;
29
29
  }
30
+ function deepMerge(target, source) {
31
+ if (target === null || target === undefined)
32
+ return source;
33
+ if (source === null)
34
+ return source;
35
+ if (typeof target !== "object" || typeof source !== "object")
36
+ return source;
37
+ if (Array.isArray(target) || Array.isArray(source))
38
+ return source;
39
+ const result = { ...target };
40
+ const src = source;
41
+ for (const key of Object.keys(src)) {
42
+ if (!(key in result)) {
43
+ // 新 key:直接添加
44
+ result[key] = src[key];
45
+ }
46
+ else if (typeof src[key] === "object" &&
47
+ src[key] !== null &&
48
+ !Array.isArray(src[key]) &&
49
+ typeof result[key] === "object" &&
50
+ result[key] !== null &&
51
+ !Array.isArray(result[key])) {
52
+ // 双方都是对象:递归合并(已有嵌套 key 不被覆盖)
53
+ result[key] = deepMerge(result[key], src[key]);
54
+ }
55
+ // else: key 在两边都存在且至少一方是 leaf → 跳过(幂等)
56
+ }
57
+ return result;
58
+ }
30
59
  export async function stateCommand(args) {
31
60
  const action = args[0];
32
61
  const changeDir = args[1];
33
62
  const field = args[2];
34
63
  const value = args[3];
35
64
  if (!action || !changeDir) {
36
- console.error("用法: alloy _state <init|read|write|check> <change-dir> [field] [value]");
65
+ console.error("用法: alloy _state <init|read|write|merge|check> <change-dir> [field] [value]");
37
66
  process.exit(1);
38
67
  }
39
68
  switch (action) {
40
69
  case "init": {
41
- // createInitialState() 创建完整 state——确保 records: [] 等所有字段存在
42
- const initialState = createInitialState();
43
- await writeState(changeDir, initialState);
44
- console.log(`✓ state 已初始化: ${changeDir}`);
70
+ // 非破坏性初始化:如果文件已存在(如 _skill log 已提前创建),保留已有数据
71
+ try {
72
+ await readState(changeDir);
73
+ console.log(`state 已存在: ${changeDir} (跳过初始化)`);
74
+ }
75
+ catch {
76
+ const initialState = createInitialState();
77
+ await writeState(changeDir, initialState);
78
+ console.log(`✓ state 已初始化: ${changeDir}`);
79
+ }
45
80
  break;
46
81
  }
47
82
  case "read": {
@@ -79,6 +114,70 @@ export async function stateCommand(args) {
79
114
  await writeState(changeDir, state);
80
115
  break;
81
116
  }
117
+ case "merge": {
118
+ if (!field || value === undefined) {
119
+ console.error("用法: alloy _state merge <change-dir> <field> <partial-json>");
120
+ process.exit(1);
121
+ }
122
+ let state;
123
+ try {
124
+ state = await readState(changeDir);
125
+ }
126
+ catch {
127
+ state = createInitialState();
128
+ }
129
+ const currentValue = state[field];
130
+ const parsedValue = coerceValue(field, value);
131
+ state[field] = deepMerge(currentValue, parsedValue);
132
+ await writeState(changeDir, state);
133
+ console.log(`✓ ${field} 已 merge: ${changeDir}`);
134
+ break;
135
+ }
136
+ case "timestamp": {
137
+ // alloy _state timestamp ensure <change-dir> <phase-name>
138
+ // args: [0]="timestamp", [1]="ensure"→changeDir, [2]=changeDir→field, [3]=phaseName→value
139
+ const subAction = changeDir;
140
+ const targetDir = field;
141
+ const phaseName = value;
142
+ if (subAction !== "ensure" || !targetDir || !phaseName) {
143
+ console.error("用法: alloy _state timestamp ensure <change-dir> <phase-name>");
144
+ process.exit(1);
145
+ }
146
+ const validPhases = ["start", "plan", "apply", "archive", "finish"];
147
+ if (!validPhases.includes(phaseName)) {
148
+ console.error(`无效的 phase 名称: ${phaseName} (支持: ${validPhases.join(", ")})`);
149
+ process.exit(1);
150
+ }
151
+ let state;
152
+ try {
153
+ state = await readState(targetDir);
154
+ }
155
+ catch {
156
+ state = createInitialState();
157
+ }
158
+ const timings = state.phase_timings ?? {};
159
+ const phaseTiming = timings[phaseName];
160
+ if (phaseTiming?.started_at) {
161
+ // 已存在:幂等输出已有值,不覆盖
162
+ console.log(phaseTiming.started_at);
163
+ }
164
+ else {
165
+ // 不存在:写入当前时间并输出
166
+ const d = new Date();
167
+ const pad = (n) => n.toString().padStart(2, "0");
168
+ const now = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
169
+ state.phase_timings = {
170
+ ...(state.phase_timings ?? {}),
171
+ [phaseName]: {
172
+ started_at: now,
173
+ completed_at: phaseTiming?.completed_at ?? null,
174
+ },
175
+ };
176
+ await writeState(targetDir, state);
177
+ console.log(now);
178
+ }
179
+ break;
180
+ }
82
181
  case "check": {
83
182
  if (!field) {
84
183
  console.error("用法: alloy _state check <change-dir> <phase>");
@@ -92,7 +191,7 @@ export async function stateCommand(args) {
92
191
  break;
93
192
  }
94
193
  default:
95
- console.error(`未知操作: ${action} (支持: init, read, write, check)`);
194
+ console.error(`未知操作: ${action} (支持: init, read, write, merge, timestamp, check)`);
96
195
  process.exit(1);
97
196
  }
98
197
  }
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../src/cli/commands/internal/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../src/cli/commands/internal/state.ts"],"names":[],"mappings":"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"}
@@ -1 +1,2 @@
1
+ export declare function printStatusDetail(projectPath: string, name: string): Promise<void>;
1
2
  export declare function statusCommand(projectPath: string, changeName?: string): Promise<string>;
@@ -1,6 +1,8 @@
1
1
  import { join } from "node:path";
2
2
  import { existsSync } from "node:fs";
3
3
  import { findActiveChanges, readState } from "../utils/state.js";
4
+ import { color, table } from "../../utils/format.js";
5
+ import { section, check } from "../../utils/output.js";
4
6
  const ARTIFACTS = [
5
7
  "draft",
6
8
  "proposal",
@@ -8,6 +10,8 @@ const ARTIFACTS = [
8
10
  "specs",
9
11
  "tasks",
10
12
  "plans",
13
+ "verify",
14
+ "retrospective",
11
15
  ];
12
16
  function checkArtifacts(changePath) {
13
17
  const status = {};
@@ -21,6 +25,37 @@ function checkArtifacts(changePath) {
21
25
  }
22
26
  return status;
23
27
  }
28
+ export async function printStatusDetail(projectPath, name) {
29
+ const changesDir = join(projectPath, "openspec", "changes");
30
+ const changePath = join(changesDir, name);
31
+ if (!existsSync(changePath)) {
32
+ console.log(`未找到 change '${name}'`);
33
+ return;
34
+ }
35
+ let state;
36
+ try {
37
+ state = await readState(changePath);
38
+ }
39
+ catch {
40
+ console.log(`change '${name}' 缺少 .alloy.yaml`);
41
+ return;
42
+ }
43
+ const artifacts = checkArtifacts(changePath);
44
+ section("Change 详情");
45
+ check("阶段", state.phase, "pass");
46
+ check("Change", name, "pass");
47
+ check("路径", changePath, "pass");
48
+ check("创建时间", state.created_at, "pass");
49
+ check("更新时间", state.updated_at, "pass");
50
+ section("制品状态");
51
+ for (const a of ARTIFACTS) {
52
+ check(a, artifacts[a] ? "✓" : "✗", artifacts[a] ? "pass" : "fail");
53
+ }
54
+ const nextStep = getNextStepDetail(state, artifacts);
55
+ if (nextStep) {
56
+ check("下一步", nextStep, "pass");
57
+ }
58
+ }
24
59
  export async function statusCommand(projectPath, changeName) {
25
60
  const changesDir = join(projectPath, "openspec", "changes");
26
61
  if (changeName) {
@@ -35,18 +70,22 @@ async function overviewMode(changesDir) {
35
70
  if (changes.size === 0) {
36
71
  return "无活跃 change。使用 /alloy-start <topic> 开始新工作流。";
37
72
  }
38
- const lines = ["活跃 Change:"];
73
+ const rows = [];
39
74
  const nextSteps = [];
40
75
  for (const [name, state] of changes) {
41
76
  const artifacts = checkArtifacts(join(changesDir, name));
42
- const artifactStatus = ARTIFACTS.map((a) => `${a} ${artifacts[a] ? "✓" : "✗"}`).join(" ");
43
- lines.push(` ${name.padEnd(20)} ${state.phase.padEnd(10)} artifacts: ${artifactStatus}`);
77
+ const artifactStatus = ARTIFACTS.map((a) => `${a} ${artifacts[a] ? color.green("✓") : color.red("✗")}`).join(" ");
78
+ rows.push([name, color.cyan(state.phase), artifactStatus]);
44
79
  const step = getNextStepSimple(state, artifacts, name);
45
80
  if (step)
46
81
  nextSteps.push(step);
47
82
  }
83
+ const lines = [
84
+ color.bold("活跃 Change:"),
85
+ table(["名称", "阶段", "制品"], rows),
86
+ ];
48
87
  if (nextSteps.length > 0) {
49
- lines.push(`\n下一步:${nextSteps.join(";")}`);
88
+ lines.push(`下一步:${nextSteps.join(";")}`);
50
89
  }
51
90
  return lines.join("\n");
52
91
  }
@@ -64,13 +103,13 @@ async function detailMode(changesDir, name) {
64
103
  }
65
104
  const artifacts = checkArtifacts(changePath);
66
105
  const lines = [
67
- `阶段: ${state.phase}`,
68
- `Change: ${name}`,
69
- `路径: ${changePath}`,
70
- `创建时间: ${state.created_at}`,
71
- `更新时间: ${state.updated_at}`,
72
- "制品状态:",
73
- ...ARTIFACTS.map((a) => ` ${a.padEnd(12)} ${artifacts[a] ? "✓" : "✗"}`),
106
+ `${color.bold("阶段:")} ${color.cyan(state.phase)}`,
107
+ `${color.bold("Change:")} ${name}`,
108
+ `${color.bold("路径:")} ${changePath}`,
109
+ `${color.bold("创建时间:")} ${state.created_at}`,
110
+ `${color.bold("更新时间:")} ${state.updated_at}`,
111
+ color.bold("制品状态:"),
112
+ ...ARTIFACTS.map((a) => ` ${a.padEnd(12)} ${artifacts[a] ? color.green("✓") : color.red("✗")}`),
74
113
  ];
75
114
  const nextStep = getNextStepDetail(state, artifacts);
76
115
  if (nextStep)
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ import { detectDeployedAgents } from "../../core/agents.js";
7
7
  import { runHealthCheck } from "../../core/health.js";
8
8
  import { getPackageRoot } from "../../utils/fs.js";
9
9
  import { promptConfirm } from "../../utils/prompt.js";
10
+ import { color } from "../../utils/format.js";
11
+ import { section, check, success, info } from "../../utils/output.js";
10
12
  const CLAUDE_MD_MARKER_START = "<!-- ALLOY-WORKFLOW:START -->";
11
13
  const CLAUDE_MD_MARKER_END = "<!-- ALLOY-WORKFLOW:END -->";
12
14
  function isDevMode() {
@@ -39,41 +41,42 @@ export async function updateCommand(projectPath) {
39
41
  // 1. 自动检测 scope
40
42
  const scope = detectScope(projectPath);
41
43
  if (!scope) {
42
- results.push("⚠️ Alloy 未初始化,请先运行 alloy init");
44
+ results.push(`${color.yellow("⚠️")} Alloy 未初始化,请先运行 alloy init`);
43
45
  return results;
44
46
  }
45
47
  // 2. 开发模式 vs 用户模式
46
48
  const dev = isDevMode();
47
49
  if (dev) {
48
- console.log(" 🔧 开发模式,从本地构建重新部署…");
50
+ info("🔧 开发模式,从本地构建重新部署…");
49
51
  }
50
52
  else {
51
53
  const pkg = JSON.parse(readFileSync(join(getPackageRoot(), "package.json"), "utf-8"));
52
54
  const currentVersion = pkg.version;
53
55
  const latest = await checkLatestVersion();
54
56
  if (latest && latest !== currentVersion) {
55
- console.log(`\n 发现新版本: v${latest}(当前 v${currentVersion})`);
57
+ section("版本检查");
58
+ info(`发现新版本: v${latest}(当前 v${currentVersion})`);
56
59
  // 兼容性检查
57
- console.log(" 🩺 兼容性检查…");
60
+ section("兼容性检查");
58
61
  const health = await runHealthCheck(getPackageRoot(), projectPath);
59
62
  const warnings = health.filter((h) => h.status !== "pass");
60
63
  if (warnings.length > 0) {
61
64
  for (const w of warnings) {
62
- console.log(` ⚠ ${w.name}: ${w.current}`);
65
+ check(w.name, w.current, "warn");
63
66
  }
64
67
  }
65
68
  else {
66
- console.log("兼容性检查通过");
69
+ success("兼容性检查通过");
67
70
  }
68
71
  // 询问确认
69
72
  const doUpdate = await promptConfirm("是否升级 alloy?", false);
70
73
  if (doUpdate) {
71
74
  try {
72
75
  execSync("npm update -g @flyin-ai/alloy", { stdio: "pipe" });
73
- results.push("✓ alloy CLI 已升级");
76
+ results.push(`${color.green("✓")} alloy CLI 已升级`);
74
77
  }
75
78
  catch {
76
- results.push("⚠️ CLI 升级失败");
79
+ results.push(`${color.yellow("⚠️")} CLI 升级失败`);
77
80
  }
78
81
  }
79
82
  else {
@@ -81,16 +84,16 @@ export async function updateCommand(projectPath) {
81
84
  }
82
85
  }
83
86
  else if (latest) {
84
- results.push(`✓ Alloy v${currentVersion} 已是最新`);
87
+ results.push(`${color.green("✓")} Alloy v${currentVersion} 已是最新`);
85
88
  }
86
89
  else {
87
- results.push(`⚠️ 无法检查更新(npm registry 不可达)`);
90
+ results.push(`${color.yellow("⚠️")} 无法检查更新(npm registry 不可达)`);
88
91
  }
89
92
  }
90
93
  // 3. 部署 commands
91
94
  const deployedAgents = detectDeployedAgents(scope, projectPath);
92
95
  if (deployedAgents.length === 0) {
93
- results.push("⚠️ 未检测到已部署的 Alloy commands,请先运行 alloy init");
96
+ results.push(`${color.yellow("⚠️")} 未检测到已部署的 Alloy commands,请先运行 alloy init`);
94
97
  return results;
95
98
  }
96
99
  const deployOpts = {
@@ -101,17 +104,17 @@ export async function updateCommand(projectPath) {
101
104
  };
102
105
  try {
103
106
  const paths = await deployCommands(deployOpts);
104
- results.push(`✓ commands/ → 部署 ${paths.length} 个文件到 ${deployedAgents.length} 个 agent`);
107
+ results.push(`${color.green("✓")} commands/ → 部署 ${paths.length} 个文件到 ${deployedAgents.length} 个 agent`);
105
108
  }
106
109
  catch {
107
- results.push("⚠️ command 部署失败");
110
+ results.push(`${color.yellow("⚠️")} command 部署失败`);
108
111
  }
109
112
  try {
110
113
  await deploySchema(deployOpts);
111
- results.push("✓ schema/ → 已部署");
114
+ results.push(`${color.green("✓")} schema/ → 已部署`);
112
115
  }
113
116
  catch {
114
- results.push(`⚠️ schema 部署失败`);
117
+ results.push(`${color.yellow("⚠️")} schema 部署失败`);
115
118
  }
116
119
  // 4. 更新 CLAUDE.md 标记区域
117
120
  const claudeMdPath = join(projectPath, "CLAUDE.md");
@@ -128,12 +131,12 @@ export async function updateCommand(projectPath) {
128
131
  latestFragment +
129
132
  content.slice(endIdx + CLAUDE_MD_MARKER_END.length);
130
133
  await writeFile(claudeMdPath, content, "utf-8");
131
- results.push("✓ CLAUDE.md → Alloy 标记区域已更新");
134
+ results.push(`${color.green("✓")} CLAUDE.md → Alloy 标记区域已更新`);
132
135
  }
133
136
  }
134
137
  }
135
138
  catch {
136
- results.push("⚠️ CLAUDE.md 更新失败");
139
+ results.push(`${color.yellow("⚠️")} CLAUDE.md 更新失败`);
137
140
  }
138
141
  }
139
142
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -4,18 +4,20 @@ import { existsSync, readFileSync } from "node:fs";
4
4
  import { readFile, writeFile } from "node:fs/promises";
5
5
  import { join, dirname } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
- import { statusCommand } from "./commands/status.js";
7
+ import { statusCommand, printStatusDetail } from "./commands/status.js";
8
8
  import { doctorCommand, formatDoctorResult } from "./commands/doctor.js";
9
9
  import { updateCommand } from "./commands/update.js";
10
10
  import { generateCompletion } from "./commands/completion.js";
11
11
  import { stateCommand } from "./commands/internal/state.js";
12
+ import { configCommand } from "./commands/internal/config.js";
12
13
  import { guardCommand } from "./commands/internal/guard.js";
13
14
  import { recordCommand } from "./commands/internal/record.js";
15
+ import { skillUsageCommand } from "./commands/internal/skill-usage.js";
14
16
  const USAGE = `
15
17
  alloy <command> [options]
16
18
 
17
19
  Commands:
18
- init [path] [--scope <project|global>] [--inject-claude-md]
20
+ init [path] [--scope <project|global>] [--inject-claude-md] [--agents <id,id,...>]
19
21
  项目初始化:检测环境 → 安装依赖 → 部署 schema + skill
20
22
  status [path|name] [--json]
21
23
  查看活跃 change 总览,指定 name 查看详情
@@ -27,8 +29,8 @@ Commands:
27
29
  生成 shell 补全脚本,--install 自动注册
28
30
 
29
31
  Options:
30
- --version, -v, -V 版本号
31
- --help, -h 帮助(alloy -h 或 alloy <command> -h)
32
+ --version, -v 版本号
33
+ --help, -h 帮助(alloy -h 或 alloy <command> -h)
32
34
  `;
33
35
  function commandHelp(cmd) {
34
36
  switch (cmd) {
@@ -39,6 +41,8 @@ alloy init [path] [options]
39
41
  选项:
40
42
  --scope <project|global> 安装范围,默认 project
41
43
  --inject-claude-md 注入 CLAUDE.md 工作流标记(默认关闭)
44
+ --agents <id,id,...> 非交互式模式,指定要安装的 AI 工具(逗号分隔)
45
+ 可用的 agent: claude-code, codebuddy, qoder, cursor, opencode, codex, tra
42
46
  --help, -h 显示本帮助
43
47
  `;
44
48
  case "status":
@@ -79,13 +83,18 @@ alloy completion [shell] [options]
79
83
  shell 目标 shell(bash / zsh / pwsh / powershell,默认从 $SHELL 检测)
80
84
 
81
85
  选项:
82
- --install 自动注册到 shell 配置文件(~/.zshrc / ~/.bashrc / PowerShell profile)
86
+ --install 自动注册到 shell 配置文件(永久生效)
83
87
  --help, -h 显示本帮助
84
88
 
89
+ 行为说明:
90
+ alloy completion <shell> 仅输出补全脚本(不安装)
91
+ alloy completion --install 自动安装到 rc 文件(永久生效,支持 bash/zsh/powershell)
92
+ source <(alloy completion) 临时启用(当前 session)
93
+
85
94
  示例:
86
- source <(alloy completion) # 当前 session 生效
87
- alloy completion --install # 自动注册并立即生效
88
- alloy completion pwsh | Out-File -FilePath $PROFILE -Append # PowerShell(需先确保目录存在,完成后 . $PROFILE)
95
+ alloy completion --install # 自动安装(推荐)
96
+ source <(alloy completion zsh) # 临时启用 zsh 补全
97
+ source <(alloy completion bash) # 临时启用 bash 补全
89
98
  `;
90
99
  default:
91
100
  return `未知命令: ${cmd}\n使用 alloy --help 查看可用命令。`;
@@ -104,11 +113,17 @@ async function installCompletion(shell) {
104
113
  completionLine = "source <(alloy completion bash)";
105
114
  }
106
115
  else if (shell.includes("pwsh") || shell.includes("powershell")) {
107
- console.log("PowerShell 用户请依次运行:");
108
- console.log(" New-Item -ItemType Directory -Force -Path (Split-Path $PROFILE)");
109
- console.log(" alloy completion pwsh | Out-File -FilePath $PROFILE -Append");
110
- console.log(" . $PROFILE # 重新加载 profile,或重启 PowerShell");
111
- return;
116
+ // PowerShell 补全需要写入 $PROFILE 文件
117
+ const profileDir = join(home, "Documents", "PowerShell");
118
+ rcFile = join(profileDir, "Microsoft.PowerShell_profile.ps1");
119
+ // PowerShell 直接写入补全脚本内容
120
+ completionLine = generateCompletion("pwsh");
121
+ // 确保目录存在
122
+ const { mkdirSync, existsSync } = await import("node:fs");
123
+ if (!existsSync(profileDir)) {
124
+ mkdirSync(profileDir, { recursive: true });
125
+ console.log(` ✓ 创建目录: ${profileDir}`);
126
+ }
112
127
  }
113
128
  if (!rcFile) {
114
129
  console.error("无法确定 shell 配置文件路径");
@@ -125,20 +140,24 @@ async function installCompletion(shell) {
125
140
  console.log(`✓ shell 补全已存在 → ${rcFile}`);
126
141
  return;
127
142
  }
128
- const block = [
129
- "",
130
- "# Alloy shell 补全 — Tab 自动补全 alloy 命令",
131
- completionLine,
132
- "",
133
- ].join("\n");
143
+ // PowerShell 直接写入补全脚本,bash/zsh 写入 source 命令
144
+ const isPowerShell = shell.includes("pwsh") || shell.includes("powershell");
145
+ const block = isPowerShell
146
+ ? completionLine // PowerShell: 直接写入补全脚本
147
+ : ["", "# Alloy shell 补全 — Tab 自动补全 alloy 命令", completionLine, ""].join("\n");
134
148
  await writeFile(rcFile, content.trimEnd() + block, "utf-8");
135
149
  console.log(`✓ shell 补全已注册 → ${rcFile}`);
136
- console.log(` 运行 'source ${rcFile}' 或重新打开终端使其生效`);
150
+ if (isPowerShell) {
151
+ console.log(` 运行 '. $PROFILE' 或重启 PowerShell 使其生效`);
152
+ }
153
+ else {
154
+ console.log(` 运行 'source ${rcFile}' 或重新打开终端使其生效`);
155
+ }
137
156
  }
138
157
  async function main() {
139
158
  const args = process.argv.slice(2);
140
159
  const isHelp = (a) => a.includes("--help") || a.includes("-h");
141
- const isVersion = (a) => a.includes("--version") || a.includes("-v") || a.includes("-V");
160
+ const isVersion = (a) => a.includes("--version") || a.includes("-v");
142
161
  if (args.length === 0 || (args.length === 1 && isHelp(args))) {
143
162
  console.log(USAGE);
144
163
  process.exit(0);
@@ -166,6 +185,7 @@ async function main() {
166
185
  options: {
167
186
  scope: { type: "string" },
168
187
  "inject-claude-md": { type: "boolean", default: false },
188
+ agents: { type: "string" },
169
189
  },
170
190
  strict: true,
171
191
  allowPositionals: true,
@@ -173,7 +193,22 @@ async function main() {
173
193
  const projectPath = positionals[0] ?? process.cwd();
174
194
  const { initCommand, selectScope, selectTargetAgents } = await import("./commands/init.js");
175
195
  const scope = await selectScope(values.scope);
176
- const targetAgents = await selectTargetAgents();
196
+ let targetAgents;
197
+ if (values.agents) {
198
+ // 非交互式模式:从 --agents 选项解析
199
+ const { KNOWN_AGENTS } = await import("../core/agents.js");
200
+ const agentIds = values.agents.split(",").map((s) => s.trim());
201
+ targetAgents = KNOWN_AGENTS.filter((a) => agentIds.includes(a.id));
202
+ if (targetAgents.length === 0) {
203
+ console.error(`未知的 agent: ${values.agents}`);
204
+ console.error(`可用的 agent: ${KNOWN_AGENTS.map((a) => a.id).join(", ")}`);
205
+ process.exit(1);
206
+ }
207
+ }
208
+ else {
209
+ // 交互式模式
210
+ targetAgents = await selectTargetAgents();
211
+ }
177
212
  await initCommand({
178
213
  scope,
179
214
  injectClaudeMd: values["inject-claude-md"] || false,
@@ -201,11 +236,15 @@ async function main() {
201
236
  projectPath = positionals[0] ?? process.cwd();
202
237
  changeName = positionals[1];
203
238
  }
204
- const result = await statusCommand(projectPath, changeName);
205
239
  if (useJson) {
240
+ const result = await statusCommand(projectPath, changeName);
206
241
  console.log(JSON.stringify({ output: result }, null, 2));
207
242
  }
243
+ else if (changeName) {
244
+ await printStatusDetail(projectPath, changeName);
245
+ }
208
246
  else {
247
+ const result = await statusCommand(projectPath);
209
248
  console.log(result);
210
249
  }
211
250
  break;
@@ -256,24 +295,27 @@ async function main() {
256
295
  // 无参数 → 显示友好使用说明
257
296
  console.log("生成 shell 补全脚本,获取 Tab 自动补全能力。\n");
258
297
  console.log("用法:");
259
- console.log(" source <(alloy completion zsh) # zsh 当前 session 生效");
260
- console.log(" source <(alloy completion bash) # bash 当前 session 生效");
261
- console.log(" alloy completion --install # 自动注册到 rc 文件,永久生效");
262
- console.log("");
263
- console.log(" # PowerShell(需先创建目录,再写入 profile,最后 . $PROFILE 或重启)");
264
- console.log(" New-Item -ItemType Directory -Force -Path (Split-Path $PROFILE)");
265
- console.log(" alloy completion pwsh | Out-File $PROFILE");
266
- console.log(" . $PROFILE");
298
+ console.log(" alloy completion --install # 自动安装(推荐,支持 bash/zsh/powershell)");
299
+ console.log(" source <(alloy completion zsh) # 临时启用 zsh 补全");
300
+ console.log(" source <(alloy completion bash) # 临时启用 bash 补全");
267
301
  break;
268
302
  }
269
303
  case "_state": {
270
304
  await stateCommand(restArgs);
271
305
  break;
272
306
  }
307
+ case "_config": {
308
+ await configCommand(restArgs);
309
+ break;
310
+ }
273
311
  case "_guard": {
274
312
  await guardCommand(restArgs);
275
313
  break;
276
314
  }
315
+ case "_skill": {
316
+ await skillUsageCommand(restArgs);
317
+ break;
318
+ }
277
319
  case "_record": {
278
320
  await recordCommand(restArgs);
279
321
  break;