adspecs 0.1.38 → 0.1.39

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.
@@ -10,7 +10,7 @@
10
10
  {
11
11
  "name": "adspecs",
12
12
  "description": "AI Coding研发协同开发插件",
13
- "version": "0.1.38",
13
+ "version": "0.1.39",
14
14
  "source": "./",
15
15
  "author": {
16
16
  "name": "Qingwen Chen",
@@ -2,7 +2,7 @@
2
2
  "name": "adspecs",
3
3
  "displayName": "adspecs AI Plugin",
4
4
  "description": "AI first工程规范驱动开发插件",
5
- "version": "0.1.38",
5
+ "version": "0.1.39",
6
6
  "author": {
7
7
  "name": "Qingwen Chen",
8
8
  "email": "cqinwn@qq.com",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "adspecs",
3
3
  "displayName": "adspecs AI 工程规范驱动开发插件",
4
- "version": "0.1.38",
4
+ "version": "0.1.39",
5
5
  "description": "AI-first specification-driven development plugin for ECP platform full-lifecycle development",
6
6
  "descriptionZh": "AI优先的工程规范驱动开发插件,覆盖需求分析、PRD、系统设计、任务拆解、TDD、代码评审、Wiki同步全流程",
7
7
  "author": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "adspecs",
3
3
  "displayName": "adspecs AI 工程规范驱动开发插件",
4
- "version": "0.1.38",
4
+ "version": "0.1.39",
5
5
  "description": "AI-first specification-driven development plugin for ECP platform full-lifecycle development",
6
6
  "descriptionZh": "AI优先的工程规范驱动开发插件,覆盖需求分析、PRD、系统设计、任务拆解、TDD、代码评审、Wiki同步全流程",
7
7
  "author": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "adspecs",
3
3
  "displayName": "adspecs AI 工程规范驱动开发插件",
4
- "version": "0.1.38",
4
+ "version": "0.1.39",
5
5
  "description": "AI-first specification-driven development plugin for ECP platform full-lifecycle development",
6
6
  "descriptionZh": "AI优先的工程规范驱动开发插件,覆盖需求分析、PRD、系统设计、任务拆解、TDD、代码评审、Wiki同步全流程",
7
7
  "author": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adspecs",
3
- "version": "0.1.38",
3
+ "version": "0.1.39",
4
4
  "description": "AI first 工程规范驱动开发插件 — 支持 npm 安装和 CLI 初始化",
5
5
  "bin": {
6
6
  "adspecs": "bin/adspecs.js"
@@ -28,6 +28,7 @@ argument-hint: "[--project-name <名称>] [--project-dir <目录>] [--company <
28
28
  | `web-ui/` | 前端正式项目 | 从插件根目录 references/web-ui 复制 | 完整 / 轻量 |
29
29
  | `service/` | 后端服务模块目录 | 创建 service 目录 + README.md | 完整 / 轻量 |
30
30
  | `.adspecs/` | 插件运行时配置与脚本 | 从插件根目录 .adspecs 完整复制(含 extensions.yml、feature.json、scripts/) | 简易 / 经典 / 完整 / 轻量 |
31
+ | `hooks/` | Hook 脚本(SessionStart/Stop 等) | 从插件根目录 hooks/ 完整复制(含 hooks.json、platform.js 等 5 个脚本) | 简易 / 经典 / 完整 / 轻量 |
31
32
 
32
33
  ## 适用场景
33
34
 
@@ -195,6 +196,7 @@ questions: [
195
196
  {pwd}/(或 {pwd}/{project_dir}/)
196
197
  ├── .adspecs/
197
198
  ├── docs/
199
+ ├── hooks/
198
200
  └── wiki/
199
201
  ```
200
202
 
@@ -204,6 +206,7 @@ questions: [
204
206
  {pwd}/(或 {pwd}/{project_dir}/)
205
207
  ├── .adspecs/
206
208
  ├── docs/
209
+ ├── hooks/
207
210
  ├── wiki/
208
211
  └── front-demo/
209
212
  ```
@@ -214,6 +217,7 @@ questions: [
214
217
  {pwd}/(或 {pwd}/{project_dir}/)
215
218
  ├── .adspecs/
216
219
  ├── docs/
220
+ ├── hooks/
217
221
  ├── wiki/
218
222
  ├── web-ui/
219
223
  ├── service/
@@ -283,10 +287,10 @@ questions: [
283
287
  - 如果 `TARGET` 存在 → 进入**冲突处理流程**(第 6 步)
284
288
  6. **冲突处理流程**(按模式扫描对应区域):
285
289
  - 根据模式扫描 `TARGET` 下对应区域目录的存在情况:
286
- - **简易模式**:扫描 `.adspecs/`、`docs/`、`wiki/`
287
- - **经典模式**:扫描 `.adspecs/`、`docs/`、`wiki/`、`front-demo/`
288
- - **完整模式**:扫描 `.adspecs/`、`docs/`、`wiki/`、`web-ui/`、`service/`、`front-demo/`
289
- - **轻量模式**:扫描 `.adspecs/`、`docs/`、`wiki/`、`web-ui/`、`service/`、`front-demo/`(同完整模式扫描范围)
290
+ - **简易模式**:扫描 `.adspecs/`、`docs/`、`wiki/`、`hooks/`
291
+ - **经典模式**:扫描 `.adspecs/`、`docs/`、`wiki/`、`front-demo/`、`hooks/`
292
+ - **完整模式**:扫描 `.adspecs/`、`docs/`、`wiki/`、`web-ui/`、`service/`、`front-demo/`、`hooks/`
293
+ - **轻量模式**:扫描 `.adspecs/`、`docs/`、`wiki/`、`web-ui/`、`service/`、`front-demo/`、`hooks/`(同完整模式扫描范围)
290
294
  - 如果对应区域均不存在 → 视为空目录,直接继续,跳到第 7 步
291
295
  - 如果有任意区域已存在 → 使用 **AskUserQuestion** 工具询问用户对**每个已存在的区域**的处理方式,提供以下两个选项:
292
296
  - **重新创建**:删除该区域现有文件,使用最新模板重新创建
@@ -300,6 +304,7 @@ questions: [
300
304
  .adspecs: "recreate" | "skip" | "create",
301
305
  docs: "recreate" | "skip" | "create", # create = 原本不存在,直接创建
302
306
  wiki: "recreate" | "skip" | "create",
307
+ hooks: "recreate" | "skip" | "create",
303
308
  }
304
309
  子目录决策 = {
305
310
  conventions_decision: "update" | "skip", # docs 为 skip 且 40-project_conventions/ 有文件时
@@ -315,6 +320,7 @@ questions: [
315
320
  docs: "recreate" | "skip" | "create",
316
321
  wiki: "recreate" | "skip" | "create",
317
322
  front_demo: "recreate" | "skip" | "create",
323
+ hooks: "recreate" | "skip" | "create",
318
324
  }
319
325
  子目录决策 = {
320
326
  conventions_decision: "update" | "skip", # docs 为 skip 且 40-project_conventions/ 有文件时
@@ -332,6 +338,7 @@ questions: [
332
338
  web_ui: "recreate" | "skip" | "create",
333
339
  service: "recreate" | "skip" | "create",
334
340
  front_demo: "recreate" | "skip" | "create",
341
+ hooks: "recreate" | "skip" | "create",
335
342
  }
336
343
  子目录决策 = {
337
344
  conventions_decision: "update" | "skip", # docs 为 skip 且 40-project_conventions/ 有文件时
@@ -349,6 +356,7 @@ questions: [
349
356
  web_ui: "recreate" | "skip" | "create",
350
357
  service: "recreate" | "skip" | "create",
351
358
  front_demo: "recreate" | "skip" | "create", # 固定 antd-front-demo
359
+ hooks: "recreate" | "skip" | "create",
352
360
  }
353
361
  子目录决策 = {
354
362
  conventions_decision: "update" | "skip", # docs 为 skip 且 40-project_conventions/ 有文件时
@@ -1096,6 +1104,65 @@ echo "更新了 ${#REPLACE_FILES[@]} 个模板文件,保留了 ${#KEEP_FILES[@
1096
1104
 
1097
1105
  ---
1098
1106
 
1107
+ ### 阶段 6.8:复制 hooks/ 脚本目录
1108
+
1109
+ **适用模式:简易 / 经典 / 完整 / 轻量**
1110
+
1111
+ **重要**:hooks 脚本是插件运行时核心组件,负责 SessionStart/Stop 等生命周期事件处理(wiki 同步队列、commit 候选队列、AI 会话日志等)。缺少此目录会导致 `Cannot find module .../hooks/commit-queue.js` 等错误。
1112
+
1113
+ 根据区域决策执行:
1114
+
1115
+ - `hooks` 决策为 `skip` → 输出 `⏭ 阶段 6.8 跳过:hooks/ 已存在,保留现有内容`,进入阶段 7
1116
+ - `hooks` 决策为 `recreate` → 执行 `rm -rf "$TARGET/hooks"`,然后按下方步骤完整重建
1117
+ - `hooks` 决策为 `create` → 直接按下方步骤创建
1118
+
1119
+ 从插件根目录完整复制 `hooks/` 目录到目标项目根目录,包含 hooks.json 配置和所有 Node.js 脚本。
1120
+
1121
+ #### 源路径
1122
+
1123
+ `$PLUGIN_DIR/hooks/`(其中 `PLUGIN_DIR` 为 adspecs 插件根目录,即 `SKILL_DIR/../..`)
1124
+
1125
+ #### 目录结构
1126
+
1127
+ ```
1128
+ hooks/
1129
+ ├── hooks.json # 跨平台 Hook 配置(SessionStart/PreCompact/PostToolUse/Stop)
1130
+ ├── platform.js # 平台检测工具模块(Claude Code / Qoder / WorkBuddy 兼容)
1131
+ ├── session-start.js # SessionStart — 注入 using-adspecs 技能引导
1132
+ ├── wiki-queue.js # PostToolUse/Stop — wiki 同步队列管理
1133
+ ├── commit-queue.js # PostToolUse/Stop — commit 候选队列管理
1134
+ └── session-logger.js # SessionStart/PreCompact/Stop — AI 会话日志管理
1135
+ ```
1136
+
1137
+ #### 执行命令
1138
+
1139
+ ```bash
1140
+ SKILL_DIR="<SKILL.md 所在目录>"
1141
+ PLUGIN_DIR="$(cd "$SKILL_DIR/../.." && pwd)" # adspecs 插件根目录
1142
+
1143
+ # 如果 hooks 决策为 recreate,先删除现有目录
1144
+ # rm -rf "$TARGET/hooks"
1145
+
1146
+ # 从插件根目录完整复制 hooks/
1147
+ cp -r "$PLUGIN_DIR/hooks" "$TARGET/hooks"
1148
+
1149
+ # 统计复制的文件数量
1150
+ find "$TARGET/hooks" -type f | wc -l
1151
+ ```
1152
+
1153
+ **注意**:
1154
+ - hooks.json 中的 `${CLAUDE_PLUGIN_ROOT}` 由平台在加载插件时注入,指向插件根目录或项目目录
1155
+ - 复制 hooks/ 到项目目录确保脚本在任何平台环境下都能正确解析
1156
+ - 不要修改 hooks.json 内容,保持 `${CLAUDE_PLUGIN_ROOT}` 变量引用不变
1157
+
1158
+ 完成后输出:
1159
+
1160
+ - 新建时:`✅ 阶段 6.8 完成:hooks/ 脚本目录已复制({N} 个文件)`
1161
+ - 重建时:`🔄 阶段 6.8 完成:hooks/ 脚本目录已重新复制({N} 个文件)`
1162
+ - 跳过时:`⏭ 阶段 6.8 跳过:hooks/ 已存在,保留现有内容`
1163
+
1164
+ ---
1165
+
1099
1166
  ### 阶段 7:生成路径配置文件
1100
1167
 
1101
1168
  **适用模式:简易 / 经典 / 完整 / 轻量**
@@ -1181,6 +1248,7 @@ mkdir -p "$TARGET/.adspecs"
1181
1248
  | docs/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 11 个骨架目录,40 仅创建空目录 |
1182
1249
  | └ 40-project_conventions/ | 🔄 已更新 / ⏭ 已跳过 | docs/ 跳过时,40 子目录的更新决策 |
1183
1250
  | wiki/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 基线文件目录 + README.md |
1251
+ | hooks/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | Hook 脚本(hooks.json + platform.js + 4 个事件脚本) |
1184
1252
  | .adspecs/project.json | ✅ 已生成 / 🔄 已更新 | 项目元数据文件(已有字段合并,缺失属性补全) |
1185
1253
  | .adspecs/paths.json | ✅ 已生成 / ⏭ 已存在跳过 | 路径配置文件 |
1186
1254
 
@@ -1195,6 +1263,7 @@ mkdir -p "$TARGET/.adspecs"
1195
1263
  | └ 40-project_conventions/ | 🔄 已更新 / ⏭ 已跳过 | docs/ 跳过时,40 子目录的更新决策 |
1196
1264
  | wiki/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 基线文件目录 + README.md |
1197
1265
  | front-demo/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | {技术栈名},{N} 个文件 |
1266
+ | hooks/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | Hook 脚本(hooks.json + platform.js + 4 个事件脚本) |
1198
1267
  | .adspecs/project.json | ✅ 已生成 / 🔄 已更新 | 项目元数据文件(已有字段合并,缺失属性补全) |
1199
1268
  | .adspecs/paths.json | ✅ 已生成 / ⏭ 已存在跳过 | 路径配置文件 |
1200
1269
 
@@ -1211,6 +1280,7 @@ mkdir -p "$TARGET/.adspecs"
1211
1280
  | web-ui/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | {N} 个文件 |
1212
1281
  | service/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | 模块 service 目录 + README.md |
1213
1282
  | front-demo/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | {技术栈名},{N} 个文件 |
1283
+ | hooks/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | Hook 脚本(hooks.json + platform.js + 4 个事件脚本) |
1214
1284
  | .adspecs/project.json | ✅ 已生成 / 🔄 已更新 | 项目元数据文件(已有字段合并,缺失属性补全) |
1215
1285
  | .adspecs/paths.json | ✅ 已生成 / ⏭ 已存在跳过 | 路径配置文件 |
1216
1286
 
@@ -1227,6 +1297,7 @@ mkdir -p "$TARGET/.adspecs"
1227
1297
  | web-ui/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | React + AntD6 前端项目,{N} 个文件 |
1228
1298
  | service/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | Python 后端服务目录 + README.md |
1229
1299
  | front-demo/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | Ant Design React,{N} 个文件 |
1300
+ | hooks/ | ✅ 已创建 / 🔄 已重建 / ⏭ 已跳过 | Hook 脚本(hooks.json + platform.js + 4 个事件脚本) |
1230
1301
  | .adspecs/project.json | ✅ 已生成 / 🔄 已更新 | 项目元数据文件(已有字段合并,缺失属性补全) |
1231
1302
  | .adspecs/paths.json | ✅ 已生成 / ⏭ 已存在跳过 | 路径配置文件 |
1232
1303
 
@@ -1244,12 +1315,14 @@ mkdir -p "$TARGET/.adspecs"
1244
1315
  {pwd}/{PROJECT_DIR}/(或直接 {pwd}/)
1245
1316
  ├── .adspecs/ (插件配置、脚本、模板 + project.json)
1246
1317
  ├── docs/ (11 个子目录)
1318
+ ├── hooks/ (Hook 脚本:SessionStart/Stop/PostToolUse 等)
1247
1319
  └── wiki/ (基线文件目录)
1248
1320
 
1249
1321
  **经典模式:**
1250
1322
  {pwd}/{PROJECT_DIR}/(或直接 {pwd}/)
1251
1323
  ├── .adspecs/ (插件配置、脚本、模板 + project.json)
1252
1324
  ├── docs/ (11 个子目录)
1325
+ ├── hooks/ (Hook 脚本:SessionStart/Stop/PostToolUse 等)
1253
1326
  ├── wiki/ (基线文件目录)
1254
1327
  └── front-demo/ ({技术栈名}前端演示项目)
1255
1328
 
@@ -1257,6 +1330,7 @@ mkdir -p "$TARGET/.adspecs"
1257
1330
  {pwd}/{PROJECT_DIR}/(或直接 {pwd}/)
1258
1331
  ├── .adspecs/ (插件配置、脚本、模板 + project.json)
1259
1332
  ├── docs/ (11 个子目录)
1333
+ ├── hooks/ (Hook 脚本:SessionStart/Stop/PostToolUse 等)
1260
1334
  ├── wiki/ (基线文件目录)
1261
1335
  ├── web-ui/ (Vue3 壳工程)
1262
1336
  ├── service/
@@ -1267,6 +1341,7 @@ mkdir -p "$TARGET/.adspecs"
1267
1341
  {pwd}/{PROJECT_DIR}/(或直接 {pwd}/)
1268
1342
  ├── .adspecs/ (插件配置、脚本、模板 + project.json)
1269
1343
  ├── docs/ (11 个子目录 + 40-project_conventions/ 含 Python 后端规范 + React 前端规范)
1344
+ ├── hooks/ (Hook 脚本:SessionStart/Stop/PostToolUse 等)
1270
1345
  ├── wiki/ (基线文件目录)
1271
1346
  ├── web-ui/ (React + AntD6 前端项目)
1272
1347
  ├── service/ (Python + SQLite 后端服务)
@@ -1357,6 +1432,7 @@ mkdir -p "$TARGET/.adspecs"
1357
1432
  - [ ] feature.json 属性补全检查已完成(recreate/skip 时,已对比 references 初始版本并补全缺失属性,已有属性不覆盖)
1358
1433
  - [ ] project.json 属性补全检查已完成(recreate/skip 时,已对比 references 初始版本并补全缺失属性)
1359
1434
  - [ ] .adspecs/project.json 项目元数据文件已生成或更新
1435
+ - [ ] hooks/ 脚本目录已从插件根目录完整复制/重建/跳过(所有模式,含 hooks.json + platform.js + 4 个事件脚本)
1360
1436
  - [ ] .adspecs/paths.json 路径配置文件已生成(含 architecture_dir 和 export_dir,或已存在时跳过)
1361
1437
  - [ ] 初始化报告已输出(包含项目信息、模式、技术栈、各区域状态)
1362
1438
  ````
@@ -21,6 +21,7 @@ const AREA_DIRS = {
21
21
  webUi: 'web-ui',
22
22
  service: 'service',
23
23
  frontDemo: 'front-demo',
24
+ hooks: 'hooks',
24
25
  };
25
26
 
26
27
  /**
@@ -32,14 +33,14 @@ const AREA_DIRS = {
32
33
  function getAreaListForMode(mode) {
33
34
  switch (mode) {
34
35
  case 'simple':
35
- return ['adspecs', 'docs', 'wiki'];
36
+ return ['adspecs', 'docs', 'wiki', 'hooks'];
36
37
  case 'classic':
37
- return ['adspecs', 'docs', 'wiki', 'frontDemo'];
38
+ return ['adspecs', 'docs', 'wiki', 'frontDemo', 'hooks'];
38
39
  case 'full':
39
40
  case 'demo':
40
- return ['adspecs', 'docs', 'wiki', 'webUi', 'service', 'frontDemo'];
41
+ return ['adspecs', 'docs', 'wiki', 'webUi', 'service', 'frontDemo', 'hooks'];
41
42
  default:
42
- return ['adspecs', 'docs', 'wiki'];
43
+ return ['adspecs', 'docs', 'wiki', 'hooks'];
43
44
  }
44
45
  }
45
46
 
@@ -83,6 +84,7 @@ function areaDisplayName(areaKey) {
83
84
  webUi: 'web-ui',
84
85
  service: 'service',
85
86
  frontDemo: 'front-demo',
87
+ hooks: 'hooks',
86
88
  };
87
89
  return names[areaKey] || areaKey;
88
90
  }
package/src/lib/report.js CHANGED
@@ -265,7 +265,8 @@ function printDirectoryTree(mode, frontDemo) {
265
265
  lines.push(` │ └── frontend-standard/ (${fdLabel} 前端规范)`);
266
266
  }
267
267
  }
268
- lines.push(' ├── wiki/ (基线文件目录)');
268
+ lines.push(' ├── hooks/ (Hook 脚本:SessionStart/Stop/PostToolUse 等)');
269
+ lines.push(' └── wiki/ (基线文件目录)');
269
270
 
270
271
  if (mode === 'full' || mode === 'demo') {
271
272
  lines.push(' ├── web-ui/ (前端生产项目)');
@@ -123,6 +123,9 @@ async function scaffold(opts) {
123
123
  detail: projectJsonResult,
124
124
  });
125
125
 
126
+ // === 阶段 6.8: hooks/ ===
127
+ report.stages.push(scaffoldHooks(targetDir, pluginDir, decisions.hooks, logger));
128
+
126
129
  // === 阶段 7: paths.json ===
127
130
  const pathsResult = writePathsJson(targetDir);
128
131
  logger(
@@ -508,6 +511,36 @@ async function scaffoldAdspecs(targetDir, pluginDir, decision, subDecisions, log
508
511
  return stage;
509
512
  }
510
513
 
514
+ /**
515
+ * 阶段 6.8: hooks/ 脚本目录
516
+ *
517
+ * 从插件根目录复制 hooks/ 到目标项目,确保 SessionStart/Stop 等
518
+ * 生命周期事件脚本(wiki-queue、commit-queue、session-logger)可用。
519
+ */
520
+ function scaffoldHooks(targetDir, pluginDir, decision, logger) {
521
+ const hooksDir = path.join(targetDir, 'hooks');
522
+ const stage = { name: 'hooks/' };
523
+
524
+ if (decision === 'skip') {
525
+ logger(`⏭ 阶段 6.8 跳过:hooks/ 已存在,保留现有内容`);
526
+ stage.status = 'skipped';
527
+ return stage;
528
+ }
529
+
530
+ const action = prepareDirByDecision(hooksDir, decision, logger, 'hooks');
531
+
532
+ // 从插件根目录复制 hooks/
533
+ const result = copyDirFiltered(path.join(pluginDir, 'hooks'), hooksDir);
534
+
535
+ stage.fileCount = result.fileCount;
536
+ stage.status = action === 'recreate' ? 'recreated' : 'created';
537
+
538
+ const verb = action === 'recreate' ? '重新复制' : '复制';
539
+ logger(`✅ 阶段 6.8 完成:hooks/ 脚本目录已${verb}(${result.fileCount} 个文件)`);
540
+
541
+ return stage;
542
+ }
543
+
511
544
  /**
512
545
  * 阶段 6.5: 生成 .adspecs/project.json
513
546
  */