skill-schedule 0.1.0

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 (93) hide show
  1. package/dist/cli/cmd_read.d.ts +3 -0
  2. package/dist/cli/cmd_read.d.ts.map +1 -0
  3. package/dist/cli/cmd_read.js +312 -0
  4. package/dist/cli/cmd_read.js.map +1 -0
  5. package/dist/fetch/db.d.ts +97 -0
  6. package/dist/fetch/db.d.ts.map +1 -0
  7. package/dist/fetch/db.js +382 -0
  8. package/dist/fetch/db.js.map +1 -0
  9. package/dist/fetch/errors.d.ts +13 -0
  10. package/dist/fetch/errors.d.ts.map +1 -0
  11. package/dist/fetch/errors.js +18 -0
  12. package/dist/fetch/errors.js.map +1 -0
  13. package/dist/fetch/feishu.d.ts +36 -0
  14. package/dist/fetch/feishu.d.ts.map +1 -0
  15. package/dist/fetch/feishu.js +141 -0
  16. package/dist/fetch/feishu.js.map +1 -0
  17. package/dist/fetch/index.d.ts +7 -0
  18. package/dist/fetch/index.d.ts.map +1 -0
  19. package/dist/fetch/index.js +5 -0
  20. package/dist/fetch/index.js.map +1 -0
  21. package/dist/fetch/paths.d.ts +6 -0
  22. package/dist/fetch/paths.d.ts.map +1 -0
  23. package/dist/fetch/paths.js +31 -0
  24. package/dist/fetch/paths.js.map +1 -0
  25. package/dist/help/index.d.ts +3 -0
  26. package/dist/help/index.d.ts.map +1 -0
  27. package/dist/help/index.js +2 -0
  28. package/dist/help/index.js.map +1 -0
  29. package/dist/help/lookup.d.ts +11 -0
  30. package/dist/help/lookup.d.ts.map +1 -0
  31. package/dist/help/lookup.js +39 -0
  32. package/dist/help/lookup.js.map +1 -0
  33. package/dist/index.d.ts +5 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +6 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/policy/category.d.ts +29 -0
  38. package/dist/policy/category.d.ts.map +1 -0
  39. package/dist/policy/category.js +168 -0
  40. package/dist/policy/category.js.map +1 -0
  41. package/dist/policy/index.d.ts +10 -0
  42. package/dist/policy/index.d.ts.map +1 -0
  43. package/dist/policy/index.js +6 -0
  44. package/dist/policy/index.js.map +1 -0
  45. package/dist/policy/plan.d.ts +26 -0
  46. package/dist/policy/plan.d.ts.map +1 -0
  47. package/dist/policy/plan.js +124 -0
  48. package/dist/policy/plan.js.map +1 -0
  49. package/dist/policy/record.d.ts +36 -0
  50. package/dist/policy/record.d.ts.map +1 -0
  51. package/dist/policy/record.js +189 -0
  52. package/dist/policy/record.js.map +1 -0
  53. package/dist/policy/routing.d.ts +13 -0
  54. package/dist/policy/routing.d.ts.map +1 -0
  55. package/dist/policy/routing.js +72 -0
  56. package/dist/policy/routing.js.map +1 -0
  57. package/dist/policy/wakewords.d.ts +14 -0
  58. package/dist/policy/wakewords.d.ts.map +1 -0
  59. package/dist/policy/wakewords.js +85 -0
  60. package/dist/policy/wakewords.js.map +1 -0
  61. package/dist/render/envelope.d.ts +6 -0
  62. package/dist/render/envelope.d.ts.map +1 -0
  63. package/dist/render/envelope.js +48 -0
  64. package/dist/render/envelope.js.map +1 -0
  65. package/dist/render/errors.d.ts +5 -0
  66. package/dist/render/errors.d.ts.map +1 -0
  67. package/dist/render/errors.js +9 -0
  68. package/dist/render/errors.js.map +1 -0
  69. package/dist/render/html.d.ts +13 -0
  70. package/dist/render/html.d.ts.map +1 -0
  71. package/dist/render/html.js +68 -0
  72. package/dist/render/html.js.map +1 -0
  73. package/dist/render/index.d.ts +8 -0
  74. package/dist/render/index.d.ts.map +1 -0
  75. package/dist/render/index.js +6 -0
  76. package/dist/render/index.js.map +1 -0
  77. package/dist/render/templates.d.ts +5 -0
  78. package/dist/render/templates.d.ts.map +1 -0
  79. package/dist/render/templates.js +42 -0
  80. package/dist/render/templates.js.map +1 -0
  81. package/dist/render/views.d.ts +78 -0
  82. package/dist/render/views.d.ts.map +1 -0
  83. package/dist/render/views.js +145 -0
  84. package/dist/render/views.js.map +1 -0
  85. package/package.json +32 -0
  86. package/templates/help.html +16 -0
  87. package/templates/plan_day.html +16 -0
  88. package/templates/plan_receipt.html +16 -0
  89. package/templates/record_compare.html +16 -0
  90. package/templates/record_day.html +16 -0
  91. package/templates/record_detail.html +16 -0
  92. package/templates/record_range.html +16 -0
  93. package/templates/record_receipt.html +16 -0
@@ -0,0 +1,68 @@
1
+ import { ScheduleRenderError } from './errors.js';
2
+ export const SCHEDULE_HTML_MAX_BYTES = 256 * 1024;
3
+ export function escapeHtml(s) {
4
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
5
+ }
6
+ function recordItemHtml(n) {
7
+ const time = escapeHtml(String(n.time ?? ''));
8
+ const act = escapeHtml(String(n.activity ?? ''));
9
+ const cat = escapeHtml(String(n.category ?? ''));
10
+ const emoji = escapeHtml(String(n.emoji ?? ''));
11
+ const dur = escapeHtml(String(n.duration ?? ''));
12
+ return '<div class="item"><div class="item-head"><span class="time">' + time + '</span><span class="badge">' + emoji + cat + '</span><span class="dur">' + dur + '</span></div><div class="content">' + act + '</div></div>';
13
+ }
14
+ function planItemHtml(n) {
15
+ const time = escapeHtml(String(n.time ?? ''));
16
+ const title = escapeHtml(String(n.title ?? ''));
17
+ const done = n.completion ? ' <span class="done">' + escapeHtml(String(n.completion)) + '</span>' : '';
18
+ const sync = n.synced ? ' <span class="sync">☁</span>' : '';
19
+ return '<div class="item"><div class="item-head"><span class="time">' + time + '</span></div><div class="content">' + title + done + sync + '</div></div>';
20
+ }
21
+ function listHtml(items, key) {
22
+ if (!items.length)
23
+ return '<div class="hm-empty">暂无记录</div>';
24
+ const fn = key.startsWith('schedule.plan.') ? planItemHtml : recordItemHtml;
25
+ return items.map((x) => fn(x)).join('');
26
+ }
27
+ // 按形状渲染 envelope 为 section 页;未知形状 throw 不返空页。
28
+ export function renderEnvelopeHtml(env) {
29
+ const head = '<section data-skill="schedule" data-shape="' + env.shape + '" data-key="' + escapeHtml(env.key) + '">';
30
+ const d = env.data;
31
+ switch (env.shape) {
32
+ case 'list': return head + listHtml(d.items, env.key) + '</section>';
33
+ case 'detail': return head + recordItemHtml(d.item) + '</section>';
34
+ case 'receipt': return head + '<div class="receipt">' + escapeHtml(String(d.message)) + '</div></section>';
35
+ case 'stat': {
36
+ const rows = Object.entries((d.metrics || {}));
37
+ return head + rows.map(([k, v]) => '<div class="stat"><b>' + v + '</b><span>' + escapeHtml(k) + '</span></div>').join('') + '</section>';
38
+ }
39
+ case 'analysis': return head + '<div class="analysis">' + escapeHtml(String(d.summary)).replace(/\n/g, '<br>') + '</div></section>';
40
+ case 'fallback': return head + '<div data-degraded="1">' + escapeHtml(String(d.reason)) + '</div></section>';
41
+ default: throw new ScheduleRenderError('SCHEDULE_SHAPE_MISMATCH', '无法渲染形状:' + String(env.shape));
42
+ }
43
+ }
44
+ export function estimateBytes(html) { return Buffer.byteLength(html, 'utf8'); }
45
+ // 体积门:超限 throw(调用方走 fallback 形状显式降级,不静默截断)。
46
+ export function assertHtmlSize(html, max = SCHEDULE_HTML_MAX_BYTES) {
47
+ if (estimateBytes(html) > max) {
48
+ throw new ScheduleRenderError('SCHEDULE_HTML_TOO_LARGE', 'HTML 超体积:' + estimateBytes(html) + ' > ' + max);
49
+ }
50
+ }
51
+ // 共享标记填充(老家离线注入壳对应):CSS/HELPERS/CONTENT 三标记各恰出现 1 次,否则 throw。
52
+ export const SHARED_CSS_MARKER = '<!--SHARED-CSS-->';
53
+ export const SHARED_HELPERS_MARKER = '<!--SHARED-HELPERS-->';
54
+ export const CONTENT_MARKER = '<!--CONTENT-->';
55
+ export const SHARED_CSS = '.page{font-family:system-ui,sans-serif;max-width:720px;margin:0 auto;padding:12px}.item{border:1px solid #ddd;border-radius:8px;padding:8px;margin:8px 0}.item-head{display:flex;gap:8px;align-items:center}.badge{background:#eee;border-radius:4px;padding:0 6px}.receipt{background:#f0fff0;border:1px solid #090;border-radius:8px;padding:12px}.stat{display:flex;gap:8px}.analysis{white-space:pre-wrap}.hm-empty{color:#888}';
56
+ export const SHARED_HELPERS = '<script>function copyItem(id){var e=document.getElementById(id);if(e&&navigator.clipboard){navigator.clipboard.writeText(e.innerText);}}</script>';
57
+ export function fillTemplate(template, contentHtml) {
58
+ for (const m of [SHARED_CSS_MARKER, SHARED_HELPERS_MARKER, CONTENT_MARKER]) {
59
+ if (template.split(m).length - 1 !== 1) {
60
+ throw new ScheduleRenderError('SCHEDULE_MARKER_INVALID', '标记须恰出现 1 次:' + m);
61
+ }
62
+ }
63
+ return template
64
+ .split(SHARED_CSS_MARKER).join('<style>' + SHARED_CSS + '</style>')
65
+ .split(SHARED_HELPERS_MARKER).join(SHARED_HELPERS)
66
+ .split(CONTENT_MARKER).join(contentHtml);
67
+ }
68
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/render/html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { ScheduleRenderError } from './errors.js';
2
+ export { SCHEDULE_KEY_SHAPES, scheduleShapeFor, buildScheduleEnvelope, parseScheduleEnvelope } from './envelope.js';
3
+ export { toRecordItem, buildRecordToday, buildRecordRange, buildRecordDetail, buildRecordReceipt, buildRecordCompare, buildCategoryDeep, buildAnomaly, toPlanItem, buildPlanToday, buildPlanReceipt, buildHelpItems, HELP_EMPTY_HINT, } from './views.js';
4
+ export type { RecordItem, PlanItem, HelpItem } from './views.js';
5
+ export { SCHEDULE_HTML_MAX_BYTES, escapeHtml, renderEnvelopeHtml, estimateBytes, assertHtmlSize, SHARED_CSS_MARKER, SHARED_HELPERS_MARKER, CONTENT_MARKER, SHARED_CSS, SHARED_HELPERS, fillTemplate, } from './html.js';
6
+ export { SCHEDULE_TEMPLATES, templateFor, loadTemplate } from './templates.js';
7
+ export type { ScheduleTemplate } from './templates.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EACvF,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAC/E,gBAAgB,EAAE,cAAc,EAAE,eAAe,GAClD,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EACL,uBAAuB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EACtF,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,GACnG,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/E,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { ScheduleRenderError } from './errors.js';
2
+ export { SCHEDULE_KEY_SHAPES, scheduleShapeFor, buildScheduleEnvelope, parseScheduleEnvelope } from './envelope.js';
3
+ export { toRecordItem, buildRecordToday, buildRecordRange, buildRecordDetail, buildRecordReceipt, buildRecordCompare, buildCategoryDeep, buildAnomaly, toPlanItem, buildPlanToday, buildPlanReceipt, buildHelpItems, HELP_EMPTY_HINT, } from './views.js';
4
+ export { SCHEDULE_HTML_MAX_BYTES, escapeHtml, renderEnvelopeHtml, estimateBytes, assertHtmlSize, SHARED_CSS_MARKER, SHARED_HELPERS_MARKER, CONTENT_MARKER, SHARED_CSS, SHARED_HELPERS, fillTemplate, } from './html.js';
5
+ export { SCHEDULE_TEMPLATES, templateFor, loadTemplate } from './templates.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EACvF,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAC/E,gBAAgB,EAAE,cAAc,EAAE,eAAe,GAClD,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,uBAAuB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EACtF,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,GACnG,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const SCHEDULE_TEMPLATES: readonly ["record_day", "record_range", "record_detail", "record_receipt", "record_compare", "plan_day", "plan_receipt", "help"];
2
+ export type ScheduleTemplate = (typeof SCHEDULE_TEMPLATES)[number];
3
+ export declare function templateFor(key: string): ScheduleTemplate;
4
+ export declare function loadTemplate(name: string): string;
5
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/render/templates.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,kIASrB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAGnE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAYzD;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMjD"}
@@ -0,0 +1,42 @@
1
+ // 渲染层·模板装载:8 模板随包发布;未知/缺失大声失败。
2
+ import { readFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { ScheduleRenderError } from './errors.js';
6
+ export const SCHEDULE_TEMPLATES = [
7
+ 'record_day',
8
+ 'record_range',
9
+ 'record_detail',
10
+ 'record_receipt',
11
+ 'record_compare',
12
+ 'plan_day',
13
+ 'plan_receipt',
14
+ 'help',
15
+ ];
16
+ // key → 模板(compare 家族共用 record_compare;write 家族用 receipt 模板)。
17
+ export function templateFor(key) {
18
+ switch (key) {
19
+ case 'schedule.record.today': return 'record_day';
20
+ case 'schedule.record.range': return 'record_range';
21
+ case 'schedule.record.detail': return 'record_detail';
22
+ case 'schedule.record.write': return 'record_receipt';
23
+ case 'schedule.record.compare': return 'record_compare';
24
+ case 'schedule.plan.today': return 'plan_day';
25
+ case 'schedule.plan.write': return 'plan_receipt';
26
+ case 'schedule.help.lookup': return 'help';
27
+ default: throw new ScheduleRenderError('SCHEDULE_UNKNOWN_KEY', '无模板映射:' + key);
28
+ }
29
+ }
30
+ const templatesDir = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'templates');
31
+ export function loadTemplate(name) {
32
+ if (!SCHEDULE_TEMPLATES.includes(name)) {
33
+ throw new ScheduleRenderError('SCHEDULE_TEMPLATE_MISSING', '未知模板:' + name);
34
+ }
35
+ try {
36
+ return readFileSync(join(templatesDir, name + '.html'), 'utf8');
37
+ }
38
+ catch (e) {
39
+ throw new ScheduleRenderError('SCHEDULE_TEMPLATE_MISSING', '模板缺失:' + name);
40
+ }
41
+ }
42
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/render/templates.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,YAAY;IACZ,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,UAAU;IACV,cAAc;IACd,MAAM;CACE,CAAC;AAGX,8DAA8D;AAC9D,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,uBAAuB,CAAC,CAAC,OAAO,YAAY,CAAC;QAClD,KAAK,uBAAuB,CAAC,CAAC,OAAO,cAAc,CAAC;QACpD,KAAK,wBAAwB,CAAC,CAAC,OAAO,eAAe,CAAC;QACtD,KAAK,uBAAuB,CAAC,CAAC,OAAO,gBAAgB,CAAC;QACtD,KAAK,yBAAyB,CAAC,CAAC,OAAO,gBAAgB,CAAC;QACxD,KAAK,qBAAqB,CAAC,CAAC,OAAO,UAAU,CAAC;QAC9C,KAAK,qBAAqB,CAAC,CAAC,OAAO,cAAc,CAAC;QAClD,KAAK,sBAAsB,CAAC,CAAC,OAAO,MAAM,CAAC;QAC3C,OAAO,CAAC,CAAC,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,EAAE,QAAQ,GAAG,GAAG,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAE5F,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAwB,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,mBAAmB,CAAC,2BAA2B,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC;QAAC,OAAO,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IACxE,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,mBAAmB,CAAC,2BAA2B,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;IAAC,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,78 @@
1
+ import type { ScheduleRecord, PlanEvent } from '../fetch/db.js';
2
+ export interface RecordItem {
3
+ id: number;
4
+ date: string;
5
+ time: string;
6
+ activity: string;
7
+ category: string;
8
+ emoji: string;
9
+ duration: string;
10
+ minutes: number;
11
+ }
12
+ export declare function toRecordItem(r: ScheduleRecord): RecordItem;
13
+ export declare function buildRecordToday(date: string, records: ScheduleRecord[]): {
14
+ items: RecordItem[];
15
+ total: number;
16
+ coverage: number;
17
+ score: number;
18
+ };
19
+ export declare function buildRecordRange(start: string, end: string, records: ScheduleRecord[]): {
20
+ metrics: Record<string, number>;
21
+ };
22
+ export declare function buildRecordDetail(record: ScheduleRecord): {
23
+ item: Record<string, unknown>;
24
+ };
25
+ export declare function buildRecordReceipt(message: string): {
26
+ ok: boolean;
27
+ message: string;
28
+ };
29
+ export declare function buildRecordCompare(args: {
30
+ labelA: string;
31
+ labelB: string;
32
+ a: ScheduleRecord[];
33
+ b: ScheduleRecord[];
34
+ }): {
35
+ summary: string;
36
+ };
37
+ export declare function buildCategoryDeep(start: string, end: string, category: string, records: ScheduleRecord[]): {
38
+ summary: string;
39
+ };
40
+ export declare function buildAnomaly(end: string, windowDays: number, daily: {
41
+ date: string;
42
+ byL1: Record<string, number>;
43
+ }[]): {
44
+ summary: string;
45
+ };
46
+ export interface PlanItem {
47
+ id: number;
48
+ date: string;
49
+ time: string;
50
+ title: string;
51
+ category: string;
52
+ completion: string | null;
53
+ synced: boolean;
54
+ }
55
+ export declare function toPlanItem(p: PlanEvent): PlanItem;
56
+ export declare function buildPlanToday(date: string, events: PlanEvent[]): {
57
+ items: PlanItem[];
58
+ total: number;
59
+ date: string;
60
+ };
61
+ export declare function buildPlanReceipt(message: string): {
62
+ ok: boolean;
63
+ message: string;
64
+ };
65
+ export interface HelpItem {
66
+ phrase: string;
67
+ key: string;
68
+ shape: string;
69
+ cli: string;
70
+ desc: string;
71
+ }
72
+ export declare const HELP_EMPTY_HINT = "\u65E0\u547D\u4E2D\uFF1A\u5B9A\u65F6\u4EFB\u52A1/\u65E9\u7761\u63D0\u9192\u7B49\u51FA scope\uFF0C\u4EE5\u5916\u7F6E\u4E3A\u51C6\uFF08HELP q \u4E3A\u7A7A\u770B\u5168\u8868\uFF0C\u6216\u6362\u5524\u9192\u8BCD\u5982\u201C\u67E5\u4F5C\u606F/\u67E5\u65E5\u7A0B\u201D\uFF09";
73
+ export declare function buildHelpItems(all: HelpItem[], q?: string): {
74
+ items: HelpItem[];
75
+ total: number;
76
+ hint?: string;
77
+ };
78
+ //# sourceMappingURL=views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/render/views.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { l1Of, fmtDur, fmtPct, computeHealthScore, detectAnomalies, getEmojiPrefix, } from '../policy/category.js';
2
+ export function toRecordItem(r) {
3
+ return {
4
+ id: r.id,
5
+ date: r.date,
6
+ time: r.time_start + '~' + r.time_end,
7
+ activity: r.activity,
8
+ category: r.category,
9
+ emoji: getEmojiPrefix(r.category),
10
+ duration: fmtDur(r.duration_minutes || 0),
11
+ minutes: r.duration_minutes || 0,
12
+ };
13
+ }
14
+ // 单日:items + total + 覆盖分钟/健康分(供模板主卡)。
15
+ export function buildRecordToday(date, records) {
16
+ const items = records.map(toRecordItem);
17
+ const byL1 = {};
18
+ let coverage = 0;
19
+ for (const r of records) {
20
+ const l1 = l1Of(r.category);
21
+ byL1[l1] = (byL1[l1] || 0) + (r.duration_minutes || 0);
22
+ coverage += r.duration_minutes || 0;
23
+ }
24
+ return { items, total: items.length, coverage, score: computeHealthScore(byL1).score };
25
+ }
26
+ // 区间:stat metrics(一级→分钟)+ 天数/总分钟(metrics 值须全 number,日期信息进 key 维度)。
27
+ export function buildRecordRange(start, end, records) {
28
+ const metrics = {};
29
+ const days = new Set();
30
+ let total = 0;
31
+ for (const r of records) {
32
+ const l1 = l1Of(r.category);
33
+ const m = r.duration_minutes || 0;
34
+ metrics['l1.' + l1] = (metrics['l1.' + l1] || 0) + m;
35
+ days.add(r.date);
36
+ total += m;
37
+ }
38
+ metrics['days'] = days.size;
39
+ metrics['total'] = total;
40
+ metrics['blocks'] = records.length;
41
+ return { metrics };
42
+ }
43
+ export function buildRecordDetail(record) {
44
+ return {
45
+ item: {
46
+ id: record.id, date: record.date, time: record.time_start + '~' + record.time_end,
47
+ duration: fmtDur(record.duration_minutes || 0), activity: record.activity,
48
+ category: record.category, emoji: getEmojiPrefix(record.category),
49
+ edit_count: record.edit_count, updated_at: record.updated_at,
50
+ },
51
+ };
52
+ }
53
+ export function buildRecordReceipt(message) {
54
+ return { ok: true, message };
55
+ }
56
+ // 对比:analysis summary(两聚合 + 差异 + 健康分差 + 异常句;数字全来自实算)。
57
+ export function buildRecordCompare(args) {
58
+ const agg = (rs) => {
59
+ const byL1 = {};
60
+ const days = new Set();
61
+ let total = 0;
62
+ for (const r of rs) {
63
+ const l1 = l1Of(r.category);
64
+ const m = r.duration_minutes || 0;
65
+ byL1[l1] = (byL1[l1] || 0) + m;
66
+ days.add(r.date);
67
+ total += m;
68
+ }
69
+ return { byL1, total, days: days.size || 1 };
70
+ };
71
+ const A = agg(args.a);
72
+ const B = agg(args.b);
73
+ const sA = computeHealthScore(A.byL1).score;
74
+ const sB = computeHealthScore(B.byL1).score;
75
+ const lines = [];
76
+ lines.push(args.labelA + ' vs ' + args.labelB + ':块数 ' + args.a.length + '→' + args.b.length + ',时长 ' + fmtDur(A.total) + '→' + fmtDur(B.total) + ',健康分 ' + sA + '→' + sB + '。');
77
+ const dims = new Set([...Object.keys(A.byL1), ...Object.keys(B.byL1)].sort());
78
+ for (const d of dims) {
79
+ const c = B.byL1[d] || 0;
80
+ const p = A.byL1[d] || 0;
81
+ if (!p && !c)
82
+ continue;
83
+ const dp = p > 0 ? fmtPct(c - p, p) : 100;
84
+ lines.push(d + ':' + fmtDur(p) + '→' + fmtDur(c) + '(' + (dp >= 0 ? '+' : '') + dp + '%)。');
85
+ }
86
+ const reds = detectAnomalies(B.byL1, A.byL1).filter((a) => a.level === 'red');
87
+ if (reds.length)
88
+ lines.push('显著变化:' + reds.map((a) => a.dim + (a.deltaPct >= 0 ? '+' : '') + a.deltaPct + '%').join('、') + '。');
89
+ return { summary: lines.join('\n') };
90
+ }
91
+ // 类别深挖:analysis summary(区间内某分类明细 + 占比)。
92
+ export function buildCategoryDeep(start, end, category, records) {
93
+ const total = records.reduce((a, r) => a + (r.duration_minutes || 0), 0);
94
+ const hit = records.filter((r) => r.category === category || l1Of(r.category) === category);
95
+ const hm = hit.reduce((a, r) => a + (r.duration_minutes || 0), 0);
96
+ const lines = [
97
+ start + '~' + end + ' 类别深挖 ' + category + ':' + hit.length + ' 块,共 ' + fmtDur(hm) + '(占区间 ' + fmtPct(hm, total) + '%)。',
98
+ ...hit.slice(0, 20).map((r) => r.date + ' ' + r.time_start + '~' + r.time_end + ' ' + r.activity),
99
+ ];
100
+ if (hit.length > 20)
101
+ lines.push('……等共 ' + hit.length + ' 块。');
102
+ return { summary: lines.join('\n') };
103
+ }
104
+ // 异常检测:analysis summary(窗口内按日聚合 vs 均值,红/黄句)。
105
+ export function buildAnomaly(end, windowDays, daily) {
106
+ const mean = {};
107
+ for (const d of daily) {
108
+ for (const [k, v] of Object.entries(d.byL1))
109
+ mean[k] = (mean[k] || 0) + v;
110
+ }
111
+ for (const k of Object.keys(mean))
112
+ mean[k] = Math.round(mean[k] / Math.max(daily.length, 1));
113
+ const lines = ['截止 ' + end + ' 近 ' + windowDays + ' 天异常检测(vs 日均):'];
114
+ let any = false;
115
+ for (const d of daily) {
116
+ const reds = detectAnomalies(d.byL1, mean).filter((a) => a.level !== null);
117
+ if (reds.length) {
118
+ any = true;
119
+ lines.push(d.date + ':' + reds.map((a) => a.dim + (a.deltaPct >= 0 ? '+' : '') + a.deltaPct + '%').join('、') + '。');
120
+ }
121
+ }
122
+ if (!any)
123
+ lines.push('无显著异常。');
124
+ return { summary: lines.join('\n') };
125
+ }
126
+ export function toPlanItem(p) {
127
+ return {
128
+ id: p.id, date: p.date, time: p.time_start + '~' + p.time_end, title: p.title,
129
+ category: p.category || '', completion: p.completion, synced: !!p.feishu_event_id,
130
+ };
131
+ }
132
+ export function buildPlanToday(date, events) {
133
+ return { items: events.map(toPlanItem), total: events.length, date };
134
+ }
135
+ export function buildPlanReceipt(message) {
136
+ return { ok: true, message };
137
+ }
138
+ export const HELP_EMPTY_HINT = '无命中:定时任务/早睡提醒等出 scope,以外置为准(HELP q 为空看全表,或换唤醒词如“查作息/查日程”)';
139
+ export function buildHelpItems(all, q) {
140
+ const items = !q || !q.trim() ? all : all.filter((h) => q.includes(h.phrase) || h.phrase.includes(q.trim()));
141
+ if (!items.length)
142
+ return { items, total: 0, hint: HELP_EMPTY_HINT };
143
+ return { items, total: items.length };
144
+ }
145
+ //# sourceMappingURL=views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/render/views.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "skill-schedule",
3
+ "version": "0.1.0",
4
+ "description": "作息管家SKILL一期:取数+口径+渲染+出口(record/plan 双域),依 link-core",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": "./dist/index.js",
10
+ "./fetch": "./dist/fetch/index.js",
11
+ "./policy": "./dist/policy/index.js",
12
+ "./render": "./dist/render/index.js",
13
+ "./cli": "./dist/cli/cmd_read.js"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "templates/*.html"
18
+ ],
19
+ "bin": {
20
+ "schedule-cmd-read": "./dist/cli/cmd_read.js"
21
+ },
22
+ "dependencies": {
23
+ "base-link-core": "workspace:^0.1.0"
24
+ },
25
+ "engines": {
26
+ "node": ">=22.13"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc -b && node scripts/build-help.mjs",
30
+ "test": "node --test ../../test/scaffold.test.mjs"
31
+ }
32
+ }
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>作息管家 HELP</title>
6
+ <!--SHARED-CSS-->
7
+ </head>
8
+ <body>
9
+ <div class="page">
10
+ <h1>作息管家 HELP</h1>
11
+ <p class="cmd">schedule-cmd-read schedule.help.lookup</p>
12
+ <!--CONTENT-->
13
+ </div>
14
+ <!--SHARED-HELPERS-->
15
+ </body>
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>查日程</title>
6
+ <!--SHARED-CSS-->
7
+ </head>
8
+ <body>
9
+ <div class="page">
10
+ <h1>查日程</h1>
11
+ <p class="cmd">schedule-cmd-read schedule.plan.today</p>
12
+ <!--CONTENT-->
13
+ </div>
14
+ <!--SHARED-HELPERS-->
15
+ </body>
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>日程回执</title>
6
+ <!--SHARED-CSS-->
7
+ </head>
8
+ <body>
9
+ <div class="page">
10
+ <h1>日程回执</h1>
11
+ <p class="cmd">schedule-cmd-read schedule.plan.write</p>
12
+ <!--CONTENT-->
13
+ </div>
14
+ <!--SHARED-HELPERS-->
15
+ </body>
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>查作息对比</title>
6
+ <!--SHARED-CSS-->
7
+ </head>
8
+ <body>
9
+ <div class="page">
10
+ <h1>查作息对比</h1>
11
+ <p class="cmd">schedule-cmd-read schedule.record.compare</p>
12
+ <!--CONTENT-->
13
+ </div>
14
+ <!--SHARED-HELPERS-->
15
+ </body>
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>查作息记录</title>
6
+ <!--SHARED-CSS-->
7
+ </head>
8
+ <body>
9
+ <div class="page">
10
+ <h1>查作息记录</h1>
11
+ <p class="cmd">schedule-cmd-read schedule.record.today</p>
12
+ <!--CONTENT-->
13
+ </div>
14
+ <!--SHARED-HELPERS-->
15
+ </body>
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>作息详情</title>
6
+ <!--SHARED-CSS-->
7
+ </head>
8
+ <body>
9
+ <div class="page">
10
+ <h1>作息详情</h1>
11
+ <p class="cmd">schedule-cmd-read schedule.record.detail</p>
12
+ <!--CONTENT-->
13
+ </div>
14
+ <!--SHARED-HELPERS-->
15
+ </body>
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>查作息区间</title>
6
+ <!--SHARED-CSS-->
7
+ </head>
8
+ <body>
9
+ <div class="page">
10
+ <h1>查作息区间</h1>
11
+ <p class="cmd">schedule-cmd-read schedule.record.range</p>
12
+ <!--CONTENT-->
13
+ </div>
14
+ <!--SHARED-HELPERS-->
15
+ </body>
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>记作息回执</title>
6
+ <!--SHARED-CSS-->
7
+ </head>
8
+ <body>
9
+ <div class="page">
10
+ <h1>记作息回执</h1>
11
+ <p class="cmd">schedule-cmd-read schedule.record.write</p>
12
+ <!--CONTENT-->
13
+ </div>
14
+ <!--SHARED-HELPERS-->
15
+ </body>
16
+ </html>