@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
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
import cliTable from "cli-table3";
|
|
3
|
+
import boxen from "boxen";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
// ── 颜色 ──
|
|
6
|
+
export const color = pc;
|
|
7
|
+
// ── 字符宽度 ──
|
|
8
|
+
export { default as stringWidth } from "string-width";
|
|
9
|
+
// ── Box 面板 ──
|
|
10
|
+
export function box(text, opts) {
|
|
11
|
+
return boxen(text, { padding: 1, ...opts });
|
|
12
|
+
}
|
|
13
|
+
export function boxPanel(content, opts) {
|
|
14
|
+
const boxenOpts = {
|
|
15
|
+
padding: opts?.padding ?? 1,
|
|
16
|
+
margin: opts?.margin ?? 0,
|
|
17
|
+
width: opts?.width,
|
|
18
|
+
title: opts?.title,
|
|
19
|
+
titleAlignment: opts?.titleAlignment ?? "left",
|
|
20
|
+
};
|
|
21
|
+
return boxen(content, boxenOpts);
|
|
22
|
+
}
|
|
23
|
+
// ── 无边框表格 ──
|
|
24
|
+
export function table(headers, rows) {
|
|
25
|
+
const t = new cliTable({
|
|
26
|
+
head: headers,
|
|
27
|
+
style: { head: ["cyan"] },
|
|
28
|
+
chars: {
|
|
29
|
+
top: "",
|
|
30
|
+
"top-mid": "",
|
|
31
|
+
"top-left": "",
|
|
32
|
+
"top-right": "",
|
|
33
|
+
bottom: "",
|
|
34
|
+
"bottom-mid": "",
|
|
35
|
+
"bottom-left": "",
|
|
36
|
+
"bottom-right": "",
|
|
37
|
+
left: " ",
|
|
38
|
+
"left-mid": "",
|
|
39
|
+
mid: "",
|
|
40
|
+
"mid-mid": "",
|
|
41
|
+
right: "",
|
|
42
|
+
"right-mid": "",
|
|
43
|
+
middle: " ",
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
for (const r of rows) {
|
|
47
|
+
t.push(r);
|
|
48
|
+
}
|
|
49
|
+
return t.toString();
|
|
50
|
+
}
|
|
51
|
+
// ── 带边框表格 ──
|
|
52
|
+
export function borderedTable(headers, rows) {
|
|
53
|
+
const t = new cliTable({
|
|
54
|
+
head: headers,
|
|
55
|
+
style: { head: ["cyan"] },
|
|
56
|
+
});
|
|
57
|
+
for (const r of rows) {
|
|
58
|
+
t.push(r);
|
|
59
|
+
}
|
|
60
|
+
return t.toString();
|
|
61
|
+
}
|
|
62
|
+
export function tableWithBorder(headers, rows, opts) {
|
|
63
|
+
const t = new cliTable({
|
|
64
|
+
head: headers,
|
|
65
|
+
style: { head: [opts?.headerStyle ?? "cyan"] },
|
|
66
|
+
});
|
|
67
|
+
for (const r of rows) {
|
|
68
|
+
t.push(r);
|
|
69
|
+
}
|
|
70
|
+
return t.toString();
|
|
71
|
+
}
|
|
72
|
+
// ── Spinner ──
|
|
73
|
+
export function spinner(text) {
|
|
74
|
+
return ora({ text, isEnabled: process.stdout.isTTY ?? false }).start();
|
|
75
|
+
}
|
|
76
|
+
export function statusLine(label, value, status, opts) {
|
|
77
|
+
const icons = {
|
|
78
|
+
success: "✓",
|
|
79
|
+
warning: "⚠",
|
|
80
|
+
error: "✗",
|
|
81
|
+
};
|
|
82
|
+
const icon = opts?.icon ?? icons[status];
|
|
83
|
+
const coloredIcon = status === "success" ? pc.green(icon) : status === "warning" ? pc.yellow(icon) : pc.red(icon);
|
|
84
|
+
return ` ${coloredIcon} ${label} ${pc.cyan(value)}`;
|
|
85
|
+
}
|
|
86
|
+
// ── 进度条 ──
|
|
87
|
+
export function progressBar(value, total, width = 20) {
|
|
88
|
+
if (width <= 0)
|
|
89
|
+
return `${Math.round((Math.max(0, Math.min(value, total)) / (total || 1)) * 100)}%`;
|
|
90
|
+
if (total === 0)
|
|
91
|
+
return `${"░".repeat(width)} 0%`;
|
|
92
|
+
const clampedValue = Math.max(0, Math.min(value, total));
|
|
93
|
+
const percentage = Math.round((clampedValue / total) * 100);
|
|
94
|
+
const filled = Math.round((clampedValue / total) * width);
|
|
95
|
+
const empty = width - filled;
|
|
96
|
+
const bar = "█".repeat(filled) + "░".repeat(empty);
|
|
97
|
+
return `${bar} ${percentage}%`;
|
|
98
|
+
}
|
|
99
|
+
// ── 工具函数 ──
|
|
100
|
+
export { default as stripAnsi } from "strip-ansi";
|
|
101
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** 分区标题——粗体,前面空行 */
|
|
2
|
+
export declare function section(title: string): void;
|
|
3
|
+
/** 检查项——带状态图标 */
|
|
4
|
+
export declare function check(label: string, value: string, status: "pass" | "fail" | "warn"): void;
|
|
5
|
+
/** 成功消息 */
|
|
6
|
+
export declare function success(msg: string): void;
|
|
7
|
+
/** 错误消息(输出到 stderr) */
|
|
8
|
+
export declare function error(msg: string): void;
|
|
9
|
+
/** 警告消息 */
|
|
10
|
+
export declare function warn(msg: string): void;
|
|
11
|
+
/** 结束横幅 */
|
|
12
|
+
export declare function banner(msg: string): void;
|
|
13
|
+
/** 详情表——boxPanel 包裹的 borderedTable */
|
|
14
|
+
export declare function detailTable(headers: string[], rows: string[][]): void;
|
|
15
|
+
/** 信息行——缩进普通文本 */
|
|
16
|
+
export declare function info(msg: string): void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { color, boxPanel, borderedTable } from "./format.js";
|
|
2
|
+
/** 分区标题——粗体,前面空行 */
|
|
3
|
+
export function section(title) {
|
|
4
|
+
console.log(`\n ${color.bold(title)}`);
|
|
5
|
+
}
|
|
6
|
+
/** 检查项——带状态图标 */
|
|
7
|
+
export function check(label, value, status) {
|
|
8
|
+
const icon = status === "pass" ? color.green("✓") :
|
|
9
|
+
status === "fail" ? color.red("✗") :
|
|
10
|
+
color.yellow("⚠");
|
|
11
|
+
console.log(` ${icon} ${label} ${color.cyan(value)}`);
|
|
12
|
+
}
|
|
13
|
+
/** 成功消息 */
|
|
14
|
+
export function success(msg) {
|
|
15
|
+
console.log(` ${color.green("✓")} ${msg}`);
|
|
16
|
+
}
|
|
17
|
+
/** 错误消息(输出到 stderr) */
|
|
18
|
+
export function error(msg) {
|
|
19
|
+
console.error(` ${color.red("✗")} ${msg}`);
|
|
20
|
+
}
|
|
21
|
+
/** 警告消息 */
|
|
22
|
+
export function warn(msg) {
|
|
23
|
+
console.log(` ${color.yellow("⚠")} ${msg}`);
|
|
24
|
+
}
|
|
25
|
+
/** 结束横幅 */
|
|
26
|
+
export function banner(msg) {
|
|
27
|
+
console.log(`\n ${color.green(msg)}`);
|
|
28
|
+
}
|
|
29
|
+
/** 详情表——boxPanel 包裹的 borderedTable */
|
|
30
|
+
export function detailTable(headers, rows) {
|
|
31
|
+
const table = borderedTable(headers, rows);
|
|
32
|
+
console.log(boxPanel(table, { title: "" }));
|
|
33
|
+
}
|
|
34
|
+
/** 信息行——缩进普通文本 */
|
|
35
|
+
export function info(msg) {
|
|
36
|
+
console.log(` ${msg}`);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE7D,oBAAoB;AACpB,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,KAAa,EAAE,MAAgC;IAClF,MAAM,IAAI,GACR,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACpC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,WAAW;AACX,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,WAAW;AACX,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,WAAW;AACX,MAAM,UAAU,MAAM,CAAC,GAAW;IAChC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,WAAW,CAAC,OAAiB,EAAE,IAAgB;IAC7D,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/utils/prompt.d.ts
CHANGED
package/dist/utils/prompt.js
CHANGED
|
@@ -1,90 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
// 一次判断,启动时确定
|
|
3
|
-
export const supportsInquirer = (() => {
|
|
4
|
-
const [major] = process.versions.node.split(".").map(Number);
|
|
5
|
-
return major >= 20;
|
|
6
|
-
})();
|
|
7
|
-
// —— 底层 stdin helpers ——
|
|
8
|
-
function ask(question) {
|
|
9
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
10
|
-
return new Promise((resolve) => {
|
|
11
|
-
rl.question(question, (answer) => {
|
|
12
|
-
rl.close();
|
|
13
|
-
resolve(answer);
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
}
|
|
1
|
+
import { select, checkbox, confirm } from "@inquirer/prompts";
|
|
17
2
|
export async function promptSelect(message, choices) {
|
|
18
|
-
|
|
19
|
-
const { select } = await import("@inquirer/prompts");
|
|
20
|
-
return select({ message, choices });
|
|
21
|
-
}
|
|
22
|
-
// stdin fallback
|
|
23
|
-
console.log(message);
|
|
24
|
-
choices.forEach((c, i) => console.log(` [${i + 1}] ${c.name}`));
|
|
25
|
-
const answer = await ask(`输入数字 (1-${choices.length}): `);
|
|
26
|
-
const idx = parseInt(answer.trim(), 10) - 1;
|
|
27
|
-
if (idx >= 0 && idx < choices.length)
|
|
28
|
-
return choices[idx].value;
|
|
29
|
-
return choices[0].value;
|
|
3
|
+
return select({ message, choices });
|
|
30
4
|
}
|
|
31
5
|
export async function promptMultiSelect(message, choices, opts) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
? (vals) => rawValidate(vals.map((v) => v.value))
|
|
41
|
-
: undefined,
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
// stdin fallback: 编号多选
|
|
45
|
-
while (true) {
|
|
46
|
-
console.log(message);
|
|
47
|
-
choices.forEach((c, i) => console.log(` [${i + 1}] ${c.name}`));
|
|
48
|
-
const answer = await ask("输入编号,逗号分隔: ");
|
|
49
|
-
const trimmed = answer.trim();
|
|
50
|
-
if (!trimmed) {
|
|
51
|
-
if (opts?.validate) {
|
|
52
|
-
const err = opts.validate([]);
|
|
53
|
-
if (err !== true) {
|
|
54
|
-
console.log(` ⚠ ${err}`);
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return [];
|
|
59
|
-
}
|
|
60
|
-
const ids = [];
|
|
61
|
-
const parts = trimmed.split(/[,,\s]+/);
|
|
62
|
-
for (const p of parts) {
|
|
63
|
-
const idx = parseInt(p, 10) - 1;
|
|
64
|
-
if (idx >= 0 && idx < choices.length) {
|
|
65
|
-
ids.push(choices[idx].value);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if (opts?.validate) {
|
|
69
|
-
const err = opts.validate(ids);
|
|
70
|
-
if (err !== true) {
|
|
71
|
-
console.log(` ⚠ ${err}`);
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return ids;
|
|
76
|
-
}
|
|
6
|
+
const rawValidate = opts?.validate;
|
|
7
|
+
return checkbox({
|
|
8
|
+
message,
|
|
9
|
+
choices: choices.map((c) => ({ name: c.name, value: c.value })),
|
|
10
|
+
validate: rawValidate
|
|
11
|
+
? (vals) => rawValidate(vals.map((v) => v.value))
|
|
12
|
+
: undefined,
|
|
13
|
+
});
|
|
77
14
|
}
|
|
78
15
|
export async function promptConfirm(message, defaultValue) {
|
|
79
|
-
|
|
80
|
-
const { confirm } = await import("@inquirer/prompts");
|
|
81
|
-
return confirm({ message, default: defaultValue });
|
|
82
|
-
}
|
|
83
|
-
const suffix = defaultValue === true ? " [Y/n] " : defaultValue === false ? " [y/N] " : " [y/N] ";
|
|
84
|
-
const answer = await ask(message + suffix);
|
|
85
|
-
const trimmed = answer.trim().toLowerCase();
|
|
86
|
-
if (trimmed === "")
|
|
87
|
-
return defaultValue ?? false;
|
|
88
|
-
return trimmed === "y" || trimmed === "yes";
|
|
16
|
+
return confirm({ message, default: defaultValue });
|
|
89
17
|
}
|
|
90
18
|
//# sourceMappingURL=prompt.js.map
|
package/dist/utils/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAO9D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,OAAiB;IACnE,OAAO,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,OAAiB,EACjB,IAAsD;IAEtD,MAAM,WAAW,GAAG,IAAI,EAAE,QAAQ,CAAC;IACnC,OAAO,QAAQ,CAAC;QACd,OAAO;QACP,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,QAAQ,EAAE,WAAW;YACnB,CAAC,CAAC,CAAC,IAAgD,EAAE,EAAE,CACnD,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC,CAAC,SAAS;KACd,CAAsB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,YAAsB;IACzE,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -36,6 +36,7 @@ alloy _state read openspec/changes/<name> worktree
|
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
提取每个制品的 artifact / hash / approver / committed_at,构建审批链。
|
|
39
|
+
**retrospective 行特殊处理:** hash 列填 `—`(自指 hash 悖论:写入 hash 会导致文件变化、hash 失效),审批时间填"待确认"——等用户审查通过后再补。hash 仅记录在 `.alloy.yaml` 中。
|
|
39
40
|
|
|
40
41
|
**来源二:git log(全周期 commit 全景)**
|
|
41
42
|
```bash
|
|
@@ -89,42 +90,23 @@ git diff --stat <base>..HEAD | tail -1
|
|
|
89
90
|
|
|
90
91
|
#### §4 全周期技能审计
|
|
91
92
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
**apply 阶段:**
|
|
107
|
-
| 技能/命令 | 使用 |
|
|
108
|
-
|----------|:---:|
|
|
109
|
-
| `superpowers:using-git-worktrees` | |
|
|
110
|
-
| `superpowers:subagent-driven-development` | |
|
|
111
|
-
| `superpowers:executing-plans` | |
|
|
112
|
-
| `superpowers:test-driven-development` | |
|
|
113
|
-
| `superpowers:requesting-code-review` | |
|
|
114
|
-
| `superpowers:verification-before-completion` | |
|
|
115
|
-
| `/opsx:verify` | |
|
|
116
|
-
|
|
117
|
-
默认期望所有行都是 ✓。
|
|
118
|
-
|
|
119
|
-
**Deliberately Skipped Skills:** 对于每个标记 ✗ 的技能,必须回答三个问题:
|
|
93
|
+
从 `.alloy.yaml` 的 `skill_usage[]` 字段读取全周期技能使用记录(各阶段 `alloy _skill log` 写入):
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
alloy _state read openspec/changes/<name> skill_usage
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
按 `templates/retrospective.md` 的 §4 格式生成审计表:
|
|
100
|
+
|
|
101
|
+
- `used=true` → 填 `✓`,有 `count` 时追加 `(×N)`,有 `via` 时原因列填 `via <source>`
|
|
102
|
+
- `used=false` → 填 `✗`,原因列填 `reason` 字段的值
|
|
103
|
+
- 不在 `skill_usage[]` 中(旧 change 无记录)→ 填 `—`
|
|
104
|
+
- `skill_usage[]` 为空数组 → 所有行填 `—`,在表前加一行提示:"> ⚠️ 当前 change 无 skill_usage 记录(旧 change),以下数据不可用。"
|
|
105
|
+
|
|
106
|
+
**Deliberately Skipped Skills:** 对于每个 `used=false` 的条目,展开三问:
|
|
120
107
|
1. **What was skipped** — 具体跳过了哪个技能或子步骤
|
|
121
|
-
2. **Why this cycle** —
|
|
122
|
-
3. **How to prevent recurrence** —
|
|
123
|
-
- schema graph fix(schema 图修正)
|
|
124
|
-
- skill description tightening(技能描述收紧)
|
|
125
|
-
- CLAUDE.md trigger(CLAUDE.md 触发规则)
|
|
126
|
-
- scope-judgment rule(范围判断规则)
|
|
127
|
-
- one-off(一次性,需说明为什么是边界情况)
|
|
108
|
+
2. **Why this cycle** — 具体触发原因(优先用 `reason` 字段的值)
|
|
109
|
+
3. **How to prevent recurrence** — schema graph fix / skill description tightening / CLAUDE.md trigger / scope-judgment rule / one-off
|
|
128
110
|
|
|
129
111
|
如果多个 cycle 因相似原因跳过同一技能,该模式应成为 §6 的 Promote candidate。
|
|
130
112
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
> 生成时间: <timestamp>
|
|
2
|
+
|
|
1
3
|
# Retrospective
|
|
2
4
|
|
|
3
5
|
> 生成前 PRECHECK:
|
|
@@ -19,7 +21,7 @@
|
|
|
19
21
|
| tasks | | | |
|
|
20
22
|
| plans | | | |
|
|
21
23
|
| verify | | | |
|
|
22
|
-
| retrospective | | | |
|
|
24
|
+
| retrospective | | — | 待确认 |
|
|
23
25
|
|
|
24
26
|
### Commit 汇总(按 type)
|
|
25
27
|
<!-- git log <base>..HEAD --oneline,按 Conventional Commits type 分组 -->
|
|
@@ -106,37 +108,55 @@
|
|
|
106
108
|
|
|
107
109
|
## §4 全周期技能审计
|
|
108
110
|
|
|
111
|
+
数据来源:`.alloy.yaml` 的 `skill_usage[]` 字段。`skill_usage[]` 为空(旧 change 无记录)→ 对应行填 `—`。
|
|
112
|
+
|
|
109
113
|
### start 阶段
|
|
110
114
|
|
|
111
|
-
| 技能/命令 | 使用 |
|
|
112
|
-
|
|
113
|
-
| `opsx:explore` | |
|
|
114
|
-
| `superpowers:brainstorming` | |
|
|
115
|
+
| 技能/命令 | 使用 | 原因 |
|
|
116
|
+
|----------|:---:|------|
|
|
117
|
+
| `opsx:explore` | | |
|
|
118
|
+
| `superpowers:brainstorming` | | |
|
|
119
|
+
| `/opsx:new` | | |
|
|
115
120
|
|
|
116
121
|
### plan 阶段
|
|
117
122
|
|
|
118
|
-
| 技能/命令 | 使用 |
|
|
119
|
-
|
|
120
|
-
| `/opsx:continue` | |
|
|
121
|
-
| `superpowers:writing-plans` | |
|
|
123
|
+
| 技能/命令 | 使用 | 原因 |
|
|
124
|
+
|----------|:---:|------|
|
|
125
|
+
| `/opsx:continue` | | |
|
|
126
|
+
| `superpowers:writing-plans` | | |
|
|
122
127
|
|
|
123
128
|
### apply 阶段
|
|
124
129
|
|
|
125
|
-
| 技能/命令 | 使用 |
|
|
126
|
-
|
|
127
|
-
| `superpowers:using-git-worktrees` | |
|
|
128
|
-
| `superpowers:subagent-driven-development` | |
|
|
129
|
-
| `
|
|
130
|
-
| `
|
|
131
|
-
| `
|
|
132
|
-
| `superpowers:
|
|
133
|
-
|
|
|
130
|
+
| 技能/命令 | 使用 | 原因 |
|
|
131
|
+
|----------|:---:|------|
|
|
132
|
+
| `superpowers:using-git-worktrees` | | |
|
|
133
|
+
| `superpowers:subagent-driven-development` | | |
|
|
134
|
+
| `test-driven-development` | | |
|
|
135
|
+
| `spec-compliance-review` | | |
|
|
136
|
+
| `code-quality-review` | | |
|
|
137
|
+
| `superpowers:test-driven-development` | | |
|
|
138
|
+
| `superpowers:executing-plans` | | |
|
|
139
|
+
| `superpowers:requesting-code-review` | | |
|
|
140
|
+
| `superpowers:verification-before-completion` | | |
|
|
141
|
+
| `/opsx:verify` | | |
|
|
142
|
+
|
|
143
|
+
### archive 阶段
|
|
144
|
+
|
|
145
|
+
| 技能/命令 | 使用 | 原因 |
|
|
146
|
+
|----------|:---:|------|
|
|
147
|
+
| `/opsx:archive` | | |
|
|
148
|
+
|
|
149
|
+
### finish 阶段
|
|
150
|
+
|
|
151
|
+
| 技能/命令 | 使用 | 原因 |
|
|
152
|
+
|----------|:---:|------|
|
|
153
|
+
| `superpowers:finishing-a-development-branch` | | |
|
|
134
154
|
|
|
135
155
|
### Deliberately Skipped Skills
|
|
136
156
|
|
|
137
157
|
<!-- 对于每个标记 ✗ 的技能,填写以下三项:
|
|
138
158
|
1. **What was skipped** — 具体跳过了哪个技能或子步骤
|
|
139
|
-
2. **Why this cycle** —
|
|
159
|
+
2. **Why this cycle** — 具体触发原因
|
|
140
160
|
3. **How to prevent recurrence** — schema graph fix / skill description tightening / CLAUDE.md trigger / scope-judgment rule / one-off
|
|
141
161
|
-->
|
|
142
162
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flyin-ai/alloy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-beta.0",
|
|
4
4
|
"description": "Alloy - OpenSpec + Superpowers 编排层 CLI 工具",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli/index.js",
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
"dist/",
|
|
16
16
|
"compat.yaml",
|
|
17
17
|
"commands/",
|
|
18
|
-
"openspec/schemas/alloy/"
|
|
18
|
+
"openspec/schemas/alloy/",
|
|
19
|
+
"vendor/"
|
|
19
20
|
],
|
|
20
21
|
"scripts": {
|
|
21
22
|
"build": "tsc",
|
|
@@ -25,8 +26,14 @@
|
|
|
25
26
|
"test:watch": "vitest"
|
|
26
27
|
},
|
|
27
28
|
"dependencies": {
|
|
28
|
-
"@inquirer/prompts": "^
|
|
29
|
+
"@inquirer/prompts": "^7.10.1",
|
|
30
|
+
"boxen": "^7.1.1",
|
|
31
|
+
"cli-table3": "^0.6.5",
|
|
32
|
+
"ora": "^7.0.1",
|
|
33
|
+
"picocolors": "^1.1.1",
|
|
29
34
|
"semver": "^7.7.0",
|
|
35
|
+
"string-width": "^6.1.0",
|
|
36
|
+
"strip-ansi": "^7.2.0",
|
|
30
37
|
"yaml": "^2.7.0"
|
|
31
38
|
},
|
|
32
39
|
"devDependencies": {
|