openfeel 1.1.5 → 1.1.6

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 (40) hide show
  1. package/README.en.md +13 -4
  2. package/README.md +13 -3
  3. package/README.zh-CN.md +14 -4
  4. package/dist/commands/setup.d.ts.map +1 -1
  5. package/dist/commands/setup.js +24 -2
  6. package/dist/commands/setup.js.map +1 -1
  7. package/dist/commands/update.d.ts.map +1 -1
  8. package/dist/commands/update.js +16 -4
  9. package/dist/commands/update.js.map +1 -1
  10. package/dist/core/backup.d.ts.map +1 -1
  11. package/dist/core/backup.js +18 -5
  12. package/dist/core/backup.js.map +1 -1
  13. package/dist/core/claude-settings.d.ts +31 -0
  14. package/dist/core/claude-settings.d.ts.map +1 -0
  15. package/dist/core/claude-settings.js +120 -0
  16. package/dist/core/claude-settings.js.map +1 -0
  17. package/dist/core/config.js +2 -2
  18. package/dist/core/global-paths.d.ts +10 -0
  19. package/dist/core/global-paths.d.ts.map +1 -1
  20. package/dist/core/global-paths.js +21 -0
  21. package/dist/core/global-paths.js.map +1 -1
  22. package/dist/core/i18n-data/en.d.ts.map +1 -1
  23. package/dist/core/i18n-data/en.js +19 -6
  24. package/dist/core/i18n-data/en.js.map +1 -1
  25. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
  26. package/dist/core/i18n-data/zh-CN.js +19 -6
  27. package/dist/core/i18n-data/zh-CN.js.map +1 -1
  28. package/dist/core/setup.d.ts +2 -2
  29. package/dist/core/setup.d.ts.map +1 -1
  30. package/dist/core/setup.js +81 -53
  31. package/dist/core/setup.js.map +1 -1
  32. package/dist/core/template-loader.d.ts +15 -0
  33. package/dist/core/template-loader.d.ts.map +1 -1
  34. package/dist/core/template-loader.js +3891 -109
  35. package/dist/core/template-loader.js.map +1 -1
  36. package/dist/core/update.d.ts +8 -0
  37. package/dist/core/update.d.ts.map +1 -1
  38. package/dist/core/update.js +327 -133
  39. package/dist/core/update.js.map +1 -1
  40. package/package.json +1 -1
package/README.en.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  OpenFeel is a TypeScript CLI tool for end-to-end process governance in AI Agent development. Core philosophy: **"Slim prompts, process in tools"** — agents understand workflows by reading `flow.json` state, not long text documents.
6
6
 
7
- > **Current adapter harness**: opencode (default); the framework targets multi-harness support (other adapters reserved).
7
+ > **Current adapter harness**: **opencode (default)** | **Claude Code** (`--tools claude`, since v1.1.6); the framework targets multi-harness support (other adapters reserved).
8
8
  > **Default Model Config**: DeepSeek V4 (primary reasoning) + GLM-5.3-flash (cross-review) + DeepSeek-flash (multimodal vision).
9
9
  > `openfeel init` auto-detects registered models and guides configuration.
10
10
  >
@@ -60,6 +60,15 @@ openfeel plan scheme create stage-01 "Implement core features"
60
60
  openfeel flow status
61
61
  ```
62
62
 
63
+ ## Claude Code Adapter (since v1.1.6)
64
+
65
+ > Coexists with the opencode adapter; **disabled by default** (requires explicit `--tools claude`).
66
+
67
+ - **Enable**: `openfeel setup --tools claude` (or `--tools opencode,claude` for both harnesses).
68
+ - **Assets deployed to `~/.claude/`**: `CLAUDE.md` (global constraints, managed-region three-state; existing user content is appended, not overwritten), `agents/` (**9**, incl. `feel`), `skills/` (**17** shared sources), `settings.json` (injects `"agent":"feel"` + `"permissions":{"defaultMode":"auto"}`; **existing user keys preserved verbatim**).
69
+ - **Upgrade**: `npm i -g openfeel@latest` → `openfeel setup --tools claude`; **after the first creation of `~/.claude/{agents,skills}`, restart the session or run `/reload-skills`** to load new skills/agents; `CLAUDE.md` takes effect on the **next session**. `npm i -g` alone does not refresh global assets.
70
+ - **Zero-touch by default**: without `--tools`, `~/.claude/` is **unchanged**.
71
+
63
72
  ## What's New in v1.1.2
64
73
 
65
74
  - **Self-description**: `flow phases [--json]` lists all valid phases and the transition table (5 top-level JSON keys: `schemaVersion` / `phases` / `transitions` / `advanceAccepted` / `transitionsDiff`).
@@ -76,7 +85,7 @@ openfeel flow status
76
85
  | Command | Purpose |
77
86
  |---------|---------|
78
87
  | `openfeel init [path]` | Initialize new project with `.openfeel/` workspace and platform adapter (current: opencode) |
79
- | `openfeel update` | Incrementally deploy platform adapter to existing projects |
88
+ | `openfeel update` | Incrementally deploy platform adapter to existing projects; `--tools <list>` explicitly enables the Claude Code adapter |
80
89
  | `openfeel flow` | Pipeline state management (status / phases / overview / current / advance / attempt / ops list / health [--fix] / checkpoint / migrate; status·current·health·metrics·overview support --json) |
81
90
  | `openfeel roadmap` | Version roadmap management (create / show) |
82
91
  | `openfeel plan` | Stage and scheme management (stage add/list [--deps/--tasks], scheme create [--draft] / publish / rename / remove / list) |
@@ -84,7 +93,7 @@ openfeel flow status
84
93
  | `openfeel config` | Configuration management (get / set[**all `defaults.*`**] / effective / get-lang / list-projects, supports --global) |
85
94
  | `openfeel knowledge` | Knowledge base management (list / add / search / index / dedup) |
86
95
  | `openfeel archive <stage>` | Stage archiving with knowledge extraction |
87
- | `openfeel setup` | Global-only deployment (global AGENTS.md + agents + skills + adapter config); no project `.openfeel/` |
96
+ | `openfeel setup` | Global-only deployment (global AGENTS.md + agents + skills + adapter config); no project `.openfeel/`; `--tools <list>` explicitly enables the Claude Code adapter |
88
97
  | `openfeel migrate` | Migrate legacy-layout projects (detect / backup / rollback) |
89
98
  | `openfeel model` | Three-tier agent model config (set / get / list, `--scope`) |
90
99
  | `openfeel stage` | Work stage status (status / set / task / create [deprecated]) |
@@ -180,7 +189,7 @@ Core Layer
180
189
  ```bash
181
190
  npm install # Install dependencies
182
191
  npm run build # Compile TypeScript
183
- npm test # Run tests (1018 cases / 61 test files; Linux CI skips 1 Windows-only case)
192
+ npm test # Run tests (1206 cases / 67 test files; Linux CI skips 1 Windows-only case)
184
193
  ```
185
194
 
186
195
  ## Acknowledgments
package/README.md CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  [English](README.en.md) | [更新日志](CHANGELOG.md) | [npm](https://www.npmjs.com/package/openfeel) | [入门指南](docs/GETTING_STARTED.md)
4
4
 
5
- > ⚡ **当前适配 harness**:opencode(框架面向多 harness 适配,其余适配器预留) | **默认模型**:DeepSeek V4(主力推理)+ GLM-5.3-flash(交叉审查)+ DeepSeek-flash(多模态视觉)
5
+ > ⚡ **当前适配 harness**:**opencode(默认)** | **Claude Code**(`--tools claude`,v1.1.6 起) | **默认模型**:DeepSeek V4(主力推理)+ GLM-5.3-flash(交叉审查)+ DeepSeek-flash(多模态视觉)
6
6
 
7
7
  > ⚠️ 下文示例命令 `openfeel <cmd>` 为**安装后的一般使用者用法**;若在**本仓库源码**中开发/执行,请改用 `node bin/openfeel.js <cmd>`(全局 `openfeel` 可能滞后于本仓——未随本仓库源码同步更新)。
8
8
 
9
9
  OpenFeel 是一个 TypeScript CLI 工具,为 AI Agent 开发提供端到端的流程治理。核心理念:**「提示词瘦身,流程入工具」** —— Agent 不靠读长文本理解流程,而是通过 `flow.json` 获取当前状态和下一步指令。
10
10
 
11
- > 📦 **最新版本 v1.1.2** — 自描述 `flow phases`、配置有效值 `config effective`、部署前自动备份;框架资产(agents/skills/AGENTS.md)全局部署。
11
+ > 📦 **最新版本 v1.1.6**(Claude Code 适配器 / 多 harness 并存) — 自描述 `flow phases`、配置有效值 `config effective`、部署前自动备份;框架资产(agents/skills/AGENTS.md)全局部署。
12
12
 
13
13
  > 📌 本项目基于 [AI_Prompt](https://github.com/Liuary/AI_Prompt) 开发,参考了 [OpenSpec](https://github.com/Fission-AI/OpenSpec) 等工具的设计思路。
14
14
 
@@ -23,10 +23,20 @@ openfeel update # 已有项目?一键部署平台适配器
23
23
  openfeel migrate # 存量旧布局项目?一键迁移(检测/备份/回滚)
24
24
  openfeel flow status # 查看流水线
25
25
  openfeel flow phases # 查看合法 phase 与转移表
26
+ openfeel setup --tools claude # 显式启用 Claude Code 适配器(可选)
26
27
 
27
28
  npm install -g openfeel@latest # 更新到最新版本
28
29
  ```
29
30
 
30
31
  > 💡 `init` 用于新项目首次部署,`update` 为已有项目增量更新(适用于 `init` 之后再引入 OpenFeel 的项目)。存量旧布局项目(opencode 适配器:项目内 `.opencode/agents|skills|instructions`)用 `openfeel migrate` 迁移到全局部署。框架资产(agents/skills/AGENTS.md)经 `openfeel setup` 全局部署,项目内不再生成 `.opencode/agents|skills`。
31
32
 
32
- 完整中文文档:[README.zh-CN.md](README.zh-CN.md)
33
+ ## Claude Code 适配器(v1.1.6 起)
34
+
35
+ > 与 opencode 适配器**并存**,**默认不启用**(须显式 `--tools claude`)。
36
+
37
+ - **启用**:`openfeel setup --tools claude`(或 `--tools opencode,claude` 双 harness)。
38
+ - **部署资产到 `~/.claude/`**:`CLAUDE.md`(全局约束,受管区三态,用户已有内容 append 不覆盖)、`agents/`(**9 个**,含 `feel`)、`skills/`(**17 个**共享源)、`settings.json`(注入 `"agent":"feel"` + `"permissions":{"defaultMode":"auto"}`,**用户既有键逐字保留**)。
39
+ - **升级**:`npm i -g openfeel@latest` → `openfeel setup --tools claude`;**首次创建 `~/.claude/{agents,skills}` 后须重启会话或 `/reload-skills`** 使新 skill/agent 生效;`CLAUDE.md` 于**下次会话**生效。仅 `npm i -g` 不刷新全局资产。
40
+ - **默认零触**:不带 `--tools` 时 `~/.claude/` **零变化**。
41
+
42
+ 完整中文文档:[README.zh-CN.md](README.zh-CN.md)(详见其中的「Claude Code 适配器」小节)
package/README.zh-CN.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  OpenFeel 是一个 TypeScript CLI 工具,为 AI Agent 开发提供端到端的流程治理。
8
8
 
9
- > **当前适配 harness**:opencode(默认);框架面向多 harness 适配(其余适配器预留)。
9
+ > **当前适配 harness**:**opencode(默认)** | **Claude Code**(`--tools claude`,v1.1.6 起);框架面向多 harness 适配(其余适配器预留)。
10
10
  > **默认模型配置**:DeepSeek V4(主力推理) + GLM-5.3-flash(交叉审查) + DeepSeek-flash(多模态视觉)。
11
11
  > 首次 `openfeel init` 时会自动检测用户已注册的模型并引导配置。
12
12
 
@@ -38,6 +38,7 @@ openfeel setup # 2. 重跑部署,刷新全局 AGENTS.md/agents/ski
38
38
  ```
39
39
 
40
40
  > 仅 `npm i -g` 不会刷新全局资产,须重跑 `openfeel setup` 并重启 harness。
41
+ > CLI 在检测到全局部署漂移或全局部署缺失时,也会向 stderr 打印被动提示。
41
42
  > 若不确定是否需要升级,运行 `openfeel setup --check` 诊断全局部署版本与 CLI 版本是否一致。
42
43
 
43
44
  ## 快速开始
@@ -59,6 +60,15 @@ openfeel plan scheme create stage-01 "实现核心功能"
59
60
  openfeel flow status
60
61
  ```
61
62
 
63
+ ## Claude Code 适配器(v1.1.6 起)
64
+
65
+ > 与 opencode 适配器**并存**,**默认不启用**(须显式 `--tools claude`)。
66
+
67
+ - **启用**:`openfeel setup --tools claude`(或 `--tools opencode,claude` 双 harness)。
68
+ - **部署资产到 `~/.claude/`**:`CLAUDE.md`(全局约束,受管区三态,用户已有内容 append 不覆盖)、`agents/`(**9 个**,含 `feel`)、`skills/`(**17 个**共享源)、`settings.json`(注入 `"agent":"feel"` + `"permissions":{"defaultMode":"auto"}`,**用户既有键逐字保留**)。
69
+ - **升级**:`npm i -g openfeel@latest` → `openfeel setup --tools claude`;**首次创建 `~/.claude/{agents,skills}` 后须重启会话或 `/reload-skills`** 使新 skill/agent 生效;`CLAUDE.md` 于**下次会话**生效。仅 `npm i -g` 不刷新全局资产。
70
+ - **默认零触**:不带 `--tools` 时 `~/.claude/` **零变化**。
71
+
62
72
  ## v1.1.2 新增能力
63
73
 
64
74
  - **自描述**:`flow phases [--json]` 输出全部合法 phase 与转移表(JSON 顶层 5 键:`schemaVersion` / `phases` / `transitions` / `advanceAccepted` / `transitionsDiff`)。
@@ -75,7 +85,7 @@ openfeel flow status
75
85
  | 命令 | 用途 |
76
86
  |------|------|
77
87
  | `openfeel init [path]` | 初始化新项目,创建 `.openfeel/` 目录结构和平台适配器(当前:opencode) |
78
- | `openfeel update` | 为已有项目增量部署平台适配器(适用于 `init` 之后再引入 OpenFeel 的项目) |
88
+ | `openfeel update` | 为已有项目增量部署平台适配器(适用于 `init` 之后再引入 OpenFeel 的项目);`--tools <list>` 显式启用 Claude Code 适配器 |
79
89
  | `openfeel flow` | 流水线状态管理(status / phases / overview / current / advance / attempt / ops list / health [--fix] / checkpoint / migrate;status·current·health·metrics·overview 支持 --json) |
80
90
  | `openfeel roadmap` | 分期大纲管理(create / show) |
81
91
  | `openfeel plan` | 工作阶段与操作方案管理(stage add/list [--deps/--tasks]、scheme create [--draft] / publish / rename / remove / list) |
@@ -83,7 +93,7 @@ openfeel flow status
83
93
  | `openfeel config` | 配置管理(get / set[**全量 `defaults.*`**] / effective / get-lang / list-projects,支持 --global) |
84
94
  | `openfeel knowledge` | 知识库管理(list / add / search / index / dedup) |
85
95
  | `openfeel archive <stage>` | 阶段归档,汇总产出、生成摘要、提取知识 |
86
- | `openfeel setup` | 纯全局部署(全局 AGENTS.md + agent + skill + 平台适配器配置),不建项目 `.openfeel/` |
96
+ | `openfeel setup` | 纯全局部署(全局 AGENTS.md + agent + skill + 平台适配器配置),不建项目 `.openfeel/`;`--tools <list>` 显式启用 Claude Code 适配器 |
87
97
  | `openfeel migrate` | 存量旧布局项目迁移(检测 / 备份 / 回滚) |
88
98
  | `openfeel model` | 三层级 agent 模型配置(set / get / list,`--scope`) |
89
99
  | `openfeel stage` | 阶段状态(status / set / task / create[已弃用]) |
@@ -179,7 +189,7 @@ Core 层
179
189
  ```bash
180
190
  npm install # 安装依赖
181
191
  npm run build # 编译 TypeScript
182
- npm test # 运行测试(1018 用例 / 61 个测试文件;Linux CI 跳过 1 个 Windows 专属用例)
192
+ npm test # 运行测试(1206 用例 / 67 个测试文件;Linux CI 跳过 1 个 Windows 专属用例)
183
193
  ```
184
194
 
185
195
  ## 致谢
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C3D"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE3D"}
@@ -1,4 +1,5 @@
1
1
  import { setupGlobalFramework } from '../core/setup.js';
2
+ import { parseToolList, supportedTools } from '../core/update.js';
2
3
  import { checkGlobalDeployment } from '../core/deployment-check.js';
3
4
  import { t, getCliLang } from '../core/i18n.js';
4
5
  export function registerSetupCommand(program) {
@@ -8,6 +9,7 @@ export function registerSetupCommand(program) {
8
9
  .option('--lang <lang>', 'Agent 提示词语言(zh-CN 或 en),默认 zh-CN')
9
10
  .option('--check', t('help.setup.check', getCliLang(process.cwd())))
10
11
  .option('--json', t('help.setup.json', getCliLang(process.cwd())))
12
+ .option('--tools <list>', t('help.setup.tools', getCliLang(process.cwd())))
11
13
  .action((options) => {
12
14
  const lang = getCliLang(process.cwd());
13
15
  // stage-67:--check 前置只读短路——不执行任何部署、零写盘(D-E / R-3)
@@ -40,7 +42,20 @@ export function registerSetupCommand(program) {
40
42
  return;
41
43
  }
42
44
  const deployLang = (options?.lang === 'en' || options?.lang === 'zh-CN') ? options.lang : 'zh-CN';
43
- const r = setupGlobalFramework(deployLang);
45
+ // --tools 解析(默认仅 opencode;非法值报错退出 1)
46
+ let tools = ['opencode'];
47
+ if (options?.tools !== undefined) {
48
+ const parsed = parseToolList(String(options.tools));
49
+ if (parsed.invalid.length > 0) {
50
+ console.error(t('update.toolsInvalidTmpl', lang, {
51
+ tools: parsed.invalid.join(', '),
52
+ valid: supportedTools.map((x) => x.id).join(', '),
53
+ }));
54
+ process.exit(1);
55
+ }
56
+ tools = parsed.tools;
57
+ }
58
+ const r = setupGlobalFramework(deployLang, tools);
44
59
  if (r.created.length) {
45
60
  console.log(t('setup.created', lang));
46
61
  for (const f of r.created)
@@ -63,7 +78,14 @@ export function registerSetupCommand(program) {
63
78
  console.log(` - ${f}`);
64
79
  }
65
80
  console.log(t('setup.complete', lang));
66
- console.log(lang === 'en' ? 'Restart the harness (opencode) to load the new global configuration.' : '请重启当前 harness(opencode)以加载新的全局配置。');
81
+ // 重启提醒(按 harness 组合;默认仅 opencode → 文案与既有逐字一致)
82
+ const harness = tools.includes('claude')
83
+ ? (tools.includes('opencode') ? 'opencode / Claude Code' : 'Claude Code')
84
+ : 'opencode';
85
+ console.log(t('setup.restartHarnessTmpl', lang, { harness }));
86
+ if (tools.includes('claude')) {
87
+ console.log(t('update.claudeReloadHintTmpl', lang));
88
+ }
67
89
  });
68
90
  }
69
91
  //# sourceMappingURL=setup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqG5D"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkH5D"}
@@ -1,6 +1,6 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { resolve } from 'node:path';
3
- import { updateProject, supportedTools, selectTools } from '../core/update.js';
3
+ import { updateProject, supportedTools, selectTools, parseToolList } from '../core/update.js';
4
4
  import { initProject } from '../core/init.js';
5
5
  import { t, getCliLang } from '../core/i18n.js';
6
6
  export function registerUpdateCommand(program) {
@@ -9,11 +9,21 @@ export function registerUpdateCommand(program) {
9
9
  .description('部署 OpenFeel 适配文件到目标项目(无参数时交互式选择工具)')
10
10
  .option('--lang <lang>', 'Agent prompt language (zh-CN or en)')
11
11
  .option('--force', '跳过 AGENTS.md 覆盖确认,直接覆盖')
12
+ .option('--tools <list>', t('help.update.tools', getCliLang(process.cwd())))
12
13
  .action(async (path, options) => {
13
14
  const targetPath = resolve(path ?? process.cwd());
14
15
  const lang = getCliLang(targetPath);
15
16
  const force = options?.force ?? false;
16
17
  try {
18
+ // --tools 校验前置(fail-fast):非法值不触发 auto-init/写盘
19
+ const toolsParsed = options?.tools !== undefined ? parseToolList(String(options.tools)) : null;
20
+ if (toolsParsed && toolsParsed.invalid.length > 0) {
21
+ console.error(t('update.toolsInvalidTmpl', lang, {
22
+ tools: toolsParsed.invalid.join(', '),
23
+ valid: supportedTools.map((x) => x.id).join(', '),
24
+ }));
25
+ process.exit(1);
26
+ }
17
27
  if (!existsSync(targetPath)) {
18
28
  console.error(t('update.errorPathNotExistTmpl', lang, { path: targetPath }));
19
29
  process.exit(1);
@@ -30,9 +40,11 @@ export function registerUpdateCommand(program) {
30
40
  }
31
41
  }
32
42
  }
33
- const selectedTools = path
34
- ? supportedTools.map((t) => t.id) // 有路径参数则全部部署
35
- : await selectTools(); // 无参数则交互选择
43
+ const selectedTools = toolsParsed
44
+ ? toolsParsed.tools
45
+ : path
46
+ ? supportedTools.filter((t) => t.enabled).map((t) => t.id) // R-5:仅部署默认启用工具
47
+ : await selectTools(); // 无参数则交互选择
36
48
  if (selectedTools.length === 0) {
37
49
  console.log(t('update.cancelled', lang));
38
50
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"AAaA,0BAA0B;AAC1B,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpE,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,2BAA2B;AAC3B,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACd,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAK7C;AAGD,gCAAgC;AAChC,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AA+CD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,YAAY,GAAG,IAAI,CAkCrB;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAQzD"}
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"AAaA,0BAA0B;AAC1B,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpE,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,2BAA2B;AAC3B,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACd,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAK7C;AAGD,gCAAgC;AAChC,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AA4DD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,YAAY,GAAG,IAAI,CAkCrB;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAQzD"}
@@ -42,12 +42,25 @@ function computeBackupRel(absPath, projectPath) {
42
42
  const hash8 = createHash('sha256').update(proj).digest('hex').slice(0, 8);
43
43
  return { zone: 'project', rel: join('project', `${basename(proj)}-${hash8}`, rel) };
44
44
  }
45
- const rel = relative(getHomedir(), absPath);
46
- // 越界防御(T26):相对化结果逃出 HOME(含 '..' 或绝对路径)时拒绝
47
- if (rel.startsWith('..') || isAbsolute(rel)) {
48
- throw new BackupError(absPath, `路径逃出用户主目录(HOME=${getHomedir()})`);
45
+ const abs = resolve(absPath);
46
+ const rel = relative(getHomedir(), abs);
47
+ // HOME 内:沿用原 global/ 分区(零回归)
48
+ if (!rel.startsWith('..') && !isAbsolute(rel)) {
49
+ return { zone: 'global', rel: join('global', rel) };
49
50
  }
50
- return { zone: 'global', rel: join('global', rel) };
51
+ // HOME 外(D-CFG / R-7):global-external/<sha8>/<规范化尾段>,不再抛错(避免「备份失败→skipped」)
52
+ // sha8 = sha256(绝对路径) 前 8 位十六进制,仅 [0-9a-f],天然规避盘符冒号与保留字符(跨平台口径定稿)
53
+ const sha8 = createHash('sha256').update(abs).digest('hex').slice(0, 8);
54
+ // 尾段:逐段剥离盘符(Windows `X:`)与前导分隔符,替换文件系统保留字符 [<>:"|?*],保留目录层级
55
+ const segs = abs
56
+ .replace(/^[A-Za-z]:/, '')
57
+ .split(/[\\/]+/)
58
+ .filter(Boolean)
59
+ .map((seg) => seg.replace(/[<>:"|?*]/g, '_'));
60
+ if (segs.length === 0) {
61
+ segs.push('root'); // 防御:极端根路径(正常源为文件,不会触发)
62
+ }
63
+ return { zone: 'global', rel: join('global-external', sha8, ...segs) };
51
64
  }
52
65
  /** 读改写当次 manifest(须在 backup 锁内调用) */
53
66
  function updateManifest(ts, command, source, backupRel) {
@@ -1 +1 @@
1
- {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type UpdateState } from './update-state.js';
2
+ /** settings.json 非严格 JSON / 顶层非对象时抛出(调用方捕获 → 跳过写入 + anomaly) */
3
+ export declare class ClaudeSettingsParseError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ /** 框架注入片段(供应商中立;JSON 无语言维度 → 代码常量,不经 build 注入) */
7
+ export declare function buildClaudeSettingsFragment(): {
8
+ agent: string;
9
+ permissions: {
10
+ defaultMode: string;
11
+ };
12
+ };
13
+ /**
14
+ * 严格 JSON 深合并:在用户既有 settings 上并入框架片段,逐字保留用户未知键。
15
+ * - 顶层须为对象;严格 JSON.parse(不接受注释 / trailing comma);失败抛 ClaudeSettingsParseError;
16
+ * - 框架自有键 agent / permissions.defaultMode 覆盖;permissions 下用户其它子键(allow/deny/…)保留;
17
+ * - 输出稳定序列化 JSON.stringify(obj, null, 2) + '\n'(依赖 JS 对象插入序保证二次运行字节幂等)。
18
+ */
19
+ export declare function mergeClaudeSettings(currentRaw: string): string;
20
+ /** applyClaudeSettings 结果动作 */
21
+ export type ClaudeSettingsAction = 'created' | 'updated' | 'skipped';
22
+ /**
23
+ * 应用 Claude settings.json 注入(**单一共享函数**,setup.ts / update.ts 共用,避免双实现漂移 R-新11)。
24
+ * 顺序:① lock 之外写前备份(目标存在即备份,对齐 jsonc 口径)→ ② lock 内 read → merge → atomicWrite。
25
+ * @param state 全局 update state(成功写回后以绝对路径记 hash)
26
+ * @param command 调用方(决定 i18n 域前缀;仅 setup / update 接入)
27
+ * @param lang 输出语言
28
+ * @returns 'created'(原不存在)/ 'updated'(合并后变化)/ 'skipped'(无变化 或 备份/读取/解析失败)
29
+ */
30
+ export declare function applyClaudeSettings(state: UpdateState, command: 'setup' | 'update', lang: 'zh-CN' | 'en'): ClaudeSettingsAction;
31
+ //# sourceMappingURL=claude-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-settings.d.ts","sourceRoot":"","sources":["../../src/core/claude-settings.ts"],"names":[],"mappings":"AAYA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrE,gEAAgE;AAChE,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAOD,kDAAkD;AAClD,wBAAgB,2BAA2B,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAErG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAkB9D;AAED,+BAA+B;AAC/B,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,GAAG,QAAQ,EAC3B,IAAI,EAAE,OAAO,GAAG,IAAI,GACnB,oBAAoB,CAsDtB"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Claude 全局 settings.json 注入模块(stage-73)
3
+ * 严格 JSON「读-深合并-写回」:把框架自有键(agent / permissions.defaultMode)并入用户既有
4
+ * ~/.claude/settings.json,逐字保留其余用户键。settings.json 为严格 JSON(无注释 / 无受管区标记),
5
+ * 故不复用 opencode-config 的 jsonc 剥注释逻辑,亦不复用 managed-region 的标记三态。
6
+ */
7
+ import { existsSync, readFileSync } from 'node:fs';
8
+ import { atomicWriteFileSync } from './fs/atomic-write.js';
9
+ import { withFileLock, globalLockPath } from './fs/file-lock.js';
10
+ import { backupFileBeforeWrite, notifyBackupIfTTY, BackupError } from './backup.js';
11
+ import { appendUpdateInfo } from './update-infos.js';
12
+ import { getClaudeSettingsPath } from './global-paths.js';
13
+ import { updateFileHash } from './update-state.js';
14
+ import { t } from './i18n.js';
15
+ /** settings.json 非严格 JSON / 顶层非对象时抛出(调用方捕获 → 跳过写入 + anomaly) */
16
+ export class ClaudeSettingsParseError extends Error {
17
+ constructor(message) {
18
+ super(`settings.json 解析失败:${message}`);
19
+ this.name = 'ClaudeSettingsParseError';
20
+ }
21
+ }
22
+ /** 判断纯对象(排除数组 / null) */
23
+ function isPlainObject(v) {
24
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
25
+ }
26
+ /** 框架注入片段(供应商中立;JSON 无语言维度 → 代码常量,不经 build 注入) */
27
+ export function buildClaudeSettingsFragment() {
28
+ return { agent: 'feel', permissions: { defaultMode: 'auto' } };
29
+ }
30
+ /**
31
+ * 严格 JSON 深合并:在用户既有 settings 上并入框架片段,逐字保留用户未知键。
32
+ * - 顶层须为对象;严格 JSON.parse(不接受注释 / trailing comma);失败抛 ClaudeSettingsParseError;
33
+ * - 框架自有键 agent / permissions.defaultMode 覆盖;permissions 下用户其它子键(allow/deny/…)保留;
34
+ * - 输出稳定序列化 JSON.stringify(obj, null, 2) + '\n'(依赖 JS 对象插入序保证二次运行字节幂等)。
35
+ */
36
+ export function mergeClaudeSettings(currentRaw) {
37
+ const raw = currentRaw.trim() === '' ? '{}' : currentRaw;
38
+ let base;
39
+ try {
40
+ base = JSON.parse(raw);
41
+ }
42
+ catch (err) {
43
+ throw new ClaudeSettingsParseError(err.message);
44
+ }
45
+ if (!isPlainObject(base)) {
46
+ throw new ClaudeSettingsParseError('顶层必须为 JSON 对象');
47
+ }
48
+ const fragment = buildClaudeSettingsFragment();
49
+ const result = { ...base };
50
+ // 框架自有键:已存在则原位覆盖(保序),不存在则按片段声明序追加
51
+ result.agent = fragment.agent;
52
+ const basePerm = isPlainObject(result.permissions) ? result.permissions : {};
53
+ result.permissions = { ...basePerm, defaultMode: fragment.permissions.defaultMode };
54
+ return JSON.stringify(result, null, 2) + '\n';
55
+ }
56
+ /**
57
+ * 应用 Claude settings.json 注入(**单一共享函数**,setup.ts / update.ts 共用,避免双实现漂移 R-新11)。
58
+ * 顺序:① lock 之外写前备份(目标存在即备份,对齐 jsonc 口径)→ ② lock 内 read → merge → atomicWrite。
59
+ * @param state 全局 update state(成功写回后以绝对路径记 hash)
60
+ * @param command 调用方(决定 i18n 域前缀;仅 setup / update 接入)
61
+ * @param lang 输出语言
62
+ * @returns 'created'(原不存在)/ 'updated'(合并后变化)/ 'skipped'(无变化 或 备份/读取/解析失败)
63
+ */
64
+ export function applyClaudeSettings(state, command, lang) {
65
+ const settingsPath = getClaudeSettingsPath();
66
+ // ① 写前备份(lock 之外,避免 backup 锁与 settings 锁嵌套)——目标存在时备份 + backed + TTY 通知
67
+ try {
68
+ const backup = backupFileBeforeWrite(settingsPath, { command });
69
+ if (backup) {
70
+ appendUpdateInfo('backed', { absolutePath: settingsPath, backupRel: backup.backupRel, command });
71
+ notifyBackupIfTTY(backup.backupRel);
72
+ }
73
+ }
74
+ catch (err) {
75
+ // 备份失败(B3):跳过 settings 写入、记 anomaly、继续其余步骤
76
+ if (err instanceof BackupError) {
77
+ appendUpdateInfo('anomaly', { absolutePath: settingsPath, note: 'backup_failed' });
78
+ console.warn(t(`${command}.claudeSettingsWriteSkipTmpl`, lang, { err: err.message }));
79
+ return 'skipped';
80
+ }
81
+ throw err; // 非备份错误照旧上抛(锁超时等不回退)
82
+ }
83
+ // ② 锁内 read → merge → atomicWrite(read 也在锁内,消除 TOCTOU)
84
+ return withFileLock(globalLockPath('global-claude-settings'), () => {
85
+ const existed = existsSync(settingsPath);
86
+ let raw;
87
+ try {
88
+ raw = existed ? readFileSync(settingsPath, 'utf-8') : '';
89
+ }
90
+ catch (err) {
91
+ // 目录占位 / 权限不可读:不写盘,记 anomaly
92
+ appendUpdateInfo('anomaly', { absolutePath: settingsPath, note: 'read_failed' });
93
+ console.warn(t(`${command}.claudeSettingsWriteSkipTmpl`, lang, { err: err.message }));
94
+ return 'skipped';
95
+ }
96
+ let merged;
97
+ try {
98
+ merged = mergeClaudeSettings(raw);
99
+ }
100
+ catch (err) {
101
+ if (err instanceof ClaudeSettingsParseError) {
102
+ // 严格 JSON 解析失败:不写盘,保留原文件,记 anomaly
103
+ appendUpdateInfo('anomaly', { absolutePath: settingsPath, note: 'parse_failed' });
104
+ console.warn(t(`${command}.claudeSettingsParseSkipTmpl`, lang, { err: err.message }));
105
+ return 'skipped';
106
+ }
107
+ throw err;
108
+ }
109
+ if (existed && merged === raw) {
110
+ return 'skipped'; // 合并无变化 → 幂等(文件字节不变)
111
+ }
112
+ atomicWriteFileSync(settingsPath, merged);
113
+ updateFileHash(state, settingsPath, merged);
114
+ if (process.stdout.isTTY) {
115
+ console.log(t(`${command}.claudeSettingsMergedTmpl`, lang));
116
+ }
117
+ return existed ? 'updated' : 'created';
118
+ });
119
+ }
120
+ //# sourceMappingURL=claude-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-settings.js","sourceRoot":"","sources":["../../src/core/claude-settings.ts"],"names":[],"mappings":"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"}
@@ -341,7 +341,7 @@ const CONFIG_TEMPLATE_ZH = `# .openfeel/config.yaml
341
341
  # 本文件为所有阶段提供默认值,status.md 可覆盖
342
342
 
343
343
  meta:
344
- version: 1.1.5
344
+ version: 1.1.6
345
345
  project: OpenFeel
346
346
  tech_stack: TypeScript
347
347
 
@@ -393,7 +393,7 @@ const CONFIG_TEMPLATE_EN = `# .openfeel/config.yaml
393
393
  # This file provides defaults for all stages; status.md can override
394
394
 
395
395
  meta:
396
- version: 1.1.5
396
+ version: 1.1.6
397
397
  project: OpenFeel
398
398
  tech_stack: TypeScript
399
399
 
@@ -33,4 +33,14 @@ export declare function getGlobalSchemasDir(): string;
33
33
  export declare function getGlobalBackupRootPath(): string;
34
34
  /** CLI 运行日志目录(~/.openfeel/cli/logs;跨项目诊断日志,stage-58) */
35
35
  export declare function getCliLogsDir(): string;
36
+ /** Claude 全局配置根目录:CLAUDE_CONFIG_DIR 非空优先(函数体内读 env,空/空白回落 ~/.claude) */
37
+ export declare function getClaudeConfigDir(): string;
38
+ /** Claude 全局 agents 目录(<config>/agents) */
39
+ export declare function getClaudeAgentsDir(): string;
40
+ /** Claude 全局 skills 目录(<config>/skills) */
41
+ export declare function getClaudeSkillsDir(): string;
42
+ /** Claude 全局约束文件路径(<config>/CLAUDE.md) */
43
+ export declare function getClaudeMdPath(): string;
44
+ /** Claude 全局 settings.json 路径(<config>/settings.json;stage-73 消费,本阶段仅解析不写) */
45
+ export declare function getClaudeSettingsPath(): string;
36
46
  //# sourceMappingURL=global-paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"global-paths.d.ts","sourceRoot":"","sources":["../../src/core/global-paths.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,+CAA+C;AAC/C,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,iDAAiD;AACjD,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,gGAAgG;AAChG,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,6DAA6D;AAC7D,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,gGAAgG;AAChG,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,uDAAuD;AACvD,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,sDAAsD;AACtD,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wDAAwD;AACxD,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
1
+ {"version":3,"file":"global-paths.d.ts","sourceRoot":"","sources":["../../src/core/global-paths.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,+CAA+C;AAC/C,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,iCAAiC;AACjC,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,iDAAiD;AACjD,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,gGAAgG;AAChG,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,6DAA6D;AAC7D,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,gGAAgG;AAChG,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,uDAAuD;AACvD,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,sDAAsD;AACtD,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wDAAwD;AACxD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED,2CAA2C;AAC3C,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,2CAA2C;AAC3C,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,0CAA0C;AAC1C,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C"}
@@ -73,4 +73,25 @@ export function getGlobalBackupRootPath() {
73
73
  export function getCliLogsDir() {
74
74
  return join(homedir(), '.openfeel', 'cli', 'logs');
75
75
  }
76
+ /** Claude 全局配置根目录:CLAUDE_CONFIG_DIR 非空优先(函数体内读 env,空/空白回落 ~/.claude) */
77
+ export function getClaudeConfigDir() {
78
+ const dir = process.env.CLAUDE_CONFIG_DIR?.trim();
79
+ return dir ? dir : join(homedir(), '.claude');
80
+ }
81
+ /** Claude 全局 agents 目录(<config>/agents) */
82
+ export function getClaudeAgentsDir() {
83
+ return join(getClaudeConfigDir(), 'agents');
84
+ }
85
+ /** Claude 全局 skills 目录(<config>/skills) */
86
+ export function getClaudeSkillsDir() {
87
+ return join(getClaudeConfigDir(), 'skills');
88
+ }
89
+ /** Claude 全局约束文件路径(<config>/CLAUDE.md) */
90
+ export function getClaudeMdPath() {
91
+ return join(getClaudeConfigDir(), 'CLAUDE.md');
92
+ }
93
+ /** Claude 全局 settings.json 路径(<config>/settings.json;stage-73 消费,本阶段仅解析不写) */
94
+ export function getClaudeSettingsPath() {
95
+ return join(getClaudeConfigDir(), 'settings.json');
96
+ }
76
97
  //# sourceMappingURL=global-paths.js.map