@betterdanlins/ai-memory 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +26 -0
  2. package/bin/cli.js +80 -0
  3. package/package.json +29 -0
  4. package/src/manifest.js +37 -0
  5. package/src/render.js +6 -0
  6. package/src/scaffold.js +33 -0
  7. package/templates/claude/.claude/agents/critic.md +8 -0
  8. package/templates/claude/.claude/commands/critic.md +6 -0
  9. package/templates/claude/.claude/commands/finalize-requirement.md +7 -0
  10. package/templates/claude/.claude/commands/new-requirement.md +6 -0
  11. package/templates/claude/.claude/commands/update-memory.md +8 -0
  12. package/templates/claude/.claude/settings.json +24 -0
  13. package/templates/claude/.claude/skills/critic/SKILL.md +6 -0
  14. package/templates/claude/.claude/skills/memory-update/SKILL.md +6 -0
  15. package/templates/claude/.claude/skills/requirements-flow/SKILL.md +6 -0
  16. package/templates/claude/CLAUDE.md +19 -0
  17. package/templates/codex/.agents/skills/critic/SKILL.md +6 -0
  18. package/templates/codex/.agents/skills/memory-update/SKILL.md +6 -0
  19. package/templates/codex/.agents/skills/requirements-flow/SKILL.md +7 -0
  20. package/templates/codex/AGENTS.md +19 -0
  21. package/templates/common/.ai/README.md +20 -0
  22. package/templates/common/.ai/memory/MEMORY.md +9 -0
  23. package/templates/common/.ai/memory/features/.gitkeep +0 -0
  24. package/templates/common/.ai/memory/feedback.md +6 -0
  25. package/templates/common/.ai/memory/project-state.md +23 -0
  26. package/templates/common/.ai/memory/session-log.md +15 -0
  27. package/templates/common/.ai/memory/user-profile.md +13 -0
  28. package/templates/common/.ai/skills/architecture.md +22 -0
  29. package/templates/common/.ai/skills/code-review.md +9 -0
  30. package/templates/common/.ai/skills/critic.md +21 -0
  31. package/templates/common/.ai/skills/memory-update.md +24 -0
  32. package/templates/common/.ai/skills/requirements-flow.md +23 -0
  33. package/templates/common/docs/requirements/README.md +6 -0
  34. package/templates/common/docs/requirements/v1.0.0/draft/.gitkeep +0 -0
  35. package/templates/common/docs/requirements/v1.0.0/final/.gitkeep +0 -0
package/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # @betterdanlins/ai-memory
2
+
3
+ AI 记忆 + 需求工作流脚手架:一条命令在项目里生成跨 Claude Code / Codex 的
4
+ 记忆层(.ai/memory)、方法论层(.ai/skills)、需求版本目录(docs/requirements)
5
+ 与两侧薄适配层。
6
+
7
+ ## 用法
8
+
9
+ ```bash
10
+ npx @betterdanlins/ai-memory init
11
+ # 非交互:
12
+ npx @betterdanlins/ai-memory init --name demo --stack "PHP + Vue" --tools claude,codex --yes
13
+ # 从已有项目导入用户级记忆:
14
+ npx @betterdanlins/ai-memory init --import /path/to/other-project
15
+ ```
16
+
17
+ `--import` 从已有项目导入 user-profile/feedback;目标文件已存在时按冲突策略处理(--yes 下跳过,交互下询问),绝不静默覆盖。
18
+
19
+ ## 设计
20
+
21
+ - 单一源:所有正文只在 `.ai/`,`.claude/`、`.agents/` 只是触发包装
22
+ - 节点式记忆:完成任务节点立即写 session-log,跨工具切换不断档
23
+ - 需求双目录:人工粗稿 `draft/` → AI 定稿 `final/`(强制 critic 门)
24
+ - 幂等:已存在的文件逐个询问,绝不静默覆盖(`--yes` 一律跳过)
25
+
26
+ 设计文档:`docs/superpowers/specs/2026-07-05-ai-memory-framework-design.md`
package/bin/cli.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { scaffold } from '../src/scaffold.js';
6
+
7
+ const TEMPLATES = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'templates');
8
+ const program = new Command();
9
+
10
+ program.name('ai-memory').description('AI memory + requirements workflow scaffolder');
11
+
12
+ program
13
+ .command('init')
14
+ .description('在当前目录生成 ai-memory 框架')
15
+ .option('--name <name>', '项目名')
16
+ .option('--stack <desc>', '技术栈描述')
17
+ .option('--tools <list>', '启用工具,逗号分隔:claude,codex')
18
+ .option('--import <path>', '从已有项目导入 user-profile/feedback')
19
+ .option('--yes', '非交互模式:缺参用默认值,冲突一律跳过')
20
+ .action(async (opts) => {
21
+ const targetDir = process.cwd();
22
+ let { name, stack, tools: toolsRaw } = opts;
23
+
24
+ // Validate CLI-supplied --tools before entering interactive prompts
25
+ if (toolsRaw !== undefined) {
26
+ for (const t of toolsRaw.split(',').map(s => s.trim()).filter(Boolean)) {
27
+ if (t !== 'claude' && t !== 'codex') {
28
+ console.error(`tools 仅支持 claude、codex,收到: ${t}`);
29
+ process.exit(1);
30
+ }
31
+ }
32
+ }
33
+
34
+ let importFrom = opts.import;
35
+ if (!opts.yes) {
36
+ const { input, checkbox } = await import('@inquirer/prompts');
37
+ name ??= await input({ message: '项目名:', default: path.basename(targetDir) });
38
+ stack ??= await input({ message: '技术栈描述:', default: '(待补充)' });
39
+ toolsRaw ??= (await checkbox({
40
+ message: '启用哪些工具适配:',
41
+ choices: [
42
+ { name: 'Claude Code', value: 'claude', checked: true },
43
+ { name: 'Codex', value: 'codex', checked: true },
44
+ ],
45
+ })).join(',');
46
+ importFrom ??= (await input({
47
+ message: '从已有项目导入 user-profile/feedback?(输入项目路径,留空跳过)', default: '',
48
+ })) || undefined;
49
+ }
50
+ name ??= path.basename(targetDir);
51
+ stack ??= '(待补充)';
52
+ toolsRaw ??= 'claude,codex';
53
+
54
+ const tools = toolsRaw.split(',').map(s => s.trim()).filter(Boolean);
55
+ if (tools.length === 0) {
56
+ console.log('未启用任何工具适配,仅生成 .ai/ 通用层');
57
+ }
58
+
59
+ const onConflict = opts.yes
60
+ ? () => 'skip'
61
+ : async (dest) => {
62
+ const { confirm } = await import('@inquirer/prompts');
63
+ return (await confirm({ message: `${dest} 已存在,覆盖?`, default: false })) ? 'overwrite' : 'skip';
64
+ };
65
+
66
+ const vars = { projectName: name, techStack: stack, date: new Date().toISOString().slice(0, 10) };
67
+ const r = await scaffold({ templatesRoot: TEMPLATES, targetDir, vars, tools, onConflict, importFrom });
68
+ console.log(`完成:写入 ${r.written.length},跳过 ${r.skipped.length}`);
69
+ if (r.skipped.length) for (const d of r.skipped) console.log(` 跳过 ${d}`);
70
+ console.log('下一步:打开项目让 agent 读 .ai/memory/MEMORY.md;把项目命令补进 CLAUDE.md/AGENTS.md。');
71
+ });
72
+
73
+ program.parseAsync().catch((e) => {
74
+ if (e.name === 'ExitPromptError') {
75
+ console.log('已取消');
76
+ } else {
77
+ console.error('错误: ' + e.message);
78
+ }
79
+ process.exit(1);
80
+ });
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@betterdanlins/ai-memory",
3
+ "version": "0.1.0",
4
+ "description": "AI memory + requirements workflow scaffolder for Claude Code & Codex",
5
+ "type": "module",
6
+ "bin": {
7
+ "ai-memory": "bin/cli.js"
8
+ },
9
+ "files": [
10
+ "bin",
11
+ "src",
12
+ "templates"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20.17.0"
16
+ },
17
+ "scripts": {
18
+ "test": "node --test test/*.test.js"
19
+ },
20
+ "license": "MIT",
21
+ "author": "Betterdan",
22
+ "keywords": ["ai", "memory", "claude-code", "codex", "scaffold", "cli"],
23
+ "repository": {"type": "git", "url": "git+https://github.com/Betterdan/ai-memory.git"},
24
+ "publishConfig": {"access": "public"},
25
+ "dependencies": {
26
+ "@inquirer/prompts": "^8.5.2",
27
+ "commander": "^13.1.0"
28
+ }
29
+ }
@@ -0,0 +1,37 @@
1
+ import { readdir } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+
4
+ const GROUPS = {
5
+ common: () => true,
6
+ claude: (tools) => tools.includes('claude'),
7
+ codex: (tools) => tools.includes('codex'),
8
+ };
9
+
10
+ export async function buildManifest(templatesRoot, tools) {
11
+ const entries = [];
12
+ for (const [group, enabled] of Object.entries(GROUPS)) {
13
+ if (!enabled(tools)) continue;
14
+ const groupDir = path.join(templatesRoot, group);
15
+ for (const rel of await walk(groupDir, '')) {
16
+ entries.push({ src: path.join(groupDir, ...rel.split('/')), dest: rel });
17
+ }
18
+ }
19
+ return entries.sort((a, b) => a.dest < b.dest ? -1 : a.dest > b.dest ? 1 : 0);
20
+ }
21
+
22
+ async function walk(dir, prefix) {
23
+ let dirents;
24
+ try {
25
+ dirents = await readdir(dir, { withFileTypes: true });
26
+ } catch (err) {
27
+ if (err.code === 'ENOENT') return [];
28
+ throw err;
29
+ }
30
+ const out = [];
31
+ for (const d of dirents) {
32
+ const rel = prefix ? `${prefix}/${d.name}` : d.name;
33
+ if (d.isDirectory()) out.push(...(await walk(path.join(dir, d.name), rel)));
34
+ else out.push(rel);
35
+ }
36
+ return out;
37
+ }
package/src/render.js ADDED
@@ -0,0 +1,6 @@
1
+ export function render(content, vars) {
2
+ return content.replace(/\{\{(\w+)\}\}/g, (_, key) => {
3
+ if (!(key in vars)) throw new Error(`未定义的模板变量: ${key}`);
4
+ return vars[key];
5
+ });
6
+ }
@@ -0,0 +1,33 @@
1
+ import { mkdir, readFile, writeFile, access } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { buildManifest } from './manifest.js';
4
+ import { render } from './render.js';
5
+
6
+ const IMPORT_DESTS = new Set(['.ai/memory/user-profile.md', '.ai/memory/feedback.md']);
7
+
8
+ export async function scaffold({ templatesRoot, targetDir, vars, tools, onConflict, importFrom }) {
9
+ const manifest = await buildManifest(templatesRoot, tools);
10
+ const summary = { written: [], skipped: [] };
11
+ for (const { src, dest } of manifest) {
12
+ const destPath = path.join(targetDir, ...dest.split('/'));
13
+ if (await exists(destPath)) {
14
+ if ((await onConflict(dest)) !== 'overwrite') { summary.skipped.push(dest); continue; }
15
+ }
16
+ let content;
17
+ if (importFrom && IMPORT_DESTS.has(dest)) {
18
+ const importSrc = path.join(importFrom, '.ai', 'memory', path.basename(dest));
19
+ if (await exists(importSrc)) {
20
+ content = await readFile(importSrc, 'utf8');
21
+ }
22
+ }
23
+ if (content === undefined) {
24
+ content = render(await readFile(src, 'utf8'), vars);
25
+ }
26
+ await mkdir(path.dirname(destPath), { recursive: true });
27
+ await writeFile(destPath, content);
28
+ summary.written.push(dest);
29
+ }
30
+ return summary;
31
+ }
32
+
33
+ const exists = (p) => access(p).then(() => true, () => false);
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: critic
3
+ description: 对需求定稿/架构设计/实现方案做对抗性检查。传入文档路径,不要传对话历史。
4
+ tools: Read, Grep, Glob
5
+ ---
6
+
7
+ 你是对抗性审查者。读取指定文档与 `.ai/skills/critic.md`,按四类清单(假设攻击/契约漏洞/过度设计/遗漏场景)攻击该文档。
8
+ 只输出质疑列表:每条 `[high|medium|low] 质疑 + 触发条件`。不提供修复方案,不表扬,不复述文档。
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: 对指定文档做对抗性检查
3
+ argument-hint: <文档路径>
4
+ ---
5
+
6
+ 派发 critic subagent 检查 $ARGUMENTS:只给文档路径与 `.ai/skills/critic.md`,不携带对话历史。返回后逐条回应「接受并修改」或「有理由反驳」,不允许沉默跳过。
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: 将 draft 需求定稿为 final(含强制 critic 门)
3
+ argument-hint: <需求名>
4
+ ---
5
+
6
+ 按 `.ai/skills/requirements-flow.md` 的「定稿」章节执行,需求名:$ARGUMENTS。
7
+ critic 门必须由 critic subagent 独立上下文执行,逐条回应后才写 final/。
@@ -0,0 +1,6 @@
1
+ ---
2
+ description: 新建需求 draft 骨架并在 project-state 登记
3
+ argument-hint: <需求名> [版本,默认当前迭代]
4
+ ---
5
+
6
+ 按 `.ai/skills/requirements-flow.md` 的「新建」章节执行。需求名与版本:$ARGUMENTS
@@ -0,0 +1,8 @@
1
+ ---
2
+ description: 主动总结当前进展并按路由写入 .ai/memory/
3
+ ---
4
+
5
+ 按 `.ai/skills/memory-update.md` 执行:
6
+ 1. 读 `.ai/memory/MEMORY.md` 与 `session-log.md`
7
+ 2. 追加本次节点条目(时间戳 + 做了什么 + 关键决策 + 下一步)
8
+ 3. 需求/里程碑状态有变则更新 `project-state.md` 对应表格行
@@ -0,0 +1,24 @@
1
+ {
2
+ "hooks": {
3
+ "Stop": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "echo '[ai-memory] 会话收尾:请确认本次进展已按节点式协议写入 .ai/memory/session-log.md'"
9
+ }
10
+ ]
11
+ }
12
+ ],
13
+ "PreCompact": [
14
+ {
15
+ "hooks": [
16
+ {
17
+ "type": "command",
18
+ "command": "echo '[ai-memory] 上下文即将压缩:请先把关键进展写入 .ai/memory/session-log.md'"
19
+ }
20
+ ]
21
+ }
22
+ ]
23
+ }
24
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ name: critic
3
+ description: Use when 需要对需求定稿、架构设计或实现方案做对抗性检查/反驳/挑毛病
4
+ ---
5
+
6
+ 派发 critic subagent(独立上下文,只给文档路径与 `.ai/skills/critic.md`,不给对话历史),随后按其纪律逐条回应质疑。
@@ -0,0 +1,6 @@
1
+ ---
2
+ name: memory-update
3
+ description: Use when 完成一个任务节点、做出关键决策、会话收尾,或用户要求更新记忆/总结进展
4
+ ---
5
+
6
+ 读取并严格遵循 `.ai/skills/memory-update.md` 的写入路由与硬性约束执行。
@@ -0,0 +1,6 @@
1
+ ---
2
+ name: requirements-flow
3
+ description: Use when 用户要新建需求、定稿需求、把 draft 转 final,或提到「需求文档/定稿/finalize」
4
+ ---
5
+
6
+ 读取并严格遵循 `.ai/skills/requirements-flow.md` 执行,不要凭记忆复述流程。
@@ -0,0 +1,19 @@
1
+ # {{projectName}}
2
+
3
+ ## AI 协作框架(ai-memory)
4
+
5
+ 进场先读 `.ai/memory/MEMORY.md`,随后遵循 `.ai/README.md` 的进场协议。
6
+
7
+ - 需求文档工作(新建/定稿)→ requirements-flow skill,产物在 `docs/requirements/vX.Y.Z/{draft,final}/`
8
+ - 记忆更新 → 节点式(完成任务节点立即写),协议见 `.ai/skills/memory-update.md`;手动 /update-memory
9
+ - 反驳检查 → /critic 或定稿流程内强制触发;必须派 critic subagent 独立上下文执行
10
+
11
+ ## 与 superpowers 的编排(未安装则忽略本节)
12
+
13
+ 1. 需求定稿(what/why)走 requirements-flow;实现设计(how)走 brainstorming,以 `docs/requirements/*/final/*.md` 为输入
14
+ 2. code review 走 superpowers 流程,叠加 `.ai/skills/code-review.md` 的项目检查项
15
+
16
+ ## 项目信息
17
+
18
+ - 技术栈:{{techStack}}
19
+ <!-- 在此补充启动/测试/构建命令 -->
@@ -0,0 +1,6 @@
1
+ ---
2
+ name: critic
3
+ description: Use when 需要对需求定稿、架构设计或实现方案做对抗性检查/反驳/挑毛病
4
+ ---
5
+
6
+ 读取 `.ai/skills/critic.md`,按四类清单攻击目标文档;输出带严重度的质疑列表后,逐条回应「接受并修改」或「有理由反驳」。刻意抵制为自己刚写内容辩护的倾向。
@@ -0,0 +1,6 @@
1
+ ---
2
+ name: memory-update
3
+ description: Use when 完成一个任务节点、做出关键决策、会话收尾,或用户要求更新记忆/总结进展
4
+ ---
5
+
6
+ 读取并严格遵循 `.ai/skills/memory-update.md` 的写入路由与硬性约束执行。
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: requirements-flow
3
+ description: Use when 用户要新建需求、定稿需求、把 draft 转 final,或提到「需求文档/定稿/finalize」
4
+ ---
5
+
6
+ 读取并严格遵循 `.ai/skills/requirements-flow.md` 执行,不要凭记忆复述流程。
7
+ critic 门在 Codex 侧为同上下文自检:严格按 `.ai/skills/critic.md` 的四类清单与纪律执行。
@@ -0,0 +1,19 @@
1
+ # {{projectName}}
2
+
3
+ ## AI 协作框架(ai-memory)
4
+
5
+ 进场先读 `.ai/memory/MEMORY.md`,随后遵循 `.ai/README.md` 的进场协议。
6
+
7
+ - 需求文档工作(新建/定稿)→ requirements-flow skill,产物在 `docs/requirements/vX.Y.Z/{draft,final}/`
8
+ - 记忆更新 → 节点式(完成任务节点立即写),协议见 `.ai/skills/memory-update.md`
9
+ - 反驳检查 → critic skill 或定稿流程内强制触发;同上下文自检,刻意抵制自我辩护(见 `.ai/skills/critic.md` 纪律)
10
+
11
+ ## 与 superpowers 的编排(未安装则忽略本节)
12
+
13
+ 1. 需求定稿(what/why)走 requirements-flow;实现设计(how)走 brainstorming,以 `docs/requirements/*/final/*.md` 为输入
14
+ 2. code review 走 superpowers 流程,叠加 `.ai/skills/code-review.md` 的项目检查项
15
+
16
+ ## 项目信息
17
+
18
+ - 技术栈:{{techStack}}
19
+ <!-- 在此补充启动/测试/构建命令 -->
@@ -0,0 +1,20 @@
1
+ # .ai/ — 跨 Agent 知识框架({{projectName}})
2
+
3
+ 本目录是 agent-agnostic 的项目知识库,Claude Code、Codex 等所有 AI 工具共享同一份内容。
4
+ 由 @betterdanlins/ai-memory 生成于 {{date}}。
5
+
6
+ ## 进场协议(每次会话开始)
7
+
8
+ 1. 读 `memory/MEMORY.md`(记忆索引)
9
+ 2. 读 `memory/session-log.md` 末尾条目(接上进度)
10
+ 3. 按任务类型按需加载 `skills/` 对应方法论
11
+
12
+ ## 目录
13
+
14
+ - `memory/` — 记忆层:MEMORY.md 索引、project-state 全景、session-log 流水、user-profile/feedback 用户级记忆、features/ 功能档案
15
+ - `skills/` — 方法论层:requirements-flow、architecture、code-review、critic、memory-update
16
+
17
+ ## 与工具专属配置的关系
18
+
19
+ CLAUDE.md、AGENTS.md 只是薄入口;`.claude/skills/`、`.agents/skills/` 只是触发包装。
20
+ **正文永远只有本目录一份**,修改方法论只改这里,适配层不需要动。
@@ -0,0 +1,9 @@
1
+ # 记忆索引
2
+
3
+ > agent 进场先读本文件,再按需加载指向的文件。一行一条;新增记忆文件必须在此登记。
4
+
5
+ - [项目状态](project-state.md) — 技术栈、当前版本、需求进度、遗留问题
6
+ - [Session 日志](session-log.md) — 最新进展、下一步、未落盘决策
7
+ - [用户画像](user-profile.md) — 背景、偏好、沟通方式
8
+ - [协作规范](feedback.md) — 历史反馈提炼的行为规范
9
+ <!-- features/ 功能档案在下方逐行登记 -->
File without changes
@@ -0,0 +1,6 @@
1
+ # 协作规范
2
+
3
+ > 从历史协作反馈中提炼的行为规范,用户级记忆,跨项目可复用。
4
+ > 每条写清:规范 + 为什么 + 如何应用。
5
+
6
+ (暂无条目)
@@ -0,0 +1,23 @@
1
+ # 项目状态
2
+
3
+ > 最后更新:{{date}}
4
+ > 低频全景文件:只在需求/里程碑状态变化时更新对应行,不写流水。
5
+
6
+ ## 基本信息
7
+
8
+ - 项目:{{projectName}}
9
+ - 技术栈:{{techStack}}
10
+ - 当前迭代:v1.0.0
11
+
12
+ ## 需求进度
13
+
14
+ | 版本 | 需求 | 状态(draft/finalized/in-progress/done) | 备注 |
15
+ |---|---|---|---|
16
+
17
+ ## 已知遗留问题
18
+
19
+ (无)
20
+
21
+ ## 归档的 session 摘要
22
+
23
+ (session-log 超长时压缩至此)
@@ -0,0 +1,15 @@
1
+ # Session 日志
2
+
3
+ > 高频追加文件:每完成一个任务节点/关键决策,带时间戳追加一条;只增不改。
4
+ > 超过约 200 行时,把旧条目压缩进 project-state.md 的「归档的 session 摘要」。
5
+ > 跨工具(Claude Code ↔ Codex)切换前,必须确认本文件已落盘并 commit。
6
+
7
+ ## 条目格式
8
+
9
+ ### YYYY-MM-DD HH:mm — <节点标题>
10
+
11
+ - 做了什么:
12
+ - 关键决策:
13
+ - 下一步:
14
+
15
+ ---
@@ -0,0 +1,13 @@
1
+ # 用户画像
2
+
3
+ > 用户级记忆,跨项目可复用(init 时可从已有项目导入)。
4
+
5
+ ## 背景与角色
6
+
7
+ (技术背景、当前角色)
8
+
9
+ ## 偏好
10
+
11
+ - 沟通语言:
12
+ - 回复风格:
13
+ - 技术偏好:
@@ -0,0 +1,22 @@
1
+ # 架构方法论(语言无关)
2
+
3
+ ## 模块边界
4
+
5
+ - 每个模块用一句话说清职责;说不清 = 边界有问题
6
+ - 模块间只通过显式接口通信;不看内部实现也能正确使用
7
+ - 依赖单向:上层可依赖下层,禁止反向依赖与循环依赖
8
+
9
+ ## 接口契约格式(定稿时写入 final/*.md 的「接口契约」章节)
10
+
11
+ 每个接口写清:
12
+
13
+ - **名称与语义**:做什么,明确不做什么
14
+ - **输入**:参数、类型、边界值约定
15
+ - **输出**:返回结构、错误路径(每种失败如何表达给调用方)
16
+ - **幂等/并发**:重复调用的后果,是否需要去重或加锁
17
+ - **兼容**:后续变更如何不破坏既有调用方
18
+
19
+ ## 跨技术栈落地
20
+
21
+ 本文件只写原则。具体项目的模块清单、依赖层级、数据规范写在
22
+ `.ai/memory/project-state.md` 或 `features/` 对应档案里,由 agent 按本原则裁剪到当前技术栈。
@@ -0,0 +1,9 @@
1
+ # Review 检查项(项目专属)
2
+
3
+ > 不注册为 skill;供 superpowers 的 code review 流程作为附加检查项引用。
4
+
5
+ - **契约一致**:实现与 `final/*.md` 的接口契约、验收标准逐条对照
6
+ - **错误路径**:失败表达与契约声明一致,没有吞掉错误
7
+ - **记忆同步**:功能行为变化已更新 `features/` 对应档案
8
+ - **范围**:未引入需求「不做什么」里排除的内容
9
+ - **简洁**:没有单人项目不需要的抽象(YAGNI)
@@ -0,0 +1,21 @@
1
+ # 对抗性检查方法论
2
+
3
+ 输入:一份需求定稿、架构设计或实现方案。你的职责是攻击它,不是完善它。
4
+
5
+ ## 四类检查
6
+
7
+ 1. **假设攻击**:依赖了哪些未验证的前提?哪条假设崩了整个方案就崩?
8
+ 2. **契约漏洞**:错误路径、边界值、并发/幂等是否有定义?调用方误用会发生什么?
9
+ 3. **过度设计**:哪些部分是 YAGNI?这个抽象在单人项目里值得吗?
10
+ 4. **遗漏场景**:验收标准覆盖不到的行为?与 `.ai/memory/features/` 已有功能的冲突?
11
+
12
+ ## 输出格式
13
+
14
+ 质疑列表,每条:`[high|medium|low] 质疑内容 + 触发条件`。不提供修复方案,不表扬。
15
+
16
+ ## 纪律
17
+
18
+ - 主 agent 必须逐条回应「接受并修改」或「给出理由反驳」,不允许沉默跳过
19
+ - 全部处理完毕才算通过
20
+ - Claude Code 侧:由 critic subagent 独立上下文执行,只给文档路径,不给对话历史
21
+ - Codex 侧:同上下文自检,刻意抵制为自己刚写内容辩护的倾向
@@ -0,0 +1,24 @@
1
+ # 记忆更新协议(节点式)
2
+
3
+ ## 触发时机
4
+
5
+ 1. **完成一个任务节点 / 做出关键决策 → 立即写**,不攒到会话结束(主路径)
6
+ 2. 用户说「更新记忆」或 /update-memory
7
+ 3. 会话收尾、上下文即将压缩
8
+ 4. 需求状态变化(requirements-flow 第 5 步联动)
9
+
10
+ ## 写入路由
11
+
12
+ | 内容 | 去处 |
13
+ |---|---|
14
+ | 进展流水(做到哪/下一步/踩坑) | `session-log.md` 带时间戳追加 |
15
+ | 需求/里程碑状态变化 | `project-state.md` 对应表格行 |
16
+ | 功能设计决策、契约变更 | `features/<名>.md` |
17
+ | 新增记忆文件 | `MEMORY.md` 加索引行 |
18
+
19
+ ## 硬性约束
20
+
21
+ - 写前先读目标文件
22
+ - 只增量追加,不重构既有格式与历史条目
23
+ - session-log 超约 200 行:把旧条目压缩进 project-state.md 的归档章节
24
+ - 跨工具切换前确认 session-log 已落盘;记忆变更随代码一起 commit
@@ -0,0 +1,23 @@
1
+ # 需求定稿流程(draft → final)
2
+
3
+ 触发:用户要求新建/定稿需求,或 /new-requirement、/finalize-requirement。
4
+
5
+ ## 新建(new)
6
+
7
+ 1. 确认目标版本目录 `docs/requirements/vX.Y.Z/`(不存在则创建 draft/ 与 final/)
8
+ 2. 在 `draft/<需求名>.md` 生成骨架:背景 / 想要什么 / 不确定的点
9
+ 3. 在 `.ai/memory/project-state.md` 需求进度表登记一行(状态 draft)
10
+
11
+ ## 定稿(finalize)
12
+
13
+ 1. 读 `draft/<需求名>.md`
14
+ 2. 逐个澄清模糊点:一次只问一个问题,优先选择题
15
+ 3. 按固定结构成稿:**目标 / 范围(必须含「不做什么」)/ 接口契约(格式见 architecture.md)/ 验收标准 / 开放问题**
16
+ 4. 强制 critic 门:按 `critic.md` 检查,逐条回应完毕才可写入 `final/<需求名>.md`
17
+ 5. 联动记忆:project-state 状态改 finalized;`features/<需求名>.md` 建档登记契约要点;MEMORY.md 加索引行
18
+ 6. 需求文档与记忆变更一起 commit
19
+
20
+ ## 与 superpowers 的衔接
21
+
22
+ 实现阶段由 brainstorming/writing-plans 以 `final/<需求名>.md` 为输入。
23
+ 本流程只产出需求(what/why),不做实现设计(how)。
@@ -0,0 +1,6 @@
1
+ # 需求目录
2
+
3
+ - 每个迭代版本一个目录:`vX.Y.Z/`
4
+ - `draft/` — 人工粗稿,自由格式,想到哪写到哪
5
+ - `final/` — AI 协作定稿,固定结构:目标 / 范围 / 接口契约 / 验收标准 / 开放问题
6
+ - 定稿流程见 `.ai/skills/requirements-flow.md`(/new-requirement、/finalize-requirement)