@flyin-ai/alloy 0.1.0 → 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 +60 -13
- 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 +10 -3
- package/vendor/superpowers/skills/brainstorming/SKILL.md +164 -0
- package/vendor/superpowers/skills/brainstorming/scripts/frame-template.html +214 -0
- package/vendor/superpowers/skills/brainstorming/scripts/helper.js +88 -0
- package/vendor/superpowers/skills/brainstorming/scripts/server.cjs +354 -0
- package/vendor/superpowers/skills/brainstorming/scripts/start-server.sh +148 -0
- package/vendor/superpowers/skills/brainstorming/scripts/stop-server.sh +56 -0
- package/vendor/superpowers/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/vendor/superpowers/skills/brainstorming/visual-companion.md +287 -0
- package/vendor/superpowers/skills/dispatching-parallel-agents/SKILL.md +182 -0
- package/vendor/superpowers/skills/executing-plans/SKILL.md +70 -0
- package/vendor/superpowers/skills/finishing-a-development-branch/SKILL.md +251 -0
- package/vendor/superpowers/skills/receiving-code-review/SKILL.md +213 -0
- package/vendor/superpowers/skills/requesting-code-review/SKILL.md +103 -0
- package/vendor/superpowers/skills/requesting-code-review/code-reviewer.md +168 -0
- package/vendor/superpowers/skills/subagent-driven-development/SKILL.md +279 -0
- package/vendor/superpowers/skills/subagent-driven-development/code-quality-reviewer-prompt.md +25 -0
- package/vendor/superpowers/skills/subagent-driven-development/implementer-prompt.md +113 -0
- package/vendor/superpowers/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/vendor/superpowers/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/vendor/superpowers/skills/systematic-debugging/SKILL.md +296 -0
- package/vendor/superpowers/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/vendor/superpowers/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/vendor/superpowers/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/vendor/superpowers/skills/systematic-debugging/find-polluter.sh +63 -0
- package/vendor/superpowers/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/vendor/superpowers/skills/systematic-debugging/test-academic.md +14 -0
- package/vendor/superpowers/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/vendor/superpowers/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/vendor/superpowers/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/vendor/superpowers/skills/test-driven-development/SKILL.md +371 -0
- package/vendor/superpowers/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/vendor/superpowers/skills/using-git-worktrees/SKILL.md +215 -0
- package/vendor/superpowers/skills/using-superpowers/SKILL.md +117 -0
- package/vendor/superpowers/skills/using-superpowers/references/codex-tools.md +59 -0
- package/vendor/superpowers/skills/using-superpowers/references/copilot-tools.md +42 -0
- package/vendor/superpowers/skills/using-superpowers/references/gemini-tools.md +51 -0
- package/vendor/superpowers/skills/verification-before-completion/SKILL.md +139 -0
- package/vendor/superpowers/skills/writing-plans/SKILL.md +152 -0
- package/vendor/superpowers/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/vendor/superpowers/skills/writing-skills/SKILL.md +655 -0
- package/vendor/superpowers/skills/writing-skills/anthropic-best-practices.md +1150 -0
- package/vendor/superpowers/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/vendor/superpowers/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/vendor/superpowers/skills/writing-skills/persuasion-principles.md +187 -0
- package/vendor/superpowers/skills/writing-skills/render-graphs.js +168 -0
- package/vendor/superpowers/skills/writing-skills/testing-skills-with-subagents.md +384 -0
|
@@ -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>;
|