skill-chef 0.1.0 → 0.2.1

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 (48) hide show
  1. package/SKILL.md +108 -0
  2. package/dist/cli/cmd_read.js +79 -19
  3. package/dist/cli/cmd_read.js.map +1 -1
  4. package/dist/cli/config.d.ts +16 -0
  5. package/dist/cli/config.d.ts.map +1 -0
  6. package/dist/cli/config.js +84 -0
  7. package/dist/cli/config.js.map +1 -0
  8. package/dist/cli/health.d.ts +7 -0
  9. package/dist/cli/health.d.ts.map +1 -0
  10. package/dist/cli/health.js +32 -0
  11. package/dist/cli/health.js.map +1 -0
  12. package/dist/config.d.ts +41 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +62 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/fetch/index.d.ts +1 -1
  17. package/dist/fetch/index.d.ts.map +1 -1
  18. package/dist/fetch/index.js +1 -1
  19. package/dist/fetch/index.js.map +1 -1
  20. package/dist/fetch/paths.d.ts +5 -3
  21. package/dist/fetch/paths.d.ts.map +1 -1
  22. package/dist/fetch/paths.js +19 -24
  23. package/dist/fetch/paths.js.map +1 -1
  24. package/dist/health.d.ts +41 -0
  25. package/dist/health.d.ts.map +1 -0
  26. package/dist/health.js +466 -0
  27. package/dist/health.js.map +1 -0
  28. package/dist/help/helpFile.d.ts +78 -0
  29. package/dist/help/helpFile.d.ts.map +1 -0
  30. package/dist/help/helpFile.js +218 -0
  31. package/dist/help/helpFile.js.map +1 -0
  32. package/dist/help/index.d.ts +4 -0
  33. package/dist/help/index.d.ts.map +1 -1
  34. package/dist/help/index.js +4 -0
  35. package/dist/help/index.js.map +1 -1
  36. package/dist/help/manifest.d.ts +11 -0
  37. package/dist/help/manifest.d.ts.map +1 -0
  38. package/dist/help/manifest.js +38 -0
  39. package/dist/help/manifest.js.map +1 -0
  40. package/dist/help/output.d.ts +17 -0
  41. package/dist/help/output.d.ts.map +1 -0
  42. package/dist/help/output.js +54 -0
  43. package/dist/help/output.js.map +1 -0
  44. package/dist/help/sceneData.d.ts +41 -0
  45. package/dist/help/sceneData.d.ts.map +1 -0
  46. package/dist/help/sceneData.js +182 -0
  47. package/dist/help/sceneData.js.map +1 -0
  48. package/package.json +7 -4
package/dist/config.js ADDED
@@ -0,0 +1,62 @@
1
+ /** 私家大厨自己的配置面:那份默认值表 + 读/写/重置三个薄转调。
2
+ *
3
+ * 口径出处(「配置的存与生效口径裁定」#675 的解决评论,本票 #695 落地):**每个技能一份 YAML 配置文件,
4
+ * 配置文件是唯一真相,环境变量不参与配置**。默认落点 `~/.ilife/chef.yaml`(由 `os.homedir()` 派生,
5
+ * 平台无关),`ILIFE_CONFIG_DIR` 设定且非空即整体接管配置目录;数据目录默认 `~/.ilife/data/`,
6
+ * 首次读时自动建;「重置为默认」先另存 `<配置目录>/chef.yaml.bak`。
7
+ *
8
+ * 读写实现(受限 YAML 子集解析、键表与类型校验、备份、建目录)住 `base-link-core` 的 `src/config/`
9
+ * ——#694 已交付,本件只做「私家大厨的那份表 + 转调」,一份实现不抄第二处(结构纪律铁律一)。
10
+ *
11
+ * 默认值逐项等于改造前的代码常量(对照读数见 `docs/skills/skill-chef/t695-证据.md`):
12
+ * · `db.name`=`chef_data.db`(原 `src/fetch/paths.ts` 的 `DB_FILENAME`);
13
+ * · `html.dir`=`cook_html/help`(原 `src/help/manifest.ts` 的 `HELP_DIR_SEGMENTS` 两段——配置形状是
14
+ * 字符串、段间用 `/` 或 `\` 分隔,因为受限子集不收数组;见 `base-link-core/README.md` §支持范围);
15
+ * · `files.help`/`files.lookup`=`私家大厨_HELP`/`私家大厨_速查表`(原 `manifest.ts` 的两个主体名)。
16
+ * 用法上一处约定:**空串=按默认落点**——`db.dir` 空即用数据目录(`~/.ilife/data/`),由取用处算,
17
+ * 所以空串不是「没配」,老数据不会看起来丢了。
18
+ */
19
+ import { loadConfig, resetConfig, saveConfig } from 'base-link-core';
20
+ /** 配置文件主体名:`<配置目录>/chef.yaml`。 */
21
+ export const CHEF_CONFIG_STEM = 'chef';
22
+ /** 私家大厨那份配置表:键即设置页的行,一层嵌套(子集支持范围见 base-link-core README)。 */
23
+ export const CHEF_CONFIG_DEFAULTS = {
24
+ db: { dir: '', name: 'chef_data.db' },
25
+ html: { dir: 'cook_html/help' },
26
+ files: { help: '私家大厨_HELP', lookup: '私家大厨_速查表' },
27
+ };
28
+ /** 每进程只读一次:配置文件的「保存即生效」靠**下一次调用现读**,同一个进程里不反复读盘。 */
29
+ let memo = null;
30
+ /** 读一份配置(文件不存在即按默认值落一份并把配置目录/数据目录建出来)。 */
31
+ export function loadChefConfig() {
32
+ if (memo === null) {
33
+ const loaded = loadConfig(CHEF_CONFIG_STEM, CHEF_CONFIG_DEFAULTS);
34
+ // base-link-core 读回来时已经过了「键齐 + 类型对」两道校验(不认识的键、类型不符一律抛),
35
+ // 故这一处从宽松记录到形状记录的转换是有依据的投影,不是猜测。
36
+ memo = {
37
+ path: loaded.path,
38
+ dataDir: loaded.dataDir,
39
+ created: loaded.created,
40
+ values: loaded.values,
41
+ };
42
+ }
43
+ return memo;
44
+ }
45
+ /** 写一份配置(写出去的是完整一份:没给的项按默认值补齐)。写完清记忆,同进程后续读也现取。 */
46
+ export function saveChefConfig(values) {
47
+ const r = saveConfig(CHEF_CONFIG_STEM, CHEF_CONFIG_DEFAULTS, values);
48
+ memo = null;
49
+ return r;
50
+ }
51
+ /** 重置为默认(先另存 `<配置目录>/chef.yaml.bak`)。 */
52
+ export function resetChefConfig() {
53
+ const r = resetConfig(CHEF_CONFIG_STEM, CHEF_CONFIG_DEFAULTS);
54
+ memo = null;
55
+ return r;
56
+ }
57
+ /** 把配置里的相对段串拆成段(`cook_html/help` → `['cook_html','help']`;`\` 与 `/` 都认,
58
+ * 空段丢弃——Windows 用户手写路径时两种分隔符都会用)。段数由值决定,故「几段」这件事配置形状能表达。 */
59
+ export function splitDirSegments(value) {
60
+ return value.split(/[\\/]+/).filter((s) => s.length > 0);
61
+ }
62
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGrE,kCAAkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAe,CAAC;AAEhD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;IACrC,IAAI,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE;IAC/B,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE;CACjD,CAAC;AAaF,oDAAoD;AACpD,IAAI,IAAI,GAA4B,IAAI,CAAC;AAEzC,0CAA0C;AAC1C,MAAM,UAAU,cAAc;IAC5B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,UAAU,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QAClE,wDAAwD;QACxD,iCAAiC;QACjC,IAAI,GAAG;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAqC;SACrD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,CAAC,GAAG,UAAU,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACrE,IAAI,GAAG,IAAI,CAAC;IACZ,OAAO,CAAC,CAAC;AACX,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,GAAG,WAAW,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IAC9D,IAAI,GAAG,IAAI,CAAC;IACZ,OAAO,CAAC,CAAC;AACX,CAAC;AAED;6DAC6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export { ChefFetchError, ChefPolicyError } from './errors.js';
2
- export { DB_FILENAME, resolveDbDir, resolveDbPath, assertWritablePath } from './paths.js';
2
+ export { DEFAULT_DB_FILENAME, dbFilename, resolveDbDir, resolveDbPath } from './paths.js';
3
3
  export { openChefDb, closeChefDb, addRecipe, addIngredient, addStep, listRecipes, filterRecipes, searchRecipes, getRecipeDetail, deprecateRecipe, updateRecipe, recordHistory, queryHistory, historyStats, buildShoppingList, healthCheck } from './db.js';
4
4
  export type { RecipeRow, IngredientRow, StepRow, HistoryRow, HealthIssue, ChefDb } from './db.js';
5
5
  export type { ShoppingItem as ChefShoppingItem } from './db.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3P,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAClG,YAAY,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3P,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAClG,YAAY,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export { ChefFetchError, ChefPolicyError } from './errors.js';
2
- export { DB_FILENAME, resolveDbDir, resolveDbPath, assertWritablePath } from './paths.js';
2
+ export { DEFAULT_DB_FILENAME, dbFilename, resolveDbDir, resolveDbPath } from './paths.js';
3
3
  export { openChefDb, closeChefDb, addRecipe, addIngredient, addStep, listRecipes, filterRecipes, searchRecipes, getRecipeDetail, deprecateRecipe, updateRecipe, recordHistory, queryHistory, historyStats, buildShoppingList, healthCheck } from './db.js';
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
@@ -1,6 +1,8 @@
1
- export declare const DB_FILENAME = "chef_data.db";
1
+ /** 库文件名的默认值:=改造前的代码常量 `DB_FILENAME`(配置项 `db.name` 空串即用它)。 */
2
+ export declare const DEFAULT_DB_FILENAME = "chef_data.db";
3
+ /** 库文件名:配置 `db.name`,空串=默认(`chef_data.db`)。 */
4
+ export declare function dbFilename(): string;
5
+ /** 库目录:配置 `db.dir`,空串=数据目录(`~/.ilife/data/`,`ILIFE_CONFIG_DIR` 可整体接管)。 */
2
6
  export declare function resolveDbDir(): string;
3
7
  export declare function resolveDbPath(filename?: string, dir?: string): string;
4
- /** 测试隔离守卫:非 tmp 路径写库须 CHEF_FORCE_PROD=1(bill 哨兵语义的大厨版)。 */
5
- export declare function assertWritablePath(dbPath: string): void;
6
8
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/fetch/paths.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAE1C,wBAAgB,YAAY,IAAI,MAAM,CASrC;AAED,wBAAgB,aAAa,CAAC,QAAQ,SAAc,EAAE,GAAG,SAAiB,GAAG,MAAM,CAGlF;AAED,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAYvD"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/fetch/paths.ts"],"names":[],"mappings":"AAUA,6DAA6D;AAC7D,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,+CAA+C;AAC/C,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED,wBAAgB,aAAa,CAAC,QAAQ,SAAe,EAAE,GAAG,SAAiB,GAAG,MAAM,CAGnF"}
@@ -1,31 +1,26 @@
1
- // DB 路径解析与隔离守卫:SKILLS_DB_PATH 必设,无默认值(铁律缺失阻断)。
2
- // 老家 db_config._fallback_db_dir(D:/CookHub)TS 线有意不继承:拒绝隐式写生产。
1
+ // 库路径解析:**配置文件的唯一真相**(#695;口径见「配置的存与生效口径裁定」#675 的解决评论)。
2
+ // 改造前这里读 `SKILLS_DB_PATH`(无默认值、缺失即抛),并按 `CHEF_FORCE_PROD=1` 守「非 tmp 不许写库」;
3
+ // #695 按用户裁决把两个环境变量**一并删掉**:路径改从 `~/.ilife/chef.yaml` 取,写库边界改由
4
+ // 「测试基座强制 `ILIFE_CONFIG_DIR`」(`base-link-core` 的 `CONFIG_TEST_ISOLATION_MISSING`)承担——
5
+ // 把「忘了配」从静默写真实库变成响亮失败。
6
+ // 老家 db_config._fallback_db_dir(D:/CookHub)TS 线仍有意不继承:拒绝隐式写生产。
3
7
  import { mkdirSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
5
- import { join, resolve } from 'node:path';
6
- export const DB_FILENAME = 'chef_data.db';
8
+ import { join } from 'node:path';
9
+ import { loadChefConfig } from '../config.js';
10
+ /** 库文件名的默认值:=改造前的代码常量 `DB_FILENAME`(配置项 `db.name` 空串即用它)。 */
11
+ export const DEFAULT_DB_FILENAME = 'chef_data.db';
12
+ /** 库文件名:配置 `db.name`,空串=默认(`chef_data.db`)。 */
13
+ export function dbFilename() {
14
+ const name = loadChefConfig().values.db.name;
15
+ return name === '' ? DEFAULT_DB_FILENAME : name;
16
+ }
17
+ /** 库目录:配置 `db.dir`,空串=数据目录(`~/.ilife/data/`,`ILIFE_CONFIG_DIR` 可整体接管)。 */
7
18
  export function resolveDbDir() {
8
- const env = process.env.SKILLS_DB_PATH;
9
- if (!env) {
10
- throw new Error('[skill-chef] SKILLS_DB_PATH 未设置:拒绝隐式落盘。' +
11
- '生产请设置 SKILLS_DB_PATH;测试请传显式 tmp 路径。');
12
- }
13
- return env;
19
+ const dir = loadChefConfig().values.db.dir;
20
+ return dir === '' ? loadChefConfig().dataDir : dir;
14
21
  }
15
- export function resolveDbPath(filename = DB_FILENAME, dir = resolveDbDir()) {
22
+ export function resolveDbPath(filename = dbFilename(), dir = resolveDbDir()) {
16
23
  mkdirSync(dir, { recursive: true });
17
24
  return join(dir, filename);
18
25
  }
19
- /** 测试隔离守卫:非 tmp 路径写库须 CHEF_FORCE_PROD=1(bill 哨兵语义的大厨版)。 */
20
- export function assertWritablePath(dbPath) {
21
- const forceProd = process.env.CHEF_FORCE_PROD === '1';
22
- const underTmp = resolve(dbPath).startsWith(resolve(tmpdir()));
23
- if (!underTmp && !forceProd) {
24
- throw new Error('[skill-chef] 拒绝写入非 tmp 路径 ' + dbPath + ':测试隔离守卫。' +
25
- '如确需生产写,请设置 CHEF_FORCE_PROD=1(opt-in 可见)。');
26
- }
27
- if (!underTmp && forceProd) {
28
- console.error('[skill-chef] CHEF_FORCE_PROD=1: 写入 ' + dbPath);
29
- }
30
- }
31
26
  //# sourceMappingURL=paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/fetch/paths.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,8DAA8D;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAE1C,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,yCAAyC;YACvC,qCAAqC,CACxC,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAQ,GAAG,WAAW,EAAE,GAAG,GAAG,YAAY,EAAE;IACxE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,4BAA4B,GAAG,MAAM,GAAG,UAAU;YAChD,0CAA0C,CAC7C,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,qCAAqC,GAAG,MAAM,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/fetch/paths.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,2EAA2E;AAC3E,+DAA+D;AAC/D,sFAAsF;AACtF,uBAAuB;AACvB,+DAA+D;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,6DAA6D;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAElD,+CAA+C;AAC/C,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;IAC7C,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC;IAC3C,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAQ,GAAG,UAAU,EAAE,EAAE,GAAG,GAAG,YAAY,EAAE;IACzE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,41 @@
1
+ /** 报告里的三档判据(与面板侧镜像同值)。 */
2
+ export type HealthStatus = 'red' | 'yellow' | 'green';
3
+ export interface HealthItem {
4
+ readonly id: string;
5
+ readonly title: string;
6
+ readonly status: HealthStatus;
7
+ readonly message: string;
8
+ readonly action: string;
9
+ readonly source?: string;
10
+ }
11
+ export interface ChefHealthReport {
12
+ readonly skill: string;
13
+ readonly configPath: string;
14
+ readonly dataDir: string;
15
+ readonly items: readonly HealthItem[];
16
+ }
17
+ /** 库表数门槛:`src/fetch/db.ts` 的建库 DDL 里那 17 张表齐了才算正常(少了报黄:还能用,但缺功能的表要重建)。 */
18
+ export declare const DB_TABLE_THRESHOLD: 17;
19
+ /** 只读解析结果:文件不在/读得出取值与「哪些键真在文件里」/读不出来(报文带行号与文件名)。 */
20
+ export type ConfigRead = {
21
+ readonly kind: 'missing';
22
+ } | {
23
+ readonly kind: 'ok';
24
+ readonly values: Record<string, Record<string, unknown>>;
25
+ readonly present: ReadonlySet<string>;
26
+ } | {
27
+ readonly kind: 'bad';
28
+ readonly message: string;
29
+ };
30
+ /**
31
+ * 只读解析那份配置文件(与 `base-link-core` 的受限子集同一套校验,口径逐条对齐):
32
+ * 剥 BOM、去 `\r`、空行与整行注释跳过、缩进只许 2 个空格且不许制表符、不支持列表、
33
+ * 一行须是「键: 值」、不许重复定义、顶层键冒号后没值即开一个组。
34
+ *
35
+ * 与 `loadConfig()` 的差别只有一处、也正是本件要的那一处:**文件不在时不落默认件**。
36
+ * 取值语义与它一致:文件里缺的项按默认值补。
37
+ */
38
+ export declare function readChefConfigReadOnly(): ConfigRead;
39
+ /** 跑一次体检,返回整份报告。**只读**:任何一处都不落盘(只有写探针那一个文件,且当场删掉)。 */
40
+ export declare function buildChefHealthReport(): ChefHealthReport;
41
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AA4BA,0BAA0B;AAC1B,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;CACvC;AAED,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,EAAG,EAAW,CAAC;AAc9C,oDAAoD;AACpD,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GACxH;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,UAAU,CAYnD;AAqQD,sDAAsD;AACtD,wBAAgB,qBAAqB,IAAI,gBAAgB,CAoJxD"}