sumulige-claude 1.3.1 → 1.3.3
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/.claude/MEMORY.md +9 -0
- package/.claude/handoffs/INDEX.md +21 -0
- package/.claude/handoffs/LATEST.md +76 -0
- package/.claude/handoffs/handoff_2026-01-22T13-07-04-757Z.md +76 -0
- package/.claude/hooks/auto-handoff.cjs +353 -0
- package/.claude/hooks/memory-loader.cjs +208 -0
- package/.claude/hooks/memory-saver.cjs +268 -0
- package/.claude/sessions/session_2026-01-22T13-07-26-625Z.json +23 -0
- package/.claude/settings.json +40 -0
- package/.claude/settings.local.json +5 -1
- package/.claude/skills/api-tester/SKILL.md +61 -0
- package/.claude/skills/api-tester/examples/basic.md +3 -0
- package/.claude/skills/api-tester/metadata.yaml +30 -0
- package/.claude/skills/api-tester/templates/default.md +3 -0
- package/.claude/skills/code-reviewer-123/SKILL.md +61 -0
- package/.claude/skills/code-reviewer-123/examples/basic.md +3 -0
- package/.claude/skills/code-reviewer-123/metadata.yaml +30 -0
- package/.claude/skills/code-reviewer-123/templates/default.md +3 -0
- package/.claude/skills/my-skill/SKILL.md +61 -0
- package/.claude/skills/my-skill/examples/basic.md +3 -0
- package/.claude/skills/my-skill/metadata.yaml +30 -0
- package/.claude/skills/my-skill/templates/default.md +3 -0
- package/.claude/skills/template/SKILL.md +6 -0
- package/.claude/skills/template/metadata.yaml +30 -0
- package/.claude/skills/test-skill-name/SKILL.md +61 -0
- package/.claude/skills/test-skill-name/examples/basic.md +3 -0
- package/.claude/skills/test-skill-name/metadata.yaml +30 -0
- package/.claude/skills/test-skill-name/templates/default.md +3 -0
- package/CHANGELOG.md +35 -0
- package/README.md +62 -0
- package/cli.js +1 -1
- package/development/todos/.state.json +3 -1
- package/lib/commands.js +83 -0
- package/package.json +1 -1
- package/template/.claude/hooks/auto-handoff.cjs +353 -0
- package/template/.claude/hooks/memory-loader.cjs +208 -0
- package/template/.claude/hooks/memory-saver.cjs +268 -0
- package/template/.claude/settings.json +40 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Code Reviewer 123
|
|
2
|
+
|
|
3
|
+
> 简短描述这个技能的作用(一句话)
|
|
4
|
+
|
|
5
|
+
**版本**: 1.0.0
|
|
6
|
+
**作者**: @username
|
|
7
|
+
**标签**: [category1, category2]
|
|
8
|
+
**难度**: 初级/中级/高级
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 概述
|
|
13
|
+
|
|
14
|
+
详细描述这个技能的功能和用途。
|
|
15
|
+
|
|
16
|
+
## 适用场景
|
|
17
|
+
|
|
18
|
+
- 场景 1
|
|
19
|
+
- 场景 2
|
|
20
|
+
- 场景 3
|
|
21
|
+
|
|
22
|
+
## 触发关键词
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
keyword1, keyword2, "exact phrase"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 使用方法
|
|
29
|
+
|
|
30
|
+
### 基础用法
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 示例命令
|
|
34
|
+
your-command-here
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 高级用法
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
# 配置示例
|
|
41
|
+
key: value
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 输出格式
|
|
45
|
+
|
|
46
|
+
描述这个技能的输出结果格式。
|
|
47
|
+
|
|
48
|
+
## 注意事项
|
|
49
|
+
|
|
50
|
+
- 注意事项 1
|
|
51
|
+
- 注意事项 2
|
|
52
|
+
|
|
53
|
+
## 相关技能
|
|
54
|
+
|
|
55
|
+
- [related-skill](../related-skill/)
|
|
56
|
+
- [another-skill](../another-skill/)
|
|
57
|
+
|
|
58
|
+
## 更新日志
|
|
59
|
+
|
|
60
|
+
### 1.0.0 (YYYY-MM-DD)
|
|
61
|
+
- 初始版本
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Skill Metadata
|
|
2
|
+
# 这个文件定义技能的基本信息,用于自动发现和索引
|
|
3
|
+
|
|
4
|
+
name: code-reviewer-123
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
author: @username
|
|
7
|
+
description: 简短描述技能功能
|
|
8
|
+
|
|
9
|
+
tags:
|
|
10
|
+
- category1
|
|
11
|
+
- category2
|
|
12
|
+
|
|
13
|
+
triggers:
|
|
14
|
+
- keyword1
|
|
15
|
+
- keyword2
|
|
16
|
+
- "exact phrase"
|
|
17
|
+
|
|
18
|
+
dependencies: [] # 依赖的其他技能
|
|
19
|
+
|
|
20
|
+
difficulty: beginner # beginner | intermediate | advanced
|
|
21
|
+
|
|
22
|
+
# 模板文件
|
|
23
|
+
templates:
|
|
24
|
+
- name: default
|
|
25
|
+
file: templates/default.md
|
|
26
|
+
|
|
27
|
+
# 示例文件
|
|
28
|
+
examples:
|
|
29
|
+
- name: basic
|
|
30
|
+
file: examples/basic.md
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# My Skill
|
|
2
|
+
|
|
3
|
+
> 简短描述这个技能的作用(一句话)
|
|
4
|
+
|
|
5
|
+
**版本**: 1.0.0
|
|
6
|
+
**作者**: @username
|
|
7
|
+
**标签**: [category1, category2]
|
|
8
|
+
**难度**: 初级/中级/高级
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 概述
|
|
13
|
+
|
|
14
|
+
详细描述这个技能的功能和用途。
|
|
15
|
+
|
|
16
|
+
## 适用场景
|
|
17
|
+
|
|
18
|
+
- 场景 1
|
|
19
|
+
- 场景 2
|
|
20
|
+
- 场景 3
|
|
21
|
+
|
|
22
|
+
## 触发关键词
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
keyword1, keyword2, "exact phrase"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 使用方法
|
|
29
|
+
|
|
30
|
+
### 基础用法
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 示例命令
|
|
34
|
+
your-command-here
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 高级用法
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
# 配置示例
|
|
41
|
+
key: value
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 输出格式
|
|
45
|
+
|
|
46
|
+
描述这个技能的输出结果格式。
|
|
47
|
+
|
|
48
|
+
## 注意事项
|
|
49
|
+
|
|
50
|
+
- 注意事项 1
|
|
51
|
+
- 注意事项 2
|
|
52
|
+
|
|
53
|
+
## 相关技能
|
|
54
|
+
|
|
55
|
+
- [related-skill](../related-skill/)
|
|
56
|
+
- [another-skill](../another-skill/)
|
|
57
|
+
|
|
58
|
+
## 更新日志
|
|
59
|
+
|
|
60
|
+
### 1.0.0 (YYYY-MM-DD)
|
|
61
|
+
- 初始版本
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Skill Metadata
|
|
2
|
+
# 这个文件定义技能的基本信息,用于自动发现和索引
|
|
3
|
+
|
|
4
|
+
name: my-skill
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
author: @username
|
|
7
|
+
description: 简短描述技能功能
|
|
8
|
+
|
|
9
|
+
tags:
|
|
10
|
+
- category1
|
|
11
|
+
- category2
|
|
12
|
+
|
|
13
|
+
triggers:
|
|
14
|
+
- keyword1
|
|
15
|
+
- keyword2
|
|
16
|
+
- "exact phrase"
|
|
17
|
+
|
|
18
|
+
dependencies: [] # 依赖的其他技能
|
|
19
|
+
|
|
20
|
+
difficulty: beginner # beginner | intermediate | advanced
|
|
21
|
+
|
|
22
|
+
# 模板文件
|
|
23
|
+
templates:
|
|
24
|
+
- name: default
|
|
25
|
+
file: templates/default.md
|
|
26
|
+
|
|
27
|
+
# 示例文件
|
|
28
|
+
examples:
|
|
29
|
+
- name: basic
|
|
30
|
+
file: examples/basic.md
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Skill Metadata
|
|
2
|
+
# 这个文件定义技能的基本信息,用于自动发现和索引
|
|
3
|
+
|
|
4
|
+
name: skill-name
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
author: @username
|
|
7
|
+
description: 简短描述技能功能
|
|
8
|
+
|
|
9
|
+
tags:
|
|
10
|
+
- category1
|
|
11
|
+
- category2
|
|
12
|
+
|
|
13
|
+
triggers:
|
|
14
|
+
- keyword1
|
|
15
|
+
- keyword2
|
|
16
|
+
- "exact phrase"
|
|
17
|
+
|
|
18
|
+
dependencies: [] # 依赖的其他技能
|
|
19
|
+
|
|
20
|
+
difficulty: beginner # beginner | intermediate | advanced
|
|
21
|
+
|
|
22
|
+
# 模板文件
|
|
23
|
+
templates:
|
|
24
|
+
- name: default
|
|
25
|
+
file: templates/default.md
|
|
26
|
+
|
|
27
|
+
# 示例文件
|
|
28
|
+
examples:
|
|
29
|
+
- name: basic
|
|
30
|
+
file: examples/basic.md
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Test Skill Name
|
|
2
|
+
|
|
3
|
+
> 简短描述这个技能的作用(一句话)
|
|
4
|
+
|
|
5
|
+
**版本**: 1.0.0
|
|
6
|
+
**作者**: @username
|
|
7
|
+
**标签**: [category1, category2]
|
|
8
|
+
**难度**: 初级/中级/高级
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 概述
|
|
13
|
+
|
|
14
|
+
详细描述这个技能的功能和用途。
|
|
15
|
+
|
|
16
|
+
## 适用场景
|
|
17
|
+
|
|
18
|
+
- 场景 1
|
|
19
|
+
- 场景 2
|
|
20
|
+
- 场景 3
|
|
21
|
+
|
|
22
|
+
## 触发关键词
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
keyword1, keyword2, "exact phrase"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 使用方法
|
|
29
|
+
|
|
30
|
+
### 基础用法
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 示例命令
|
|
34
|
+
your-command-here
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 高级用法
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
# 配置示例
|
|
41
|
+
key: value
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 输出格式
|
|
45
|
+
|
|
46
|
+
描述这个技能的输出结果格式。
|
|
47
|
+
|
|
48
|
+
## 注意事项
|
|
49
|
+
|
|
50
|
+
- 注意事项 1
|
|
51
|
+
- 注意事项 2
|
|
52
|
+
|
|
53
|
+
## 相关技能
|
|
54
|
+
|
|
55
|
+
- [related-skill](../related-skill/)
|
|
56
|
+
- [another-skill](../another-skill/)
|
|
57
|
+
|
|
58
|
+
## 更新日志
|
|
59
|
+
|
|
60
|
+
### 1.0.0 (YYYY-MM-DD)
|
|
61
|
+
- 初始版本
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Skill Metadata
|
|
2
|
+
# 这个文件定义技能的基本信息,用于自动发现和索引
|
|
3
|
+
|
|
4
|
+
name: test-skill-name
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
author: @username
|
|
7
|
+
description: 简短描述技能功能
|
|
8
|
+
|
|
9
|
+
tags:
|
|
10
|
+
- category1
|
|
11
|
+
- category2
|
|
12
|
+
|
|
13
|
+
triggers:
|
|
14
|
+
- keyword1
|
|
15
|
+
- keyword2
|
|
16
|
+
- "exact phrase"
|
|
17
|
+
|
|
18
|
+
dependencies: [] # 依赖的其他技能
|
|
19
|
+
|
|
20
|
+
difficulty: beginner # beginner | intermediate | advanced
|
|
21
|
+
|
|
22
|
+
# 模板文件
|
|
23
|
+
templates:
|
|
24
|
+
- name: default
|
|
25
|
+
file: templates/default.md
|
|
26
|
+
|
|
27
|
+
# 示例文件
|
|
28
|
+
examples:
|
|
29
|
+
- name: basic
|
|
30
|
+
file: examples/basic.md
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,38 @@
|
|
|
1
|
+
## [1.3.3](https://github.com/sumulige/sumulige-claude/compare/v1.3.2...v1.3.3) (2026-01-22)
|
|
2
|
+
|
|
3
|
+
### ✨ New Features
|
|
4
|
+
|
|
5
|
+
- **`smc sync --hooks`**: Incremental hooks update for existing projects
|
|
6
|
+
- Adds new lifecycle hooks without overwriting customizations
|
|
7
|
+
- Merges SessionStart/SessionEnd/PreCompact into existing settings.json
|
|
8
|
+
|
|
9
|
+
### 📝 Documentation
|
|
10
|
+
|
|
11
|
+
- Add Layer 7: Lifecycle Hooks section to README
|
|
12
|
+
- Document update methods for other projects
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## [1.3.2](https://github.com/sumulige/sumulige-claude/compare/v1.3.1...v1.3.2) (2026-01-22)
|
|
17
|
+
|
|
18
|
+
### ✨ New Features
|
|
19
|
+
|
|
20
|
+
- **Official Hooks Integration**: Claude Code lifecycle auto-sync
|
|
21
|
+
- `SessionStart` → `memory-loader.cjs`: Auto-load MEMORY.md, ANCHORS.md, restore TODO state
|
|
22
|
+
- `SessionEnd` → `memory-saver.cjs`: Auto-save session summary, archive session, sync TODO
|
|
23
|
+
- `PreCompact` → `auto-handoff.cjs`: Auto-generate handoff before context compression
|
|
24
|
+
- **Context Preservation**: Automatic handoff documents in `.claude/handoffs/`
|
|
25
|
+
- Includes active TODOs, recently modified files, recovery commands
|
|
26
|
+
- `LATEST.md` always points to most recent handoff
|
|
27
|
+
|
|
28
|
+
### 🔧 Improvements
|
|
29
|
+
|
|
30
|
+
- Session state tracking via `.session-state.json`
|
|
31
|
+
- Automatic session archiving to `.claude/sessions/`
|
|
32
|
+
- Memory entries kept for 7 days with auto-cleanup
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
1
36
|
## [1.3.1](https://github.com/sumulige/sumulige-claude/compare/v1.3.0...v1.3.1) (2026-01-22)
|
|
2
37
|
|
|
3
38
|
### ✨ New Features
|
package/README.md
CHANGED
|
@@ -400,6 +400,68 @@ smc skill:create my-skill
|
|
|
400
400
|
|
|
401
401
|
---
|
|
402
402
|
|
|
403
|
+
## Layer 7: Lifecycle Hooks / 第七层:生命周期钩子
|
|
404
|
+
|
|
405
|
+
### Auto-Sync System / 自动同步系统
|
|
406
|
+
|
|
407
|
+
> v1.3.2: 利用 Claude Code 官方 Hook 事件实现记忆自动同步
|
|
408
|
+
|
|
409
|
+
```
|
|
410
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
411
|
+
│ SessionStart ──► memory-loader.cjs │
|
|
412
|
+
│ └─ 自动加载 MEMORY.md, ANCHORS.md, TODO 状态 │
|
|
413
|
+
│ │
|
|
414
|
+
│ PreCompact ──► auto-handoff.cjs │
|
|
415
|
+
│ └─ 上下文压缩前自动生成 handoff 文档 │
|
|
416
|
+
│ │
|
|
417
|
+
│ SessionEnd ──► memory-saver.cjs │
|
|
418
|
+
│ └─ 会话结束自动保存摘要到 MEMORY.md │
|
|
419
|
+
└─────────────────────────────────────────────────────────────┘
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### Hook Files / 钩子文件
|
|
423
|
+
|
|
424
|
+
| Hook | 文件 | 触发时机 | 功能 |
|
|
425
|
+
|------|------|----------|------|
|
|
426
|
+
| `SessionStart` | `memory-loader.cjs` | 会话开始 | 加载记忆、锚点、TODO |
|
|
427
|
+
| `SessionEnd` | `memory-saver.cjs` | 会话结束 | 保存摘要、归档会话 |
|
|
428
|
+
| `PreCompact` | `auto-handoff.cjs` | 上下文压缩前 | 生成 handoff 保护上下文 |
|
|
429
|
+
|
|
430
|
+
### Handoff Documents / 交接文档
|
|
431
|
+
|
|
432
|
+
当上下文即将被压缩时,自动生成交接文档:
|
|
433
|
+
|
|
434
|
+
```
|
|
435
|
+
.claude/handoffs/
|
|
436
|
+
├── LATEST.md # 最新交接文档
|
|
437
|
+
├── INDEX.md # 交接文档索引
|
|
438
|
+
└── handoff_*.md # 历史交接文档
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
每个交接文档包含:
|
|
442
|
+
- 会话信息(项目、版本、开始时间)
|
|
443
|
+
- 活跃 TODOs 列表
|
|
444
|
+
- 最近修改的文件
|
|
445
|
+
- 恢复命令
|
|
446
|
+
|
|
447
|
+
### Update Hooks / 更新钩子
|
|
448
|
+
|
|
449
|
+
其他项目如何获取新 hooks:
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
# 方式 1: 完整更新(推荐)
|
|
453
|
+
smc template --force
|
|
454
|
+
|
|
455
|
+
# 方式 2: 增量同步(仅更新 hooks)
|
|
456
|
+
smc sync --hooks
|
|
457
|
+
|
|
458
|
+
# 方式 3: 手动安装
|
|
459
|
+
npm update -g sumulige-claude
|
|
460
|
+
smc template
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
403
465
|
## Documentation / 文档
|
|
404
466
|
|
|
405
467
|
- **[Development Guide / 开发指南](docs/DEVELOPMENT.md)** - Architecture, adding skills / 架构、添加技能
|
package/cli.js
CHANGED
package/lib/commands.js
CHANGED
|
@@ -335,6 +335,7 @@ const commands = {
|
|
|
335
335
|
// -------------------------------------------------------------------------
|
|
336
336
|
sync: async (...args) => {
|
|
337
337
|
const forceCheckUpdate = args.includes("--check-update");
|
|
338
|
+
const syncHooks = args.includes("--hooks");
|
|
338
339
|
|
|
339
340
|
console.log("🔄 Syncing Sumulige Claude to current project...");
|
|
340
341
|
console.log("");
|
|
@@ -387,6 +388,88 @@ const commands = {
|
|
|
387
388
|
}
|
|
388
389
|
}
|
|
389
390
|
|
|
391
|
+
// Sync hooks if --hooks flag is provided
|
|
392
|
+
if (syncHooks) {
|
|
393
|
+
const templateHooksDir = path.join(TEMPLATE_DIR, ".claude", "hooks");
|
|
394
|
+
const projectHooksDir = path.join(projectConfigDir, "hooks");
|
|
395
|
+
const templateSettingsFile = path.join(
|
|
396
|
+
TEMPLATE_DIR,
|
|
397
|
+
".claude",
|
|
398
|
+
"settings.json",
|
|
399
|
+
);
|
|
400
|
+
const projectSettingsFile = path.join(projectConfigDir, "settings.json");
|
|
401
|
+
|
|
402
|
+
if (fs.existsSync(templateHooksDir)) {
|
|
403
|
+
ensureDir(projectHooksDir);
|
|
404
|
+
|
|
405
|
+
// Sync hook files (only add new ones, don't overwrite)
|
|
406
|
+
const hookFiles = fs
|
|
407
|
+
.readdirSync(templateHooksDir)
|
|
408
|
+
.filter((f) => f.endsWith(".cjs"));
|
|
409
|
+
let syncedCount = 0;
|
|
410
|
+
|
|
411
|
+
hookFiles.forEach((hookFile) => {
|
|
412
|
+
const src = path.join(templateHooksDir, hookFile);
|
|
413
|
+
const dest = path.join(projectHooksDir, hookFile);
|
|
414
|
+
|
|
415
|
+
if (!fs.existsSync(dest)) {
|
|
416
|
+
fs.copyFileSync(src, dest);
|
|
417
|
+
setExecutablePermission(dest);
|
|
418
|
+
syncedCount++;
|
|
419
|
+
console.log(` ✅ Added ${hookFile}`);
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
if (syncedCount > 0) {
|
|
424
|
+
console.log(`✅ Synced ${syncedCount} new hook(s)`);
|
|
425
|
+
} else {
|
|
426
|
+
console.log("✅ Hooks up to date");
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Sync settings.json (merge new lifecycle hooks)
|
|
431
|
+
if (
|
|
432
|
+
fs.existsSync(templateSettingsFile) &&
|
|
433
|
+
fs.existsSync(projectSettingsFile)
|
|
434
|
+
) {
|
|
435
|
+
try {
|
|
436
|
+
const templateSettings = JSON.parse(
|
|
437
|
+
fs.readFileSync(templateSettingsFile, "utf-8"),
|
|
438
|
+
);
|
|
439
|
+
const projectSettings = JSON.parse(
|
|
440
|
+
fs.readFileSync(projectSettingsFile, "utf-8"),
|
|
441
|
+
);
|
|
442
|
+
|
|
443
|
+
// Merge new lifecycle hooks
|
|
444
|
+
const lifecycleHooks = [
|
|
445
|
+
"SessionStart",
|
|
446
|
+
"SessionEnd",
|
|
447
|
+
"PreCompact",
|
|
448
|
+
"env",
|
|
449
|
+
];
|
|
450
|
+
let updated = false;
|
|
451
|
+
|
|
452
|
+
lifecycleHooks.forEach((hook) => {
|
|
453
|
+
if (templateSettings[hook] && !projectSettings[hook]) {
|
|
454
|
+
projectSettings[hook] = templateSettings[hook];
|
|
455
|
+
updated = true;
|
|
456
|
+
console.log(` ✅ Added ${hook} hook`);
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
if (updated) {
|
|
461
|
+
fs.writeFileSync(
|
|
462
|
+
projectSettingsFile,
|
|
463
|
+
JSON.stringify(projectSettings, null, 2),
|
|
464
|
+
);
|
|
465
|
+
console.log("✅ Updated settings.json");
|
|
466
|
+
}
|
|
467
|
+
} catch (e) {
|
|
468
|
+
console.log("⚠️ Failed to merge settings.json");
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
390
473
|
// Sync todos directory structure
|
|
391
474
|
const todosTemplateDir = path.join(TEMPLATE_DIR, "development", "todos");
|
|
392
475
|
const todosProjectDir = path.join(projectDir, "development", "todos");
|