@yijiancaotang/cli 0.0.0-stage → 1.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 (60) hide show
  1. package/README.md +311 -2
  2. package/bin/caotang.cjs +15 -0
  3. package/dist/agent-identity.js +14 -0
  4. package/dist/auth.js +340 -0
  5. package/dist/calendar-contract.js +358 -0
  6. package/dist/calendar-help.js +12 -0
  7. package/dist/calendar.js +64 -0
  8. package/dist/capability-result.js +85 -0
  9. package/dist/cli.js +257 -0
  10. package/dist/command-help.js +105 -0
  11. package/dist/commands.js +356 -0
  12. package/dist/config.js +14 -0
  13. package/dist/connection-copy.js +40 -0
  14. package/dist/context.js +30 -0
  15. package/dist/contracts.js +1 -0
  16. package/dist/create-bundle.js +103 -0
  17. package/dist/create-file-failure.js +18 -0
  18. package/dist/credential-store.js +594 -0
  19. package/dist/doctor.js +221 -0
  20. package/dist/errors.js +214 -0
  21. package/dist/generated/knowledge-growth.js +37 -0
  22. package/dist/habit-day.js +58 -0
  23. package/dist/habit-read.js +32 -0
  24. package/dist/habit-wire.js +87 -0
  25. package/dist/http.js +211 -0
  26. package/dist/input-validation.js +76 -0
  27. package/dist/installation.js +761 -0
  28. package/dist/knowledge-growth.js +85 -0
  29. package/dist/local-commands.js +229 -0
  30. package/dist/local-lock.js +245 -0
  31. package/dist/local-records.js +149 -0
  32. package/dist/local-types.js +3 -0
  33. package/dist/managed-skill-baseline.js +35 -0
  34. package/dist/missing-sections.js +72 -0
  35. package/dist/onboarding.js +48 -0
  36. package/dist/output.js +54 -0
  37. package/dist/pending-requests.js +45 -0
  38. package/dist/platforms.js +239 -0
  39. package/dist/query-daily.js +70 -0
  40. package/dist/query-search.js +43 -0
  41. package/dist/query-validation.js +45 -0
  42. package/dist/reviewed-managed-bundle-baseline.js +356 -0
  43. package/dist/schedule-contract.js +289 -0
  44. package/dist/schedule-help.js +35 -0
  45. package/dist/schedule-start-wire.js +80 -0
  46. package/dist/schedule.js +70 -0
  47. package/dist/skill-assets.js +136 -0
  48. package/dist/upload.js +130 -0
  49. package/dist/web-citations.js +68 -0
  50. package/dist/write-permissions.js +41 -0
  51. package/dist/write-routing.js +26 -0
  52. package/package.json +27 -4
  53. package/skills/caotang-context/SKILL.md +52 -0
  54. package/skills/caotang-first-connect/SKILL.md +74 -0
  55. package/skills/caotang-project-progress/SKILL.md +91 -0
  56. package/skills/caotang-save-knowledge/SKILL.md +42 -0
  57. package/skills/caotang-schedule/SKILL.md +54 -0
  58. package/skills/caotang-search/SKILL.md +79 -0
  59. package/skills/caotang-workday/SKILL.md +81 -0
  60. package/skills/manifest.json +33 -0
@@ -0,0 +1,70 @@
1
+ import { asRecord, CliError, expectOK } from "./errors.js";
2
+ import { validDate } from "./query-validation.js";
3
+ import { safeSearchWarnings } from "./query-search.js";
4
+ const leap = (year) => year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
5
+ function ordinal(year, month, day) {
6
+ const prior = year - 1;
7
+ const months = [31, leap(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
8
+ return 365 * prior + Math.floor(prior / 4) - Math.floor(prior / 100) + Math.floor(prior / 400) + months.slice(0, month - 1).reduce((sum, value) => sum + value, 0) + day - 1;
9
+ }
10
+ export function validateDailyDates(flags) {
11
+ const start = flags["start-date"], end = flags["end-date"];
12
+ if (!validDate(start) || !validDate(end))
13
+ throw new CliError("invalid_arguments", "日汇总起止日期参数无效。", "必须同时提供 --start-date 和 --end-date,使用真实 YYYY-MM-DD(0001至9999年),不可为空。");
14
+ const [sy, sm, sd] = start.split("-").map(Number), [ey, em, ed] = end.split("-").map(Number);
15
+ // Use civil ordinals, not JS Date years 0..99, timezone offsets or 366 days.
16
+ // Internal year 10000 is valid for the exclusive bound of wire year 9999.
17
+ const nextMonth = sm === 2 && sd === 29 && !leap(sy + 1) ? 3 : sm;
18
+ const nextDay = nextMonth !== sm ? 1 : sd;
19
+ if (start > end || ordinal(ey, em, ed) + 1 > ordinal(sy + 1, nextMonth, nextDay))
20
+ throw new CliError("invalid_arguments", "日汇总日期范围无效。", "起始不得晚于结束;含首尾日期最多一个日历年,闰日周年按次年3月1日计算,不按固定366天计算。");
21
+ }
22
+ export function isDailyParameterError(value) {
23
+ return typeof value === "string" && ["start_date is required", "end_date is required", "date range exceeds one calendar year", "unsupported daily parameter", "invalid daily query", "invalid start_date", "invalid end_date", "invalid date range", "invalid limit", "invalid offset"].some(message => value === message || value === `${message}\n`);
24
+ }
25
+ const coverages = ["unavailable", "not_recorded", "partial", "complete"];
26
+ function validDailyMetadata(value) {
27
+ const body = asRecord(value);
28
+ if (!body || !Array.isArray(body.days) || typeof body.partial !== "boolean" || (body.coverage_start !== null && typeof body.coverage_start !== "string"))
29
+ return false;
30
+ return body.days.every(day => {
31
+ const row = asRecord(day);
32
+ return row !== null && validDate(row.date) && typeof row.knowledge_growth_coverage === "string" && coverages.includes(row.knowledge_growth_coverage)
33
+ && ["progress", "knowledge_created", "knowledge_growth", "redacted_progress_count"].every(key => row[key] === null || typeof row[key] === "number" && Number.isSafeInteger(row[key]) && row[key] >= 0);
34
+ });
35
+ }
36
+ export function formatDailyNotice(value) {
37
+ const body = asRecord(value);
38
+ if (!body || body.timezone !== "Asia/Shanghai" || !Array.isArray(body.days))
39
+ return "";
40
+ const days = body.days.map(asRecord).filter((row) => row !== null);
41
+ let result = "每日数量是完整日期范围的统计,不是当前页明细数;明细total只含可读事件。\n";
42
+ if (days.some(row => [row.progress, row.knowledge_created, row.knowledge_growth, row.redacted_progress_count].includes(null)))
43
+ result += "null表示不可读取或未完整记录,不能当作0。\n";
44
+ if (days.some(row => row.knowledge_growth_coverage === "not_recorded"))
45
+ result += "知识长势覆盖起点之前未完整记录,不能据此判断没有变化。\n";
46
+ if (days.some(row => row.knowledge_growth_coverage === "partial"))
47
+ result += "知识长势覆盖起点当天仅部分记录,不代表完整一天。\n";
48
+ if (body.partial === true)
49
+ result += "本次结果不完整;草稿被过滤时数字不含草稿,不能理解成当天没有活动。\n";
50
+ if (days.some(row => typeof row.redacted_progress_count === "number" && row.redacted_progress_count > 0))
51
+ result += "部分知识应用进展仅保留匿名日计数,不返回身份、关联或正文。\n";
52
+ return result;
53
+ }
54
+ export function expectDailyOK(result) {
55
+ if (result.status === 400 && isDailyParameterError(result.body))
56
+ throw new CliError("invalid_arguments", "日汇总参数无效。", "仅支持必填起止日期与limit/offset;真实日期含首尾最多一个日历年,limit为1至50,offset为非负安全整数。", 2, { http_status: 400 });
57
+ if (result.status === 404)
58
+ throw new CliError("not_found", "当前日汇总入口不可用。", "请核对服务版本与访问范围;这不表示没有活动数据。", 2, { http_status: 404 });
59
+ const body = asRecord(result.body), code = body?.code ?? body?.error;
60
+ if (result.status === 403 && code === "capability_disabled" && (body?.code === undefined || body.code === code) && (body?.error === undefined || body.error === code)) {
61
+ const expected = [{ section: "daily_progress", required_capability: "read_projects", reason: "capability_disabled" }, { section: "daily_knowledge", required_capability: "read_knowledge", reason: "capability_disabled" }];
62
+ const rows = Array.isArray(body?.missing_sections) ? body.missing_sections : [];
63
+ if (!Object.hasOwn(body, "required_capability") && expected.every(want => rows.some(row => { const item = asRecord(row); return item?.section === want.section && item.required_capability === want.required_capability && item.reason === want.reason; })))
64
+ throw new CliError("capability_disabled", "“读取项目”和“读取知识”开关都未开启。", "请本人到网页的 Agent 管理核对并开启所需开关;不要重新授权、换入口或重试来绕过限制。", 4, { http_status: 403, missing_sections: expected });
65
+ }
66
+ const checked = expectOK(result, "read");
67
+ if (!validDailyMetadata(checked.body))
68
+ throw new CliError("invalid_response", "日汇总返回了无法确认的计数或覆盖信息。", "请核对服务返回合同;不要把未知计数当作0或输出未经确认的身份信息。", 7);
69
+ return { ...checked, body: safeSearchWarnings(checked.body) };
70
+ }
@@ -0,0 +1,43 @@
1
+ import { asRecord, CliError } from "./errors.js";
2
+ import { expectQueryOK } from "./query-validation.js";
3
+ const trimSearch = (value) => value.replace(/^\p{White_Space}+|\p{White_Space}+$/gu, "");
4
+ export function validateSearch(q, flags) {
5
+ if (q !== undefined && (q.includes("\0") || /[\uD800-\uDFFF]/u.test(q) || [...trimSearch(q)].length > 200)) {
6
+ throw new CliError("invalid_arguments", "搜索词参数无效。", "搜索词首尾空白不计,最多200个Unicode字符;不能含NUL或无效字符。可省略搜索词按日期浏览。");
7
+ }
8
+ if (["project", "topic"].some(key => flags[key] !== undefined && (typeof flags[key] !== "string" || !trimSearch(flags[key])))) {
9
+ throw new CliError("invalid_arguments", "知识分支筛选参数无效。", "--project 和 --topic 不可显式为空;这些参数只筛知识分支,不筛其它类型。");
10
+ }
11
+ }
12
+ export function isSearchParameterError(value) {
13
+ return typeof value === "string" && ["invalid q", "invalid status", "invalid topic", "invalid publication_status", "invalid project_id", "invalid core_only", "unsupported core filter"].some(message => value === message || value === `${message}\n`);
14
+ }
15
+ export const searchWarningNotice = "历史手写进展与项目进展存在无法唯一确认的镜像关系,已保留记录,结果中可能有少量重复。\n";
16
+ export function safeSearchWarnings(value) {
17
+ const body = asRecord(value);
18
+ if (!body || !Object.hasOwn(body, "warnings"))
19
+ return value;
20
+ const { warnings, ...rest } = body;
21
+ return Array.isArray(warnings) && warnings.includes("historical_mirror_ambiguous") ? { ...rest, warnings: ["historical_mirror_ambiguous"] } : rest;
22
+ }
23
+ export function formatSearchWarnings(value) {
24
+ const warnings = asRecord(value)?.warnings;
25
+ return Array.isArray(warnings) && warnings.includes("historical_mirror_ambiguous") ? searchWarningNotice : "";
26
+ }
27
+ export function expectSearchOK(result) {
28
+ if (result.status === 400 && isSearchParameterError(result.body)) {
29
+ throw new CliError("invalid_arguments", "搜索参数无效。", "搜索词最多200个Unicode字符;status/topic/publication-status/project只筛知识且不可显式为空。只看核心请使用 --core-only。", 2, { http_status: 400 });
30
+ }
31
+ const body = asRecord(result.body), code = body?.code ?? body?.error;
32
+ if (result.status === 403 && code === "capability_disabled" && (body?.code === undefined || body.code === code) && (body?.error === undefined || body.error === code)) {
33
+ const rows = Array.isArray(body?.missing_sections) ? body.missing_sections : [];
34
+ const schedule = rows.some(row => { const item = asRecord(row); return item?.section === "search_schedule_items" || item?.required_capability === "read_workbench"; });
35
+ const expected = [{ section: "search_projects", required_capability: "read_projects", reason: "capability_disabled" }, { section: "search_knowledge", required_capability: "read_knowledge", reason: "capability_disabled" }, ...(schedule ? [{ section: "search_schedule_items", required_capability: "read_workbench", reason: "capability_disabled" }] : [])];
36
+ if (!Object.hasOwn(body, "required_capability") && expected.every(want => rows.some(row => { const item = asRecord(row); return item?.section === want.section && item.required_capability === want.required_capability && item.reason === want.reason; }))) {
37
+ throw new CliError("capability_disabled", schedule ? "“读取项目”、“读取知识”和“读取工作台”开关都未开启。" : "“读取项目”和“读取知识”开关都未开启。", "请本人到网页的 Agent 管理核对并开启所需开关;不要重新授权、换入口或重试来绕过限制。", 4, { http_status: 403, missing_sections: expected });
38
+ }
39
+ }
40
+ const checked = expectQueryOK(result);
41
+ const cleaned = safeSearchWarnings(checked.body);
42
+ return cleaned === checked.body ? checked : { ...checked, body: cleaned };
43
+ }
@@ -0,0 +1,45 @@
1
+ import { CliError, expectOK } from "./errors.js";
2
+ export const dateFlags = ["start-date", "end-date", "date-field"];
3
+ export function validDate(value) {
4
+ if (typeof value !== "string" || value.length !== 10 || !/^\d{4}-\d{2}-\d{2}$/.test(value))
5
+ return false;
6
+ const [year, month, day] = value.split("-").map(Number);
7
+ const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
8
+ const days = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
9
+ return year >= 1 && month >= 1 && month <= 12 && day >= 1 && day <= days[month - 1];
10
+ }
11
+ export function validateDateFlags(flags, createdOnly = false) {
12
+ if ((flags["start-date"] !== undefined && !validDate(flags["start-date"]))
13
+ || (flags["end-date"] !== undefined && !validDate(flags["end-date"]))) {
14
+ throw new CliError("invalid_arguments", "日期参数无效。", "--start-date 和 --end-date 请使用真实的 YYYY-MM-DD 日期(0001 至 9999 年);省略表示不设该侧边界,不可留空。按北京时间包含首尾两天。");
15
+ }
16
+ if (typeof flags["start-date"] === "string" && typeof flags["end-date"] === "string" && flags["start-date"] > flags["end-date"]) {
17
+ throw new CliError("invalid_arguments", "起止日期参数顺序无效。", "--start-date 不得晚于 --end-date;可以只提供一侧日期。");
18
+ }
19
+ const field = flags["date-field"];
20
+ if (field !== undefined && (createdOnly ? field !== "created_at" : field !== "created_at" && field !== "updated_at")) {
21
+ throw new CliError("invalid_arguments", "--date-field 参数无效。", createdOnly ? "项目进展和手写进展固定按 created_at 写入时间筛选;可省略 --date-field。" : "--date-field 请使用 created_at 或 updated_at;省略时按 updated_at 筛选,不可留空。");
22
+ }
23
+ }
24
+ export function isPagedQueryPath(path) {
25
+ return /^\/api\/v1\/agent\/(?:m1\/(?:projects(?:\/[^/]+\/updates)?|knowledge|checkins|search|activity\/daily)|pending-actions)$/.test(path);
26
+ }
27
+ export function isProjectIDParameterError(path, value) {
28
+ return /^\/api\/v1\/agent\/m1\/(?:projects\/[^/]+\/updates|knowledge)$/.test(path)
29
+ && (value === "invalid project_id" || value === "invalid project_id\n");
30
+ }
31
+ // Go http.Error has a narrow plain-text contract. Adopt exact known bodies only;
32
+ // JSON messages, suffixes, and other server text are never reflected to users.
33
+ export function isQueryParameterError(value) {
34
+ return typeof value === "string" && ["invalid limit", "invalid offset", "invalid start_date", "invalid end_date", "invalid date range", "invalid date_field"].some(message => value === message || value === `${message}\n`);
35
+ }
36
+ export function expectQueryOK(result, maxLimit = 50) {
37
+ if (result.status === 400 && isQueryParameterError(result.body)) {
38
+ const nextAction = result.body.startsWith("invalid limit")
39
+ ? maxLimit === 50 ? "--limit 必须是 1 至 50 的整数。" : "--limit 必须是 1 至 100 的整数。"
40
+ : result.body.startsWith("invalid offset") ? "--offset 必须是 0 至 9007199254740991 的整数。"
41
+ : "日期须为真实 YYYY-MM-DD,起始不得晚于结束且显式值不可为空;项目/知识可选 created_at 或 updated_at,进展固定 created_at。";
42
+ throw new CliError("invalid_arguments", "查询参数无效。", nextAction, 2, { http_status: 400 });
43
+ }
44
+ return expectOK(result, "read");
45
+ }
@@ -0,0 +1,356 @@
1
+ // Exact runtime bytes from reviewed CLI tgz 8ce64d4ae13656763b913da10637cd20da85b6763fb7a5c02757a1417b7f8d9b.
2
+ // One full-content baseline only; version/receipt/directory self-reports are not evidence.
3
+ export const REVIEWED_MANAGED_BUNDLE_1_1_0 = {
4
+ "version": "1.1.0",
5
+ "sha": "ed87c23c98d57cd990a5212a05788cc95136b6bc810e61f30c1fbac7026c212a",
6
+ "files": [
7
+ {
8
+ "path": "bin/caotang.cjs",
9
+ "mode": 448,
10
+ "bytes": 861,
11
+ "sha256": "b1047ea22a774718e377edcb4a18e3c16ce2b101ad40c5d39721894d652f37c5"
12
+ },
13
+ {
14
+ "path": "dist/agent-identity.js",
15
+ "mode": 384,
16
+ "bytes": 1417,
17
+ "sha256": "e217376060e8c5a46c6c58f596f198750c3154eca561be757fee7151e3e1c86c"
18
+ },
19
+ {
20
+ "path": "dist/auth.js",
21
+ "mode": 384,
22
+ "bytes": 20770,
23
+ "sha256": "5c0917ae4b212b47091ca205d40427f8dd580bd494ccc6b5c586177bbfded0e0"
24
+ },
25
+ {
26
+ "path": "dist/calendar-contract.js",
27
+ "mode": 384,
28
+ "bytes": 24328,
29
+ "sha256": "3124493cea046a0f0dc6841f52610cb4e1aae78f3375de7090e378010f953807"
30
+ },
31
+ {
32
+ "path": "dist/calendar-help.js",
33
+ "mode": 384,
34
+ "bytes": 4578,
35
+ "sha256": "224c5eeb5376358593e04501c4d92d39174a6ca23e1d4bc46729e8f84058c37a"
36
+ },
37
+ {
38
+ "path": "dist/calendar.js",
39
+ "mode": 384,
40
+ "bytes": 3748,
41
+ "sha256": "b10c9135617e9c9fe6530fef32c6679ff9e6c497967308a33ddd2013469e7a6f"
42
+ },
43
+ {
44
+ "path": "dist/capability-result.js",
45
+ "mode": 384,
46
+ "bytes": 3829,
47
+ "sha256": "09d398275dfeb82c18bcfa0b9abe6341607678e3248eb543d944fed390a0466d"
48
+ },
49
+ {
50
+ "path": "dist/cli.js",
51
+ "mode": 384,
52
+ "bytes": 22177,
53
+ "sha256": "71eff64b32306430fd9c35a2ecc633dda195eec7064c3b700822de3b76940af8"
54
+ },
55
+ {
56
+ "path": "dist/command-help.js",
57
+ "mode": 384,
58
+ "bytes": 14071,
59
+ "sha256": "556be79209c89eef690f18866cd27803aef671279b411f73383c115a82a41cc6"
60
+ },
61
+ {
62
+ "path": "dist/commands.js",
63
+ "mode": 384,
64
+ "bytes": 23262,
65
+ "sha256": "cfc95b14372a105c917b588e4574458196b58bf30967591361f8bdec0493b989"
66
+ },
67
+ {
68
+ "path": "dist/config.js",
69
+ "mode": 384,
70
+ "bytes": 1289,
71
+ "sha256": "7a99ac4696d06db5bcecef3a9c9e406ef079ace724101bf720bf916e319bef0a"
72
+ },
73
+ {
74
+ "path": "dist/connection-copy.js",
75
+ "mode": 384,
76
+ "bytes": 2284,
77
+ "sha256": "5617453b07fe39ebf1fa20a4a4f64729adbfb2f93a51f9754330b2be60bb6078"
78
+ },
79
+ {
80
+ "path": "dist/context.js",
81
+ "mode": 384,
82
+ "bytes": 1885,
83
+ "sha256": "6c92b7c7f7d11674bebb0f6f9981794ac64a8c94f45393a9a4e5b6e92bd87616"
84
+ },
85
+ {
86
+ "path": "dist/contracts.js",
87
+ "mode": 384,
88
+ "bytes": 11,
89
+ "sha256": "8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"
90
+ },
91
+ {
92
+ "path": "dist/create-bundle.js",
93
+ "mode": 384,
94
+ "bytes": 9646,
95
+ "sha256": "043713b3e9d435268634aab72dc6f8a15017b5be1ecf4760bde2d788f31e95f5"
96
+ },
97
+ {
98
+ "path": "dist/create-file-failure.js",
99
+ "mode": 384,
100
+ "bytes": 1555,
101
+ "sha256": "690a59a4fc47b624260d753bbf79b88ecb8a83d6ee846341e3c9133779dff045"
102
+ },
103
+ {
104
+ "path": "dist/credential-store.js",
105
+ "mode": 384,
106
+ "bytes": 27762,
107
+ "sha256": "2bf9b031eec6cf984af30822e5fa7b5e8f8888f58d09084e723feeaf49c291a2"
108
+ },
109
+ {
110
+ "path": "dist/doctor.js",
111
+ "mode": 384,
112
+ "bytes": 17642,
113
+ "sha256": "c0438daeab4483a483051f9bd94beb40d5cedd11f20155506f09bbb3d5ec00c2"
114
+ },
115
+ {
116
+ "path": "dist/errors.js",
117
+ "mode": 384,
118
+ "bytes": 17485,
119
+ "sha256": "0634831524769f8c348aea43f8b2b90f1e5eab74f66bdf3c0ef77057c8a3e9d7"
120
+ },
121
+ {
122
+ "path": "dist/generated/knowledge-growth.js",
123
+ "mode": 384,
124
+ "bytes": 1324,
125
+ "sha256": "3fefbb5bd04dfef4548b21bb91b739bbdcc4f565cfd34d8cf08bdcb598d069b9"
126
+ },
127
+ {
128
+ "path": "dist/habit-day.js",
129
+ "mode": 384,
130
+ "bytes": 2697,
131
+ "sha256": "23bbcd87ae6af1d874c57e5601b2ac6a6d27982f94a84490fdce0a5fb565b237"
132
+ },
133
+ {
134
+ "path": "dist/habit-read.js",
135
+ "mode": 384,
136
+ "bytes": 2134,
137
+ "sha256": "db69e3a7ba00887367d86e101dd451efe4b993138cee6704fb96031dcbcf965f"
138
+ },
139
+ {
140
+ "path": "dist/habit-wire.js",
141
+ "mode": 384,
142
+ "bytes": 7188,
143
+ "sha256": "ce414a79b8e444f97a641eb048e52397bf2d5b3e162121f2f349ebfeb0d0b8f7"
144
+ },
145
+ {
146
+ "path": "dist/http.js",
147
+ "mode": 384,
148
+ "bytes": 10029,
149
+ "sha256": "8bdb9bede2b928037e882a9b375d0a1959d53f599b969d83fa2081248e051f67"
150
+ },
151
+ {
152
+ "path": "dist/input-validation.js",
153
+ "mode": 384,
154
+ "bytes": 4135,
155
+ "sha256": "c5382d9287b1f330a5468d2c3abad33903bc560182f45d69f121a132ac15e28b"
156
+ },
157
+ {
158
+ "path": "dist/installation.js",
159
+ "mode": 384,
160
+ "bytes": 39276,
161
+ "sha256": "4e371462d83abc0e440906cdc802a3a3713e6f62cf59c3e2e0519492a5cd08db"
162
+ },
163
+ {
164
+ "path": "dist/knowledge-growth.js",
165
+ "mode": 384,
166
+ "bytes": 4257,
167
+ "sha256": "18187fb1100faf0d79e32fc1bf0455ad35d59ffe94d35040b9a765d89674c12b"
168
+ },
169
+ {
170
+ "path": "dist/local-commands.js",
171
+ "mode": 384,
172
+ "bytes": 17710,
173
+ "sha256": "0ddde63bb06d84acce0072be202384e550c070cfddb7befb7477eb3fd6ad1e36"
174
+ },
175
+ {
176
+ "path": "dist/local-lock.js",
177
+ "mode": 384,
178
+ "bytes": 9362,
179
+ "sha256": "3ee54676ebb20a177bb22726ff6d08d329a511b25500e59cd969e5a27c5e417a"
180
+ },
181
+ {
182
+ "path": "dist/local-records.js",
183
+ "mode": 384,
184
+ "bytes": 8122,
185
+ "sha256": "a2304b1ad0ddc3107265a61faf3935b3a3f14436be275906dd9a306338fa6b77"
186
+ },
187
+ {
188
+ "path": "dist/local-types.js",
189
+ "mode": 384,
190
+ "bytes": 358,
191
+ "sha256": "d43abb2a72ecb33f501e5c16bf624fd971f33f3541153937060f4320d54d956f"
192
+ },
193
+ {
194
+ "path": "dist/managed-skill-baseline.js",
195
+ "mode": 384,
196
+ "bytes": 2142,
197
+ "sha256": "63f869e057d2bc41405facc9a4883c136955255bef2abc2c443c85e204ed8d97"
198
+ },
199
+ {
200
+ "path": "dist/missing-sections.js",
201
+ "mode": 384,
202
+ "bytes": 4216,
203
+ "sha256": "9ce6d37478ebc813ce9d2ee1a8372bdc8170a7867274a7bf5f817052972b88b7"
204
+ },
205
+ {
206
+ "path": "dist/onboarding.js",
207
+ "mode": 384,
208
+ "bytes": 2768,
209
+ "sha256": "f48693b69edadba01dc34fd4949bcd617bc3130451c4ea6c158860bc85e2aaaf"
210
+ },
211
+ {
212
+ "path": "dist/output.js",
213
+ "mode": 384,
214
+ "bytes": 3970,
215
+ "sha256": "0f8cdd45522f2990d77d5078820d7a6897a4e4e1c969fc729480ce14017276fc"
216
+ },
217
+ {
218
+ "path": "dist/pending-requests.js",
219
+ "mode": 384,
220
+ "bytes": 3697,
221
+ "sha256": "29ba9aa0af625fde56dd7d3da708d2a283d2a0aef40118f1ce16304e9ee01195"
222
+ },
223
+ {
224
+ "path": "dist/platforms.js",
225
+ "mode": 384,
226
+ "bytes": 10224,
227
+ "sha256": "5660acdd8f1471c7ff2df19e02ce23ebfbb5124846b2e04882a1670158ad7392"
228
+ },
229
+ {
230
+ "path": "dist/query-daily.js",
231
+ "mode": 384,
232
+ "bytes": 6188,
233
+ "sha256": "5648b0322f72c8296df9d3beac7a788cd94f7af9c902c46539a9ae4f36834b67"
234
+ },
235
+ {
236
+ "path": "dist/query-search.js",
237
+ "mode": 384,
238
+ "bytes": 4015,
239
+ "sha256": "eeb4b76665489edd57e2ab757ce585cdf91941c08cbc088758ed88b35f130332"
240
+ },
241
+ {
242
+ "path": "dist/query-validation.js",
243
+ "mode": 384,
244
+ "bytes": 3439,
245
+ "sha256": "0aa2123725ca27720eb86cfbe59cb1f6771ee2db2991150eae783db9c4c9cd79"
246
+ },
247
+ {
248
+ "path": "dist/schedule-contract.js",
249
+ "mode": 384,
250
+ "bytes": 16879,
251
+ "sha256": "d5f5a43e4ac33274ddf275d00dd5b3696fe125c773e117979643830b5294da6e"
252
+ },
253
+ {
254
+ "path": "dist/schedule-help.js",
255
+ "mode": 384,
256
+ "bytes": 4821,
257
+ "sha256": "cc86c38e16e8660fca343dc95d2dfc9af525b41296c67db2ccd1b969f7da82f4"
258
+ },
259
+ {
260
+ "path": "dist/schedule-start-wire.js",
261
+ "mode": 384,
262
+ "bytes": 3634,
263
+ "sha256": "6b6b6843dd41053c3b334c0785100de90ef3f4e5af130fb839911897100161ce"
264
+ },
265
+ {
266
+ "path": "dist/schedule.js",
267
+ "mode": 384,
268
+ "bytes": 4030,
269
+ "sha256": "ee234a5744aa0cef9afcbd0b2ac9cb4336e7226069a148c39858fa439a25202e"
270
+ },
271
+ {
272
+ "path": "dist/skill-assets.js",
273
+ "mode": 384,
274
+ "bytes": 6960,
275
+ "sha256": "962171172db20f2ecc1cc0eaa9863e2f27e414b7cf1399fb224cade57b09613d"
276
+ },
277
+ {
278
+ "path": "dist/upload.js",
279
+ "mode": 384,
280
+ "bytes": 7625,
281
+ "sha256": "59c862ea1d31f90e48a746f8d26fb0903c8bedd3af0f0b4624c744280359afff"
282
+ },
283
+ {
284
+ "path": "dist/web-citations.js",
285
+ "mode": 384,
286
+ "bytes": 4509,
287
+ "sha256": "58cd8275f992f88a030f30239bb78eb301948e40e24d9c2c0e9b4fe27aa3d00a"
288
+ },
289
+ {
290
+ "path": "dist/write-permissions.js",
291
+ "mode": 384,
292
+ "bytes": 2497,
293
+ "sha256": "ecaf3009ee061d246d85aef69036815c5ae778617578be7e4f3513426045cc1b"
294
+ },
295
+ {
296
+ "path": "dist/write-routing.js",
297
+ "mode": 384,
298
+ "bytes": 2629,
299
+ "sha256": "4acff0b485ee0c8a394adf5142122f82ca14c6d03fdaf81fd7c46aa80fe8f39c"
300
+ },
301
+ {
302
+ "path": "package.json",
303
+ "mode": 384,
304
+ "bytes": 140,
305
+ "sha256": "ecddc8f82d17dec46897ed0d324b24f5465451dc413a90b1e0ba7a8b0e259889"
306
+ },
307
+ {
308
+ "path": "skills/caotang-context/SKILL.md",
309
+ "mode": 384,
310
+ "bytes": 7260,
311
+ "sha256": "0580c8513de3f91c9a12cf94290200e90d1a0ee5dc2610e0654ccc3146832732"
312
+ },
313
+ {
314
+ "path": "skills/caotang-first-connect/SKILL.md",
315
+ "mode": 384,
316
+ "bytes": 11277,
317
+ "sha256": "cbbe660f4a058214ff6fbc320f999f7342457384ba9a38ce493f1dbc8eda7692"
318
+ },
319
+ {
320
+ "path": "skills/caotang-project-progress/SKILL.md",
321
+ "mode": 384,
322
+ "bytes": 9829,
323
+ "sha256": "1a5a2c4849aca52237a1e18f6c70bbddd2a9815260c87ce6fb26872736120c94"
324
+ },
325
+ {
326
+ "path": "skills/caotang-save-knowledge/SKILL.md",
327
+ "mode": 384,
328
+ "bytes": 6779,
329
+ "sha256": "002dd420b32851b1b0a97175baaf270c44c327900c1f9ae40197673d415e10fa"
330
+ },
331
+ {
332
+ "path": "skills/caotang-schedule/SKILL.md",
333
+ "mode": 384,
334
+ "bytes": 5365,
335
+ "sha256": "e2f3689412b39cc1475ba56d6e6082380ed9bbc195f6fb44ed9b5e9992a787a4"
336
+ },
337
+ {
338
+ "path": "skills/caotang-search/SKILL.md",
339
+ "mode": 384,
340
+ "bytes": 9895,
341
+ "sha256": "d69f9e6dae707c163139ddb64eef787bd9ae1d3ca0328079353f206085edf0a2"
342
+ },
343
+ {
344
+ "path": "skills/caotang-workday/SKILL.md",
345
+ "mode": 384,
346
+ "bytes": 7233,
347
+ "sha256": "b20b3592e2d9d61d1d42638b51fdcd34bbe113b6655ec353e342e45aa7dd65cb"
348
+ },
349
+ {
350
+ "path": "skills/manifest.json",
351
+ "mode": 384,
352
+ "bytes": 1438,
353
+ "sha256": "9bdbf8e82510fd51036704e8de6830a4d53bc8a6d97aad3c3a20c883c50c9939"
354
+ }
355
+ ]
356
+ };