@lich0821/devmind 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.
- package/bin/devmind.js +5 -0
- package/dist/commands/audit.d.ts +8 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +87 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +240 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/recall.d.ts +2 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +89 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +88 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/templates-commands.d.ts +5 -0
- package/dist/templates-commands.d.ts.map +1 -0
- package/dist/templates-commands.js +201 -0
- package/dist/templates-commands.js.map +1 -0
- package/dist/templates-commands2.d.ts +8 -0
- package/dist/templates-commands2.d.ts.map +1 -0
- package/dist/templates-commands2.js +394 -0
- package/dist/templates-commands2.js.map +1 -0
- package/dist/templates-devmind.d.ts +14 -0
- package/dist/templates-devmind.d.ts.map +1 -0
- package/dist/templates-devmind.js +195 -0
- package/dist/templates-devmind.js.map +1 -0
- package/dist/templates.d.ts +5 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +203 -0
- package/dist/templates.js.map +1 -0
- package/dist/utils/find-devmind.d.ts +10 -0
- package/dist/utils/find-devmind.d.ts.map +1 -0
- package/dist/utils/find-devmind.js +34 -0
- package/dist/utils/find-devmind.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const CURRENT_MODE_TXT = "explore";
|
|
2
|
+
export declare const SESSION_YAML = "# .devmind/session.yaml \u2014 \u4F1A\u8BDD\u68C0\u67E5\u70B9\uFF08\u7531 /dm:build \u81EA\u52A8\u7EF4\u62A4\uFF09\n# \u9996\u6B21\u4F7F\u7528\u65F6\u6B64\u6587\u4EF6\u4E3A\u7A7A\uFF0C\u6267\u884C\u8BA1\u5212\u540E AI \u4F1A\u8FFD\u52A0\u68C0\u67E5\u70B9\n\nlast_mode: ~\nlast_plan: ~\nlast_active: ~\n\n# \u68C0\u67E5\u70B9\u94FE\uFF08Build \u6A21\u5F0F\u6267\u884C\u8FDB\u5EA6\uFF09\ncheckpoints: []\n";
|
|
3
|
+
export declare const CONFIG_YAML = "project: MyProject\ndefault_mode: explore\nenforcement_level: hook\n\nmemory:\n load_on_session_start:\n - index_only\n auto_draft_on_plan: true\n pattern_threshold: 3\n auto_retrieve_on:\n - plan_mode\n - decision_conflict\n retrieval_backend: keyword # keyword | embed-local | embed-ollama | embed-api\n aging:\n decisions:\n review_after_days: 90\n auto_archive_after_days: 365\n patterns:\n review_after_days: 180\n graveyard:\n never_expire: true\n\nflow:\n pause_on_scope_exceeded: true\n\ncollaboration:\n mode: solo\n conflict_resolution:\n strategy: last_write_wins\n ownership:\n require_author: true\n notify_on_change: false\n";
|
|
4
|
+
export declare const FLOW_YAML = "checkpoints:\n - trigger: file_scope_exceeded\n action: pause\n message: \"\u5373\u5C06\u4FEE\u6539\u8BA1\u5212\u5916\u7684\u6587\u4EF6 {file_path}\"\n options:\n - label: \"\u5141\u8BB8\u6B64\u6B21\u4FEE\u6539\uFF0C\u5E76\u66F4\u65B0\u8BA1\u5212\u8303\u56F4\"\n action: expand_plan_scope\n - label: \"\u5141\u8BB8\u6B64\u6B21\u4FEE\u6539\uFF08\u4E00\u6B21\u6027\u4F8B\u5916\uFF0C\u4E0D\u66F4\u65B0\u8BA1\u5212\uFF09\"\n action: allow_once\n - label: \"\u8DF3\u8FC7\u6B64\u4FEE\u6539\uFF0C\u7EE7\u7EED\u5176\u4ED6\u6B65\u9AA4\"\n action: skip\n - label: \"\u6682\u505C\u6574\u4E2A Build\uFF0C\u91CD\u65B0\u8FDB\u5165 Plan \u6A21\u5F0F\"\n action: switch_to_plan\n\n - trigger: uncertainty_declared\n action: pause\n message: \"\u65B9\u6848\u5B58\u5728\u4E0D\u786E\u5B9A\u70B9\uFF0C\u8BF7\u786E\u8BA4\u662F\u5426\u7EE7\u7EED\"\n options:\n - label: \"\u5DF2\u4E86\u89E3\u98CE\u9669\uFF0C\u7EE7\u7EED\u6267\u884C\"\n action: proceed\n - label: \"\u5148\u9A8C\u8BC1\u5047\u8BBE\uFF0C\u6682\u4E0D\u6267\u884C\"\n action: pause_for_validation\n - label: \"\u8FD4\u56DE Plan \u6A21\u5F0F\u91CD\u65B0\u8BC4\u4F30\"\n action: switch_to_plan\n\n - trigger: decision_conflict\n action: pause\n message: \"\u53D1\u73B0\u4E0E\u5DF2\u8BB0\u5F55\u51B3\u7B56\u51B2\u7A81\uFF0C\u8BF7\u88C1\u51B3\"\n options:\n - label: \"\u9075\u5B88\u5DF2\u6709\u51B3\u7B56\uFF0C\u8C03\u6574\u5F53\u524D\u65B9\u6848\"\n action: follow_existing\n - label: \"\u8986\u76D6\u5DF2\u6709\u51B3\u7B56\uFF08\u9700\u66F4\u65B0 decisions/\uFF09\"\n action: override_decision\n - label: \"\u6682\u505C\uFF0C\u4EBA\u5DE5\u8BC4\u4F30\u540E\u51B3\u5B9A\"\n action: manual_review\n\n - trigger: milestone_reached\n action: pause\n message: \"\u5DF2\u5B8C\u6210\u9636\u6BB5\u76EE\u6807\uFF0C\u7EE7\u7EED\uFF1F\"\n options:\n - label: \"\u7EE7\u7EED\u4E0B\u4E00\u9636\u6BB5\"\n action: proceed\n - label: \"\u6682\u505C\uFF0C\u68C0\u67E5\u4EA7\u51FA\u540E\u51B3\u5B9A\"\n action: pause\n\n - on: [\"DROP TABLE\", \"rm -rf\", \"DELETE FROM\"]\n action: require_explicit_confirm\n message: \"\u68C0\u6D4B\u5230\u5371\u9669\u64CD\u4F5C\uFF0C\u8BF7\u660E\u786E\u786E\u8BA4\"\n";
|
|
5
|
+
export declare const CURRENT_PLAN_MD = "# \u8BA1\u5212\uFF1A\uFF08\u8BF7\u586B\u5199\u4EFB\u52A1\u540D\u79F0\uFF09\n\n> \u9009\u5B9A\u65E5\u671F\uFF1AYYYY-MM-DD \u65B9\u6848\uFF1A\uFF08\u65B9\u6848\u540D\uFF09\n\n## Spec\n\n### \u7EA6\u675F\uFF08\u4E0D\u53EF\u8FDD\u53CD\uFF0C\u8FDD\u53CD\u65F6\u81EA\u52A8\u6682\u505C\uFF09\n- \uFF08\u586B\u5199\u7EA6\u675F\u6761\u76EE\uFF09\n\n### \u9884\u671F\u4EA7\u51FA\uFF08\u53EF\u9A8C\u8BC1\uFF09\n- [ ] \uFF08\u586B\u5199\u53EF\u9A8C\u8BC1\u7684\u4EA7\u51FA\u6761\u76EE\uFF09\n\n### \u5141\u8BB8\u4FEE\u6539\u7684\u6587\u4EF6\u8303\u56F4\n- \uFF08\u586B\u5199\u6587\u4EF6\u6216\u76EE\u5F55\uFF09\n\n### \u660E\u786E\u6392\u9664\uFF08\u4FEE\u6539\u8FD9\u4E9B\u6587\u4EF6\u65F6\u5FC5\u987B\u6682\u505C\u786E\u8BA4\uFF09\n- \uFF08\u586B\u5199\u6587\u4EF6\u6216\u76EE\u5F55\uFF09\n\n## \u6267\u884C\u6B65\u9AA4\n\n1. \uFF08\u6B65\u9AA41\uFF09\n";
|
|
6
|
+
export declare const PROGRESS_MD = "# progress.md\n\n<!-- \u5F53\u524D\u4EFB\u52A1\u8FDB\u5EA6\uFF0C\u7531 /build \u547D\u4EE4\u7EF4\u62A4 -->\n\n## \u5F53\u524D\u4EFB\u52A1\n\n\uFF08\u65E0\u8FDB\u884C\u4E2D\u7684\u4EFB\u52A1\uFF09\n\n## \u6700\u8FD1\u5B8C\u6210\n\n\uFF08\u6682\u65E0\u8BB0\u5F55\uFF09\n";
|
|
7
|
+
export declare const MODE_EXPLORE_MD = "# Explore \u6A21\u5F0F\n**\u53EA\u8BFB\u5206\u6790\u6A21\u5F0F**\u2014\u2014\u7406\u89E3\u4EE3\u7801\u67B6\u6784\uFF0C\u5B9A\u4F4D\u95EE\u9898\uFF0C\u4E0D\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\u3002\n";
|
|
8
|
+
export declare const MODE_EDIT_MD = "# Edit \u6A21\u5F0F\n**\u5C0F\u8303\u56F4\u7F16\u8F91\u6A21\u5F0F**\u2014\u2014\u76F4\u63A5\u5B9E\u65BD\u660E\u786E\u7684\u4FEE\u6539\uFF0C\u63A7\u5236\u6539\u52A8\u8303\u56F4\uFF0C\u8DE8\u6587\u4EF6\u4FEE\u6539\u9700\u786E\u8BA4\u3002\n\n## \u8C03\u8BD5\u573A\u666F\u4F7F\u7528\u65B9\u5F0F\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";
|
|
9
|
+
export declare const MODE_PLAN_MD = "# Plan \u6A21\u5F0F\n**\u65B9\u6848\u89C4\u5212\u6A21\u5F0F**\u2014\u2014\u53EA\u8F93\u51FA\u65B9\u6848\u5BF9\u6BD4\uFF0C\u4E0D\u6267\u884C\u4FEE\u6539\uFF0C\u7B49\u5F85\u5F00\u53D1\u8005\u9009\u62E9\u540E\u751F\u6210 Spec\u3002\n";
|
|
10
|
+
export declare const MODE_BUILD_MD = "# Build \u6A21\u5F0F\n**Spec \u6267\u884C\u6A21\u5F0F**\u2014\u2014\u4E25\u683C\u6309\u7167 current-plan.md \u4E2D\u7684 Spec \u6267\u884C\uFF0C\u9047\u8BA1\u5212\u5916\u5206\u53C9\u81EA\u52A8\u6682\u505C\u3002\n";
|
|
11
|
+
export declare const TMPL_DECISION = "## \u51B3\u7B56\uFF1A<\u6807\u9898>\n\n**\u6458\u8981**\uFF1A<1-2\u53E5\u8BDD\u6982\u62EC\u51B3\u7B56\u5185\u5BB9\uFF0C\u7528\u4E8E\u7D22\u5F15\u9884\u89C8\u548C\u672A\u6765\u8BED\u4E49\u68C0\u7D22>\n\n- \u65E5\u671F\uFF1AYYYY-MM-DD\n- \u63D0\u8BAE\u8005\uFF1A@username\n- \u6807\u7B7E\uFF1A<\u5206\u7C7B\u6807\u7B7E\uFF0C\u5982\uFF1AReact, \u5B58\u50A8, \u67B6\u6784>\n- \u72B6\u6001\uFF1Aactive\n- \u80CC\u666F\uFF1A<\u4E3A\u4EC0\u4E48\u8981\u505A\u8FD9\u4E2A\u51B3\u7B56>\n- \u7ED3\u8BBA\uFF1A<\u5177\u4F53\u7684\u51B3\u7B56\u5185\u5BB9>\n- \u539F\u56E0\uFF1A\n 1. <\u539F\u56E01>\n 2. <\u539F\u56E02>\n\n---\n\nAI \u4F7F\u7528\u63D0\u793A\uFF1A<\u4F55\u65F6\u5E94\u8BE5\u8BFB\u53D6\u6B64\u51B3\u7B56>\n";
|
|
12
|
+
export declare const TMPL_PATTERN = "## \u89C4\u5F8B\uFF1A<\u6807\u9898>\n\n**\u6458\u8981**\uFF1A<1-2\u53E5\u8BDD\u6982\u62EC\u89C4\u5F8B\u5185\u5BB9\uFF0C\u7528\u4E8E\u7D22\u5F15\u9884\u89C8\u548C\u672A\u6765\u8BED\u4E49\u68C0\u7D22>\n\n- \u6765\u6E90\uFF1A<N> \u6B21\u76F8\u4F3C\u8BA8\u8BBA\n- \u6807\u7B7E\uFF1A<\u5206\u7C7B\u6807\u7B7E>\n- \u5DF2\u9A8C\u8BC1\uFF1A\u662F/\u5426\n- \u89C4\u5F8B\uFF1A\n - <\u89C4\u5F8B\u6761\u76EE1>\n - <\u89C4\u5F8B\u6761\u76EE2>\n- \u53CD\u4F8B/\u4F8B\u5916\uFF1A<\u4EC0\u4E48\u60C5\u51B5\u4E0B\u6B64\u89C4\u5F8B\u4E0D\u9002\u7528>\n\n---\n\nAI \u4F7F\u7528\u63D0\u793A\uFF1A<\u51E1\u6D89\u53CA XX \u64CD\u4F5C\uFF0C\u5148\u67E5\u6B64\u89C4\u5F8B>\n";
|
|
13
|
+
export declare const TMPL_GRAVEYARD = "## \u653E\u5F03\u65B9\u6848\uFF1A<\u6807\u9898>\n\n- \u65E5\u671F\uFF1AYYYY-MM-DD\n- \u63D0\u8BAE\u8005\uFF1A@username / AI\n- \u5173\u952E\u8BCD\uFF1A<\u5173\u952E\u8BCD1>, <\u5173\u952E\u8BCD2>, <\u5173\u952E\u8BCD3>\n- \u539F\u59CB\u60F3\u6CD5\uFF1A<\u5F53\u65F6\u7684\u63D0\u8BAE>\n- \u653E\u5F03\u539F\u56E0\uFF1A\n 1. <\u539F\u56E01>\n 2. <\u539F\u56E02>\n- \u66FF\u4EE3\u65B9\u6848\uFF1A<\u6700\u7EC8\u91C7\u7528\u7684\u65B9\u6848>\n- \u76F8\u4F3C\u65B9\u6848\u7279\u5F81\uFF1A<\u5982\u4F55\u8BC6\u522B\u91CD\u8E48\u8986\u8F99\u7684\u63D0\u8BAE>\n\n---\n\nAI \u4F7F\u7528\u63D0\u793A\uFF1A\u5982\u679C\u518D\u63D0\u8BAE\u7C7B\u4F3C\u65B9\u6848\uFF0C\u5148\u8BFB\u6B64\u6587\u4EF6\u3002\n";
|
|
14
|
+
//# sourceMappingURL=templates-devmind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates-devmind.d.ts","sourceRoot":"","sources":["../src/templates-devmind.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C,eAAO,MAAM,YAAY,wZASxB,CAAC;AAEF,eAAO,MAAM,WAAW,8rBAgCvB,CAAC;AAEF,eAAO,MAAM,SAAS,gxEAgDrB,CAAC;AAEF,eAAO,MAAM,eAAe,i1BAqB3B,CAAC;AAEF,eAAO,MAAM,WAAW,iRAWvB,CAAC;AAEF,eAAO,MAAM,eAAe,2MAE3B,CAAC;AAEF,eAAO,MAAM,YAAY,4gBAMxB,CAAC;AAEF,eAAO,MAAM,YAAY,2OAExB,CAAC;AAEF,eAAO,MAAM,aAAa,yNAEzB,CAAC;AAEF,eAAO,MAAM,aAAa,ysBAiBzB,CAAC;AAEF,eAAO,MAAM,YAAY,mpBAexB,CAAC;AAEF,eAAO,MAAM,cAAc,6rBAe1B,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// templates-devmind.ts — .devmind/ internal file templates
|
|
2
|
+
export const CURRENT_MODE_TXT = `explore`;
|
|
3
|
+
export const SESSION_YAML = `# .devmind/session.yaml — 会话检查点(由 /dm:build 自动维护)
|
|
4
|
+
# 首次使用时此文件为空,执行计划后 AI 会追加检查点
|
|
5
|
+
|
|
6
|
+
last_mode: ~
|
|
7
|
+
last_plan: ~
|
|
8
|
+
last_active: ~
|
|
9
|
+
|
|
10
|
+
# 检查点链(Build 模式执行进度)
|
|
11
|
+
checkpoints: []
|
|
12
|
+
`;
|
|
13
|
+
export const CONFIG_YAML = `project: MyProject
|
|
14
|
+
default_mode: explore
|
|
15
|
+
enforcement_level: hook
|
|
16
|
+
|
|
17
|
+
memory:
|
|
18
|
+
load_on_session_start:
|
|
19
|
+
- index_only
|
|
20
|
+
auto_draft_on_plan: true
|
|
21
|
+
pattern_threshold: 3
|
|
22
|
+
auto_retrieve_on:
|
|
23
|
+
- plan_mode
|
|
24
|
+
- decision_conflict
|
|
25
|
+
retrieval_backend: keyword # keyword | embed-local | embed-ollama | embed-api
|
|
26
|
+
aging:
|
|
27
|
+
decisions:
|
|
28
|
+
review_after_days: 90
|
|
29
|
+
auto_archive_after_days: 365
|
|
30
|
+
patterns:
|
|
31
|
+
review_after_days: 180
|
|
32
|
+
graveyard:
|
|
33
|
+
never_expire: true
|
|
34
|
+
|
|
35
|
+
flow:
|
|
36
|
+
pause_on_scope_exceeded: true
|
|
37
|
+
|
|
38
|
+
collaboration:
|
|
39
|
+
mode: solo
|
|
40
|
+
conflict_resolution:
|
|
41
|
+
strategy: last_write_wins
|
|
42
|
+
ownership:
|
|
43
|
+
require_author: true
|
|
44
|
+
notify_on_change: false
|
|
45
|
+
`;
|
|
46
|
+
export const FLOW_YAML = `checkpoints:
|
|
47
|
+
- trigger: file_scope_exceeded
|
|
48
|
+
action: pause
|
|
49
|
+
message: "即将修改计划外的文件 {file_path}"
|
|
50
|
+
options:
|
|
51
|
+
- label: "允许此次修改,并更新计划范围"
|
|
52
|
+
action: expand_plan_scope
|
|
53
|
+
- label: "允许此次修改(一次性例外,不更新计划)"
|
|
54
|
+
action: allow_once
|
|
55
|
+
- label: "跳过此修改,继续其他步骤"
|
|
56
|
+
action: skip
|
|
57
|
+
- label: "暂停整个 Build,重新进入 Plan 模式"
|
|
58
|
+
action: switch_to_plan
|
|
59
|
+
|
|
60
|
+
- trigger: uncertainty_declared
|
|
61
|
+
action: pause
|
|
62
|
+
message: "方案存在不确定点,请确认是否继续"
|
|
63
|
+
options:
|
|
64
|
+
- label: "已了解风险,继续执行"
|
|
65
|
+
action: proceed
|
|
66
|
+
- label: "先验证假设,暂不执行"
|
|
67
|
+
action: pause_for_validation
|
|
68
|
+
- label: "返回 Plan 模式重新评估"
|
|
69
|
+
action: switch_to_plan
|
|
70
|
+
|
|
71
|
+
- trigger: decision_conflict
|
|
72
|
+
action: pause
|
|
73
|
+
message: "发现与已记录决策冲突,请裁决"
|
|
74
|
+
options:
|
|
75
|
+
- label: "遵守已有决策,调整当前方案"
|
|
76
|
+
action: follow_existing
|
|
77
|
+
- label: "覆盖已有决策(需更新 decisions/)"
|
|
78
|
+
action: override_decision
|
|
79
|
+
- label: "暂停,人工评估后决定"
|
|
80
|
+
action: manual_review
|
|
81
|
+
|
|
82
|
+
- trigger: milestone_reached
|
|
83
|
+
action: pause
|
|
84
|
+
message: "已完成阶段目标,继续?"
|
|
85
|
+
options:
|
|
86
|
+
- label: "继续下一阶段"
|
|
87
|
+
action: proceed
|
|
88
|
+
- label: "暂停,检查产出后决定"
|
|
89
|
+
action: pause
|
|
90
|
+
|
|
91
|
+
- on: ["DROP TABLE", "rm -rf", "DELETE FROM"]
|
|
92
|
+
action: require_explicit_confirm
|
|
93
|
+
message: "检测到危险操作,请明确确认"
|
|
94
|
+
`;
|
|
95
|
+
export const CURRENT_PLAN_MD = `# 计划:(请填写任务名称)
|
|
96
|
+
|
|
97
|
+
> 选定日期:YYYY-MM-DD 方案:(方案名)
|
|
98
|
+
|
|
99
|
+
## Spec
|
|
100
|
+
|
|
101
|
+
### 约束(不可违反,违反时自动暂停)
|
|
102
|
+
- (填写约束条目)
|
|
103
|
+
|
|
104
|
+
### 预期产出(可验证)
|
|
105
|
+
- [ ] (填写可验证的产出条目)
|
|
106
|
+
|
|
107
|
+
### 允许修改的文件范围
|
|
108
|
+
- (填写文件或目录)
|
|
109
|
+
|
|
110
|
+
### 明确排除(修改这些文件时必须暂停确认)
|
|
111
|
+
- (填写文件或目录)
|
|
112
|
+
|
|
113
|
+
## 执行步骤
|
|
114
|
+
|
|
115
|
+
1. (步骤1)
|
|
116
|
+
`;
|
|
117
|
+
export const PROGRESS_MD = `# progress.md
|
|
118
|
+
|
|
119
|
+
<!-- 当前任务进度,由 /build 命令维护 -->
|
|
120
|
+
|
|
121
|
+
## 当前任务
|
|
122
|
+
|
|
123
|
+
(无进行中的任务)
|
|
124
|
+
|
|
125
|
+
## 最近完成
|
|
126
|
+
|
|
127
|
+
(暂无记录)
|
|
128
|
+
`;
|
|
129
|
+
export const MODE_EXPLORE_MD = `# Explore 模式
|
|
130
|
+
**只读分析模式**——理解代码架构,定位问题,不修改任何文件。
|
|
131
|
+
`;
|
|
132
|
+
export const MODE_EDIT_MD = `# Edit 模式
|
|
133
|
+
**小范围编辑模式**——直接实施明确的修改,控制改动范围,跨文件修改需确认。
|
|
134
|
+
|
|
135
|
+
## 调试场景使用方式
|
|
136
|
+
- **诊断阶段**:使用 \`/dm:explore\`(只读,定位根因)
|
|
137
|
+
- **修复阶段**:切换到 \`/dm:edit\`(最小化修复)
|
|
138
|
+
`;
|
|
139
|
+
export const MODE_PLAN_MD = `# Plan 模式
|
|
140
|
+
**方案规划模式**——只输出方案对比,不执行修改,等待开发者选择后生成 Spec。
|
|
141
|
+
`;
|
|
142
|
+
export const MODE_BUILD_MD = `# Build 模式
|
|
143
|
+
**Spec 执行模式**——严格按照 current-plan.md 中的 Spec 执行,遇计划外分叉自动暂停。
|
|
144
|
+
`;
|
|
145
|
+
export const TMPL_DECISION = `## 决策:<标题>
|
|
146
|
+
|
|
147
|
+
**摘要**:<1-2句话概括决策内容,用于索引预览和未来语义检索>
|
|
148
|
+
|
|
149
|
+
- 日期:YYYY-MM-DD
|
|
150
|
+
- 提议者:@username
|
|
151
|
+
- 标签:<分类标签,如:React, 存储, 架构>
|
|
152
|
+
- 状态:active
|
|
153
|
+
- 背景:<为什么要做这个决策>
|
|
154
|
+
- 结论:<具体的决策内容>
|
|
155
|
+
- 原因:
|
|
156
|
+
1. <原因1>
|
|
157
|
+
2. <原因2>
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
AI 使用提示:<何时应该读取此决策>
|
|
162
|
+
`;
|
|
163
|
+
export const TMPL_PATTERN = `## 规律:<标题>
|
|
164
|
+
|
|
165
|
+
**摘要**:<1-2句话概括规律内容,用于索引预览和未来语义检索>
|
|
166
|
+
|
|
167
|
+
- 来源:<N> 次相似讨论
|
|
168
|
+
- 标签:<分类标签>
|
|
169
|
+
- 已验证:是/否
|
|
170
|
+
- 规律:
|
|
171
|
+
- <规律条目1>
|
|
172
|
+
- <规律条目2>
|
|
173
|
+
- 反例/例外:<什么情况下此规律不适用>
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
AI 使用提示:<凡涉及 XX 操作,先查此规律>
|
|
178
|
+
`;
|
|
179
|
+
export const TMPL_GRAVEYARD = `## 放弃方案:<标题>
|
|
180
|
+
|
|
181
|
+
- 日期:YYYY-MM-DD
|
|
182
|
+
- 提议者:@username / AI
|
|
183
|
+
- 关键词:<关键词1>, <关键词2>, <关键词3>
|
|
184
|
+
- 原始想法:<当时的提议>
|
|
185
|
+
- 放弃原因:
|
|
186
|
+
1. <原因1>
|
|
187
|
+
2. <原因2>
|
|
188
|
+
- 替代方案:<最终采用的方案>
|
|
189
|
+
- 相似方案特征:<如何识别重蹈覆辙的提议>
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
AI 使用提示:如果再提议类似方案,先读此文件。
|
|
194
|
+
`;
|
|
195
|
+
//# sourceMappingURL=templates-devmind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates-devmind.js","sourceRoot":"","sources":["../src/templates-devmind.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAE1C,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;CAS3B,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC1B,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDxB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;CAqB9B,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;CAW1B,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;;CAE9B,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;CAM3B,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;CAE3B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;CAE5B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;CAiB5B,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;CAe3B,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;CAe7B,CAAC"}
|
|
@@ -0,0 +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";
|
|
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
|
+
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";
|
|
5
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// templates.ts — All file templates for `devmind init`
|
|
2
|
+
// Split into logical groups to keep the file manageable.
|
|
3
|
+
// ─── Hooks ───────────────────────────────────────────────────────────────────
|
|
4
|
+
export const PRE_TOOL_USE_SH = `#!/bin/bash
|
|
5
|
+
# .claude/hooks/pre-tool-use.sh
|
|
6
|
+
# PreToolUse Hook: 模式约束拦截
|
|
7
|
+
# 在 Explore / Plan 模式下阻止写操作
|
|
8
|
+
# Claude Code 通过 stdin 传入 JSON: {"tool_name":"...","tool_input":{...}}
|
|
9
|
+
|
|
10
|
+
set -e
|
|
11
|
+
|
|
12
|
+
DEVMIND_DIR="$(cd "$(dirname "$0")/../.." && pwd)/.devmind"
|
|
13
|
+
|
|
14
|
+
# 读取 stdin 中的 JSON 数据
|
|
15
|
+
HOOK_INPUT=$(cat)
|
|
16
|
+
|
|
17
|
+
# 从 JSON 中提取 tool_name
|
|
18
|
+
TOOL_NAME=$(printf '%s' "$HOOK_INPUT" | grep -o '"tool_name":"[^"]*"' | cut -d'"' -f4)
|
|
19
|
+
|
|
20
|
+
# 读取当前模式,文件不存在则默认 explore(最严格)
|
|
21
|
+
CURRENT_MODE=$(cat "$DEVMIND_DIR/current-mode.txt" 2>/dev/null || echo "explore")
|
|
22
|
+
|
|
23
|
+
# 从 JSON 中提取 file_path(纯 bash,无外部依赖)
|
|
24
|
+
extract_file_path() {
|
|
25
|
+
printf '%s' "$1" | grep -o '"file_path":"[^"]*"' | head -1 | cut -d'"' -f4
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
# 只拦截写操作工具
|
|
29
|
+
if echo "$TOOL_NAME" | grep -qE '^(Write|Edit|NotebookEdit)$'; then
|
|
30
|
+
|
|
31
|
+
if [ "$CURRENT_MODE" = "explore" ]; then
|
|
32
|
+
echo "BLOCKED: Explore 模式禁止修改文件" >&2
|
|
33
|
+
echo "提示:使用 /dm:edit 或 /dm:build 进入可写模式" >&2
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
if [ "$CURRENT_MODE" = "plan" ]; then
|
|
38
|
+
FILE_ARG=$(extract_file_path "$HOOK_INPUT")
|
|
39
|
+
if echo "$FILE_ARG" | grep -q "\\.devmind/"; then
|
|
40
|
+
exit 0
|
|
41
|
+
fi
|
|
42
|
+
echo "BLOCKED: Plan 模式仅输出方案,不修改业务代码" >&2
|
|
43
|
+
echo "提示:使用 /dm:build 执行已确认的计划" >&2
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
if [ "$CURRENT_MODE" = "build" ]; then
|
|
48
|
+
PLAN_FILE="$DEVMIND_DIR/current-plan.md"
|
|
49
|
+
FILE_ARG=$(extract_file_path "$HOOK_INPUT")
|
|
50
|
+
|
|
51
|
+
if [ -n "$FILE_ARG" ] && [ -f "$PLAN_FILE" ]; then
|
|
52
|
+
IN_EXCLUDED=$(awk '/^### 明确排除/,/^###/' "$PLAN_FILE" | grep -v "^###" | grep -v "^$" | sed 's/^- //' | while read -r pattern; do
|
|
53
|
+
if echo "$FILE_ARG" | grep -q "$pattern"; then
|
|
54
|
+
echo "yes"
|
|
55
|
+
break
|
|
56
|
+
fi
|
|
57
|
+
done)
|
|
58
|
+
|
|
59
|
+
if [ "$IN_EXCLUDED" = "yes" ]; then
|
|
60
|
+
echo "PAUSED: 文件 '$FILE_ARG' 在明确排除列表中" >&2
|
|
61
|
+
echo "请选择:(1) 允许并更新计划范围 (2) 允许一次性例外 (3) 跳过此修改 (4) 切换到 Plan 模式" >&2
|
|
62
|
+
exit 1
|
|
63
|
+
fi
|
|
64
|
+
fi
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
exit 0
|
|
70
|
+
`;
|
|
71
|
+
export const POST_TOOL_USE_SH = `#!/bin/bash
|
|
72
|
+
# .claude/hooks/post-tool-use.sh
|
|
73
|
+
# PostToolUse Hook: 审计日志自动捕获
|
|
74
|
+
# 每次写操作后自动记录到 audit.log
|
|
75
|
+
# Claude Code 通过 stdin 传入 JSON: {"tool_name":"...","tool_input":{...},"tool_response":{...}}
|
|
76
|
+
|
|
77
|
+
DEVMIND_DIR="$(cd "$(dirname "$0")/../.." && pwd)/.devmind"
|
|
78
|
+
|
|
79
|
+
# 读取 stdin 中的 JSON 数据
|
|
80
|
+
HOOK_INPUT=$(cat)
|
|
81
|
+
|
|
82
|
+
# 从 JSON 中提取 tool_name
|
|
83
|
+
TOOL_NAME=$(printf '%s' "$HOOK_INPUT" | grep -o '"tool_name":"[^"]*"' | cut -d'"' -f4)
|
|
84
|
+
|
|
85
|
+
# 从 JSON 中提取 file_path
|
|
86
|
+
extract_file_path() {
|
|
87
|
+
printf '%s' "$1" | grep -o '"file_path":"[^"]*"' | head -1 | cut -d'"' -f4
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
# 只处理写操作工具
|
|
91
|
+
if echo "$TOOL_NAME" | grep -qE '^(Write|Edit|NotebookEdit)$'; then
|
|
92
|
+
|
|
93
|
+
CURRENT_MODE=$(cat "$DEVMIND_DIR/current-mode.txt" 2>/dev/null || echo "unknown")
|
|
94
|
+
CURRENT_PLAN=$(head -1 "$DEVMIND_DIR/current-plan.md" 2>/dev/null | sed 's/^# //')
|
|
95
|
+
FILE_PATH=$(extract_file_path "$HOOK_INPUT")
|
|
96
|
+
FILE_PATH="\${FILE_PATH:-unknown}"
|
|
97
|
+
|
|
98
|
+
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $CURRENT_MODE \${FILE_PATH} plan:\${CURRENT_PLAN:-none}" \\
|
|
99
|
+
>> "$DEVMIND_DIR/audit.log"
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
exit 0
|
|
103
|
+
`;
|
|
104
|
+
// ─── CLAUDE.md ────────────────────────────────────────────────────────────────
|
|
105
|
+
export const CLAUDE_MD = `# DevMind 状态感知
|
|
106
|
+
|
|
107
|
+
> 本段由 DevMind 框架注入,适用于本项目所有 Claude Code 会话。
|
|
108
|
+
|
|
109
|
+
## 会话启动检查
|
|
110
|
+
|
|
111
|
+
每次会话开始时,执行以下操作:
|
|
112
|
+
|
|
113
|
+
1. **读取当前模式**:\`cat .devmind/current-mode.txt\`
|
|
114
|
+
- \`explore\`:只读,禁止修改任何文件
|
|
115
|
+
- \`edit\`:可小范围修改,跨文件改动(超过2个文件)需确认
|
|
116
|
+
- \`plan\`:仅输出方案,不修改业务代码
|
|
117
|
+
- \`build\`:按 \`current-plan.md\` 中的 Spec 执行
|
|
118
|
+
- 文件不存在时,默认进入 \`explore\` 模式
|
|
119
|
+
|
|
120
|
+
2. **检查会话状态**:如果 \`.devmind/session.yaml\` 存在,读取并告知开发者上次任务状态,包括:
|
|
121
|
+
- 上次执行的计划
|
|
122
|
+
- 已完成和待续的检查点
|
|
123
|
+
- 是否有未解决的暂停原因
|
|
124
|
+
|
|
125
|
+
3. **加载记忆索引**:读取 \`.devmind/memory/index.md\`(轻量级,仅包含摘要和标签)
|
|
126
|
+
|
|
127
|
+
## 模式切换提示
|
|
128
|
+
|
|
129
|
+
当开发者输入的意图与当前模式不符时,主动提示可用的模式命令:
|
|
130
|
+
|
|
131
|
+
\`\`\`
|
|
132
|
+
用户:"帮我改这个 bug"
|
|
133
|
+
当前模式:explore(只读)
|
|
134
|
+
→ 提示:检测到修改意图,当前处于 explore 模式(只读)。
|
|
135
|
+
建议:
|
|
136
|
+
- 先定位问题?继续使用 /dm:explore
|
|
137
|
+
- 已知问题位置?使用 /dm:edit 进入编辑模式
|
|
138
|
+
- 需要大范围修改?使用 /dm:plan 制定方案后再 /dm:build
|
|
139
|
+
\`\`\`
|
|
140
|
+
|
|
141
|
+
## 模式约束说明(Hook 强制执行)
|
|
142
|
+
|
|
143
|
+
- Explore / Plan 模式下,Write / Edit / NotebookEdit 工具调用会被 \`pre-tool-use.sh\` 拦截
|
|
144
|
+
- Build 模式下,修改"明确排除"列表中的文件会触发暂停
|
|
145
|
+
- 所有写操作都由 \`post-tool-use.sh\` 自动记录到 \`audit.log\`
|
|
146
|
+
|
|
147
|
+
## 可用命令速览
|
|
148
|
+
|
|
149
|
+
| 命令 | 用途 |
|
|
150
|
+
|------|------|
|
|
151
|
+
| \`/dm:explore\` | 进入只读分析模式 |
|
|
152
|
+
| \`/dm:edit\` | 进入小范围编辑模式 |
|
|
153
|
+
| \`/dm:plan\` | 制定结构化方案(强制检索 Graveyard) |
|
|
154
|
+
| \`/dm:build\` | 按计划执行(支持断点续传) |
|
|
155
|
+
| \`/dm:remember\` | 将本次决策沉淀为记忆 |
|
|
156
|
+
| \`/dm:recall\` | 检索历史记忆 |
|
|
157
|
+
| \`/dm:bury\` | 记录被否决的方案到 Graveyard |
|
|
158
|
+
| \`/dm:audit\` | 查看操作审计日志 |
|
|
159
|
+
| \`/dm:sync-memory\` | 同步团队记忆(git pull + 重建索引) |
|
|
160
|
+
| \`/dm:publish\` | 将当前功能整理为文档写入 \`docs/designs/draft/\` |
|
|
161
|
+
| \`/dm:release\` | 汇总 draft/ 生成版本文档,归档功能文档 |
|
|
162
|
+
`;
|
|
163
|
+
// ─── settings.local.json ──────────────────────────────────────────────────────
|
|
164
|
+
export const SETTINGS_LOCAL_JSON = `{
|
|
165
|
+
"permissions": {
|
|
166
|
+
"allow": [
|
|
167
|
+
"Bash(chmod:*)",
|
|
168
|
+
"Bash(tree:*)",
|
|
169
|
+
"Bash(python:*)",
|
|
170
|
+
"Bash(python3:*)",
|
|
171
|
+
"Bash(.devmind/scripts/rebuild-index.sh:*)",
|
|
172
|
+
"Bash(bash:*)"
|
|
173
|
+
],
|
|
174
|
+
"deny": [],
|
|
175
|
+
"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
|
+
}
|
|
201
|
+
}
|
|
202
|
+
`;
|
|
203
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walk up from startDir looking for a directory that contains `.devmind/`.
|
|
3
|
+
* Returns the absolute path to the `.devmind/` directory, or null if not found.
|
|
4
|
+
*/
|
|
5
|
+
export declare function findDevmindDir(startDir?: string): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Like findDevmindDir but throws a user-friendly error if not found.
|
|
8
|
+
*/
|
|
9
|
+
export declare function requireDevmindDir(startDir?: string): string;
|
|
10
|
+
//# sourceMappingURL=find-devmind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-devmind.d.ts","sourceRoot":"","sources":["../../src/utils/find-devmind.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAc9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAQ1E"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Walk up from startDir looking for a directory that contains `.devmind/`.
|
|
5
|
+
* Returns the absolute path to the `.devmind/` directory, or null if not found.
|
|
6
|
+
*/
|
|
7
|
+
export function findDevmindDir(startDir = process.cwd()) {
|
|
8
|
+
let current = startDir;
|
|
9
|
+
while (true) {
|
|
10
|
+
const candidate = join(current, '.devmind');
|
|
11
|
+
if (existsSync(candidate)) {
|
|
12
|
+
return candidate;
|
|
13
|
+
}
|
|
14
|
+
const parent = dirname(current);
|
|
15
|
+
if (parent === current) {
|
|
16
|
+
// Reached filesystem root
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
current = parent;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Like findDevmindDir but throws a user-friendly error if not found.
|
|
24
|
+
*/
|
|
25
|
+
export function requireDevmindDir(startDir = process.cwd()) {
|
|
26
|
+
const dir = findDevmindDir(startDir);
|
|
27
|
+
if (!dir) {
|
|
28
|
+
console.error('Error: .devmind/ not found in this directory or any parent directory.');
|
|
29
|
+
console.error('Run "devmind init" first to initialize DevMind in your project.');
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
return dir;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=find-devmind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-devmind.js","sourceRoot":"","sources":["../../src/utils/find-devmind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC3D,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,OAAO,IAAI,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC5C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACrB,0BAA0B;YAC1B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACrB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC9D,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lich0821/devmind",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "DevMind — stateful AI collaboration framework for Claude Code",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"devmind": "./bin/devmind.js"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=18.0.0"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"bin",
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"dev": "tsc --watch",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"chalk": "^5.3.0",
|
|
23
|
+
"commander": "^12.0.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^20.0.0",
|
|
27
|
+
"typescript": "^5.4.0"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"claude-code",
|
|
31
|
+
"ai",
|
|
32
|
+
"devmind",
|
|
33
|
+
"workflow",
|
|
34
|
+
"memory"
|
|
35
|
+
],
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/lich0821/devmind"
|
|
40
|
+
}
|
|
41
|
+
}
|