@lich0821/devmind 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,12 @@
1
+ /**
2
+ * Inject DevMind hooks into ~/.claude/settings.json (user-level).
3
+ * Claude Code reads hooks ONLY from user-level settings, not project-level.
4
+ * Preserves all existing content; only adds hooks if not already registered.
5
+ * Hook commands use absolute paths so they work from any project directory.
6
+ */
7
+ export declare function injectUserHooks(projectDir: string): {
8
+ status: 'injected' | 'already' | 'error';
9
+ message: string;
10
+ };
1
11
  export declare function runInit(targetDir: string): void;
2
12
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAwNA,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAmD/C"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAsKA;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAsDjH;AA8DD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAiE/C"}
@@ -1,9 +1,10 @@
1
- import { existsSync, mkdirSync, writeFileSync, chmodSync } from 'node:fs';
2
- import { join } from 'node:path';
1
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, chmodSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
3
4
  import chalk from 'chalk';
4
5
  import { PRE_TOOL_USE_SH, POST_TOOL_USE_SH, CLAUDE_MD, SETTINGS_LOCAL_JSON } from '../templates.js';
5
6
  import { CMD_EXPLORE, CMD_EDIT, CMD_PLAN, CMD_BUILD } from '../templates-commands.js';
6
- import { CMD_REMEMBER, CMD_RECALL, CMD_BURY, CMD_AUDIT, CMD_SYNC_MEMORY, CMD_PUBLISH, CMD_RELEASE } from '../templates-commands2.js';
7
+ import { CMD_REMEMBER, CMD_RECALL, CMD_BURY, CMD_AUDIT, CMD_SYNC_MEMORY, CMD_PUBLISH, CMD_RELEASE, CMD_MIGRATE } from '../templates-commands2.js';
7
8
  import { CURRENT_MODE_TXT, SESSION_YAML, CONFIG_YAML, FLOW_YAML, CURRENT_PLAN_MD, PROGRESS_MD, MODE_EXPLORE_MD, MODE_EDIT_MD, MODE_PLAN_MD, MODE_BUILD_MD, TMPL_DECISION, TMPL_PATTERN, TMPL_GRAVEYARD, } from '../templates-devmind.js';
8
9
  // ─── Rebuild-index script (kept here to avoid another template file) ──────────
9
10
  const REBUILD_INDEX_SH = `#!/bin/bash
@@ -145,6 +146,55 @@ const INDEX_MD = `<!-- 此文件由 .devmind/scripts/rebuild-index.sh 自动生
145
146
 
146
147
  使用提示:需要详细内容时,使用 \`/recall <关键词>\` 检索
147
148
  `;
149
+ /**
150
+ * Inject DevMind hooks into ~/.claude/settings.json (user-level).
151
+ * Claude Code reads hooks ONLY from user-level settings, not project-level.
152
+ * Preserves all existing content; only adds hooks if not already registered.
153
+ * Hook commands use absolute paths so they work from any project directory.
154
+ */
155
+ export function injectUserHooks(projectDir) {
156
+ const userSettingsPath = resolve(homedir(), '.claude', 'settings.json');
157
+ const absProjectDir = resolve(projectDir);
158
+ const preHookCommand = `${absProjectDir}/.claude/hooks/pre-tool-use.sh`;
159
+ const postHookCommand = `${absProjectDir}/.claude/hooks/post-tool-use.sh`;
160
+ // Read or initialize user settings
161
+ let settings = {};
162
+ if (existsSync(userSettingsPath)) {
163
+ try {
164
+ settings = JSON.parse(readFileSync(userSettingsPath, 'utf-8'));
165
+ }
166
+ catch {
167
+ return { status: 'error', message: '~/.claude/settings.json is malformed JSON' };
168
+ }
169
+ }
170
+ const hooks = settings.hooks ? { ...settings.hooks } : {};
171
+ // Check if already registered (by command path)
172
+ const preAlready = (hooks['PreToolUse'] ?? []).some(m => m.hooks?.some(h => h.command === preHookCommand));
173
+ const postAlready = (hooks['PostToolUse'] ?? []).some(m => m.hooks?.some(h => h.command === postHookCommand));
174
+ if (preAlready && postAlready) {
175
+ return { status: 'already', message: 'hooks already registered' };
176
+ }
177
+ if (!preAlready) {
178
+ hooks['PreToolUse'] = [
179
+ ...(hooks['PreToolUse'] ?? []),
180
+ { matcher: '', hooks: [{ type: 'command', command: preHookCommand }] },
181
+ ];
182
+ }
183
+ if (!postAlready) {
184
+ hooks['PostToolUse'] = [
185
+ ...(hooks['PostToolUse'] ?? []),
186
+ { matcher: '', hooks: [{ type: 'command', command: postHookCommand }] },
187
+ ];
188
+ }
189
+ settings.hooks = hooks;
190
+ // Ensure ~/.claude/ dir exists
191
+ const claudeDir = resolve(homedir(), '.claude');
192
+ if (!existsSync(claudeDir)) {
193
+ mkdirSync(claudeDir, { recursive: true });
194
+ }
195
+ writeFileSync(userSettingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
196
+ return { status: 'injected', message: userSettingsPath };
197
+ }
148
198
  function buildFileMap() {
149
199
  return [
150
200
  // .devmind/
@@ -165,6 +215,7 @@ function buildFileMap() {
165
215
  { path: '.devmind/memory/decisions/.gitkeep', content: '' },
166
216
  { path: '.devmind/memory/patterns/.gitkeep', content: '' },
167
217
  { path: '.devmind/memory/graveyard/.gitkeep', content: '' },
218
+ { path: '.devmind/memory/drafts/.gitkeep', content: '' },
168
219
  { path: '.devmind/memory/TEMPLATES/decision-template.md', content: TMPL_DECISION },
169
220
  { path: '.devmind/memory/TEMPLATES/pattern-template.md', content: TMPL_PATTERN },
170
221
  { path: '.devmind/memory/TEMPLATES/graveyard-template.md', content: TMPL_GRAVEYARD },
@@ -188,6 +239,7 @@ function buildFileMap() {
188
239
  { path: '.claude/commands/dm/sync-memory.md', content: CMD_SYNC_MEMORY },
189
240
  { path: '.claude/commands/dm/publish.md', content: CMD_PUBLISH },
190
241
  { path: '.claude/commands/dm/release.md', content: CMD_RELEASE },
242
+ { path: '.claude/commands/dm/migrate.md', content: CMD_MIGRATE },
191
243
  // docs
192
244
  { path: 'docs/designs/draft/.gitkeep', content: '' },
193
245
  ];
@@ -215,6 +267,8 @@ export function runInit(targetDir) {
215
267
  }
216
268
  created.push(file.path);
217
269
  }
270
+ // Inject hooks into user-level ~/.claude/settings.json
271
+ const hookResult = injectUserHooks(targetDir);
218
272
  // Output summary
219
273
  console.log('');
220
274
  console.log(chalk.green('✓') + ' DevMind initialized successfully!\n');
@@ -230,6 +284,18 @@ export function runInit(targetDir) {
230
284
  console.log('');
231
285
  console.log(chalk.yellow(`Skipped ${skipped.length} existing files.`));
232
286
  }
287
+ // Report hook injection status
288
+ console.log('');
289
+ if (hookResult.status === 'injected') {
290
+ console.log(chalk.green('✓') + ' Hooks registered in ' + chalk.cyan('~/.claude/settings.json'));
291
+ }
292
+ else if (hookResult.status === 'already') {
293
+ console.log(chalk.yellow('~') + ' Hooks already registered in ~/.claude/settings.json');
294
+ }
295
+ else {
296
+ console.log(chalk.red('✗') + ' Hook injection failed: ' + hookResult.message);
297
+ console.log(' Please manually add hooks to ~/.claude/settings.json');
298
+ }
233
299
  console.log('');
234
300
  console.log(chalk.bold('Next steps:'));
235
301
  console.log(' 1. Edit ' + chalk.cyan('.devmind/config.yaml') + ' — set your project name');
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runMigrate(targetDir: string): void;
2
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAyLA,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAkElD"}
@@ -0,0 +1,228 @@
1
+ import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { execSync } from 'node:child_process';
4
+ import chalk from 'chalk';
5
+ import { runInit, injectUserHooks } from './init.js';
6
+ function detectTechStack(dir) {
7
+ const stack = [];
8
+ if (existsSync(join(dir, 'package.json'))) {
9
+ try {
10
+ const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'));
11
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
12
+ if (deps['react'] || deps['react-dom'])
13
+ stack.push('React');
14
+ if (deps['vue'])
15
+ stack.push('Vue');
16
+ if (deps['next'])
17
+ stack.push('Next.js');
18
+ if (deps['express'])
19
+ stack.push('Express');
20
+ if (deps['fastify'])
21
+ stack.push('Fastify');
22
+ if (deps['typescript'] || deps['ts-node'])
23
+ stack.push('TypeScript');
24
+ if (!stack.includes('TypeScript') && existsSync(join(dir, 'tsconfig.json')))
25
+ stack.push('TypeScript');
26
+ if (!stack.length)
27
+ stack.push('Node.js');
28
+ }
29
+ catch {
30
+ stack.push('Node.js');
31
+ }
32
+ }
33
+ if (existsSync(join(dir, 'go.mod')))
34
+ stack.push('Go');
35
+ if (existsSync(join(dir, 'pyproject.toml')) || existsSync(join(dir, 'requirements.txt')))
36
+ stack.push('Python');
37
+ if (existsSync(join(dir, 'Cargo.toml')))
38
+ stack.push('Rust');
39
+ if (existsSync(join(dir, 'pom.xml')) || existsSync(join(dir, 'build.gradle')))
40
+ stack.push('Java');
41
+ return stack.length ? stack : ['(unknown)'];
42
+ }
43
+ function detectOpenSpec(dir) {
44
+ const openspecDir = join(dir, 'openspec');
45
+ if (!existsSync(openspecDir)) {
46
+ return { hasOpenSpec: false, archiveCount: 0, activeChanges: [] };
47
+ }
48
+ const changesDir = join(openspecDir, 'changes');
49
+ const archiveDir = join(changesDir, 'archive');
50
+ let archiveCount = 0;
51
+ if (existsSync(archiveDir)) {
52
+ archiveCount = readdirSync(archiveDir, { withFileTypes: true })
53
+ .filter(d => d.isDirectory()).length;
54
+ }
55
+ const activeChanges = [];
56
+ if (existsSync(changesDir)) {
57
+ readdirSync(changesDir, { withFileTypes: true })
58
+ .filter(d => d.isDirectory() && d.name !== 'archive')
59
+ .forEach(d => activeChanges.push(d.name));
60
+ }
61
+ return { hasOpenSpec: true, archiveCount, activeChanges };
62
+ }
63
+ function getGitLog(dir) {
64
+ try {
65
+ const output = execSync('git log --oneline -20', { cwd: dir, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
66
+ return { lines: output.trim().split('\n').filter(Boolean), isGitRepo: true };
67
+ }
68
+ catch {
69
+ return { lines: [], isGitRepo: false };
70
+ }
71
+ }
72
+ function getProjectName(dir) {
73
+ // Try package.json name
74
+ const pkgPath = join(dir, 'package.json');
75
+ if (existsSync(pkgPath)) {
76
+ try {
77
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
78
+ if (pkg.name)
79
+ return pkg.name;
80
+ }
81
+ catch { /* ignore */ }
82
+ }
83
+ // Fall back to directory name
84
+ return dir.split('/').pop() ?? 'MyProject';
85
+ }
86
+ // ─── Checklist generation ──────────────────────────────────────────────────────
87
+ function buildChecklist(info) {
88
+ const today = new Date().toISOString().slice(0, 10);
89
+ const lines = [];
90
+ lines.push(`# DevMind 迁移清单`);
91
+ lines.push(``);
92
+ lines.push(`> 生成日期:${today}`);
93
+ lines.push(`> 使用方法:在 Claude Code 中输入 \`/dm:migrate\` 开始迁移`);
94
+ lines.push(``);
95
+ lines.push(`## 项目基本信息`);
96
+ lines.push(``);
97
+ lines.push(`- **项目名称**:${info.name}`);
98
+ lines.push(`- **技术栈**:${info.techStack.join(', ')}`);
99
+ lines.push(`- **README**:${info.hasReadme ? '存在' : '未找到'}`);
100
+ lines.push(`- **Git 仓库**:${info.isGitRepo ? '是' : '否'}`);
101
+ lines.push(``);
102
+ if (info.hasOpenSpec) {
103
+ lines.push(`## OpenSpec 检测结果`);
104
+ lines.push(``);
105
+ lines.push(`检测到项目使用 OpenSpec,以下内容将被转换到 DevMind 记忆系统:`);
106
+ lines.push(``);
107
+ lines.push(`| 来源 | 数量 | 目标 |`);
108
+ lines.push(`|------|------|------|`);
109
+ lines.push(`| \`openspec/changes/archive/\` | ${info.openSpecArchiveCount} 个已归档变更 | \`.devmind/memory/decisions/\` |`);
110
+ if (info.openSpecActiveChanges.length > 0) {
111
+ lines.push(`| \`openspec/changes/\`(进行中) | ${info.openSpecActiveChanges.length} 个 | \`.devmind/current-plan.md\` |`);
112
+ }
113
+ lines.push(``);
114
+ if (info.openSpecActiveChanges.length > 0) {
115
+ lines.push(`### 进行中的变更`);
116
+ lines.push(``);
117
+ info.openSpecActiveChanges.forEach(c => lines.push(`- \`${c}\``));
118
+ lines.push(``);
119
+ lines.push(`> /dm:migrate 将把第一个进行中的变更转换为 \`current-plan.md\`,其余的转换为 decisions。`);
120
+ lines.push(``);
121
+ }
122
+ }
123
+ if (info.isGitRepo && info.gitLogLines.length > 0) {
124
+ lines.push(`## 最近 Git 提交(供 AI 参考)`);
125
+ lines.push(``);
126
+ lines.push(`\`\`\``);
127
+ info.gitLogLines.forEach(l => lines.push(l));
128
+ lines.push(`\`\`\``);
129
+ lines.push(``);
130
+ }
131
+ lines.push(`## 迁移任务清单`);
132
+ lines.push(``);
133
+ lines.push(`/dm:migrate 将自动完成以下步骤:`);
134
+ lines.push(``);
135
+ lines.push(`- [ ] 更新 \`.devmind/config.yaml\` 中的 \`project:\` 字段`);
136
+ if (info.hasReadme) {
137
+ lines.push(`- [ ] 读取 README.md,提炼架构概述`);
138
+ }
139
+ lines.push(`- [ ] 探索代码库结构,识别核心架构决策`);
140
+ lines.push(`- [ ] 识别开发规律,写入 \`memory/patterns/\``);
141
+ if (info.hasOpenSpec) {
142
+ lines.push(`- [ ] 将 OpenSpec archived changes 转换为 \`memory/decisions/\``);
143
+ if (info.openSpecActiveChanges.length > 0) {
144
+ lines.push(`- [ ] 将进行中的 OpenSpec change 转换为 \`current-plan.md\``);
145
+ }
146
+ lines.push(`- [ ] 检查未归档但被放弃的 changes,询问是否写入 \`memory/graveyard/\``);
147
+ }
148
+ else {
149
+ lines.push(`- [ ] 检查历史中是否有被否决的技术方案,写入 \`memory/graveyard/\``);
150
+ }
151
+ lines.push(`- [ ] 运行 \`.devmind/scripts/rebuild-index.sh\` 重建索引`);
152
+ lines.push(`- [ ] 输出迁移摘要`);
153
+ lines.push(``);
154
+ lines.push(`## 下一步`);
155
+ lines.push(``);
156
+ lines.push(`打开 Claude Code,在对话框中输入:`);
157
+ lines.push(``);
158
+ lines.push(`\`\`\``);
159
+ lines.push(`/dm:migrate`);
160
+ lines.push(`\`\`\``);
161
+ return lines.join('\n');
162
+ }
163
+ // ─── Main ──────────────────────────────────────────────────────────────────────
164
+ export function runMigrate(targetDir) {
165
+ console.log(chalk.bold('DevMind migrate'));
166
+ console.log('');
167
+ // Step 1: ensure devmind is initialized
168
+ const devmindDir = join(targetDir, '.devmind');
169
+ if (!existsSync(devmindDir)) {
170
+ console.log(chalk.yellow('DevMind not initialized. Running init first...'));
171
+ console.log('');
172
+ runInit(targetDir);
173
+ console.log('');
174
+ }
175
+ else {
176
+ console.log(chalk.green('✓') + ' DevMind already initialized');
177
+ // Still ensure hooks are registered in user-level settings
178
+ const hookResult = injectUserHooks(targetDir);
179
+ if (hookResult.status === 'injected') {
180
+ console.log(chalk.green('✓') + ' Hooks registered in ' + chalk.cyan('~/.claude/settings.json'));
181
+ }
182
+ else if (hookResult.status === 'error') {
183
+ console.log(chalk.red('✗') + ' Hook injection failed: ' + hookResult.message);
184
+ }
185
+ }
186
+ // Step 2: gather project info
187
+ console.log('Scanning project...');
188
+ const name = getProjectName(targetDir);
189
+ const techStack = detectTechStack(targetDir);
190
+ const { hasOpenSpec, archiveCount, activeChanges } = detectOpenSpec(targetDir);
191
+ const { lines: gitLogLines, isGitRepo } = getGitLog(targetDir);
192
+ const hasReadme = existsSync(join(targetDir, 'README.md')) || existsSync(join(targetDir, 'README.mdx'));
193
+ const info = {
194
+ name,
195
+ techStack,
196
+ hasReadme,
197
+ hasOpenSpec,
198
+ openSpecArchiveCount: archiveCount,
199
+ openSpecActiveChanges: activeChanges,
200
+ gitLogLines,
201
+ isGitRepo,
202
+ };
203
+ // Step 3: report what was detected
204
+ console.log('');
205
+ console.log(chalk.bold('Detected:'));
206
+ console.log(` Project name : ${chalk.cyan(name)}`);
207
+ console.log(` Tech stack : ${chalk.cyan(techStack.join(', '))}`);
208
+ if (hasOpenSpec) {
209
+ console.log(` OpenSpec : ${chalk.green('yes')} (${archiveCount} archived, ${activeChanges.length} active)`);
210
+ }
211
+ else {
212
+ console.log(` OpenSpec : ${chalk.gray('not found')}`);
213
+ }
214
+ console.log(` Git repo : ${isGitRepo ? chalk.green('yes') : chalk.gray('no')}`);
215
+ // Step 4: write checklist
216
+ const checklistPath = join(devmindDir, 'migrate-checklist.md');
217
+ const checklist = buildChecklist(info);
218
+ writeFileSync(checklistPath, checklist, 'utf8');
219
+ console.log('');
220
+ console.log(chalk.green('✓') + ' Generated: ' + chalk.cyan('.devmind/migrate-checklist.md'));
221
+ // Step 5: instructions
222
+ console.log('');
223
+ console.log(chalk.bold('Next steps:'));
224
+ console.log(' 1. Open Claude Code in this directory');
225
+ console.log(' 2. Type ' + chalk.cyan('/dm:migrate') + ' to start the migration');
226
+ console.log('');
227
+ }
228
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ import { runInit } from './commands/init.js';
5
5
  import { runStatus } from './commands/status.js';
6
6
  import { runRecall } from './commands/recall.js';
7
7
  import { runAudit } from './commands/audit.js';
8
+ import { runMigrate } from './commands/migrate.js';
8
9
  const require = createRequire(import.meta.url);
9
10
  const pkg = require('../package.json');
10
11
  const program = new Command();
@@ -19,6 +20,13 @@ program
19
20
  const targetDir = resolve(path ?? '.');
20
21
  runInit(targetDir);
21
22
  });
23
+ program
24
+ .command('migrate [path]')
25
+ .description('Migrate an existing project to DevMind (supports plain projects and OpenSpec)')
26
+ .action((path) => {
27
+ const targetDir = resolve(path ?? '.');
28
+ runMigrate(targetDir);
29
+ });
22
30
  program
23
31
  .command('status')
24
32
  .description('Show current mode, active plan, and session checkpoints')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAA6C,CAAC;AAEnF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;KAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAE1B,OAAO;KACF,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,CAAC,IAAa,EAAE,EAAE;IACtB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,GAAG,EAAE;IACT,SAAS,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,CAAC,OAAe,EAAE,EAAE;IACxB,SAAS,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,gBAAgB,EAAE,kCAAkC,EAAE,IAAI,CAAC;KAClE,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;KAClD,MAAM,CAAC,mBAAmB,EAAE,0CAA0C,CAAC;KACvE,MAAM,CAAC,CAAC,IAAqD,EAAE,EAAE;IAC9D,QAAQ,CAAC;QACL,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QACrD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;KAClB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEP,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAA6C,CAAC;AAEnF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;KAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAE1B,OAAO;KACF,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,CAAC,IAAa,EAAE,EAAE;IACtB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,+EAA+E,CAAC;KAC5F,MAAM,CAAC,CAAC,IAAa,EAAE,EAAE;IACtB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IACvC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,GAAG,EAAE;IACT,SAAS,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,CAAC,OAAe,EAAE,EAAE;IACxB,SAAS,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,gBAAgB,EAAE,kCAAkC,EAAE,IAAI,CAAC;KAClE,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;KAClD,MAAM,CAAC,mBAAmB,EAAE,0CAA0C,CAAC;KACvE,MAAM,CAAC,CAAC,IAAqD,EAAE,EAAE;IAC9D,QAAQ,CAAC;QACL,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QACrD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;KAClB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEP,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export declare const CMD_EXPLORE = "---\ndescription: \u8FDB\u5165\u53EA\u8BFB\u5206\u6790\u6A21\u5F0F\uFF0C\u7406\u89E3\u4EE3\u7801\u67B6\u6784\uFF0C\u5B9A\u4F4D\u95EE\u9898\uFF0C\u4E0D\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\n---\n\n\u8FDB\u5165 **EXPLORE \u6A21\u5F0F**\uFF08\u53EA\u8BFB\uFF09\u3002\n\n## \u524D\u7F6E\u64CD\u4F5C\n\n```sh\necho \"explore\" > .devmind/current-mode.txt\n```\n\n## \u884C\u4E3A\u89C4\u5219\n\n- **\u7981\u6B62**\u8C03\u7528 Write / Edit / NotebookEdit \u5DE5\u5177\uFF08Hook \u4F1A\u81EA\u52A8\u62E6\u622A\uFF09\n- \u53EF\u81EA\u7531\u8BFB\u53D6\u4EFB\u4F55\u6587\u4EF6\n- \u52A0\u8F7D `.devmind/memory/index.md`\uFF0C\u4E86\u89E3\u9879\u76EE\u5386\u53F2\u51B3\u7B56\u80CC\u666F\n\n## \u5206\u6790\u8F93\u51FA\u683C\u5F0F\n\n\u5B8C\u6210\u63A2\u7D22\u540E\uFF0C\u8F93\u51FA\uFF1A\n\n1. **\u53D1\u73B0\u6458\u8981**\uFF1A1-3 \u53E5\u8BDD\u63CF\u8FF0\u5173\u952E\u53D1\u73B0\n2. **\u76F8\u5173\u8BB0\u5FC6**\uFF1A\u5217\u51FA index.md \u4E2D\u4E0E\u5F53\u524D\u95EE\u9898\u76F8\u5173\u7684 Decision/Pattern\uFF08\u5982\u6709\uFF09\n3. **\u5EFA\u8BAE\u4E0B\u4E00\u6B65**\uFF1A\u6839\u636E\u53D1\u73B0\u63A8\u8350\u5207\u6362\u5230\u54EA\u4E2A\u6A21\u5F0F\n - \u95EE\u9898\u5DF2\u5B9A\u4F4D\uFF0C\u6539\u52A8\u5C0F \u2192 \u5EFA\u8BAE `/dm:edit`\n - \u9700\u8981\u65B9\u6848\u89C4\u5212 \u2192 \u5EFA\u8BAE `/dm:plan`\n - \u5DF2\u6709\u660E\u786E\u8BA1\u5212 \u2192 \u5EFA\u8BAE `/dm:build`\n\n## \u6CE8\u610F\n\n\u4E0D\u8981\u5728 Explore \u6A21\u5F0F\u4E0B\u7ED9\u51FA\"\u4FEE\u6539\u5EFA\u8BAE\"\u2014\u2014\u63A2\u7D22\u662F\u4E3A\u4E86\u7406\u89E3\uFF0C\u4E0D\u662F\u4E3A\u4E86\u884C\u52A8\u3002\n\u5982\u9700\u4FEE\u6539\uFF0C\u660E\u786E\u5207\u6362\u6A21\u5F0F\u540E\u518D\u64CD\u4F5C\u3002\n";
2
- export declare const CMD_EDIT = "---\ndescription: \u8FDB\u5165\u5C0F\u8303\u56F4\u7F16\u8F91\u6A21\u5F0F\uFF0C\u76F4\u63A5\u5B9E\u65BD\u660E\u786E\u7684\u4FEE\u6539\uFF0C\u8DE8\u6587\u4EF6\u6539\u52A8\u9700\u786E\u8BA4\n---\n\n\u8FDB\u5165 **EDIT \u6A21\u5F0F**\uFF08\u5C0F\u8303\u56F4\u7F16\u8F91\uFF09\u3002\n\n## \u524D\u7F6E\u64CD\u4F5C\n\n```sh\necho \"edit\" > .devmind/current-mode.txt\n```\n\n## \u884C\u4E3A\u89C4\u5219\n\n- \u53EF\u76F4\u63A5\u4FEE\u6539\u6587\u4EF6\uFF0C\u65E0\u9700\u9884\u5148\u5236\u5B9A\u8BA1\u5212\n- **\u8DE8\u6587\u4EF6\u6539\u52A8\u8D85\u8FC7 2 \u4E2A\u6587\u4EF6\u65F6**\uFF0C\u5148\u5217\u51FA\u6539\u52A8\u6E05\u5355\uFF0C\u7B49\u5F85\u786E\u8BA4\u540E\u518D\u6267\u884C\n- \u4FEE\u6539\u5B8C\u6210\u540E\uFF0C\u7B80\u8981\u8BF4\u660E\u505A\u4E86\u4EC0\u4E48\n\n## \u8C03\u8BD5\u573A\u666F\u4F7F\u7528\u65B9\u5F0F\n\n- **\u8BCA\u65AD\u9636\u6BB5**\uFF1A\u4F7F\u7528 `/dm:explore`\uFF08\u53EA\u8BFB\uFF0C\u5B9A\u4F4D\u6839\u56E0\uFF09\n- **\u4FEE\u590D\u9636\u6BB5**\uFF1A\u5207\u6362\u5230 `/dm:edit`\uFF08\u6700\u5C0F\u5316\u4FEE\u590D\uFF09\n\n## \u6CE8\u610F\n\nEdit \u6A21\u5F0F\u9002\u5408\u660E\u786E\u7684\u5C0F\u8303\u56F4\u6539\u52A8\u3002\u5982\u679C\u6539\u52A8\u8303\u56F4\u6269\u5927\uFF0C\u5EFA\u8BAE\u5207\u6362\u5230 `/dm:plan` \u5236\u5B9A\u65B9\u6848\u3002\n";
2
+ export declare const CMD_EDIT = "---\ndescription: \u8FDB\u5165\u5C0F\u8303\u56F4\u7F16\u8F91\u6A21\u5F0F\uFF0C\u76F4\u63A5\u5B9E\u65BD\u660E\u786E\u7684\u4FEE\u6539\uFF0C\u8DE8\u6587\u4EF6\u6539\u52A8\u9700\u786E\u8BA4\n---\n\n\u8FDB\u5165 **EDIT \u6A21\u5F0F**\uFF08\u5C0F\u8303\u56F4\u7F16\u8F91\uFF09\u3002\n\n## \u524D\u7F6E\u64CD\u4F5C\n\n```sh\necho \"edit\" > .devmind/current-mode.txt\n```\n\n## \u884C\u4E3A\u89C4\u5219\n\n- \u5141\u8BB8\u4FEE\u6539\u6587\u4EF6\uFF0C\u4F46**\u4F18\u5148\u6700\u5C0F\u5316\u6539\u52A8\u8303\u56F4**\n- **\u4FEE\u6539\u8D85\u8FC7 2 \u4E2A\u6587\u4EF6\u524D**\uFF0C\u5FC5\u987B\u5148\u8F93\u51FA\u6E05\u5355\u5E76\u7B49\u5F85\u786E\u8BA4\uFF0C\u672A\u7ECF\u786E\u8BA4\u4E0D\u5F97\u6267\u884C\uFF1A\n\n```\n\u5373\u5C06\u4FEE\u6539\u591A\u4E2A\u6587\u4EF6\uFF1A\n- [\u6587\u4EF61]\uFF1A[\u4FEE\u6539\u539F\u56E0]\n- [\u6587\u4EF62]\uFF1A[\u4FEE\u6539\u539F\u56E0]\n- [\u6587\u4EF63]\uFF1A[\u4FEE\u6539\u539F\u56E0]\n\n\u8D85\u8FC7 2 \u4E2A\u6587\u4EF6\uFF0C\u7EE7\u7EED\uFF1F(y/n)\n```\n\n- \u4E0D\u65B0\u589E npm/pip/go \u4F9D\u8D56\uFF0C\u4E0D\u505A\u67B6\u6784\u7EA7\u4FEE\u6539\n- \u6BCF\u6B21\u4FEE\u6539\u524D\u7B80\u8981\u8BF4\u660E\uFF1A\u6539\u4EC0\u4E48\u3001\u4E3A\u4EC0\u4E48\u3001\u9884\u671F\u6548\u679C\n\n## \u9002\u7528\u573A\u666F\n\n- \u4FEE\u590D\u5DF2\u5B9A\u4F4D\u7684 bug\uFF08\u5148\u7528 `/dm:explore` \u8BCA\u65AD\uFF0C\u518D\u5207\u6B64\u6A21\u5F0F\u4FEE\u590D\uFF09\n- \u5B9E\u65BD\u5C0F\u578B\u529F\u80FD\u6539\u52A8\uFF08\u5DF2\u77E5\u6539\u4EC0\u4E48\u3001\u6539\u54EA\u91CC\uFF09\n- \u5C0F\u8303\u56F4\u5B9E\u9A8C\u6027\u4FEE\u6539\n\n## \u5B8C\u6210\u540E\n\n\u5EFA\u8BAE\u4F7F\u7528 `/dm:remember` \u8BB0\u5F55\u6709\u4EF7\u503C\u7684\u53D1\u73B0\uFF08\u5982\u679C\u53D1\u73B0\u4E86\u91CD\u8981\u89C4\u5F8B\uFF09\u3002\n\u5982\u679C\u6539\u52A8\u65B9\u6848\u590D\u6742\uFF0C\u5EFA\u8BAE\u5148\u5207\u6362\u5230 `/dm:plan` \u5236\u5B9A\u65B9\u6848\u3002\n";
3
3
  export declare const CMD_PLAN = "---\ndescription: \u5236\u5B9A\u7ED3\u6784\u5316\u65B9\u6848\uFF0C\u5F3A\u5236\u68C0\u7D22 Graveyard \u9632\u6B62\u91CD\u8E48\u8986\u8F99\uFF0C\u7B49\u5F85\u5F00\u53D1\u8005\u9009\u62E9\u540E\u751F\u6210 Spec\n---\n\n\u8FDB\u5165 **PLAN \u6A21\u5F0F**\uFF08\u65B9\u6848\u89C4\u5212\uFF09\u3002\n\n## \u524D\u7F6E\u64CD\u4F5C\n\n```sh\necho \"plan\" > .devmind/current-mode.txt\n```\n\n## \u6267\u884C\u6B65\u9AA4\n\n### \u6B65\u9AA41\uFF1A\u5F3A\u5236\u68C0\u7D22 Graveyard\n\n\u8BFB\u53D6 `.devmind/memory/graveyard/` \u4E0B\u7684\u6240\u6709\u6587\u4EF6\u3002\n\n\u68C0\u67E5\u5F53\u524D\u63D0\u8BAE\u662F\u5426\u4E0E\u5DF2\u5426\u51B3\u65B9\u6848\u76F8\u4F3C\uFF08\u5173\u952E\u8BCD\u91CD\u53E0\uFF09\u3002\n\n\u5982\u53D1\u73B0\u5339\u914D\uFF0C**\u5FC5\u987B**\u5148\u8F93\u51FA\u8B66\u544A\uFF1A\n\n```\n\u26A0\uFE0F \u53D1\u73B0\u76F8\u4F3C\u7684\u5DF2\u5426\u51B3\u65B9\u6848\uFF1A[\u65B9\u6848\u540D]\n \u5426\u51B3\u539F\u56E0\uFF1A[\u539F\u56E0\u6458\u8981]\n \u5173\u952E\u8BCD\u91CD\u53E0\uFF1A[\u5173\u952E\u8BCD\u5217\u8868]\n\n\u8BF7\u9009\u62E9\uFF1A\n(1) \u67E5\u770B\u5B8C\u6574\u5426\u51B3\u539F\u56E0\u540E\u51B3\u5B9A\u662F\u5426\u7EE7\u7EED\n(2) \u60C5\u51B5\u4E0D\u540C\uFF0C\u5F53\u524D\u65B9\u6848\u4E0E\u6B64\u65E0\u5173\uFF0C\u7EE7\u7EED\u89C4\u5212\n(3) \u786E\u5B9E\u76F8\u4F3C\uFF0C\u76F4\u63A5\u653E\u5F03\u6B64\u65B9\u5411\n```\n\n\u7B49\u5F85\u5F00\u53D1\u8005\u9009\u62E9\u540E\u7EE7\u7EED\u3002\n\n### \u6B65\u9AA42\uFF1A\u8F93\u51FA\u7ED3\u6784\u5316\u65B9\u6848\u5BF9\u6BD4\n\n\u6BCF\u4E2A\u65B9\u6848\u4F7F\u7528\u4EE5\u4E0B\u683C\u5F0F\uFF1A\n\n```markdown\n## \u65B9\u6848 X\uFF1A[\u65B9\u6848\u540D]\n\n### \u786E\u5B9A\u7684\u90E8\u5206\n- [\u6761\u76EE]\n\n### \u4E0D\u786E\u5B9A\u7684\u90E8\u5206\n- \u26A0\uFE0F [\u4E0D\u786E\u5B9A\u70B9]\uFF1A[\u8BF4\u660E]\n\n### \u98CE\u9669\u8BC4\u4F30\n- \u6280\u672F\u98CE\u9669\uFF1A\u4F4E/\u4E2D/\u9AD8\n- \u56DE\u6EDA\u6210\u672C\uFF1A\u4F4E/\u4E2D/\u9AD8\n```\n\n### \u6B65\u9AA43\uFF1A\u7B49\u5F85\u5F00\u53D1\u8005\u9009\u62E9\n\n\u8F93\u51FA\u6240\u6709\u65B9\u6848\u540E\uFF0C\u7B49\u5F85\u5F00\u53D1\u8005\u660E\u786E\u9009\u62E9\uFF0C\u4E0D\u8981\u81EA\u884C\u63A8\u8FDB\u3002\n\n### \u6B65\u9AA44\uFF1A\u751F\u6210 Spec \u5316 current-plan.md\n\n\u5F00\u53D1\u8005\u9009\u5B9A\u65B9\u6848\u540E\uFF0C\u5199\u5165 `.devmind/current-plan.md`\uFF1A\n\n```markdown\n# \u8BA1\u5212\uFF1A[\u4EFB\u52A1\u540D\u79F0]\n\n> \u9009\u5B9A\u65E5\u671F\uFF1AYYYY-MM-DD \u65B9\u6848\uFF1A[\u65B9\u6848\u540D]\n\n## Spec\n\n### \u7EA6\u675F\uFF08\u4E0D\u53EF\u8FDD\u53CD\uFF0C\u8FDD\u53CD\u65F6\u81EA\u52A8\u6682\u505C\uFF09\n- [\u7EA6\u675F\u6761\u76EE]\n\n### \u9884\u671F\u4EA7\u51FA\uFF08\u53EF\u9A8C\u8BC1\uFF09\n- [ ] [\u53EF\u9A8C\u8BC1\u7684\u4EA7\u51FA\u6761\u76EE]\n\n### \u5141\u8BB8\u4FEE\u6539\u7684\u6587\u4EF6\u8303\u56F4\n- [\u6587\u4EF6\u6216\u76EE\u5F55]\n\n### \u660E\u786E\u6392\u9664\uFF08\u4FEE\u6539\u8FD9\u4E9B\u6587\u4EF6\u65F6\u5FC5\u987B\u6682\u505C\u786E\u8BA4\uFF09\n- [\u6587\u4EF6\u6216\u76EE\u5F55]\n\n## \u6267\u884C\u6B65\u9AA4\n\n1. [\u6B65\u9AA4]\n```\n\n## \u6CE8\u610F\n\n- \u4E0D\u4FEE\u6539\u4EFB\u4F55\u4E1A\u52A1\u4EE3\u7801\uFF08Hook \u5F3A\u5236\u6267\u884C\uFF09\n- \u65B9\u6848\u5BF9\u6BD4\u8981\u5BA2\u89C2\uFF0C\u4E0D\u8981\u504F\u5411\u590D\u6742\u65B9\u6848\n";
4
4
  export declare const CMD_BUILD = "---\ndescription: \u6309\u786E\u8BA4\u8BA1\u5212\u4E25\u683C\u6267\u884C\uFF0C\u652F\u6301\u65AD\u70B9\u7EED\u4F20\uFF0C\u9047\u8BA1\u5212\u5916\u5206\u53C9\u81EA\u52A8\u6682\u505C\n---\n\n\u8FDB\u5165 **BUILD \u6A21\u5F0F**\uFF08Spec \u6267\u884C\uFF09\u3002\n\n## \u524D\u7F6E\u64CD\u4F5C\n\n```sh\necho \"build\" > .devmind/current-mode.txt\n```\n\n## \u542F\u52A8\u68C0\u67E5\n\n### 1. \u68C0\u67E5\u5386\u53F2\u68C0\u67E5\u70B9\n\n\u8BFB\u53D6 `.devmind/session.yaml`\uFF08\u5982\u679C\u5B58\u5728\uFF09\uFF1A\n\n\u5982\u679C\u6709 `status: paused` \u7684\u68C0\u67E5\u70B9\uFF0C**\u7ACB\u5373\u544A\u77E5**\u5F00\u53D1\u8005\uFF1A\n```\n\u4E0A\u6B21\u4EFB\u52A1\uFF1A[\u8BA1\u5212\u540D]\n\u5DF2\u5B8C\u6210\uFF1A[\u5DF2\u5B8C\u6210\u68C0\u67E5\u70B9\u5217\u8868]\n\u5F85\u7EED\uFF1A[\u6682\u505C\u68C0\u67E5\u70B9] \u2014 \u539F\u56E0\uFF1A[\u6682\u505C\u539F\u56E0]\n\n\u8BF7\u9009\u62E9\uFF1A\n(1) \u4ECE\u65AD\u70B9\u7EE7\u7EED\n(2) \u91CD\u65B0\u5F00\u59CB\uFF08\u6E05\u9664\u5386\u53F2\u68C0\u67E5\u70B9\uFF09\n```\n\n### 2. \u52A0\u8F7D\u6267\u884C\u7EA6\u675F\n\n\u8BFB\u53D6 `.devmind/current-plan.md` \u7684 Spec \u533A\u5757\u3002\n\n\u5982\u679C `current-plan.md` \u4E0D\u5B58\u5728\u6216\u6CA1\u6709 Spec \u533A\u5757\uFF0C\u505C\u6B62\u5E76\u63D0\u793A\uFF1A\n```\n\u7F3A\u5C11\u6267\u884C\u8BA1\u5212\u3002\u8BF7\u5148\u4F7F\u7528 /dm:plan \u5236\u5B9A\u65B9\u6848\u3002\n```\n\n## \u6267\u884C\u89C4\u5219\n\n1. **\u4E25\u683C\u6309\u7167\u6267\u884C\u6B65\u9AA4\u63A8\u8FDB**\uFF0C\u4E0D\u8DF3\u6B65\n2. \u6BCF\u5B8C\u6210\u4E00\u4E2A\u6B65\u9AA4\uFF0C\u5411 `session.yaml` \u8FFD\u52A0\u68C0\u67E5\u70B9\n3. \u9047\u5230\u8BA1\u5212\u5916\u6587\u4EF6\u3001\u4F9D\u8D56\u6216\u7EA6\u675F\u51B2\u7A81\u65F6**\u7ACB\u5373\u6682\u505C**\n\n## \u5B8C\u6210\u540E\n\n\u8F93\u51FA\u6267\u884C\u6458\u8981\uFF0C\u5EFA\u8BAE\u4F7F\u7528 `/dm:remember` \u6C89\u6DC0\u51B3\u7B56\u3002\n";
5
5
  //# sourceMappingURL=templates-commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates-commands.d.ts","sourceRoot":"","sources":["../src/templates-commands.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,sqDAiCvB,CAAC;AAEF,eAAO,MAAM,QAAQ,wwCA0BpB,CAAC;AAEF,eAAO,MAAM,QAAQ,ouGAyFpB,CAAC;AAEF,eAAO,MAAM,SAAS,g3DA+CrB,CAAC"}
1
+ {"version":3,"file":"templates-commands.d.ts","sourceRoot":"","sources":["../src/templates-commands.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,sqDAiCvB,CAAC;AAEF,eAAO,MAAM,QAAQ,42DAuCpB,CAAC;AAEF,eAAO,MAAM,QAAQ,ouGAyFpB,CAAC;AAEF,eAAO,MAAM,SAAS,g3DA+CrB,CAAC"}
@@ -47,18 +47,31 @@ echo "edit" > .devmind/current-mode.txt
47
47
 
48
48
  ## 行为规则
49
49
 
50
- - 可直接修改文件,无需预先制定计划
51
- - **跨文件改动超过 2 个文件时**,先列出改动清单,等待确认后再执行
52
- - 修改完成后,简要说明做了什么
50
+ - 允许修改文件,但**优先最小化改动范围**
51
+ - **修改超过 2 个文件前**,必须先输出清单并等待确认,未经确认不得执行:
53
52
 
54
- ## 调试场景使用方式
53
+ \`\`\`
54
+ 即将修改多个文件:
55
+ - [文件1]:[修改原因]
56
+ - [文件2]:[修改原因]
57
+ - [文件3]:[修改原因]
58
+
59
+ 超过 2 个文件,继续?(y/n)
60
+ \`\`\`
55
61
 
56
- - **诊断阶段**:使用 \`/dm:explore\`(只读,定位根因)
57
- - **修复阶段**:切换到 \`/dm:edit\`(最小化修复)
62
+ - 不新增 npm/pip/go 依赖,不做架构级修改
63
+ - 每次修改前简要说明:改什么、为什么、预期效果
58
64
 
59
- ## 注意
65
+ ## 适用场景
66
+
67
+ - 修复已定位的 bug(先用 \`/dm:explore\` 诊断,再切此模式修复)
68
+ - 实施小型功能改动(已知改什么、改哪里)
69
+ - 小范围实验性修改
70
+
71
+ ## 完成后
60
72
 
61
- Edit 模式适合明确的小范围改动。如果改动范围扩大,建议切换到 \`/dm:plan\` 制定方案。
73
+ 建议使用 \`/dm:remember\` 记录有价值的发现(如果发现了重要规律)。
74
+ 如果改动方案复杂,建议先切换到 \`/dm:plan\` 制定方案。
62
75
  `;
63
76
  export const CMD_PLAN = `---
64
77
  description: 制定结构化方案,强制检索 Graveyard 防止重蹈覆辙,等待开发者选择后生成 Spec
@@ -1 +1 @@
1
- {"version":3,"file":"templates-commands.js","sourceRoot":"","sources":["../src/templates-commands.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC1B,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BvB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFvB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CxB,CAAC"}
1
+ {"version":3,"file":"templates-commands.js","sourceRoot":"","sources":["../src/templates-commands.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC1B,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCvB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFvB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CxB,CAAC"}
@@ -5,4 +5,5 @@ export declare const CMD_AUDIT = "---\ndescription: \u67E5\u770B\u6587\u4EF6\u4F
5
5
  export declare const CMD_SYNC_MEMORY = "---\ndescription: \u540C\u6B65\u56E2\u961F\u8BB0\u5FC6\uFF08git pull + \u91CD\u5EFA\u7D22\u5F15 + \u51B2\u7A81\u68C0\u6D4B\uFF09\n---\n\n\u6267\u884C **SYNC-MEMORY**\u2014\u2014\u540C\u6B65\u56E2\u961F\u8BB0\u5FC6\u3002\n\n## \u6267\u884C\u6B65\u9AA4\n\n### \u6B65\u9AA41\uFF1A\u62C9\u53D6\u6700\u65B0\u53D8\u66F4\n\n```sh\ngit pull origin main\n```\n\n\u5982\u679C\u5931\u8D25\uFF08\u51B2\u7A81\u6216\u7F51\u7EDC\u95EE\u9898\uFF09\uFF0C\u505C\u6B62\u5E76\u63D0\u793A\u5F00\u53D1\u8005\u624B\u52A8\u5904\u7406\u3002\n\n### \u6B65\u9AA42\uFF1A\u68C0\u67E5 memory/ \u51B2\u7A81\n\n```sh\ngit status | grep \"memory/\"\n```\n\n\u5982\u679C\u6709\u51B2\u7A81\u6587\u4EF6\uFF0C\u8F93\u51FA\uFF1A\n```\n\u26A0\uFE0F \u53D1\u73B0 memory/ \u76EE\u5F55\u4E0B\u6709\u5408\u5E76\u51B2\u7A81\uFF1A\n- [\u51B2\u7A81\u6587\u4EF6\u5217\u8868]\n\n\u8BF7\u624B\u52A8\u89E3\u51B3\u51B2\u7A81\u540E\uFF0C\u91CD\u65B0\u8FD0\u884C /dm:sync-memory\n```\n\n### \u6B65\u9AA43\uFF1A\u91CD\u5EFA\u7D22\u5F15\n\n```sh\n.devmind/scripts/rebuild-index.sh\n```\n\n### \u6B65\u9AA44\uFF1A\u8F93\u51FA\u540C\u6B65\u6458\u8981\n\n```\n\u540C\u6B65\u5B8C\u6210\uFF1A\n- \u62C9\u53D6\u4E86 N \u4E2A\u65B0\u63D0\u4EA4\n- memory/ \u65B0\u589E/\u4FEE\u6539\u4E86 M \u4E2A\u6587\u4EF6\n- \u7D22\u5F15\u5DF2\u66F4\u65B0\uFF1AX \u6761 Decisions\uFF0CY \u6761 Patterns\uFF0CZ \u6761 Graveyard\n```\n\n## \u6CE8\u610F\n\n\u4E2A\u4EBA\u4F7F\u7528\u65F6\uFF0C\u76F4\u63A5\u8FD0\u884C `.devmind/scripts/rebuild-index.sh` \u5373\u53EF\uFF0C\u65E0\u9700 git pull\u3002\n";
6
6
  export declare const CMD_PUBLISH = "---\ndescription: \u5C06\u5F53\u524D\u529F\u80FD\u6574\u7406\u4E3A\u6587\u6863\u5199\u5165 docs/designs/draft/\n---\n\n\u8FDB\u5165 **PUBLISH \u6A21\u5F0F**\uFF08\u751F\u6210\u529F\u80FD\u6587\u6863\uFF09\u3002\n\n## \u6267\u884C\u6B65\u9AA4\n\n### \u6B65\u9AA41\uFF1A\u6536\u96C6\u4FE1\u606F\n\n\u8BFB\u53D6\u4EE5\u4E0B\u5185\u5BB9\uFF1A\n- `.devmind/current-plan.md`\uFF08\u5F53\u524D\u6216\u521A\u5B8C\u6210\u7684\u8BA1\u5212\uFF09\n- `.devmind/memory/decisions/`\uFF08\u672C\u6B21\u4EFB\u52A1\u76F8\u5173\u7684\u51B3\u7B56\uFF0C\u6309\u65E5\u671F\u5224\u65AD\uFF09\n\n### \u6B65\u9AA42\uFF1A\u786E\u5B9A\u6587\u6863 slug\n\n\u6839\u636E\u8BA1\u5212\u6807\u9898\u751F\u6210 slug\uFF08kebab-case\uFF0C\u82F1\u6587\uFF09\uFF0C\u5411\u5F00\u53D1\u8005\u786E\u8BA4\uFF1A\n\n```\n\u5373\u5C06\u751F\u6210\u6587\u6863\uFF1Adocs/designs/draft/<slug>.md\n\u6587\u6863\u6807\u9898\uFF1A[\u6807\u9898]\n\n\u786E\u8BA4\uFF1F(1) \u786E\u8BA4 (2) \u4FEE\u6539 slug\n```\n\n### \u6B65\u9AA43\uFF1A\u751F\u6210\u6587\u6863\n\n\u5199\u5165 `docs/designs/draft/<slug>.md`\uFF0C\u683C\u5F0F\u5982\u4E0B\uFF1A\n\n```markdown\n# <\u529F\u80FD\u6807\u9898>\n\n> \u751F\u6210\u65E5\u671F\uFF1AYYYY-MM-DD\n\n## \u80CC\u666F\n\n<\u4E3A\u4EC0\u4E48\u8981\u505A\u8FD9\u4E2A\u529F\u80FD\uFF0C\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898>\n\n## \u65B9\u6848\u8BBE\u8BA1\n\n<\u5177\u4F53\u5B9E\u73B0\u65B9\u6848\uFF0C\u67B6\u6784\u8BF4\u660E\uFF0C\u5173\u952E\u8BBE\u8BA1\u51B3\u7B56>\n\n## \u529F\u80FD\u8303\u56F4\n\n<\u672C\u6B21\u5B9E\u73B0\u4E86\u4EC0\u4E48\uFF0C\u660E\u786E\u6392\u9664\u4E86\u4EC0\u4E48>\n\n## \u5173\u952E\u51B3\u7B56\n\n<\u5217\u51FA\u672C\u6B21\u6D89\u53CA\u7684\u91CD\u8981\u51B3\u7B56\u53CA\u7406\u7531>\n\n## \u5DF2\u77E5\u9650\u5236 / \u540E\u7EED\u8BA1\u5212\n\n<\u5F53\u524D\u65B9\u6848\u7684\u9650\u5236\uFF0C\u4EE5\u53CA\u8BA1\u5212\u5728\u672A\u6765\u7248\u672C\u4E2D\u6539\u8FDB\u7684\u70B9>\n```\n\n### \u6B65\u9AA44\uFF1A\u63D0\u793A\u52A0\u5165 milestone\uFF08\u53EF\u9009\uFF09\n\n\u8F93\u51FA\uFF1A\n\n```\n\u6587\u6863\u5DF2\u751F\u6210\uFF1Adocs/designs/draft/<slug>.md\n\n\u662F\u5426\u52A0\u5165\u67D0\u4E2A milestone\uFF1F\n(1) \u6682\u4E0D\u5F52\u5165\uFF08\u4FDD\u7559\u5728 draft/\uFF09\n(2) \u8F93\u5165\u7248\u672C\u53F7\uFF08\u5982 v0.1\uFF09\uFF0C\u5728 /dm:release \u65F6\u4F1A\u81EA\u52A8\u6536\u5F55\n```\n\n\u5982\u679C\u7528\u6237\u8F93\u5165\u7248\u672C\u53F7\uFF0C\u5728\u6587\u6863\u5934\u90E8\u8FFD\u52A0 frontmatter\uFF1A\n\n```markdown\n---\nmilestone: vxx\n---\n```\n\n## \u6CE8\u610F\n\n- \u6587\u6863\u9762\u5411\u4EBA\u7C7B\u5F00\u53D1\u8005\uFF0C\u8BED\u8A00\u6E05\u6670\u53EF\u8BFB\uFF0C\u907F\u514D AI \u5143\u6570\u636E\u8BED\u8A00\n- \u4E0D\u4FEE\u6539 `.devmind/memory/` \u4E0B\u7684\u4EFB\u4F55\u6587\u4EF6\uFF08\u90A3\u662F /dm:remember \u7684\u804C\u8D23\uFF09\n- \u5982\u9700\u540C\u65F6\u6C89\u6DC0 AI \u8BB0\u5FC6\uFF0C\u6267\u884C\u5B8C\u540E\u63D0\u793A\u4F7F\u7528 `/dm:remember`\n";
7
7
  export declare const CMD_RELEASE = "---\ndescription: \u6C47\u603B docs/designs/draft/ \u751F\u6210\u7248\u672C\u6587\u6863\uFF0C\u5F52\u6863\u529F\u80FD\u6587\u6863\n---\n\n\u8FDB\u5165 **RELEASE \u6A21\u5F0F**\uFF08\u751F\u6210\u7248\u672C\u6587\u6863\uFF09\u3002\n\n## \u6267\u884C\u6B65\u9AA4\n\n### \u6B65\u9AA41\uFF1A\u8BFB\u53D6 draft/ \u5185\u5BB9\n\n\u8BFB\u53D6 `docs/designs/draft/` \u4E0B\u6240\u6709 `.md` \u6587\u4EF6\uFF08\u5FFD\u7565 `.gitkeep`\uFF09\u3002\n\n\u5982\u679C draft/ \u4E3A\u7A7A\uFF0C\u505C\u6B62\u5E76\u63D0\u793A\uFF1A\n\n```\ndocs/designs/draft/ \u76EE\u5F55\u4E3A\u7A7A\uFF0C\u6CA1\u6709\u53EF\u53D1\u5E03\u7684\u529F\u80FD\u6587\u6863\u3002\n\u8BF7\u5148\u4F7F\u7528 /dm:publish \u751F\u6210\u529F\u80FD\u6587\u6863\u3002\n```\n\n### \u6B65\u9AA42\uFF1A\u786E\u8BA4\u7248\u672C\u53F7\n\n\u5411\u5F00\u53D1\u8005\u786E\u8BA4\u7248\u672C\u53F7\uFF1A\n\n```\ndraft/ \u4E0B\u5171\u6709 N \u4E2A\u529F\u80FD\u6587\u6863\uFF1A\n- <slug1>.md \u2014 <\u6807\u9898>\n- <slug2>.md \u2014 <\u6807\u9898>\n...\n\n\u8BF7\u8F93\u5165\u7248\u672C\u53F7\uFF08\u5982 v1.0\u3001v0.2-beta\uFF09\uFF1A\n```\n\n### \u6B65\u9AA43\uFF1A\u751F\u6210\u7248\u672C\u6587\u6863\n\n\u5199\u5165 `docs/releases/<version>.md`\uFF0C\u683C\u5F0F\u5982\u4E0B\uFF1A\n\n```markdown\n# Release <version>\n\n> \u53D1\u5E03\u65E5\u671F\uFF1AYYYY-MM-DD\n\n## \u672C\u7248\u672C\u5305\u542B\n\n<\u9010\u6761\u5217\u51FA\u5404\u529F\u80FD\u7684\u7B80\u8981\u8BF4\u660E\uFF0C\u9644\u94FE\u63A5\u5230\u5BF9\u5E94\u8BBE\u8BA1\u6587\u6863>\n\n- **[\u529F\u80FD\u6807\u9898](../designs/<version>/<slug>.md)**\uFF1A<\u4E00\u53E5\u8BDD\u8BF4\u660E>\n\n## \u67B6\u6784\u53D8\u5316\n\n<\u5982\u6709\u91CD\u5927\u67B6\u6784\u8C03\u6574\uFF0C\u5728\u6B64\u8BF4\u660E\uFF1B\u65E0\u5219\u7701\u7565>\n\n## \u5DF2\u77E5\u95EE\u9898 / \u540E\u7EED\u8BA1\u5212\n\n<\u5F53\u524D\u7248\u672C\u7684\u9650\u5236\uFF0C\u4E0B\u4E00\u7248\u672C\u7684\u65B9\u5411>\n```\n\n### \u6B65\u9AA44\uFF1A\u5F52\u6863 draft/\n\n\u6267\u884C\u4EE5\u4E0B\u64CD\u4F5C\uFF1A\n1. \u5C06 `docs/designs/draft/` \u91CD\u547D\u540D\u4E3A `docs/designs/<version>/`\n2. \u65B0\u5EFA\u7A7A\u7684 `docs/designs/draft/` \u76EE\u5F55\uFF0C\u5199\u5165 `.gitkeep`\n\n\u5411\u5F00\u53D1\u8005\u786E\u8BA4\u540E\u6267\u884C\uFF1A\n\n```\n\u5373\u5C06\u6267\u884C\uFF1A\n docs/designs/draft/ \u2192 docs/designs/<version>/\n \u65B0\u5EFA\u7A7A docs/designs/draft/\n\n\u786E\u8BA4\uFF1F(1) \u786E\u8BA4 (2) \u53D6\u6D88\n```\n\n### \u6B65\u9AA45\uFF1A\u5B8C\u6210\u63D0\u793A\n\n```\n\u2713 \u7248\u672C\u6587\u6863\u5DF2\u751F\u6210\uFF1Adocs/releases/<version>.md\n\u2713 \u529F\u80FD\u6587\u6863\u5DF2\u5F52\u6863\uFF1Adocs/designs/<version>/\n\u2713 draft/ \u5DF2\u91CD\u7F6E\uFF0C\u53EF\u5F00\u59CB\u8BB0\u5F55\u4E0B\u4E00\u7248\u672C\u529F\u80FD\n\n\u5EFA\u8BAE\uFF1A\u4F7F\u7528 /dm:remember \u5C06\u672C\u7248\u672C\u7684\u5173\u952E\u51B3\u7B56\u6C89\u6DC0\u4E3A AI \u8BB0\u5FC6\n```\n\n## \u6CE8\u610F\n\n- \u91CD\u547D\u540D\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\uFF0C\u6267\u884C\u524D\u5FC5\u987B\u5411\u7528\u6237\u786E\u8BA4\n- \u4E0D\u4FEE\u6539 `.devmind/memory/` \u4E0B\u7684\u4EFB\u4F55\u6587\u4EF6\n- \u7248\u672C\u53F7\u683C\u5F0F\u7531\u7528\u6237\u51B3\u5B9A\uFF0C\u4E0D\u5F3A\u5236\u89C4\u8303\n";
8
+ export declare const CMD_MIGRATE = "---\ndescription: \u7406\u89E3\u5F53\u524D\u9879\u76EE\u5E76\u8FC1\u79FB\u5230 DevMind \u8BB0\u5FC6\u7CFB\u7EDF\uFF08\u652F\u6301\u901A\u7528\u9879\u76EE\u548C OpenSpec \u9879\u76EE\uFF09\n---\n\n\u6267\u884C **MIGRATE**\u2014\u2014\u8BFB\u53D6\u9879\u76EE\u73B0\u72B6\uFF0C\u5C06\u5DF2\u6709\u77E5\u8BC6\u8FC1\u79FB\u5230 DevMind \u8BB0\u5FC6\u7CFB\u7EDF\u3002\n\n## \u524D\u7F6E\u64CD\u4F5C\n\n```sh\necho \"edit\" > .devmind/current-mode.txt\n```\n\n## \u6267\u884C\u6B65\u9AA4\n\n### \u6B65\u9AA41\uFF1A\u8BFB\u53D6\u8FC1\u79FB\u6E05\u5355\n\n\u8BFB\u53D6 `.devmind/migrate-checklist.md`\u3002\n\n\u5982\u679C\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u63D0\u793A\uFF1A\n```\n\u672A\u627E\u5230\u8FC1\u79FB\u6E05\u5355\u3002\u8BF7\u5148\u5728\u7EC8\u7AEF\u8FD0\u884C\uFF1A\n devmind migrate\n```\n\n\u4ECE\u6E05\u5355\u4E2D\u63D0\u53D6\uFF1A\n- \u9879\u76EE\u540D\u79F0\n- \u6280\u672F\u6808\n- \u662F\u5426\u4E3A OpenSpec \u9879\u76EE\n- \u8FDB\u884C\u4E2D / \u5DF2\u5F52\u6863\u7684 OpenSpec changes\uFF08\u5982\u6709\uFF09\n\n### \u6B65\u9AA42\uFF1A\u63A2\u7D22\u9879\u76EE\n\n\u8FDB\u5165\u53EA\u8BFB\u63A2\u7D22\uFF0C**\u4E0D\u4FEE\u6539\u4EFB\u4F55\u4E1A\u52A1\u6587\u4EF6**\u3002\n\n\u6309\u4F18\u5148\u7EA7\u8BFB\u53D6\uFF1A\n1. `README.md`\uFF08\u6216 `README.mdx`\uFF09\n2. \u9879\u76EE\u6839\u76EE\u5F55\u7ED3\u6784\uFF08`ls` \u6216 `tree -L 2`\uFF09\n3. \u4E3B\u8981\u6E90\u7801\u76EE\u5F55\uFF08`src/`\u3001`pkg/`\u3001`lib/` \u7B49\uFF09\u9876\u5C42\u6587\u4EF6\u5217\u8868\n4. \u5982\u679C\u662F OpenSpec \u9879\u76EE\uFF1A\u8BFB\u53D6 `openspec/specs/` \u4E0B\u7684 spec \u6587\u4EF6\n\n**\u76EE\u6807**\uFF1A\u7406\u89E3\u9879\u76EE\u7684\u6838\u5FC3\u67B6\u6784\u548C\u5173\u952E\u8BBE\u8BA1\u51B3\u7B56\uFF0C\u4E0D\u8981\u6DF1\u5165\u6BCF\u4E2A\u5B9E\u73B0\u6587\u4EF6\u3002\n\n### \u6B65\u9AA43\uFF1A\u66F4\u65B0 config.yaml\n\n\u5C06 `.devmind/config.yaml` \u4E2D\u7684 `project: MyProject` \u66FF\u6362\u4E3A\u5B9E\u9645\u9879\u76EE\u540D\u79F0\u3002\n\n### \u6B65\u9AA44\uFF1A\u63D0\u70BC\u5E76\u5199\u5165\u8BB0\u5FC6\n\n#### 4a\uFF1A\u67B6\u6784\u51B3\u7B56 \u2192 memory/decisions/\n\n\u8BC6\u522B 1-5 \u4E2A\u6700\u91CD\u8981\u7684**\u5DF2\u843D\u5730**\u67B6\u6784\u51B3\u7B56\uFF0C\u5199\u5165 `.devmind/memory/decisions/YYYY-MM-DD_[slug].md`\u3002\n\n\u51B3\u7B56\u8BC6\u522B\u6807\u51C6\uFF1A\n- \u6280\u672F\u9009\u578B\uFF08\u4E3A\u4EC0\u4E48\u9009 X \u800C\u4E0D\u662F Y\uFF09\n- \u67B6\u6784\u8FB9\u754C\uFF08\u6A21\u5757\u5982\u4F55\u5212\u5206\uFF09\n- \u6570\u636E\u6A21\u578B\u6838\u5FC3\u7EA6\u5B9A\n- \u91CD\u8981\u7684 trade-off\n\n\u5982\u679C\u662F OpenSpec \u9879\u76EE\uFF0C\u5C06 `openspec/changes/archive/` \u4E2D\u7684\u6BCF\u4E2A\u5F52\u6863\u53D8\u66F4\u8F6C\u6362\u4E3A\u4E00\u6761 decision\uFF1A\n- \u6807\u9898\u6765\u81EA `proposal.md` \u7684 H1\n- \u6458\u8981\u6765\u81EA `proposal.md` \u7684\u80CC\u666F/\u76EE\u7684\n- \u51B3\u7B56\u5185\u5BB9\u6765\u81EA `design.md`\uFF08\u5982\u5B58\u5728\uFF09\n\n#### 4b\uFF1A\u5F00\u53D1\u89C4\u5F8B \u2192 memory/patterns/\n\n\u8BC6\u522B 1-3 \u4E2A\u9879\u76EE\u7279\u6709\u7684**\u5F00\u53D1\u89C4\u5F8B**\uFF0C\u5199\u5165 `.devmind/memory/patterns/[slug].md`\u3002\n\n\u89C4\u5F8B\u8BC6\u522B\u6807\u51C6\uFF1A\n- \u9879\u76EE\u72EC\u7279\u7684\u4EE3\u7801\u7EC4\u7EC7\u65B9\u5F0F\n- \u7279\u5B9A\u7684\u547D\u540D\u6216\u6587\u4EF6\u7ED3\u6784\u7EA6\u5B9A\n- \u5F00\u53D1\u73AF\u5883\u7684\u7279\u6B8A\u8981\u6C42\uFF08\u5982\u6784\u5EFA\u5DE5\u5177\u9650\u5236\uFF09\n\n#### 4c\uFF1A\u8FDB\u884C\u4E2D\u7684\u53D8\u66F4 \u2192 current-plan.md\uFF08\u4EC5 OpenSpec \u9879\u76EE\uFF09\n\n\u5982\u679C\u5B58\u5728\u8FDB\u884C\u4E2D\u7684 OpenSpec change\uFF08`openspec/changes/<name>/`\uFF0C\u975E archive\uFF09\uFF0C\n\u8BFB\u53D6\u5176 `proposal.md` \u548C `tasks.md`\uFF0C\u751F\u6210\u5BF9\u5E94\u7684 `.devmind/current-plan.md`\uFF1A\n\n```markdown\n# \u8BA1\u5212\uFF1A[proposal \u6807\u9898]\n\n> \u8FC1\u79FB\u81EA OpenSpec change: [change-name] \u65E5\u671F\uFF1AYYYY-MM-DD\n\n## Spec\n\n### \u9884\u671F\u4EA7\u51FA\uFF08\u53EF\u9A8C\u8BC1\uFF09\n- [ ] [tasks.md \u4E2D\u6BCF\u4E2A\u672A\u5B8C\u6210\u7684\u4EFB\u52A1]\n\n### \u5141\u8BB8\u4FEE\u6539\u7684\u6587\u4EF6\u8303\u56F4\n- \uFF08\u6839\u636E proposal/design \u63A8\u65AD\uFF09\n\n## \u6267\u884C\u6B65\u9AA4\n\n[\u6839\u636E tasks.md \u8F6C\u6362]\n```\n\n\u5982\u6709\u591A\u4E2A\u8FDB\u884C\u4E2D\u7684 change\uFF0C\u53EA\u8F6C\u6362\u7B2C\u4E00\u4E2A\uFF0C\u5176\u4F59\u4F5C\u4E3A decisions \u8BB0\u5F55\u3002\n\n#### 4d\uFF1A\u88AB\u653E\u5F03\u7684\u65B9\u6848 \u2192 memory/graveyard/\uFF08\u53EF\u9009\uFF09\n\n\u5982\u679C\u5728 git log \u6216\u9879\u76EE\u5386\u53F2\u4E2D\u53D1\u73B0\u660E\u663E\u88AB\u653E\u5F03\u7684\u6280\u672F\u65B9\u6848\uFF0C\u8BE2\u95EE\u5F00\u53D1\u8005\uFF1A\n\n```\n\u53D1\u73B0\u53EF\u80FD\u88AB\u653E\u5F03\u7684\u65B9\u6848\uFF1A[\u65B9\u6848\u63CF\u8FF0]\n\u662F\u5426\u5199\u5165 Graveyard\uFF1F(y/n/skip-all)\n```\n\n### \u6B65\u9AA45\uFF1A\u91CD\u5EFA\u7D22\u5F15\n\n```sh\n.devmind/scripts/rebuild-index.sh\n```\n\n### \u6B65\u9AA46\uFF1A\u8F93\u51FA\u8FC1\u79FB\u6458\u8981\n\n```\n\u8FC1\u79FB\u5B8C\u6210\uFF1A\n\n\u2713 config.yaml \u5DF2\u66F4\u65B0\uFF1Aproject: [\u9879\u76EE\u540D]\n\u2713 \u5199\u5165 N \u6761 Decisions\uFF1A\n - [\u6587\u4EF6\u540D]\uFF1A[\u6458\u8981]\n\u2713 \u5199\u5165 M \u6761 Patterns\uFF1A\n - [\u6587\u4EF6\u540D]\uFF1A[\u6458\u8981]\n[\u2713 current-plan.md \u5DF2\u4ECE OpenSpec change \u8F6C\u6362]\n\u2713 \u7D22\u5F15\u5DF2\u91CD\u5EFA\n\n\u5EFA\u8BAE\u4E0B\u4E00\u6B65\uFF1A\n /dm:explore \u2014 \u5F00\u59CB\u63A2\u7D22\u9879\u76EE\uFF0CDevMind \u5DF2\u52A0\u8F7D\u9879\u76EE\u80CC\u666F\n```\n\n## \u6CE8\u610F\n\n- \u4E0D\u4FEE\u6539\u4EFB\u4F55\u4E1A\u52A1\u4EE3\u7801\uFF08src/\u3001lib/ \u7B49\uFF09\n- \u4E0D\u5220\u9664 OpenSpec \u6587\u4EF6\uFF08\u53EA\u8BFB\u53D6\uFF0C\u4E0D\u8FC1\u79FB\u6389\u539F\u6587\u4EF6\uFF09\n- \u8BB0\u5FC6\u6587\u4EF6\u5B81\u53EF\u5C11\u5199\u3001\u5199\u51C6\uFF0C\u4E0D\u8981\u4E3A\u586B\u5145\u6570\u91CF\u800C\u751F\u6210\u4F4E\u8D28\u91CF\u6761\u76EE\n- \u5B8C\u6210\u540E\u5C06\u6A21\u5F0F\u5207\u56DE explore\uFF1A`echo \"explore\" > .devmind/current-mode.txt`\n";
8
9
  //# sourceMappingURL=templates-commands2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates-commands2.d.ts","sourceRoot":"","sources":["../src/templates-commands2.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,myEA+CxB,CAAC;AAEF,eAAO,MAAM,UAAU,2iDA0CtB,CAAC;AAEF,eAAO,MAAM,QAAQ,6kEAqDpB,CAAC;AAEF,eAAO,MAAM,SAAS,mqDA4BrB,CAAC;AAEF,eAAO,MAAM,eAAe,u/CAgD3B,CAAC;AAEF,eAAO,MAAM,WAAW,y3FAgFvB,CAAC;AAEF,eAAO,MAAM,WAAW,6pGAuFvB,CAAC"}
1
+ {"version":3,"file":"templates-commands2.d.ts","sourceRoot":"","sources":["../src/templates-commands2.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,myEA+CxB,CAAC;AAEF,eAAO,MAAM,UAAU,2iDA0CtB,CAAC;AAEF,eAAO,MAAM,QAAQ,6kEAqDpB,CAAC;AAEF,eAAO,MAAM,SAAS,mqDA4BrB,CAAC;AAEF,eAAO,MAAM,eAAe,u/CAgD3B,CAAC;AAEF,eAAO,MAAM,WAAW,y3FAgFvB,CAAC;AAEF,eAAO,MAAM,WAAW,6pGAuFvB,CAAC;AAEF,eAAO,MAAM,WAAW,iiMAuIvB,CAAC"}
@@ -1,4 +1,4 @@
1
- // templates-commands2.ts — Slash command templates (part 2: remember/recall/bury/audit/sync-memory/publish/release)
1
+ // templates-commands2.ts — Slash command templates (part 2: remember/recall/bury/audit/sync-memory/publish/release/migrate)
2
2
  export const CMD_REMEMBER = `---
3
3
  description: 将本次会话中出现的决策和经验规律沉淀为记忆文件
4
4
  ---
@@ -391,4 +391,140 @@ draft/ 下共有 N 个功能文档:
391
391
  - 不修改 \`.devmind/memory/\` 下的任何文件
392
392
  - 版本号格式由用户决定,不强制规范
393
393
  `;
394
+ export const CMD_MIGRATE = `---
395
+ description: 理解当前项目并迁移到 DevMind 记忆系统(支持通用项目和 OpenSpec 项目)
396
+ ---
397
+
398
+ 执行 **MIGRATE**——读取项目现状,将已有知识迁移到 DevMind 记忆系统。
399
+
400
+ ## 前置操作
401
+
402
+ \`\`\`sh
403
+ echo "edit" > .devmind/current-mode.txt
404
+ \`\`\`
405
+
406
+ ## 执行步骤
407
+
408
+ ### 步骤1:读取迁移清单
409
+
410
+ 读取 \`.devmind/migrate-checklist.md\`。
411
+
412
+ 如果文件不存在,提示:
413
+ \`\`\`
414
+ 未找到迁移清单。请先在终端运行:
415
+ devmind migrate
416
+ \`\`\`
417
+
418
+ 从清单中提取:
419
+ - 项目名称
420
+ - 技术栈
421
+ - 是否为 OpenSpec 项目
422
+ - 进行中 / 已归档的 OpenSpec changes(如有)
423
+
424
+ ### 步骤2:探索项目
425
+
426
+ 进入只读探索,**不修改任何业务文件**。
427
+
428
+ 按优先级读取:
429
+ 1. \`README.md\`(或 \`README.mdx\`)
430
+ 2. 项目根目录结构(\`ls\` 或 \`tree -L 2\`)
431
+ 3. 主要源码目录(\`src/\`、\`pkg/\`、\`lib/\` 等)顶层文件列表
432
+ 4. 如果是 OpenSpec 项目:读取 \`openspec/specs/\` 下的 spec 文件
433
+
434
+ **目标**:理解项目的核心架构和关键设计决策,不要深入每个实现文件。
435
+
436
+ ### 步骤3:更新 config.yaml
437
+
438
+ 将 \`.devmind/config.yaml\` 中的 \`project: MyProject\` 替换为实际项目名称。
439
+
440
+ ### 步骤4:提炼并写入记忆
441
+
442
+ #### 4a:架构决策 → memory/decisions/
443
+
444
+ 识别 1-5 个最重要的**已落地**架构决策,写入 \`.devmind/memory/decisions/YYYY-MM-DD_[slug].md\`。
445
+
446
+ 决策识别标准:
447
+ - 技术选型(为什么选 X 而不是 Y)
448
+ - 架构边界(模块如何划分)
449
+ - 数据模型核心约定
450
+ - 重要的 trade-off
451
+
452
+ 如果是 OpenSpec 项目,将 \`openspec/changes/archive/\` 中的每个归档变更转换为一条 decision:
453
+ - 标题来自 \`proposal.md\` 的 H1
454
+ - 摘要来自 \`proposal.md\` 的背景/目的
455
+ - 决策内容来自 \`design.md\`(如存在)
456
+
457
+ #### 4b:开发规律 → memory/patterns/
458
+
459
+ 识别 1-3 个项目特有的**开发规律**,写入 \`.devmind/memory/patterns/[slug].md\`。
460
+
461
+ 规律识别标准:
462
+ - 项目独特的代码组织方式
463
+ - 特定的命名或文件结构约定
464
+ - 开发环境的特殊要求(如构建工具限制)
465
+
466
+ #### 4c:进行中的变更 → current-plan.md(仅 OpenSpec 项目)
467
+
468
+ 如果存在进行中的 OpenSpec change(\`openspec/changes/<name>/\`,非 archive),
469
+ 读取其 \`proposal.md\` 和 \`tasks.md\`,生成对应的 \`.devmind/current-plan.md\`:
470
+
471
+ \`\`\`markdown
472
+ # 计划:[proposal 标题]
473
+
474
+ > 迁移自 OpenSpec change: [change-name] 日期:YYYY-MM-DD
475
+
476
+ ## Spec
477
+
478
+ ### 预期产出(可验证)
479
+ - [ ] [tasks.md 中每个未完成的任务]
480
+
481
+ ### 允许修改的文件范围
482
+ - (根据 proposal/design 推断)
483
+
484
+ ## 执行步骤
485
+
486
+ [根据 tasks.md 转换]
487
+ \`\`\`
488
+
489
+ 如有多个进行中的 change,只转换第一个,其余作为 decisions 记录。
490
+
491
+ #### 4d:被放弃的方案 → memory/graveyard/(可选)
492
+
493
+ 如果在 git log 或项目历史中发现明显被放弃的技术方案,询问开发者:
494
+
495
+ \`\`\`
496
+ 发现可能被放弃的方案:[方案描述]
497
+ 是否写入 Graveyard?(y/n/skip-all)
498
+ \`\`\`
499
+
500
+ ### 步骤5:重建索引
501
+
502
+ \`\`\`sh
503
+ .devmind/scripts/rebuild-index.sh
504
+ \`\`\`
505
+
506
+ ### 步骤6:输出迁移摘要
507
+
508
+ \`\`\`
509
+ 迁移完成:
510
+
511
+ ✓ config.yaml 已更新:project: [项目名]
512
+ ✓ 写入 N 条 Decisions:
513
+ - [文件名]:[摘要]
514
+ ✓ 写入 M 条 Patterns:
515
+ - [文件名]:[摘要]
516
+ [✓ current-plan.md 已从 OpenSpec change 转换]
517
+ ✓ 索引已重建
518
+
519
+ 建议下一步:
520
+ /dm:explore — 开始探索项目,DevMind 已加载项目背景
521
+ \`\`\`
522
+
523
+ ## 注意
524
+
525
+ - 不修改任何业务代码(src/、lib/ 等)
526
+ - 不删除 OpenSpec 文件(只读取,不迁移掉原文件)
527
+ - 记忆文件宁可少写、写准,不要为填充数量而生成低质量条目
528
+ - 完成后将模式切回 explore:\`echo "explore" > .devmind/current-mode.txt\`
529
+ `;
394
530
  //# sourceMappingURL=templates-commands2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates-commands2.js","sourceRoot":"","sources":["../src/templates-commands2.ts"],"names":[],"mappings":"AAAA,oHAAoH;AAEpH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+C3B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CzB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDvB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BxB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgD9B,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgF1B,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuF1B,CAAC"}
1
+ {"version":3,"file":"templates-commands2.js","sourceRoot":"","sources":["../src/templates-commands2.ts"],"names":[],"mappings":"AAAA,4HAA4H;AAE5H,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+C3B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CzB,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDvB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BxB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgD9B,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgF1B,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuF1B,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuI1B,CAAC"}
@@ -1,5 +1,5 @@
1
- export declare const PRE_TOOL_USE_SH = "#!/bin/bash\n# .claude/hooks/pre-tool-use.sh\n# PreToolUse Hook: \u6A21\u5F0F\u7EA6\u675F\u62E6\u622A\n# \u5728 Explore / Plan \u6A21\u5F0F\u4E0B\u963B\u6B62\u5199\u64CD\u4F5C\n# Claude Code \u901A\u8FC7 stdin \u4F20\u5165 JSON: {\"tool_name\":\"...\",\"tool_input\":{...}}\n\nset -e\n\nDEVMIND_DIR=\"$(cd \"$(dirname \"$0\")/../..\" && pwd)/.devmind\"\n\n# \u8BFB\u53D6 stdin \u4E2D\u7684 JSON \u6570\u636E\nHOOK_INPUT=$(cat)\n\n# \u4ECE JSON \u4E2D\u63D0\u53D6 tool_name\nTOOL_NAME=$(printf '%s' \"$HOOK_INPUT\" | grep -o '\"tool_name\":\"[^\"]*\"' | cut -d'\"' -f4)\n\n# \u8BFB\u53D6\u5F53\u524D\u6A21\u5F0F\uFF0C\u6587\u4EF6\u4E0D\u5B58\u5728\u5219\u9ED8\u8BA4 explore\uFF08\u6700\u4E25\u683C\uFF09\nCURRENT_MODE=$(cat \"$DEVMIND_DIR/current-mode.txt\" 2>/dev/null || echo \"explore\")\n\n# \u4ECE JSON \u4E2D\u63D0\u53D6 file_path\uFF08\u7EAF bash\uFF0C\u65E0\u5916\u90E8\u4F9D\u8D56\uFF09\nextract_file_path() {\n printf '%s' \"$1\" | grep -o '\"file_path\":\"[^\"]*\"' | head -1 | cut -d'\"' -f4\n}\n\n# \u53EA\u62E6\u622A\u5199\u64CD\u4F5C\u5DE5\u5177\nif echo \"$TOOL_NAME\" | grep -qE '^(Write|Edit|NotebookEdit)$'; then\n\n if [ \"$CURRENT_MODE\" = \"explore\" ]; then\n echo \"BLOCKED: Explore \u6A21\u5F0F\u7981\u6B62\u4FEE\u6539\u6587\u4EF6\" >&2\n echo \"\u63D0\u793A\uFF1A\u4F7F\u7528 /dm:edit \u6216 /dm:build \u8FDB\u5165\u53EF\u5199\u6A21\u5F0F\" >&2\n exit 1\n fi\n\n if [ \"$CURRENT_MODE\" = \"plan\" ]; then\n FILE_ARG=$(extract_file_path \"$HOOK_INPUT\")\n if echo \"$FILE_ARG\" | grep -q \"\\.devmind/\"; then\n exit 0\n fi\n echo \"BLOCKED: Plan \u6A21\u5F0F\u4EC5\u8F93\u51FA\u65B9\u6848\uFF0C\u4E0D\u4FEE\u6539\u4E1A\u52A1\u4EE3\u7801\" >&2\n echo \"\u63D0\u793A\uFF1A\u4F7F\u7528 /dm:build \u6267\u884C\u5DF2\u786E\u8BA4\u7684\u8BA1\u5212\" >&2\n exit 1\n fi\n\n if [ \"$CURRENT_MODE\" = \"build\" ]; then\n PLAN_FILE=\"$DEVMIND_DIR/current-plan.md\"\n FILE_ARG=$(extract_file_path \"$HOOK_INPUT\")\n\n if [ -n \"$FILE_ARG\" ] && [ -f \"$PLAN_FILE\" ]; then\n IN_EXCLUDED=$(awk '/^### \u660E\u786E\u6392\u9664/,/^###/' \"$PLAN_FILE\" | grep -v \"^###\" | grep -v \"^$\" | sed 's/^- //' | while read -r pattern; do\n if echo \"$FILE_ARG\" | grep -q \"$pattern\"; then\n echo \"yes\"\n break\n fi\n done)\n\n if [ \"$IN_EXCLUDED\" = \"yes\" ]; then\n echo \"PAUSED: \u6587\u4EF6 '$FILE_ARG' \u5728\u660E\u786E\u6392\u9664\u5217\u8868\u4E2D\" >&2\n echo \"\u8BF7\u9009\u62E9\uFF1A(1) \u5141\u8BB8\u5E76\u66F4\u65B0\u8BA1\u5212\u8303\u56F4 (2) \u5141\u8BB8\u4E00\u6B21\u6027\u4F8B\u5916 (3) \u8DF3\u8FC7\u6B64\u4FEE\u6539 (4) \u5207\u6362\u5230 Plan \u6A21\u5F0F\" >&2\n exit 1\n fi\n fi\n fi\n\nfi\n\nexit 0\n";
1
+ export declare const PRE_TOOL_USE_SH = "#!/bin/bash\n# .claude/hooks/pre-tool-use.sh\n# PreToolUse Hook: \u6A21\u5F0F\u7EA6\u675F\u62E6\u622A\n# \u5728 Explore / Plan \u6A21\u5F0F\u4E0B\u963B\u6B62\u5199\u64CD\u4F5C\n# Claude Code \u901A\u8FC7 stdin \u4F20\u5165 JSON: {\"tool_name\":\"...\",\"tool_input\":{...}}\n\nset -e\n\nDEVMIND_DIR=\"$(cd \"$(dirname \"$0\")/../..\" && pwd)/.devmind\"\n\n# \u8BFB\u53D6 stdin \u4E2D\u7684 JSON \u6570\u636E\nHOOK_INPUT=$(cat)\n\n# \u4ECE JSON \u4E2D\u63D0\u53D6 tool_name\nTOOL_NAME=$(printf '%s' \"$HOOK_INPUT\" | grep -o '\"tool_name\":\"[^\"]*\"' | cut -d'\"' -f4)\n\n# \u8BFB\u53D6\u5F53\u524D\u6A21\u5F0F\uFF0C\u6587\u4EF6\u4E0D\u5B58\u5728\u5219\u9ED8\u8BA4 explore\uFF08\u6700\u4E25\u683C\uFF09\nCURRENT_MODE=$(cat \"$DEVMIND_DIR/current-mode.txt\" 2>/dev/null || echo \"explore\")\n\n# \u4ECE JSON \u4E2D\u63D0\u53D6 file_path\uFF08\u7EAF bash\uFF0C\u65E0\u5916\u90E8\u4F9D\u8D56\uFF09\nextract_file_path() {\n printf '%s' \"$1\" | grep -o '\"file_path\":\"[^\"]*\"' | head -1 | cut -d'\"' -f4\n}\n\n# \u62E6\u622A Bash \u5DE5\u5177\u4E2D\u7684\u5371\u9669\u547D\u4EE4\uFF08\u6240\u6709\u6A21\u5F0F\u4E0B\u5747\u68C0\u6D4B\uFF09\nif [ \"$TOOL_NAME\" = \"Bash\" ]; then\n COMMAND=$(printf '%s' \"$HOOK_INPUT\" | grep -o '\"command\":\"[^\"]*\"' | head -1 | cut -d'\"' -f4)\n for DANGER in \"rm -rf\" \"DROP TABLE\" \"DELETE FROM\" \"git push --force\" \"git push -f\"; do\n if echo \"$COMMAND\" | grep -qi \"$DANGER\"; then\n echo \"BLOCKED: \u68C0\u6D4B\u5230\u5371\u9669\u547D\u4EE4\uFF1A$DANGER\" >&2\n echo \"\u547D\u4EE4\uFF1A$COMMAND\" >&2\n echo \"\u5982\u9700\u6267\u884C\uFF0C\u8BF7\u5728\u7EC8\u7AEF\u624B\u52A8\u8FD0\u884C\u5E76\u660E\u786E\u786E\u8BA4\u540E\u679C\u3002\" >&2\n exit 1\n fi\n done\nfi\n\n# \u53EA\u62E6\u622A\u5199\u64CD\u4F5C\u5DE5\u5177\nif echo \"$TOOL_NAME\" | grep -qE '^(Write|Edit|NotebookEdit)$'; then\n\n if [ \"$CURRENT_MODE\" = \"explore\" ]; then\n echo \"BLOCKED: Explore \u6A21\u5F0F\u7981\u6B62\u4FEE\u6539\u6587\u4EF6\" >&2\n echo \"\u63D0\u793A\uFF1A\u4F7F\u7528 /dm:edit \u6216 /dm:build \u8FDB\u5165\u53EF\u5199\u6A21\u5F0F\" >&2\n exit 1\n fi\n\n if [ \"$CURRENT_MODE\" = \"plan\" ]; then\n FILE_ARG=$(extract_file_path \"$HOOK_INPUT\")\n if echo \"$FILE_ARG\" | grep -q \"\\.devmind/\"; then\n exit 0\n fi\n echo \"BLOCKED: Plan \u6A21\u5F0F\u4EC5\u8F93\u51FA\u65B9\u6848\uFF0C\u4E0D\u4FEE\u6539\u4E1A\u52A1\u4EE3\u7801\" >&2\n echo \"\u63D0\u793A\uFF1A\u4F7F\u7528 /dm:build \u6267\u884C\u5DF2\u786E\u8BA4\u7684\u8BA1\u5212\" >&2\n exit 1\n fi\n\n if [ \"$CURRENT_MODE\" = \"build\" ]; then\n PLAN_FILE=\"$DEVMIND_DIR/current-plan.md\"\n FILE_ARG=$(extract_file_path \"$HOOK_INPUT\")\n\n if [ -n \"$FILE_ARG\" ] && [ -f \"$PLAN_FILE\" ]; then\n IN_EXCLUDED=$(awk '/^### \u660E\u786E\u6392\u9664/,/^###/' \"$PLAN_FILE\" | grep -v \"^###\" | grep -v \"^$\" | sed 's/^- //' | while read -r pattern; do\n if echo \"$FILE_ARG\" | grep -q \"$pattern\"; then\n echo \"yes\"\n break\n fi\n done)\n\n if [ \"$IN_EXCLUDED\" = \"yes\" ]; then\n echo \"PAUSED: \u6587\u4EF6 '$FILE_ARG' \u5728\u660E\u786E\u6392\u9664\u5217\u8868\u4E2D\" >&2\n echo \"\u8BF7\u9009\u62E9\uFF1A(1) \u5141\u8BB8\u5E76\u66F4\u65B0\u8BA1\u5212\u8303\u56F4 (2) \u5141\u8BB8\u4E00\u6B21\u6027\u4F8B\u5916 (3) \u8DF3\u8FC7\u6B64\u4FEE\u6539 (4) \u5207\u6362\u5230 Plan \u6A21\u5F0F\" >&2\n exit 1\n fi\n fi\n fi\n\nfi\n\nexit 0\n";
2
2
  export declare const POST_TOOL_USE_SH = "#!/bin/bash\n# .claude/hooks/post-tool-use.sh\n# PostToolUse Hook: \u5BA1\u8BA1\u65E5\u5FD7\u81EA\u52A8\u6355\u83B7\n# \u6BCF\u6B21\u5199\u64CD\u4F5C\u540E\u81EA\u52A8\u8BB0\u5F55\u5230 audit.log\n# Claude Code \u901A\u8FC7 stdin \u4F20\u5165 JSON: {\"tool_name\":\"...\",\"tool_input\":{...},\"tool_response\":{...}}\n\nDEVMIND_DIR=\"$(cd \"$(dirname \"$0\")/../..\" && pwd)/.devmind\"\n\n# \u8BFB\u53D6 stdin \u4E2D\u7684 JSON \u6570\u636E\nHOOK_INPUT=$(cat)\n\n# \u4ECE JSON \u4E2D\u63D0\u53D6 tool_name\nTOOL_NAME=$(printf '%s' \"$HOOK_INPUT\" | grep -o '\"tool_name\":\"[^\"]*\"' | cut -d'\"' -f4)\n\n# \u4ECE JSON \u4E2D\u63D0\u53D6 file_path\nextract_file_path() {\n printf '%s' \"$1\" | grep -o '\"file_path\":\"[^\"]*\"' | head -1 | cut -d'\"' -f4\n}\n\n# \u53EA\u5904\u7406\u5199\u64CD\u4F5C\u5DE5\u5177\nif echo \"$TOOL_NAME\" | grep -qE '^(Write|Edit|NotebookEdit)$'; then\n\n CURRENT_MODE=$(cat \"$DEVMIND_DIR/current-mode.txt\" 2>/dev/null || echo \"unknown\")\n CURRENT_PLAN=$(head -1 \"$DEVMIND_DIR/current-plan.md\" 2>/dev/null | sed 's/^# //')\n FILE_PATH=$(extract_file_path \"$HOOK_INPUT\")\n FILE_PATH=\"${FILE_PATH:-unknown}\"\n\n echo \"[$(date '+%Y-%m-%d %H:%M:%S')] $CURRENT_MODE ${FILE_PATH} plan:${CURRENT_PLAN:-none}\" \\\n >> \"$DEVMIND_DIR/audit.log\"\nfi\n\nexit 0\n";
3
3
  export declare const CLAUDE_MD = "# DevMind \u72B6\u6001\u611F\u77E5\n\n> \u672C\u6BB5\u7531 DevMind \u6846\u67B6\u6CE8\u5165\uFF0C\u9002\u7528\u4E8E\u672C\u9879\u76EE\u6240\u6709 Claude Code \u4F1A\u8BDD\u3002\n\n## \u4F1A\u8BDD\u542F\u52A8\u68C0\u67E5\n\n\u6BCF\u6B21\u4F1A\u8BDD\u5F00\u59CB\u65F6\uFF0C\u6267\u884C\u4EE5\u4E0B\u64CD\u4F5C\uFF1A\n\n1. **\u8BFB\u53D6\u5F53\u524D\u6A21\u5F0F**\uFF1A`cat .devmind/current-mode.txt`\n - `explore`\uFF1A\u53EA\u8BFB\uFF0C\u7981\u6B62\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\n - `edit`\uFF1A\u53EF\u5C0F\u8303\u56F4\u4FEE\u6539\uFF0C\u8DE8\u6587\u4EF6\u6539\u52A8\uFF08\u8D85\u8FC72\u4E2A\u6587\u4EF6\uFF09\u9700\u786E\u8BA4\n - `plan`\uFF1A\u4EC5\u8F93\u51FA\u65B9\u6848\uFF0C\u4E0D\u4FEE\u6539\u4E1A\u52A1\u4EE3\u7801\n - `build`\uFF1A\u6309 `current-plan.md` \u4E2D\u7684 Spec \u6267\u884C\n - \u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\uFF0C\u9ED8\u8BA4\u8FDB\u5165 `explore` \u6A21\u5F0F\n\n2. **\u68C0\u67E5\u4F1A\u8BDD\u72B6\u6001**\uFF1A\u5982\u679C `.devmind/session.yaml` \u5B58\u5728\uFF0C\u8BFB\u53D6\u5E76\u544A\u77E5\u5F00\u53D1\u8005\u4E0A\u6B21\u4EFB\u52A1\u72B6\u6001\uFF0C\u5305\u62EC\uFF1A\n - \u4E0A\u6B21\u6267\u884C\u7684\u8BA1\u5212\n - \u5DF2\u5B8C\u6210\u548C\u5F85\u7EED\u7684\u68C0\u67E5\u70B9\n - \u662F\u5426\u6709\u672A\u89E3\u51B3\u7684\u6682\u505C\u539F\u56E0\n\n3. **\u52A0\u8F7D\u8BB0\u5FC6\u7D22\u5F15**\uFF1A\u8BFB\u53D6 `.devmind/memory/index.md`\uFF08\u8F7B\u91CF\u7EA7\uFF0C\u4EC5\u5305\u542B\u6458\u8981\u548C\u6807\u7B7E\uFF09\n\n## \u6A21\u5F0F\u5207\u6362\u63D0\u793A\n\n\u5F53\u5F00\u53D1\u8005\u8F93\u5165\u7684\u610F\u56FE\u4E0E\u5F53\u524D\u6A21\u5F0F\u4E0D\u7B26\u65F6\uFF0C\u4E3B\u52A8\u63D0\u793A\u53EF\u7528\u7684\u6A21\u5F0F\u547D\u4EE4\uFF1A\n\n```\n\u7528\u6237\uFF1A\"\u5E2E\u6211\u6539\u8FD9\u4E2A bug\"\n\u5F53\u524D\u6A21\u5F0F\uFF1Aexplore\uFF08\u53EA\u8BFB\uFF09\n\u2192 \u63D0\u793A\uFF1A\u68C0\u6D4B\u5230\u4FEE\u6539\u610F\u56FE\uFF0C\u5F53\u524D\u5904\u4E8E explore \u6A21\u5F0F\uFF08\u53EA\u8BFB\uFF09\u3002\n \u5EFA\u8BAE\uFF1A\n - \u5148\u5B9A\u4F4D\u95EE\u9898\uFF1F\u7EE7\u7EED\u4F7F\u7528 /dm:explore\n - \u5DF2\u77E5\u95EE\u9898\u4F4D\u7F6E\uFF1F\u4F7F\u7528 /dm:edit \u8FDB\u5165\u7F16\u8F91\u6A21\u5F0F\n - \u9700\u8981\u5927\u8303\u56F4\u4FEE\u6539\uFF1F\u4F7F\u7528 /dm:plan \u5236\u5B9A\u65B9\u6848\u540E\u518D /dm:build\n```\n\n## \u6A21\u5F0F\u7EA6\u675F\u8BF4\u660E\uFF08Hook \u5F3A\u5236\u6267\u884C\uFF09\n\n- Explore / Plan \u6A21\u5F0F\u4E0B\uFF0CWrite / Edit / NotebookEdit \u5DE5\u5177\u8C03\u7528\u4F1A\u88AB `pre-tool-use.sh` \u62E6\u622A\n- Build \u6A21\u5F0F\u4E0B\uFF0C\u4FEE\u6539\"\u660E\u786E\u6392\u9664\"\u5217\u8868\u4E2D\u7684\u6587\u4EF6\u4F1A\u89E6\u53D1\u6682\u505C\n- \u6240\u6709\u5199\u64CD\u4F5C\u90FD\u7531 `post-tool-use.sh` \u81EA\u52A8\u8BB0\u5F55\u5230 `audit.log`\n\n## \u53EF\u7528\u547D\u4EE4\u901F\u89C8\n\n| \u547D\u4EE4 | \u7528\u9014 |\n|------|------|\n| `/dm:explore` | \u8FDB\u5165\u53EA\u8BFB\u5206\u6790\u6A21\u5F0F |\n| `/dm:edit` | \u8FDB\u5165\u5C0F\u8303\u56F4\u7F16\u8F91\u6A21\u5F0F |\n| `/dm:plan` | \u5236\u5B9A\u7ED3\u6784\u5316\u65B9\u6848\uFF08\u5F3A\u5236\u68C0\u7D22 Graveyard\uFF09 |\n| `/dm:build` | \u6309\u8BA1\u5212\u6267\u884C\uFF08\u652F\u6301\u65AD\u70B9\u7EED\u4F20\uFF09 |\n| `/dm:remember` | \u5C06\u672C\u6B21\u51B3\u7B56\u6C89\u6DC0\u4E3A\u8BB0\u5FC6 |\n| `/dm:recall` | \u68C0\u7D22\u5386\u53F2\u8BB0\u5FC6 |\n| `/dm:bury` | \u8BB0\u5F55\u88AB\u5426\u51B3\u7684\u65B9\u6848\u5230 Graveyard |\n| `/dm:audit` | \u67E5\u770B\u64CD\u4F5C\u5BA1\u8BA1\u65E5\u5FD7 |\n| `/dm:sync-memory` | \u540C\u6B65\u56E2\u961F\u8BB0\u5FC6\uFF08git pull + \u91CD\u5EFA\u7D22\u5F15\uFF09 |\n| `/dm:publish` | \u5C06\u5F53\u524D\u529F\u80FD\u6574\u7406\u4E3A\u6587\u6863\u5199\u5165 `docs/designs/draft/` |\n| `/dm:release` | \u6C47\u603B draft/ \u751F\u6210\u7248\u672C\u6587\u6863\uFF0C\u5F52\u6863\u529F\u80FD\u6587\u6863 |\n";
4
- export declare const SETTINGS_LOCAL_JSON = "{\n \"permissions\": {\n \"allow\": [\n \"Bash(chmod:*)\",\n \"Bash(tree:*)\",\n \"Bash(python:*)\",\n \"Bash(python3:*)\",\n \"Bash(.devmind/scripts/rebuild-index.sh:*)\",\n \"Bash(bash:*)\"\n ],\n \"deny\": [],\n \"ask\": []\n },\n \"hooks\": {\n \"PreToolUse\": [\n {\n \"matcher\": \".*\",\n \"hooks\": [\n {\n \"type\": \"command\",\n \"command\": \".claude/hooks/pre-tool-use.sh\"\n }\n ]\n }\n ],\n \"PostToolUse\": [\n {\n \"matcher\": \".*\",\n \"hooks\": [\n {\n \"type\": \"command\",\n \"command\": \".claude/hooks/post-tool-use.sh\"\n }\n ]\n }\n ]\n }\n}\n";
4
+ export declare const SETTINGS_LOCAL_JSON = "{\n \"permissions\": {\n \"allow\": [\n \"Bash(chmod:*)\",\n \"Bash(tree:*)\",\n \"Bash(python:*)\",\n \"Bash(python3:*)\",\n \"Bash(.devmind/scripts/rebuild-index.sh:*)\",\n \"Bash(bash:*)\"\n ],\n \"deny\": [],\n \"ask\": []\n }\n}\n";
5
5
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,22FAkE3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,kzCAgC5B,CAAC;AAIF,eAAO,MAAM,SAAS,2yHAyDrB,CAAC;AAIF,eAAO,MAAM,mBAAmB,uwBAsC/B,CAAC"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,ynHA+E3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,kzCAgC5B,CAAC;AAIF,eAAO,MAAM,SAAS,2yHAyDrB,CAAC;AAIF,eAAO,MAAM,mBAAmB,4RAc/B,CAAC"}
package/dist/templates.js CHANGED
@@ -25,6 +25,19 @@ extract_file_path() {
25
25
  printf '%s' "$1" | grep -o '"file_path":"[^"]*"' | head -1 | cut -d'"' -f4
26
26
  }
27
27
 
28
+ # 拦截 Bash 工具中的危险命令(所有模式下均检测)
29
+ if [ "$TOOL_NAME" = "Bash" ]; then
30
+ COMMAND=$(printf '%s' "$HOOK_INPUT" | grep -o '"command":"[^"]*"' | head -1 | cut -d'"' -f4)
31
+ for DANGER in "rm -rf" "DROP TABLE" "DELETE FROM" "git push --force" "git push -f"; do
32
+ if echo "$COMMAND" | grep -qi "$DANGER"; then
33
+ echo "BLOCKED: 检测到危险命令:$DANGER" >&2
34
+ echo "命令:$COMMAND" >&2
35
+ echo "如需执行,请在终端手动运行并明确确认后果。" >&2
36
+ exit 1
37
+ fi
38
+ done
39
+ fi
40
+
28
41
  # 只拦截写操作工具
29
42
  if echo "$TOOL_NAME" | grep -qE '^(Write|Edit|NotebookEdit)$'; then
30
43
 
@@ -173,30 +186,6 @@ export const SETTINGS_LOCAL_JSON = `{
173
186
  ],
174
187
  "deny": [],
175
188
  "ask": []
176
- },
177
- "hooks": {
178
- "PreToolUse": [
179
- {
180
- "matcher": ".*",
181
- "hooks": [
182
- {
183
- "type": "command",
184
- "command": ".claude/hooks/pre-tool-use.sh"
185
- }
186
- ]
187
- }
188
- ],
189
- "PostToolUse": [
190
- {
191
- "matcher": ".*",
192
- "hooks": [
193
- {
194
- "type": "command",
195
- "command": ".claude/hooks/post-tool-use.sh"
196
- }
197
- ]
198
- }
199
- ]
200
189
  }
201
190
  }
202
191
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,yDAAyD;AAEzD,gFAAgF;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkE9B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC/B,CAAC;AAEF,iFAAiF;AAEjF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDxB,CAAC;AAEF,iFAAiF;AAEjF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsClC,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,yDAAyD;AAEzD,gFAAgF;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+E9B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC/B,CAAC;AAEF,iFAAiF;AAEjF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDxB,CAAC;AAEF,iFAAiF;AAEjF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;CAclC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lich0821/devmind",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "DevMind — stateful AI collaboration framework for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {