@flyin-ai/alloy 0.1.1 → 0.2.0-beta.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.
- package/README.md +28 -90
- package/commands/alloy/apply.md +274 -119
- package/commands/alloy/archive.md +116 -60
- package/commands/alloy/discard.md +57 -15
- package/commands/alloy/finish.md +92 -70
- package/commands/alloy/fix.md +282 -53
- package/commands/alloy/plan.md +125 -63
- package/commands/alloy/references/interaction-style.md +82 -0
- package/commands/alloy/references/main-branch-detection.md +32 -0
- package/commands/alloy/references/phase-routing.md +21 -0
- package/commands/alloy/references/skill-precheck.md +46 -0
- package/commands/alloy/start.md +167 -64
- package/commands/alloy/status.md +1 -1
- package/dist/cli/commands/doctor.d.ts +1 -0
- package/dist/cli/commands/doctor.js +28 -6
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/init.js +40 -37
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/internal/config.d.ts +1 -0
- package/dist/cli/commands/internal/config.js +45 -0
- package/dist/cli/commands/internal/config.js.map +1 -0
- package/dist/cli/commands/internal/guard.js +2 -41
- package/dist/cli/commands/internal/guard.js.map +1 -1
- package/dist/cli/commands/internal/record.js +10 -47
- package/dist/cli/commands/internal/record.js.map +1 -1
- package/dist/cli/commands/internal/skill-usage.d.ts +1 -0
- package/dist/cli/commands/internal/skill-usage.js +78 -0
- package/dist/cli/commands/internal/skill-usage.js.map +1 -0
- package/dist/cli/commands/internal/state.js +105 -6
- package/dist/cli/commands/internal/state.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +50 -11
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/update.js +20 -17
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +73 -31
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/hash.d.ts +3 -0
- package/dist/cli/utils/hash.js +42 -0
- package/dist/cli/utils/hash.js.map +1 -0
- package/dist/cli/utils/state.d.ts +4 -2
- package/dist/cli/utils/state.js +34 -2
- package/dist/cli/utils/state.js.map +1 -1
- package/dist/core/artifacts.d.ts +3 -0
- package/dist/core/artifacts.js +45 -0
- package/dist/core/artifacts.js.map +1 -0
- package/dist/core/detect-installations.d.ts +19 -0
- package/dist/core/detect-installations.js +65 -0
- package/dist/core/detect-installations.js.map +1 -0
- package/dist/core/openspec.d.ts +2 -1
- package/dist/core/openspec.js +30 -12
- package/dist/core/openspec.js.map +1 -1
- package/dist/core/skills.js +16 -0
- package/dist/core/skills.js.map +1 -1
- package/dist/core/superpowers.d.ts +8 -1
- package/dist/core/superpowers.js +41 -20
- package/dist/core/superpowers.js.map +1 -1
- package/dist/core/types.d.ts +20 -0
- package/dist/utils/format.d.ts +31 -0
- package/dist/utils/format.js +101 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/output.d.ts +16 -0
- package/dist/utils/output.js +38 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/prompt.d.ts +0 -1
- package/dist/utils/prompt.js +11 -83
- package/dist/utils/prompt.js.map +1 -1
- package/openspec/schemas/alloy/instructions/retrospective.md +17 -35
- package/openspec/schemas/alloy/templates/design.md +2 -0
- package/openspec/schemas/alloy/templates/draft.md +2 -0
- package/openspec/schemas/alloy/templates/plans.md +2 -0
- package/openspec/schemas/alloy/templates/proposal.md +2 -0
- package/openspec/schemas/alloy/templates/retrospective.md +39 -19
- package/openspec/schemas/alloy/templates/specs.md +2 -0
- package/openspec/schemas/alloy/templates/tasks.md +2 -0
- package/package.json +8 -2
|
@@ -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
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAc,MAAM,mBAAmB,CAAC;
|
|
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
|
-
|
|
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
|
-
|
|
57
|
+
section("版本检查");
|
|
58
|
+
info(`发现新版本: v${latest}(当前 v${currentVersion})`);
|
|
56
59
|
// 兼容性检查
|
|
57
|
-
|
|
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
|
-
|
|
65
|
+
check(w.name, w.current, "warn");
|
|
63
66
|
}
|
|
64
67
|
}
|
|
65
68
|
else {
|
|
66
|
-
|
|
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(
|
|
87
|
+
results.push(`${color.green("✓")} Alloy v${currentVersion} 已是最新`);
|
|
85
88
|
}
|
|
86
89
|
else {
|
|
87
|
-
results.push(
|
|
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(
|
|
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(
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
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
|
|
31
|
-
--help, -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
|
|
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
|
-
|
|
87
|
-
alloy completion
|
|
88
|
-
alloy completion
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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")
|
|
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
|
-
|
|
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("
|
|
260
|
-
console.log(" source <(alloy completion
|
|
261
|
-
console.log(" alloy completion
|
|
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;
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile, stat, readdir } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
export const ARTIFACT_FILES = {
|
|
5
|
+
draft: "draft.md",
|
|
6
|
+
proposal: "proposal.md",
|
|
7
|
+
design: "design.md",
|
|
8
|
+
specs: "specs",
|
|
9
|
+
tasks: "tasks.md",
|
|
10
|
+
plans: "plans.md",
|
|
11
|
+
verify: "verify.md",
|
|
12
|
+
retrospective: "retrospective.md",
|
|
13
|
+
};
|
|
14
|
+
export function computeHash(content) {
|
|
15
|
+
return createHash("sha256").update(content).digest("hex").substring(0, 12);
|
|
16
|
+
}
|
|
17
|
+
export async function computeArtifactHash(changeDir, artifactId) {
|
|
18
|
+
const fileName = ARTIFACT_FILES[artifactId];
|
|
19
|
+
if (!fileName)
|
|
20
|
+
return null;
|
|
21
|
+
const fullPath = join(changeDir, fileName);
|
|
22
|
+
try {
|
|
23
|
+
const st = await stat(fullPath);
|
|
24
|
+
if (st.isDirectory()) {
|
|
25
|
+
const entries = await readdir(fullPath, { withFileTypes: true });
|
|
26
|
+
const files = entries.filter(e => e.isFile()).map(e => e.name).sort();
|
|
27
|
+
const contents = [];
|
|
28
|
+
for (const f of files) {
|
|
29
|
+
contents.push(await readFile(join(fullPath, f)));
|
|
30
|
+
}
|
|
31
|
+
return computeHash(Buffer.concat(contents));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const content = await readFile(fullPath);
|
|
35
|
+
return computeHash(content);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/cli/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,aAAa;IACvB,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,WAAW;IACnB,aAAa,EAAE,kBAAkB;CAClC,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,OAAwB;IAClD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,UAAkB;IAElB,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACtE,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import type { AlloyState } from "../../core/types.js";
|
|
2
|
-
export type { AlloyState };
|
|
1
|
+
import type { AlloyState, ProjectConfig } from "../../core/types.js";
|
|
2
|
+
export type { AlloyState, ProjectConfig };
|
|
3
3
|
export declare function createInitialState(): AlloyState;
|
|
4
4
|
export declare function readState(changePath: string): Promise<AlloyState>;
|
|
5
5
|
export declare function writeState(changePath: string, state: AlloyState): Promise<void>;
|
|
6
6
|
export declare function findActiveChanges(changesDir: string): Promise<Map<string, AlloyState>>;
|
|
7
|
+
export declare function readProjectConfig(projectRoot: string): Promise<ProjectConfig>;
|
|
8
|
+
export declare function writeProjectConfig(projectRoot: string, config: ProjectConfig): Promise<void>;
|