adspecs 0.1.19 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/.adspecs/feature.json +16 -16
  2. package/.adspecs/feature.yml +28 -28
  3. package/.adspecs/paths.json +17 -17
  4. package/.adspecs/templates/04-/345/211/215/347/253/257/345/212/237/350/203/275/350/256/276/350/256/241/346/250/241/346/235/277.md +1 -1
  5. package/.adspecs/templates/05-/345/220/216/347/253/257/344/273/273/345/212/241/346/270/205/345/215/225/346/250/241/346/235/277.md +613 -724
  6. package/.adspecs/templates/05b-/345/211/215/347/253/257/344/273/273/345/212/241/346/270/205/345/215/225/346/250/241/346/235/277.md +51 -51
  7. package/.claude-plugin/marketplace.json +23 -23
  8. package/.claude-plugin/plugin.json +18 -18
  9. package/.qoder-plugin/plugin.json +31 -31
  10. package/CLAUDE.md +1 -5
  11. package/INSTALL.md +3 -3
  12. package/README.md +395 -395
  13. package/bin/adspecs.js +129 -129
  14. package/hooks/commit-queue.js +245 -245
  15. package/hooks/hooks.json +63 -63
  16. package/hooks/session-start.js +44 -44
  17. package/hooks/wiki-queue.js +127 -127
  18. package/package.json +61 -61
  19. package/references/ant6-front-standard/index.md +99 -99
  20. package/references/antd-front-demo/public/mockServiceWorker.js +361 -361
  21. package/references/ecp-end-standard/index.md +63 -63
  22. package/references/python-end-standard/01-Python/345/220/216/347/253/257/347/274/226/347/240/201/350/247/204/350/214/203.md +372 -372
  23. package/references/python-end-standard/02-/346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/344/270/216/344/275/277/347/224/250/350/247/204/350/214/203.md +226 -226
  24. package/references/python-end-standard/03-Celery/345/274/202/346/255/245/344/273/273/345/212/241/350/247/204/350/214/203.md +237 -237
  25. package/references/python-end-standard/04-Redis/344/275/277/347/224/250/350/247/204/350/214/203.md +231 -231
  26. package/scripts/postinstall.js +107 -107
  27. package/scripts/sync-version.js +105 -105
  28. package/skills/.claude/.wiki-update-queue +26 -26
  29. package/skills/adspecs-constitution/SKILL.md +157 -0
  30. package/skills/adspecs-export-word/SKILL.md +498 -498
  31. package/skills/adspecs-export-word/references/md-to-docx.js +862 -862
  32. package/skills/adspecs-export-word/references/package-lock.json +220 -220
  33. package/skills/adspecs-export-word/references/package.json +10 -10
  34. package/skills/adspecs-front-prototype/SKILL.md +405 -405
  35. package/skills/adspecs-front-spec/SKILL.md +4 -4
  36. package/skills/adspecs-front-tasks/SKILL.md +213 -173
  37. package/skills/adspecs-plan/SKILL.md +59 -69
  38. package/skills/adspecs-prd/SKILL.md +13 -5
  39. package/skills/adspecs-prd-to-demo/SKILL.md +532 -0
  40. package/skills/adspecs-tasks/SKILL.md +175 -204
  41. package/skills/adspecs-update-status/SKILL.md +382 -382
  42. package/skills/adspecs-utest/SKILL.md +107 -116
  43. package/skills/grill-me/SKILL.md +7 -0
  44. package/skills/grill-me/agents/openai.yaml +5 -0
  45. package/skills/playwright-cli/SKILL.md +420 -0
  46. package/skills/playwright-cli/references/element-attributes.md +23 -0
  47. package/skills/playwright-cli/references/playwright-tests.md +39 -0
  48. package/skills/playwright-cli/references/request-mocking.md +87 -0
  49. package/skills/playwright-cli/references/running-code.md +241 -0
  50. package/skills/playwright-cli/references/session-management.md +225 -0
  51. package/skills/playwright-cli/references/storage-state.md +275 -0
  52. package/skills/playwright-cli/references/test-generation.md +433 -0
  53. package/skills/playwright-cli/references/tracing.md +139 -0
  54. package/skills/playwright-cli/references/video-recording.md +143 -0
  55. package/skills/playwright-trace/SKILL.md +171 -0
  56. package/skills/project-init/SKILL.md +93 -22
  57. package/skills/project-init/references/front-demo/.claude/settings.local.json +9 -0
  58. package/skills/wiki-update/SKILL.md +232 -232
  59. package/src/commands/doctor.js +197 -197
  60. package/src/commands/init.js +83 -83
  61. package/src/commands/plugin.js +165 -165
  62. package/src/commands/update.js +87 -87
  63. package/src/lib/area-scanner.js +129 -129
  64. package/src/lib/copier.js +104 -104
  65. package/src/lib/dir-utils.js +161 -133
  66. package/src/lib/json-merge.js +114 -114
  67. package/src/lib/paths-defaults.js +37 -37
  68. package/src/lib/prompts.js +428 -347
  69. package/src/lib/readme-gen.js +143 -143
  70. package/src/lib/report.js +338 -327
  71. package/src/lib/scaffolder.js +551 -518
  72. package/src/lib/short-name.js +36 -36
  73. package/src/utils.js +80 -80
  74. package/references/antd-front-demo/.env +0 -15
@@ -1,245 +1,245 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Commit Queue — 跨平台 Hook 脚本
5
- *
6
- * 在 SessionStart / PostToolUse / Stop 三个 Hook 事件中管理 .commit-candidates 队列文件。
7
- * 当检测到 pipeline-manifest.json 写入(且 status=completed + mvn_compile=pass),
8
- * 自动将 feature 信息加入提交候选队列,Stop 时提示用户执行提交。
9
- *
10
- * 用法:
11
- * node hooks/commit-queue.js init — SessionStart: 创建队列文件
12
- * node hooks/commit-queue.js enqueue — PostToolUse: 检测 manifest 写入并入队
13
- * node hooks/commit-queue.js report — Stop: 检查队列并输出提示
14
- */
15
-
16
- const fs = require('fs');
17
- const path = require('path');
18
-
19
- // ── 配置 ──────────────────────────────────────────────
20
- // 队列文件放在目标项目根目录的 .claude/ 下。
21
- // 使用 process.cwd() 获取目标项目根目录(Claude Code 运行 hook 时 CWD 即为目标项目)。
22
- // 注意:不能用 __dirname,因为 __dirname 指向的是插件安装目录,而非用户的目标项目。
23
- const PROJECT_ROOT = process.cwd();
24
- const QUEUE_DIR = path.join(PROJECT_ROOT, '.claude');
25
- const QUEUE_FILE = path.join(QUEUE_DIR, '.commit-candidates');
26
-
27
- // ── 工具函数 ──────────────────────────────────────────
28
-
29
- /** 确保 .claude 目录和队列文件存在 */
30
- function ensureQueueFile() {
31
- fs.mkdirSync(QUEUE_DIR, { recursive: true });
32
- if (!fs.existsSync(QUEUE_FILE)) {
33
- fs.writeFileSync(QUEUE_FILE, '', 'utf8');
34
- }
35
- }
36
-
37
- /**
38
- * 解析 pipeline-manifest.json 文件,提取提交候选信息。
39
- * 返回 null 表示不满足提交条件(未完成或编译未通过)。
40
- *
41
- * @param {string} filePath - pipeline-manifest.json 的绝对路径
42
- * @returns {object|null}
43
- */
44
- function parseManifest(filePath) {
45
- if (!fs.existsSync(filePath)) {
46
- return null;
47
- }
48
-
49
- var manifest;
50
- try {
51
- var raw = fs.readFileSync(filePath, 'utf8');
52
- manifest = JSON.parse(raw);
53
- } catch (_err) {
54
- // JSON 解析失败(文件可能正在写入),跳过
55
- return null;
56
- }
57
-
58
- // 检查基本完成状态
59
- if (!manifest || manifest.status !== 'completed') {
60
- return null;
61
- }
62
-
63
- // 检查 TDD 验证中编译是否通过
64
- var tdd = manifest.tdd_verification;
65
- if (!tdd) {
66
- // 没有 tdd_verification 字段时,检查是否有其他编译通过标记
67
- if (!manifest.mvn_compile || manifest.mvn_compile !== 'pass') {
68
- return null;
69
- }
70
- } else {
71
- if (tdd.mvn_compile !== 'pass' && tdd.compile !== 'pass') {
72
- return null;
73
- }
74
- }
75
-
76
- // 提取候选信息
77
- var feature = manifest.feature || '';
78
- var modulePath = manifest.module_path || '';
79
- var specDir = manifest.spec_dir || '';
80
-
81
- // 尝试从文件路径推导 feature 和模块路径
82
- if (!feature || !modulePath) {
83
- var dirParts = path.dirname(filePath).split(path.sep);
84
- // 从 45-specs/{feature}/ 路径推导
85
- for (var i = 0; i < dirParts.length; i++) {
86
- if (dirParts[i] === '45-specs' && i + 1 < dirParts.length) {
87
- feature = feature || dirParts[i + 1];
88
- break;
89
- }
90
- }
91
- // 从 {code}-{name}-model-app/ 路径推导模块路径
92
- for (var j = 0; j < dirParts.length; j++) {
93
- if (dirParts[j].endsWith('-model-app')) {
94
- modulePath = modulePath || dirParts.slice(0, j + 1).join(path.sep);
95
- break;
96
- }
97
- }
98
- }
99
-
100
- if (!feature) {
101
- return null; // 无法推导 feature 名称,跳过
102
- }
103
-
104
- return {
105
- feature: feature,
106
- modulePath: modulePath,
107
- specDir: specDir || path.dirname(filePath),
108
- manifestPath: filePath,
109
- enrolledAt: new Date().toISOString()
110
- };
111
- }
112
-
113
- /**
114
- * 从 CLAUDE_TOOL_OUTPUT_FILES 环境变量中筛选 pipeline-manifest.json 文件,
115
- * 解析并加入提交候选队列。
116
- */
117
- function enqueueFromManifests(files) {
118
- if (!files || (typeof files === 'string' && files.trim() === '')) {
119
- return;
120
- }
121
-
122
- fs.mkdirSync(QUEUE_DIR, { recursive: true });
123
-
124
- var candidatePaths = files
125
- .split(/\r?\n/)
126
- .map(function (f) { return f.trim(); })
127
- .filter(function (f) { return f && f.endsWith('pipeline-manifest.json'); });
128
-
129
- if (candidatePaths.length === 0) {
130
- return;
131
- }
132
-
133
- // 读取已有队列,按 feature 名称去重
134
- /** @type {Set<string>} */
135
- var seen = new Set();
136
- if (fs.existsSync(QUEUE_FILE)) {
137
- var existingLines = fs.readFileSync(QUEUE_FILE, 'utf8')
138
- .split(/\r?\n/)
139
- .map(function (f) { return f.trim(); })
140
- .filter(Boolean);
141
- existingLines.forEach(function (f) {
142
- try {
143
- var entry = JSON.parse(f);
144
- if (entry.feature) {
145
- seen.add(entry.feature);
146
- }
147
- } catch (_err) {
148
- // 兼容旧格式(非 JSON 行),按原值去重
149
- seen.add(f);
150
- }
151
- });
152
- }
153
-
154
- var appended = 0;
155
- candidatePaths.forEach(function (filePath) {
156
- var candidate = parseManifest(filePath);
157
- if (!candidate) {
158
- return;
159
- }
160
-
161
- // 使用 feature 名称作为去重键
162
- var key = candidate.feature;
163
- if (seen.has(key)) {
164
- return;
165
- }
166
-
167
- // 以 JSON 行格式写入队列
168
- fs.appendFileSync(QUEUE_FILE, JSON.stringify(candidate) + '\n', 'utf8');
169
- seen.add(key);
170
- appended++;
171
- });
172
-
173
- if (appended > 0) {
174
- console.log('[commit-queue] ' + appended + ' feature(s) ready for commit.');
175
- }
176
- }
177
-
178
- /** 检查队列并在有待处理项时输出提示 */
179
- function checkAndReport() {
180
- if (!fs.existsSync(QUEUE_FILE)) {
181
- return;
182
- }
183
-
184
- var content;
185
- try {
186
- content = fs.readFileSync(QUEUE_FILE, 'utf8').trim();
187
- } catch (_err) {
188
- return;
189
- }
190
-
191
- if (!content) {
192
- return;
193
- }
194
-
195
- var lines = content.split(/\r?\n/).filter(Boolean);
196
- var count = lines.length;
197
-
198
- if (count > 0) {
199
- console.log('');
200
- console.log('═══ [commit-queue] ═══════════════════════════════════');
201
- console.log('[commit-queue] ' + count + ' feature(s) compiled and ready to commit:');
202
- console.log('');
203
-
204
- lines.forEach(function (line) {
205
- try {
206
- var candidate = JSON.parse(line);
207
- console.log(' • ' + candidate.feature + (candidate.modulePath ? ' (' + candidate.modulePath + ')' : ''));
208
- } catch (_err) {
209
- console.log(' • ' + line);
210
- }
211
- });
212
-
213
- console.log('');
214
- console.log('[commit-queue] To commit with worktree isolation:');
215
- console.log('[commit-queue] /ai-softengineer:git-worktree-manager');
216
- console.log('[commit-queue] To commit directly (no worktree):');
217
- console.log('[commit-queue] /ai-softengineer:git-commit');
218
- console.log('══════════════════════════════════════════════════════');
219
- console.log('');
220
- }
221
- }
222
-
223
- // ── 主入口 ────────────────────────────────────────────
224
-
225
- var action = process.argv[2];
226
-
227
- switch (action) {
228
- case 'init':
229
- ensureQueueFile();
230
- break;
231
-
232
- case 'enqueue':
233
- // CLAUDE_TOOL_OUTPUT_FILES 由 Claude Code Hook 运行时注入为环境变量
234
- enqueueFromManifests(process.env.CLAUDE_TOOL_OUTPUT_FILES || '');
235
- break;
236
-
237
- case 'report':
238
- checkAndReport();
239
- break;
240
-
241
- default:
242
- console.error('[commit-queue] Unknown action: ' + (action || '(none)'));
243
- console.error('[commit-queue] Usage: node hooks/commit-queue.js init|enqueue|report');
244
- process.exit(1);
245
- }
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Commit Queue — 跨平台 Hook 脚本
5
+ *
6
+ * 在 SessionStart / PostToolUse / Stop 三个 Hook 事件中管理 .commit-candidates 队列文件。
7
+ * 当检测到 pipeline-manifest.json 写入(且 status=completed + mvn_compile=pass),
8
+ * 自动将 feature 信息加入提交候选队列,Stop 时提示用户执行提交。
9
+ *
10
+ * 用法:
11
+ * node hooks/commit-queue.js init — SessionStart: 创建队列文件
12
+ * node hooks/commit-queue.js enqueue — PostToolUse: 检测 manifest 写入并入队
13
+ * node hooks/commit-queue.js report — Stop: 检查队列并输出提示
14
+ */
15
+
16
+ const fs = require('fs');
17
+ const path = require('path');
18
+
19
+ // ── 配置 ──────────────────────────────────────────────
20
+ // 队列文件放在目标项目根目录的 .claude/ 下。
21
+ // 使用 process.cwd() 获取目标项目根目录(Claude Code 运行 hook 时 CWD 即为目标项目)。
22
+ // 注意:不能用 __dirname,因为 __dirname 指向的是插件安装目录,而非用户的目标项目。
23
+ const PROJECT_ROOT = process.cwd();
24
+ const QUEUE_DIR = path.join(PROJECT_ROOT, '.claude');
25
+ const QUEUE_FILE = path.join(QUEUE_DIR, '.commit-candidates');
26
+
27
+ // ── 工具函数 ──────────────────────────────────────────
28
+
29
+ /** 确保 .claude 目录和队列文件存在 */
30
+ function ensureQueueFile() {
31
+ fs.mkdirSync(QUEUE_DIR, { recursive: true });
32
+ if (!fs.existsSync(QUEUE_FILE)) {
33
+ fs.writeFileSync(QUEUE_FILE, '', 'utf8');
34
+ }
35
+ }
36
+
37
+ /**
38
+ * 解析 pipeline-manifest.json 文件,提取提交候选信息。
39
+ * 返回 null 表示不满足提交条件(未完成或编译未通过)。
40
+ *
41
+ * @param {string} filePath - pipeline-manifest.json 的绝对路径
42
+ * @returns {object|null}
43
+ */
44
+ function parseManifest(filePath) {
45
+ if (!fs.existsSync(filePath)) {
46
+ return null;
47
+ }
48
+
49
+ var manifest;
50
+ try {
51
+ var raw = fs.readFileSync(filePath, 'utf8');
52
+ manifest = JSON.parse(raw);
53
+ } catch (_err) {
54
+ // JSON 解析失败(文件可能正在写入),跳过
55
+ return null;
56
+ }
57
+
58
+ // 检查基本完成状态
59
+ if (!manifest || manifest.status !== 'completed') {
60
+ return null;
61
+ }
62
+
63
+ // 检查 TDD 验证中编译是否通过
64
+ var tdd = manifest.tdd_verification;
65
+ if (!tdd) {
66
+ // 没有 tdd_verification 字段时,检查是否有其他编译通过标记
67
+ if (!manifest.mvn_compile || manifest.mvn_compile !== 'pass') {
68
+ return null;
69
+ }
70
+ } else {
71
+ if (tdd.mvn_compile !== 'pass' && tdd.compile !== 'pass') {
72
+ return null;
73
+ }
74
+ }
75
+
76
+ // 提取候选信息
77
+ var feature = manifest.feature || '';
78
+ var modulePath = manifest.module_path || '';
79
+ var specDir = manifest.spec_dir || '';
80
+
81
+ // 尝试从文件路径推导 feature 和模块路径
82
+ if (!feature || !modulePath) {
83
+ var dirParts = path.dirname(filePath).split(path.sep);
84
+ // 从 45-specs/{feature}/ 路径推导
85
+ for (var i = 0; i < dirParts.length; i++) {
86
+ if (dirParts[i] === '45-specs' && i + 1 < dirParts.length) {
87
+ feature = feature || dirParts[i + 1];
88
+ break;
89
+ }
90
+ }
91
+ // 从 {code}-{name}-model-app/ 路径推导模块路径
92
+ for (var j = 0; j < dirParts.length; j++) {
93
+ if (dirParts[j].endsWith('-model-app')) {
94
+ modulePath = modulePath || dirParts.slice(0, j + 1).join(path.sep);
95
+ break;
96
+ }
97
+ }
98
+ }
99
+
100
+ if (!feature) {
101
+ return null; // 无法推导 feature 名称,跳过
102
+ }
103
+
104
+ return {
105
+ feature: feature,
106
+ modulePath: modulePath,
107
+ specDir: specDir || path.dirname(filePath),
108
+ manifestPath: filePath,
109
+ enrolledAt: new Date().toISOString()
110
+ };
111
+ }
112
+
113
+ /**
114
+ * 从 CLAUDE_TOOL_OUTPUT_FILES 环境变量中筛选 pipeline-manifest.json 文件,
115
+ * 解析并加入提交候选队列。
116
+ */
117
+ function enqueueFromManifests(files) {
118
+ if (!files || (typeof files === 'string' && files.trim() === '')) {
119
+ return;
120
+ }
121
+
122
+ fs.mkdirSync(QUEUE_DIR, { recursive: true });
123
+
124
+ var candidatePaths = files
125
+ .split(/\r?\n/)
126
+ .map(function (f) { return f.trim(); })
127
+ .filter(function (f) { return f && f.endsWith('pipeline-manifest.json'); });
128
+
129
+ if (candidatePaths.length === 0) {
130
+ return;
131
+ }
132
+
133
+ // 读取已有队列,按 feature 名称去重
134
+ /** @type {Set<string>} */
135
+ var seen = new Set();
136
+ if (fs.existsSync(QUEUE_FILE)) {
137
+ var existingLines = fs.readFileSync(QUEUE_FILE, 'utf8')
138
+ .split(/\r?\n/)
139
+ .map(function (f) { return f.trim(); })
140
+ .filter(Boolean);
141
+ existingLines.forEach(function (f) {
142
+ try {
143
+ var entry = JSON.parse(f);
144
+ if (entry.feature) {
145
+ seen.add(entry.feature);
146
+ }
147
+ } catch (_err) {
148
+ // 兼容旧格式(非 JSON 行),按原值去重
149
+ seen.add(f);
150
+ }
151
+ });
152
+ }
153
+
154
+ var appended = 0;
155
+ candidatePaths.forEach(function (filePath) {
156
+ var candidate = parseManifest(filePath);
157
+ if (!candidate) {
158
+ return;
159
+ }
160
+
161
+ // 使用 feature 名称作为去重键
162
+ var key = candidate.feature;
163
+ if (seen.has(key)) {
164
+ return;
165
+ }
166
+
167
+ // 以 JSON 行格式写入队列
168
+ fs.appendFileSync(QUEUE_FILE, JSON.stringify(candidate) + '\n', 'utf8');
169
+ seen.add(key);
170
+ appended++;
171
+ });
172
+
173
+ if (appended > 0) {
174
+ console.log('[commit-queue] ' + appended + ' feature(s) ready for commit.');
175
+ }
176
+ }
177
+
178
+ /** 检查队列并在有待处理项时输出提示 */
179
+ function checkAndReport() {
180
+ if (!fs.existsSync(QUEUE_FILE)) {
181
+ return;
182
+ }
183
+
184
+ var content;
185
+ try {
186
+ content = fs.readFileSync(QUEUE_FILE, 'utf8').trim();
187
+ } catch (_err) {
188
+ return;
189
+ }
190
+
191
+ if (!content) {
192
+ return;
193
+ }
194
+
195
+ var lines = content.split(/\r?\n/).filter(Boolean);
196
+ var count = lines.length;
197
+
198
+ if (count > 0) {
199
+ console.log('');
200
+ console.log('═══ [commit-queue] ═══════════════════════════════════');
201
+ console.log('[commit-queue] ' + count + ' feature(s) compiled and ready to commit:');
202
+ console.log('');
203
+
204
+ lines.forEach(function (line) {
205
+ try {
206
+ var candidate = JSON.parse(line);
207
+ console.log(' • ' + candidate.feature + (candidate.modulePath ? ' (' + candidate.modulePath + ')' : ''));
208
+ } catch (_err) {
209
+ console.log(' • ' + line);
210
+ }
211
+ });
212
+
213
+ console.log('');
214
+ console.log('[commit-queue] To commit with worktree isolation:');
215
+ console.log('[commit-queue] /ai-softengineer:git-worktree-manager');
216
+ console.log('[commit-queue] To commit directly (no worktree):');
217
+ console.log('[commit-queue] /ai-softengineer:git-commit');
218
+ console.log('══════════════════════════════════════════════════════');
219
+ console.log('');
220
+ }
221
+ }
222
+
223
+ // ── 主入口 ────────────────────────────────────────────
224
+
225
+ var action = process.argv[2];
226
+
227
+ switch (action) {
228
+ case 'init':
229
+ ensureQueueFile();
230
+ break;
231
+
232
+ case 'enqueue':
233
+ // CLAUDE_TOOL_OUTPUT_FILES 由 Claude Code Hook 运行时注入为环境变量
234
+ enqueueFromManifests(process.env.CLAUDE_TOOL_OUTPUT_FILES || '');
235
+ break;
236
+
237
+ case 'report':
238
+ checkAndReport();
239
+ break;
240
+
241
+ default:
242
+ console.error('[commit-queue] Unknown action: ' + (action || '(none)'));
243
+ console.error('[commit-queue] Usage: node hooks/commit-queue.js init|enqueue|report');
244
+ process.exit(1);
245
+ }
package/hooks/hooks.json CHANGED
@@ -1,63 +1,63 @@
1
- {
2
- "hooks": {
3
- "SessionStart": [
4
- {
5
- "hooks": [
6
- {
7
- "type": "command",
8
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/session-start.js"
9
- },
10
- {
11
- "type": "command",
12
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/wiki-queue.js init"
13
- },
14
- {
15
- "type": "command",
16
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/commit-queue.js init"
17
- }
18
- ]
19
- }
20
- ],
21
- "PreToolUse": [],
22
- "PostToolUse": [
23
- {
24
- "matcher": "Write|Edit",
25
- "hooks": [
26
- {
27
- "type": "command",
28
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/wiki-queue.js enqueue"
29
- }
30
- ],
31
- "conditions": {
32
- "filePattern": "\\.(java|py|ts|js|go|rs|cs|md)$"
33
- }
34
- },
35
- {
36
- "matcher": "Write",
37
- "hooks": [
38
- {
39
- "type": "command",
40
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/commit-queue.js enqueue"
41
- }
42
- ],
43
- "conditions": {
44
- "filePattern": "pipeline-manifest\\.json$"
45
- }
46
- }
47
- ],
48
- "Stop": [
49
- {
50
- "hooks": [
51
- {
52
- "type": "command",
53
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/wiki-queue.js report"
54
- },
55
- {
56
- "type": "command",
57
- "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/commit-queue.js report"
58
- }
59
- ]
60
- }
61
- ]
62
- }
63
- }
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/session-start.js"
9
+ },
10
+ {
11
+ "type": "command",
12
+ "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/wiki-queue.js init"
13
+ },
14
+ {
15
+ "type": "command",
16
+ "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/commit-queue.js init"
17
+ }
18
+ ]
19
+ }
20
+ ],
21
+ "PreToolUse": [],
22
+ "PostToolUse": [
23
+ {
24
+ "matcher": "Write|Edit",
25
+ "hooks": [
26
+ {
27
+ "type": "command",
28
+ "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/wiki-queue.js enqueue"
29
+ }
30
+ ],
31
+ "conditions": {
32
+ "filePattern": "\\.(java|py|ts|js|go|rs|cs|md)$"
33
+ }
34
+ },
35
+ {
36
+ "matcher": "Write",
37
+ "hooks": [
38
+ {
39
+ "type": "command",
40
+ "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/commit-queue.js enqueue"
41
+ }
42
+ ],
43
+ "conditions": {
44
+ "filePattern": "pipeline-manifest\\.json$"
45
+ }
46
+ }
47
+ ],
48
+ "Stop": [
49
+ {
50
+ "hooks": [
51
+ {
52
+ "type": "command",
53
+ "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/wiki-queue.js report"
54
+ },
55
+ {
56
+ "type": "command",
57
+ "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/commit-queue.js report"
58
+ }
59
+ ]
60
+ }
61
+ ]
62
+ }
63
+ }