@kweaver-ai/kweaver-sdk 0.8.1 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +40 -52
  2. package/README.zh.md +41 -46
  3. package/dist/agent-providers/index.d.ts +7 -0
  4. package/dist/agent-providers/index.js +5 -0
  5. package/dist/agent-providers/prompt-template.d.ts +62 -0
  6. package/dist/agent-providers/prompt-template.js +105 -0
  7. package/dist/agent-providers/prompts/rubric-judge-v1.prompt.md +51 -0
  8. package/dist/agent-providers/prompts/within-trace-synthesizer-v1.prompt.md +60 -0
  9. package/dist/agent-providers/providers/claude-code-subprocess.d.ts +74 -0
  10. package/dist/agent-providers/providers/claude-code-subprocess.js +259 -0
  11. package/dist/agent-providers/providers/stub.d.ts +47 -0
  12. package/dist/agent-providers/providers/stub.js +77 -0
  13. package/dist/agent-providers/registry.d.ts +45 -0
  14. package/dist/agent-providers/registry.js +77 -0
  15. package/dist/agent-providers/types.d.ts +91 -0
  16. package/dist/agent-providers/types.js +25 -0
  17. package/dist/api/agent-chat.js +8 -6
  18. package/dist/api/context-loader.d.ts +1 -0
  19. package/dist/api/resources.d.ts +94 -0
  20. package/dist/api/resources.js +166 -0
  21. package/dist/api/semantic-search.d.ts +5 -0
  22. package/dist/api/semantic-search.js +5 -0
  23. package/dist/api/skills.d.ts +75 -2
  24. package/dist/api/skills.js +108 -12
  25. package/dist/api/trace.d.ts +5 -0
  26. package/dist/api/trace.js +4 -0
  27. package/dist/cli.js +109 -15
  28. package/dist/client.d.ts +3 -3
  29. package/dist/client.js +5 -5
  30. package/dist/commands/agent/mode.d.ts +6 -0
  31. package/dist/commands/agent/mode.js +75 -0
  32. package/dist/commands/agent-members.js +27 -11
  33. package/dist/commands/agent.js +469 -286
  34. package/dist/commands/auth.js +184 -71
  35. package/dist/commands/bkn-metric.js +37 -16
  36. package/dist/commands/bkn-ops.js +164 -86
  37. package/dist/commands/bkn-query.js +99 -31
  38. package/dist/commands/bkn-schema.d.ts +3 -3
  39. package/dist/commands/bkn-schema.js +127 -86
  40. package/dist/commands/bkn.js +153 -114
  41. package/dist/commands/call.js +23 -13
  42. package/dist/commands/config.js +22 -12
  43. package/dist/commands/context-loader.js +625 -49
  44. package/dist/commands/dataflow.js +14 -6
  45. package/dist/commands/ds.js +52 -30
  46. package/dist/commands/explore.js +18 -15
  47. package/dist/commands/model.js +53 -42
  48. package/dist/commands/resource.d.ts +1 -0
  49. package/dist/commands/{dataview.js → resource.js} +62 -84
  50. package/dist/commands/skill.d.ts +21 -1
  51. package/dist/commands/skill.js +567 -43
  52. package/dist/commands/token.js +11 -0
  53. package/dist/commands/tool.js +46 -29
  54. package/dist/commands/toolbox.js +31 -15
  55. package/dist/commands/trace.d.ts +26 -1
  56. package/dist/commands/trace.js +515 -15
  57. package/dist/commands/vega.js +466 -250
  58. package/dist/help/format.d.ts +65 -0
  59. package/dist/help/format.js +141 -0
  60. package/dist/index.d.ts +5 -5
  61. package/dist/index.js +3 -3
  62. package/dist/resources/bkn.d.ts +5 -0
  63. package/dist/resources/bkn.js +5 -0
  64. package/dist/resources/{dataviews.d.ts → resources.d.ts} +10 -11
  65. package/dist/resources/{dataviews.js → resources.js} +12 -13
  66. package/dist/resources/skills.d.ts +17 -1
  67. package/dist/resources/skills.js +32 -1
  68. package/dist/trace-ai/diagnose/agent-binding.d.ts +67 -0
  69. package/dist/trace-ai/diagnose/agent-binding.js +257 -0
  70. package/dist/trace-ai/diagnose/builtin-rules/tool-retry-intent-mismatch.yaml +68 -0
  71. package/dist/trace-ai/diagnose/index.d.ts +32 -0
  72. package/dist/trace-ai/diagnose/index.js +246 -0
  73. package/dist/trace-ai/diagnose/output-schema-converter.d.ts +24 -0
  74. package/dist/trace-ai/diagnose/output-schema-converter.js +81 -0
  75. package/dist/trace-ai/diagnose/query-extractor.d.ts +14 -0
  76. package/dist/trace-ai/diagnose/query-extractor.js +45 -0
  77. package/dist/trace-ai/diagnose/report-assembler.d.ts +31 -0
  78. package/dist/{trace-core → trace-ai}/diagnose/report-assembler.js +19 -9
  79. package/dist/trace-ai/diagnose/report-markdown.d.ts +18 -0
  80. package/dist/trace-ai/diagnose/report-markdown.js +192 -0
  81. package/dist/{trace-core → trace-ai}/diagnose/rule-loader.js +42 -8
  82. package/dist/{trace-core → trace-ai}/diagnose/schemas.d.ts +77 -2
  83. package/dist/trace-ai/diagnose/schemas.js +154 -0
  84. package/dist/trace-ai/diagnose/signal-probe.d.ts +17 -0
  85. package/dist/trace-ai/diagnose/signal-probe.js +39 -0
  86. package/dist/trace-ai/diagnose/synthesizer-agent.d.ts +40 -0
  87. package/dist/trace-ai/diagnose/synthesizer-agent.js +158 -0
  88. package/dist/{trace-core → trace-ai}/diagnose/trace-shaper.js +1 -0
  89. package/dist/{trace-core → trace-ai}/diagnose/types.d.ts +55 -6
  90. package/dist/trace-ai/eval-set/assertion-evaluator.d.ts +29 -0
  91. package/dist/trace-ai/eval-set/assertion-evaluator.js +100 -0
  92. package/dist/trace-ai/eval-set/builder.d.ts +36 -0
  93. package/dist/trace-ai/eval-set/builder.js +126 -0
  94. package/dist/trace-ai/eval-set/index.d.ts +15 -0
  95. package/dist/trace-ai/eval-set/index.js +10 -0
  96. package/dist/trace-ai/eval-set/output-writer.d.ts +27 -0
  97. package/dist/trace-ai/eval-set/output-writer.js +126 -0
  98. package/dist/trace-ai/eval-set/query-picker.d.ts +37 -0
  99. package/dist/trace-ai/eval-set/query-picker.js +147 -0
  100. package/dist/trace-ai/eval-set/redactor.d.ts +42 -0
  101. package/dist/trace-ai/eval-set/redactor.js +133 -0
  102. package/dist/trace-ai/eval-set/rubric-templates/answer-match-reference.prompt.md +19 -0
  103. package/dist/trace-ai/eval-set/schemas.d.ts +136 -0
  104. package/dist/trace-ai/eval-set/schemas.js +130 -0
  105. package/dist/trace-ai/eval-set/semantic-match-provider.d.ts +33 -0
  106. package/dist/trace-ai/eval-set/semantic-match-provider.js +51 -0
  107. package/dist/trace-ai/eval-set/test-runner.d.ts +34 -0
  108. package/dist/trace-ai/eval-set/test-runner.js +153 -0
  109. package/dist/trace-ai/eval-set/types.d.ts +46 -0
  110. package/dist/trace-ai/eval-set/types.js +8 -0
  111. package/dist/trace-ai/exp/bundle-writer.d.ts +10 -0
  112. package/dist/trace-ai/exp/bundle-writer.js +54 -0
  113. package/dist/trace-ai/exp/claude-binary.d.ts +5 -0
  114. package/dist/trace-ai/exp/claude-binary.js +30 -0
  115. package/dist/trace-ai/exp/coordinator.d.ts +45 -0
  116. package/dist/trace-ai/exp/coordinator.js +203 -0
  117. package/dist/trace-ai/exp/eval-runner.d.ts +14 -0
  118. package/dist/trace-ai/exp/eval-runner.js +47 -0
  119. package/dist/trace-ai/exp/exp-store/abort-signal.d.ts +3 -0
  120. package/dist/trace-ai/exp/exp-store/abort-signal.js +27 -0
  121. package/dist/trace-ai/exp/exp-store/candidate-lineage-yaml.d.ts +4 -0
  122. package/dist/trace-ai/exp/exp-store/candidate-lineage-yaml.js +37 -0
  123. package/dist/trace-ai/exp/exp-store/events-jsonl.d.ts +17 -0
  124. package/dist/trace-ai/exp/exp-store/events-jsonl.js +60 -0
  125. package/dist/trace-ai/exp/exp-store/exp-registry.d.ts +6 -0
  126. package/dist/trace-ai/exp/exp-store/exp-registry.js +41 -0
  127. package/dist/trace-ai/exp/exp-store/index.d.ts +46 -0
  128. package/dist/trace-ai/exp/exp-store/index.js +59 -0
  129. package/dist/trace-ai/exp/exp-store/lock.d.ts +3 -0
  130. package/dist/trace-ai/exp/exp-store/lock.js +73 -0
  131. package/dist/trace-ai/exp/exp-store/mission-md.d.ts +3 -0
  132. package/dist/trace-ai/exp/exp-store/mission-md.js +37 -0
  133. package/dist/trace-ai/exp/exp-store/readme-template.d.ts +5 -0
  134. package/dist/trace-ai/exp/exp-store/readme-template.js +25 -0
  135. package/dist/trace-ai/exp/exp-store/round-yaml.d.ts +3 -0
  136. package/dist/trace-ai/exp/exp-store/round-yaml.js +33 -0
  137. package/dist/trace-ai/exp/index.d.ts +8 -0
  138. package/dist/trace-ai/exp/index.js +238 -0
  139. package/dist/trace-ai/exp/info.d.ts +35 -0
  140. package/dist/trace-ai/exp/info.js +120 -0
  141. package/dist/trace-ai/exp/patch/agent-config.d.ts +1 -0
  142. package/dist/trace-ai/exp/patch/agent-config.js +26 -0
  143. package/dist/trace-ai/exp/patch/index.d.ts +2 -0
  144. package/dist/trace-ai/exp/patch/index.js +13 -0
  145. package/dist/trace-ai/exp/patch/skill.d.ts +1 -0
  146. package/dist/trace-ai/exp/patch/skill.js +24 -0
  147. package/dist/trace-ai/exp/providers/synthesizer-client.d.ts +14 -0
  148. package/dist/trace-ai/exp/providers/synthesizer-client.js +39 -0
  149. package/dist/trace-ai/exp/providers/triage-client.d.ts +19 -0
  150. package/dist/trace-ai/exp/providers/triage-client.js +51 -0
  151. package/dist/trace-ai/exp/schemas.d.ts +147 -0
  152. package/dist/trace-ai/exp/schemas.js +50 -0
  153. package/dist/trace-ai/exp/scoring.d.ts +2 -0
  154. package/dist/trace-ai/exp/scoring.js +46 -0
  155. package/dist/trace-ai/scan/aggregator.d.ts +20 -0
  156. package/dist/trace-ai/scan/aggregator.js +26 -0
  157. package/dist/trace-ai/scan/artifacts/paths.d.ts +12 -0
  158. package/dist/trace-ai/scan/artifacts/paths.js +18 -0
  159. package/dist/trace-ai/scan/artifacts/writer.d.ts +67 -0
  160. package/dist/trace-ai/scan/artifacts/writer.js +96 -0
  161. package/dist/trace-ai/scan/batched-rubric.d.ts +55 -0
  162. package/dist/trace-ai/scan/batched-rubric.js +159 -0
  163. package/dist/trace-ai/scan/cross-trace-synthesizer.d.ts +24 -0
  164. package/dist/trace-ai/scan/cross-trace-synthesizer.js +93 -0
  165. package/dist/trace-ai/scan/index.d.ts +31 -0
  166. package/dist/trace-ai/scan/index.js +390 -0
  167. package/dist/trace-ai/scan/prompts/builtin/cross-trace-synthesizer-v1.prompt.md +44 -0
  168. package/dist/trace-ai/scan/prompts/builtin/rubric-judge-batch-v1.prompt.md +44 -0
  169. package/dist/trace-ai/scan/runner.d.ts +25 -0
  170. package/dist/trace-ai/scan/runner.js +42 -0
  171. package/dist/trace-ai/scan/sampler.d.ts +18 -0
  172. package/dist/trace-ai/scan/sampler.js +81 -0
  173. package/dist/trace-ai/scan/scan-summary-markdown.d.ts +2 -0
  174. package/dist/trace-ai/scan/scan-summary-markdown.js +71 -0
  175. package/dist/trace-ai/scan/scan-summary-schema.d.ts +73 -0
  176. package/dist/trace-ai/scan/scan-summary-schema.js +61 -0
  177. package/dist/trace-ai/scan/single-agent-validator.d.ts +23 -0
  178. package/dist/trace-ai/scan/single-agent-validator.js +42 -0
  179. package/dist/trace-ai/scan/traces-list-parser.d.ts +15 -0
  180. package/dist/trace-ai/scan/traces-list-parser.js +46 -0
  181. package/package.json +2 -2
  182. package/dist/api/dataviews.d.ts +0 -117
  183. package/dist/api/dataviews.js +0 -265
  184. package/dist/commands/dataview.d.ts +0 -8
  185. package/dist/trace-core/diagnose/index.d.ts +0 -9
  186. package/dist/trace-core/diagnose/index.js +0 -104
  187. package/dist/trace-core/diagnose/report-assembler.d.ts +0 -12
  188. package/dist/trace-core/diagnose/schemas.js +0 -94
  189. package/dist/trace-core/diagnose/signal-probe.d.ts +0 -5
  190. package/dist/trace-core/diagnose/signal-probe.js +0 -21
  191. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/excessive-tool-calls-per-turn.d.ts +0 -0
  192. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/excessive-tool-calls-per-turn.js +0 -0
  193. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/excessive-tool-calls-per-turn.yaml +0 -0
  194. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/llm-response-truncated-no-continue.d.ts +0 -0
  195. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/llm-response-truncated-no-continue.js +0 -0
  196. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/llm-response-truncated-no-continue.yaml +0 -0
  197. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/register.d.ts +0 -0
  198. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/register.js +0 -0
  199. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/retrieval-empty-no-fallback.d.ts +0 -0
  200. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/retrieval-empty-no-fallback.js +0 -0
  201. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/retrieval-empty-no-fallback.yaml +0 -0
  202. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-error-swallowed.d.ts +0 -0
  203. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-error-swallowed.js +0 -0
  204. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-error-swallowed.yaml +0 -0
  205. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-loop-no-state-change.d.ts +0 -0
  206. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-loop-no-state-change.js +0 -0
  207. /package/dist/{trace-core → trace-ai}/diagnose/builtin-rules/tool-loop-no-state-change.yaml +0 -0
  208. /package/dist/{trace-core → trace-ai}/diagnose/predicate-registry.d.ts +0 -0
  209. /package/dist/{trace-core → trace-ai}/diagnose/predicate-registry.js +0 -0
  210. /package/dist/{trace-core → trace-ai}/diagnose/rule-loader.d.ts +0 -0
  211. /package/dist/{trace-core → trace-ai}/diagnose/synthesizer-template.d.ts +0 -0
  212. /package/dist/{trace-core → trace-ai}/diagnose/synthesizer-template.js +0 -0
  213. /package/dist/{trace-core → trace-ai}/diagnose/trace-shaper.d.ts +0 -0
  214. /package/dist/{trace-core → trace-ai}/diagnose/types.js +0 -0
@@ -2,81 +2,267 @@ import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
2
2
  import { basename, dirname, resolve } from "node:path";
3
3
  import { ensureValidToken, formatHttpError, with401RefreshRetry } from "../auth/oauth.js";
4
4
  import { resolveBusinessDomain } from "../config/store.js";
5
- import { deleteSkill, downloadSkill, fetchSkillContent, fetchSkillFile, getSkill, getSkillContentIndex, installSkillArchive, listSkillMarket, listSkills, readSkillFile, registerSkillZip, updateSkillStatus, } from "../api/skills.js";
5
+ import { deleteSkill, downloadSkill, downloadSkillManagementArchive, fetchSkillContent, fetchSkillFile, getSkill, getSkillMarketDetail, getSkillContentIndex, getSkillManagementContent, installSkillArchive, listSkillMarket, listSkillHistory, listSkills, publishSkillHistory, readSkillFile, readSkillManagementFile, republishSkillHistory, registerSkillZip, updateSkillMetadata, updateSkillPackageContent, updateSkillPackageZip, updateSkillStatus, } from "../api/skills.js";
6
6
  import { bundleSkillDirectoryToZip, bundleSkillFileToZip } from "../utils/skill-bundle.js";
7
+ import { renderHelp } from "../help/format.js";
8
+ const SKILL_HELP = renderHelp({
9
+ tagline: "Skill registry and market — register, market, content, lifecycle",
10
+ usage: "kweaver skill <subcommand> [flags]",
11
+ sections: [
12
+ {
13
+ title: "REGISTRY",
14
+ items: [
15
+ { name: "list", desc: "List skills (filter by --name / --status / --source / --create-user)" },
16
+ { name: "get", desc: "Get a skill by id" },
17
+ { name: "register", desc: "Register a skill (--content-file <SKILL.md|dir> | --zip-file <path>)" },
18
+ { name: "set-status", desc: "Change status: unpublish | published | offline" },
19
+ { name: "delete", desc: "Delete a skill" },
20
+ ],
21
+ },
22
+ {
23
+ title: "MARKET",
24
+ items: [
25
+ { name: "market", desc: "Browse the skill market" },
26
+ { name: "market-get", desc: "Get a market skill by id" },
27
+ { name: "download", desc: "Download a skill package archive" },
28
+ { name: "install", desc: "Install a skill locally" },
29
+ ],
30
+ },
31
+ {
32
+ title: "CONTENT",
33
+ items: [
34
+ { name: "content", desc: "Read SKILL.md content" },
35
+ { name: "read-file", desc: "Read a file inside a skill (progressive)" },
36
+ { name: "management-content", desc: "Read SKILL.md via management endpoint" },
37
+ { name: "management-read-file", desc: "Read file inside skill via management endpoint" },
38
+ { name: "management-download", desc: "Download via management endpoint" },
39
+ ],
40
+ },
41
+ {
42
+ title: "LIFECYCLE",
43
+ items: [
44
+ { name: "update-metadata", desc: "Update metadata (name / description / category / source)" },
45
+ { name: "update-package", desc: "Update package content or zip" },
46
+ { name: "history", desc: "Show version history" },
47
+ { name: "republish", desc: "Republish a specific historical version" },
48
+ { name: "publish-history", desc: "Publish a historical version" },
49
+ ],
50
+ },
51
+ ],
52
+ flags: [
53
+ { name: "-bd, --biz-domain <s>", desc: "Business domain (default: bd_public)" },
54
+ { name: "--pretty / --compact", desc: "JSON output style (default: pretty)" },
55
+ ],
56
+ inheritedFlags: "--base-url, --token, --user, --help",
57
+ examples: [
58
+ "kweaver skill list --name kweaver",
59
+ "kweaver skill register --zip-file ./demo-skill.zip --source upload_zip",
60
+ "kweaver skill install skill-123 ./skills/demo-skill --force",
61
+ ],
62
+ learnMore: ["Use `kweaver skill <subcommand> --help` for flag details"],
63
+ });
7
64
  function printSkillHelp(subcommand) {
8
65
  if (subcommand === "list") {
9
- console.log(`kweaver skill list [--name kw] [--source src] [--status status] [--create-user user]
10
- [--page N] [--page-size N|--limit N] [--all] [-bd value] [--pretty|--compact]`);
66
+ console.log(renderHelp({
67
+ tagline: "List installed skills.",
68
+ usage: "kweaver skill list [--name kw] [--source src] [--status status] [--create-user user] [--page N] [--page-size N|--limit N] [--all] [-bd value] [--pretty|--compact]",
69
+ flags: [
70
+ { name: "--name kw", desc: "Filter by name keyword." },
71
+ { name: "--source src", desc: "Filter by source." },
72
+ { name: "--status status", desc: "Filter by status." },
73
+ { name: "--create-user user", desc: "Filter by creator." },
74
+ { name: "--page N", desc: "Page number." },
75
+ { name: "--page-size N", desc: "Page size (alias: --limit)." },
76
+ { name: "--all", desc: "Fetch all pages." },
77
+ { name: "-bd value", desc: "Override base URL." },
78
+ { name: "--pretty|--compact", desc: "Toggle pretty JSON output." },
79
+ ],
80
+ inheritedFlags: "--base-url, --token, --user, --help",
81
+ }));
11
82
  return;
12
83
  }
13
84
  if (subcommand === "market") {
14
- console.log(`kweaver skill market [--name kw] [--source src] [--page N] [--page-size N|--limit N]
15
- [--all] [-bd value] [--pretty|--compact]`);
85
+ console.log(renderHelp({
86
+ tagline: "Browse the skill marketplace.",
87
+ usage: "kweaver skill market [--name kw] [--source src] [--page N] [--page-size N|--limit N] [--all] [-bd value] [--pretty|--compact]",
88
+ flags: [
89
+ { name: "--name kw", desc: "Filter by name keyword." },
90
+ { name: "--source src", desc: "Filter by source." },
91
+ { name: "--page N", desc: "Page number." },
92
+ { name: "--page-size N", desc: "Page size (alias: --limit)." },
93
+ { name: "--all", desc: "Fetch all pages." },
94
+ { name: "-bd value", desc: "Override base URL." },
95
+ { name: "--pretty|--compact", desc: "Toggle pretty JSON output." },
96
+ ],
97
+ inheritedFlags: "--base-url, --token, --user, --help",
98
+ }));
16
99
  return;
17
100
  }
18
101
  if (subcommand === "get") {
19
- console.log("kweaver skill get <skill-id> [-bd value] [--pretty|--compact]");
102
+ console.log(renderHelp({
103
+ tagline: "Show installed skill details.",
104
+ usage: "kweaver skill get <skill-id> [-bd value] [--pretty|--compact]",
105
+ inheritedFlags: "--base-url, --token, --user, --help",
106
+ }));
107
+ return;
108
+ }
109
+ if (subcommand === "market-get") {
110
+ console.log(renderHelp({
111
+ tagline: "Show marketplace skill details.",
112
+ usage: "kweaver skill market-get <skill-id> [-bd value] [--pretty|--compact]",
113
+ inheritedFlags: "--base-url, --token, --user, --help",
114
+ }));
20
115
  return;
21
116
  }
22
117
  if (subcommand === "register") {
23
- console.log(`kweaver skill register (--content-file <path> | --zip-file <path>)
24
- [--source src] [--extend-info json] [-bd value] [--pretty|--compact]
25
-
26
- --content-file accepts either:
27
- - a single file named SKILL.md (auto-bundled into a 1-file zip)
28
- - a skill directory containing SKILL.md (bundled into a zip)
29
- Both paths upload as multipart zip; the backend's file_type=content
30
- registration is unreliable (publish-then-read returns 404) so the CLI
31
- always goes through zip.
32
- --zip-file accepts a pre-built .zip with SKILL.md at the archive root.`);
118
+ console.log(renderHelp({
119
+ tagline: "Register a new skill (multipart zip upload).",
120
+ usage: "kweaver skill register (--content-file <path> | --zip-file <path>) [--source src] [--extend-info json] [-bd value] [--pretty|--compact]",
121
+ flags: [
122
+ { name: "--content-file <path>", desc: "SKILL.md file or skill directory containing SKILL.md (auto-bundled into a zip)." },
123
+ { name: "--zip-file <path>", desc: "Pre-built .zip with SKILL.md at the archive root." },
124
+ { name: "--source src", desc: "Source tag." },
125
+ { name: "--extend-info json", desc: "Extra metadata as JSON object." },
126
+ { name: "-bd value", desc: "Override base URL." },
127
+ { name: "--pretty|--compact", desc: "Toggle pretty JSON output." },
128
+ ],
129
+ inheritedFlags: "--base-url, --token, --user, --help",
130
+ learnMore: [
131
+ "Both --content-file and --zip-file upload as multipart zip; the backend's",
132
+ "file_type=content registration is unreliable (publish-then-read returns 404)",
133
+ "so the CLI always goes through zip.",
134
+ ],
135
+ }));
33
136
  return;
34
137
  }
35
138
  if (subcommand === "set-status" || subcommand === "status") {
36
- console.log("kweaver skill set-status <skill-id> <unpublish|published|offline> [-bd value] [--pretty|--compact]");
139
+ console.log(renderHelp({
140
+ tagline: "Set skill publish status.",
141
+ usage: "kweaver skill set-status <skill-id> <unpublish|published|offline> [-bd value] [--pretty|--compact]",
142
+ inheritedFlags: "--base-url, --token, --user, --help",
143
+ }));
37
144
  return;
38
145
  }
39
146
  if (subcommand === "delete") {
40
- console.log("kweaver skill delete <skill-id> [-y|--yes] [-bd value] [--pretty|--compact]");
147
+ console.log(renderHelp({
148
+ tagline: "Delete a skill.",
149
+ usage: "kweaver skill delete <skill-id> [-y|--yes] [-bd value] [--pretty|--compact]",
150
+ inheritedFlags: "--base-url, --token, --user, --help",
151
+ }));
152
+ return;
153
+ }
154
+ if (subcommand === "update-metadata") {
155
+ console.log(renderHelp({
156
+ tagline: "Update skill metadata fields.",
157
+ usage: "kweaver skill update-metadata <skill-id> --name <name> --description <text> --category <other_category|system> [--source <custom|internal>] [--extend-info json] [-bd value] [--pretty|--compact]",
158
+ flags: [
159
+ { name: "--name <name>", desc: "Skill name." },
160
+ { name: "--description <text>", desc: "Skill description." },
161
+ { name: "--category <other_category|system>", desc: "Skill category." },
162
+ { name: "--source <custom|internal>", desc: "Source tag." },
163
+ { name: "--extend-info json", desc: "Extra metadata as JSON object." },
164
+ { name: "-bd value", desc: "Override base URL." },
165
+ { name: "--pretty|--compact", desc: "Toggle pretty JSON output." },
166
+ ],
167
+ inheritedFlags: "--base-url, --token, --user, --help",
168
+ }));
169
+ return;
170
+ }
171
+ if (subcommand === "update-package") {
172
+ console.log(renderHelp({
173
+ tagline: "Replace skill package contents.",
174
+ usage: "kweaver skill update-package <skill-id> (--content-file <path> | --zip-file <path>) [-bd value] [--pretty|--compact]",
175
+ flags: [
176
+ { name: "--content-file <path>", desc: "SKILL.md file or skill directory (auto-bundled into a zip)." },
177
+ { name: "--zip-file <path>", desc: "Pre-built .zip with SKILL.md at the archive root." },
178
+ { name: "-bd value", desc: "Override base URL." },
179
+ { name: "--pretty|--compact", desc: "Toggle pretty JSON output." },
180
+ ],
181
+ inheritedFlags: "--base-url, --token, --user, --help",
182
+ }));
183
+ return;
184
+ }
185
+ if (subcommand === "history") {
186
+ console.log(renderHelp({
187
+ tagline: "Show skill edit history.",
188
+ usage: "kweaver skill history <skill-id> [-bd value] [--pretty|--compact]",
189
+ inheritedFlags: "--base-url, --token, --user, --help",
190
+ }));
191
+ return;
192
+ }
193
+ if (subcommand === "republish") {
194
+ console.log(renderHelp({
195
+ tagline: "Republish a previous skill version.",
196
+ usage: "kweaver skill republish <skill-id> --version <version> [-bd value] [--pretty|--compact]",
197
+ inheritedFlags: "--base-url, --token, --user, --help",
198
+ }));
199
+ return;
200
+ }
201
+ if (subcommand === "publish-history") {
202
+ console.log(renderHelp({
203
+ tagline: "Show publish history for a version.",
204
+ usage: "kweaver skill publish-history <skill-id> --version <version> [-bd value] [--pretty|--compact]",
205
+ inheritedFlags: "--base-url, --token, --user, --help",
206
+ }));
41
207
  return;
42
208
  }
43
209
  if (subcommand === "content") {
44
- console.log("kweaver skill content <skill-id> [--raw] [--output file] [-bd value] [--pretty|--compact]");
210
+ console.log(renderHelp({
211
+ tagline: "Fetch installed skill SKILL.md content.",
212
+ usage: "kweaver skill content <skill-id> [--raw] [--output file] [-bd value] [--pretty|--compact]",
213
+ inheritedFlags: "--base-url, --token, --user, --help",
214
+ }));
45
215
  return;
46
216
  }
47
217
  if (subcommand === "read-file") {
48
- console.log("kweaver skill read-file <skill-id> <rel-path> [--raw] [--output file] [-bd value] [--pretty|--compact]");
218
+ console.log(renderHelp({
219
+ tagline: "Read a file from an installed skill.",
220
+ usage: "kweaver skill read-file <skill-id> <rel-path> [--raw] [--output file] [-bd value] [--pretty|--compact]",
221
+ inheritedFlags: "--base-url, --token, --user, --help",
222
+ }));
49
223
  return;
50
224
  }
51
225
  if (subcommand === "download") {
52
- console.log("kweaver skill download <skill-id> [--output file] [-bd value] [--pretty|--compact]");
226
+ console.log(renderHelp({
227
+ tagline: "Download an installed skill package.",
228
+ usage: "kweaver skill download <skill-id> [--output file] [-bd value] [--pretty|--compact]",
229
+ inheritedFlags: "--base-url, --token, --user, --help",
230
+ }));
53
231
  return;
54
232
  }
55
233
  if (subcommand === "install") {
56
- console.log("kweaver skill install <skill-id> [directory] [--force] [-bd value] [--pretty|--compact]");
234
+ console.log(renderHelp({
235
+ tagline: "Install a skill locally.",
236
+ usage: "kweaver skill install <skill-id> [directory] [--force] [-bd value] [--pretty|--compact]",
237
+ inheritedFlags: "--base-url, --token, --user, --help",
238
+ }));
239
+ return;
240
+ }
241
+ if (subcommand === "management-content") {
242
+ console.log(renderHelp({
243
+ tagline: "Fetch management-side skill SKILL.md content.",
244
+ usage: "kweaver skill management-content <skill-id> [--raw] [--response-mode url|content] [--output file] [-bd value] [--pretty|--compact]",
245
+ inheritedFlags: "--base-url, --token, --user, --help",
246
+ }));
247
+ return;
248
+ }
249
+ if (subcommand === "management-read-file") {
250
+ console.log(renderHelp({
251
+ tagline: "Read a file via management API.",
252
+ usage: "kweaver skill management-read-file <skill-id> <rel-path> [--response-mode url|content] [--output file] [-bd value] [--pretty|--compact]",
253
+ inheritedFlags: "--base-url, --token, --user, --help",
254
+ }));
57
255
  return;
58
256
  }
59
- console.log(`kweaver skill
60
-
61
- Subcommands:
62
- list [--name kw] [--status status] [--page N] [--page-size N] [-bd value]
63
- market [--name kw] [--source src] [--page N] [--page-size N] [-bd value]
64
- get <skill-id> [-bd value]
65
- register --content-file <path> | --zip-file <path> [--source src] [--extend-info json]
66
- (--content-file accepts a file named SKILL.md or a directory; both auto-zip)
67
- set-status <skill-id> <unpublish|published|offline> [-bd value]
68
- delete <skill-id> [-y] [-bd value]
69
- content <skill-id> [--raw] [--output file] [-bd value]
70
- read-file <skill-id> <rel-path> [--raw] [--output file] [-bd value]
71
- download <skill-id> [--output file] [-bd value]
72
- install <skill-id> [directory] [--force] [-bd value]
73
-
74
- Examples:
75
- kweaver skill list --name kweaver
76
- kweaver skill register --zip-file ./demo-skill.zip --source upload_zip
77
- kweaver skill content skill-123 --raw
78
- kweaver skill read-file skill-123 references/guide.md --output ./guide.md
79
- kweaver skill install skill-123 ./skills/demo-skill --force`);
257
+ if (subcommand === "management-download") {
258
+ console.log(renderHelp({
259
+ tagline: "Download a skill via management API.",
260
+ usage: "kweaver skill management-download <skill-id> [--response-mode url|content] [--output file] [-bd value] [--pretty|--compact]",
261
+ inheritedFlags: "--base-url, --token, --user, --help",
262
+ }));
263
+ return;
264
+ }
265
+ console.log(SKILL_HELP);
80
266
  }
81
267
  function format(value, pretty) {
82
268
  return JSON.stringify(value, null, pretty ? 2 : 0);
@@ -276,6 +462,108 @@ function parseSkillGetArgs(args) {
276
462
  }
277
463
  return { ...base.opts, skillId };
278
464
  }
465
+ export function parseSkillUpdateMetadataArgs(args) {
466
+ const skillId = args[0];
467
+ if (!skillId || skillId.startsWith("-"))
468
+ throw new Error("Missing skill-id");
469
+ let name;
470
+ let description;
471
+ let category;
472
+ let source;
473
+ let extendInfo;
474
+ const base = parseBaseArgs(args, 1);
475
+ for (let i = 1; i < base.args.length; i += 1) {
476
+ const arg = base.args[i];
477
+ if (arg === "--help" || arg === "-h")
478
+ throw new Error("help");
479
+ if (arg === "--name") {
480
+ name = base.args[i + 1];
481
+ i += 1;
482
+ continue;
483
+ }
484
+ if (arg === "--description") {
485
+ description = base.args[i + 1];
486
+ i += 1;
487
+ continue;
488
+ }
489
+ if (arg === "--category") {
490
+ const value = base.args[i + 1];
491
+ if (value !== "other_category" && value !== "system") {
492
+ throw new Error("Invalid --category. Expected other_category|system");
493
+ }
494
+ category = value;
495
+ i += 1;
496
+ continue;
497
+ }
498
+ if (arg === "--source") {
499
+ source = base.args[i + 1];
500
+ i += 1;
501
+ continue;
502
+ }
503
+ if (arg === "--extend-info") {
504
+ extendInfo = parseJsonFlag(base.args[i + 1], "--extend-info");
505
+ i += 1;
506
+ continue;
507
+ }
508
+ throw new Error(`Unsupported skill update-metadata argument: ${arg}`);
509
+ }
510
+ if (!name)
511
+ throw new Error("Missing --name");
512
+ if (!description)
513
+ throw new Error("Missing --description");
514
+ if (!category)
515
+ throw new Error("Missing --category");
516
+ return { ...base.opts, skillId, name, description, category, source, extendInfo };
517
+ }
518
+ export function parseSkillUpdatePackageArgs(args) {
519
+ const skillId = args[0];
520
+ if (!skillId || skillId.startsWith("-"))
521
+ throw new Error("Missing skill-id");
522
+ let contentFile;
523
+ let zipFile;
524
+ const base = parseBaseArgs(args, 1);
525
+ for (let i = 1; i < base.args.length; i += 1) {
526
+ const arg = base.args[i];
527
+ if (arg === "--help" || arg === "-h")
528
+ throw new Error("help");
529
+ if (arg === "--content-file") {
530
+ contentFile = base.args[i + 1];
531
+ i += 1;
532
+ continue;
533
+ }
534
+ if (arg === "--zip-file") {
535
+ zipFile = base.args[i + 1];
536
+ i += 1;
537
+ continue;
538
+ }
539
+ throw new Error(`Unsupported skill update-package argument: ${arg}`);
540
+ }
541
+ if ((contentFile ? 1 : 0) + (zipFile ? 1 : 0) !== 1) {
542
+ throw new Error("Use exactly one of --content-file or --zip-file");
543
+ }
544
+ return { ...base.opts, skillId, contentFile, zipFile };
545
+ }
546
+ export function parseSkillHistoryVersionArgs(args, commandName) {
547
+ const skillId = args[0];
548
+ if (!skillId || skillId.startsWith("-"))
549
+ throw new Error("Missing skill-id");
550
+ let version;
551
+ const base = parseBaseArgs(args, 1);
552
+ for (let i = 1; i < base.args.length; i += 1) {
553
+ const arg = base.args[i];
554
+ if (arg === "--help" || arg === "-h")
555
+ throw new Error("help");
556
+ if (arg === "--version") {
557
+ version = base.args[i + 1];
558
+ i += 1;
559
+ continue;
560
+ }
561
+ throw new Error(`Unsupported skill ${commandName} argument: ${arg}`);
562
+ }
563
+ if (!version)
564
+ throw new Error("Missing --version");
565
+ return { ...base.opts, skillId, version };
566
+ }
279
567
  function parseSkillReadFileArgs(args) {
280
568
  const skillId = args[0];
281
569
  const relPath = args[1];
@@ -325,6 +613,101 @@ function parseSkillInstallArgs(args) {
325
613
  }
326
614
  return { ...base.opts, skillId, directory, force };
327
615
  }
616
+ function parseManagementContentArgs(args) {
617
+ const skillId = args[0];
618
+ if (!skillId || skillId.startsWith("-"))
619
+ throw new Error("Missing skill-id");
620
+ let responseMode;
621
+ let fetchRaw = false;
622
+ let output;
623
+ const base = parseBaseArgs(args, 1);
624
+ for (let i = 1; i < base.args.length; i += 1) {
625
+ const arg = base.args[i];
626
+ if (arg === "--help" || arg === "-h")
627
+ throw new Error("help");
628
+ if (arg === "--raw") {
629
+ fetchRaw = true;
630
+ continue;
631
+ }
632
+ if (arg === "--response-mode") {
633
+ const value = base.args[i + 1];
634
+ if (value !== "url" && value !== "content") {
635
+ throw new Error("Invalid --response-mode. Expected url|content");
636
+ }
637
+ responseMode = value;
638
+ i += 1;
639
+ continue;
640
+ }
641
+ if (arg === "--output" || arg === "-o") {
642
+ output = base.args[i + 1];
643
+ i += 1;
644
+ continue;
645
+ }
646
+ throw new Error(`Unsupported skill management-content argument: ${arg}`);
647
+ }
648
+ return { ...base.opts, skillId, responseMode, fetchRaw, output };
649
+ }
650
+ function parseManagementReadFileArgs(args) {
651
+ const skillId = args[0];
652
+ const relPath = args[1];
653
+ if (!skillId || skillId.startsWith("-"))
654
+ throw new Error("Missing skill-id");
655
+ if (!relPath || relPath.startsWith("-"))
656
+ throw new Error("Missing rel-path");
657
+ let responseMode;
658
+ let output;
659
+ const base = parseBaseArgs(args, 2);
660
+ for (let i = 2; i < base.args.length; i += 1) {
661
+ const arg = base.args[i];
662
+ if (arg === "--help" || arg === "-h")
663
+ throw new Error("help");
664
+ if (arg === "--response-mode") {
665
+ const value = base.args[i + 1];
666
+ if (value !== "url" && value !== "content") {
667
+ throw new Error("Invalid --response-mode. Expected url|content");
668
+ }
669
+ responseMode = value;
670
+ i += 1;
671
+ continue;
672
+ }
673
+ if (arg === "--output" || arg === "-o") {
674
+ output = base.args[i + 1];
675
+ i += 1;
676
+ continue;
677
+ }
678
+ throw new Error(`Unsupported skill management-read-file argument: ${arg}`);
679
+ }
680
+ return { ...base.opts, skillId, relPath, responseMode, output };
681
+ }
682
+ function parseManagementDownloadArgs(args) {
683
+ const skillId = args[0];
684
+ if (!skillId || skillId.startsWith("-"))
685
+ throw new Error("Missing skill-id");
686
+ let responseMode;
687
+ let output;
688
+ const base = parseBaseArgs(args, 1);
689
+ for (let i = 1; i < base.args.length; i += 1) {
690
+ const arg = base.args[i];
691
+ if (arg === "--help" || arg === "-h")
692
+ throw new Error("help");
693
+ if (arg === "--response-mode") {
694
+ const value = base.args[i + 1];
695
+ if (value !== "url" && value !== "content") {
696
+ throw new Error("Invalid --response-mode. Expected url|content");
697
+ }
698
+ responseMode = value;
699
+ i += 1;
700
+ continue;
701
+ }
702
+ if (arg === "--output" || arg === "-o") {
703
+ output = base.args[i + 1];
704
+ i += 1;
705
+ continue;
706
+ }
707
+ throw new Error(`Unsupported skill management-download argument: ${arg}`);
708
+ }
709
+ return { ...base.opts, skillId, responseMode, output };
710
+ }
328
711
  function parseStatusArgs(args) {
329
712
  const skillId = args[0];
330
713
  const status = args[1];
@@ -401,6 +784,16 @@ export async function runSkillCommand(args) {
401
784
  console.log(format(result, opts.pretty));
402
785
  return 0;
403
786
  }
787
+ if (subcommand === "market-get") {
788
+ const opts = parseSkillGetArgs(rest);
789
+ const result = await getSkillMarketDetail({
790
+ ...token,
791
+ businessDomain: opts.businessDomain,
792
+ skillId: opts.skillId,
793
+ });
794
+ console.log(format(result, opts.pretty));
795
+ return 0;
796
+ }
404
797
  if (subcommand === "register") {
405
798
  const opts = parseSkillRegisterArgs(rest);
406
799
  if (opts.contentFile) {
@@ -463,6 +856,79 @@ export async function runSkillCommand(args) {
463
856
  console.log(format(result, opts.pretty));
464
857
  return 0;
465
858
  }
859
+ if (subcommand === "update-metadata") {
860
+ const opts = parseSkillUpdateMetadataArgs(rest);
861
+ const result = await updateSkillMetadata({
862
+ ...token,
863
+ businessDomain: opts.businessDomain,
864
+ skillId: opts.skillId,
865
+ name: opts.name,
866
+ description: opts.description,
867
+ category: opts.category,
868
+ source: opts.source,
869
+ extendInfo: opts.extendInfo,
870
+ });
871
+ console.log(format(result, opts.pretty));
872
+ return 0;
873
+ }
874
+ if (subcommand === "update-package") {
875
+ const opts = parseSkillUpdatePackageArgs(rest);
876
+ if (opts.contentFile) {
877
+ const content = readFileSync(resolve(opts.contentFile), "utf8");
878
+ const result = await updateSkillPackageContent({
879
+ ...token,
880
+ businessDomain: opts.businessDomain,
881
+ skillId: opts.skillId,
882
+ content,
883
+ });
884
+ console.log(format(result, opts.pretty));
885
+ return 0;
886
+ }
887
+ if (opts.zipFile) {
888
+ const bytes = new Uint8Array(readFileSync(resolve(opts.zipFile)));
889
+ const result = await updateSkillPackageZip({
890
+ ...token,
891
+ businessDomain: opts.businessDomain,
892
+ skillId: opts.skillId,
893
+ filename: basename(resolve(opts.zipFile)),
894
+ bytes,
895
+ });
896
+ console.log(format(result, opts.pretty));
897
+ return 0;
898
+ }
899
+ }
900
+ if (subcommand === "history") {
901
+ const opts = parseSkillGetArgs(rest);
902
+ const result = await listSkillHistory({
903
+ ...token,
904
+ businessDomain: opts.businessDomain,
905
+ skillId: opts.skillId,
906
+ });
907
+ console.log(format(result, opts.pretty));
908
+ return 0;
909
+ }
910
+ if (subcommand === "republish") {
911
+ const opts = parseSkillHistoryVersionArgs(rest, "republish");
912
+ const result = await republishSkillHistory({
913
+ ...token,
914
+ businessDomain: opts.businessDomain,
915
+ skillId: opts.skillId,
916
+ version: opts.version,
917
+ });
918
+ console.log(format(result, opts.pretty));
919
+ return 0;
920
+ }
921
+ if (subcommand === "publish-history") {
922
+ const opts = parseSkillHistoryVersionArgs(rest, "publish-history");
923
+ const result = await publishSkillHistory({
924
+ ...token,
925
+ businessDomain: opts.businessDomain,
926
+ skillId: opts.skillId,
927
+ version: opts.version,
928
+ });
929
+ console.log(format(result, opts.pretty));
930
+ return 0;
931
+ }
466
932
  if (subcommand === "content") {
467
933
  const opts = parseSkillContentArgs(rest);
468
934
  if (opts.fetchRaw || opts.output) {
@@ -533,6 +999,64 @@ export async function runSkillCommand(args) {
533
999
  console.log(`Installed ${opts.skillId} to ${result.directory}`);
534
1000
  return 0;
535
1001
  }
1002
+ if (subcommand === "management-content") {
1003
+ const opts = parseManagementContentArgs(rest);
1004
+ if (opts.fetchRaw || opts.responseMode === "content" || opts.output) {
1005
+ const result = await getSkillManagementContent({
1006
+ ...token,
1007
+ businessDomain: opts.businessDomain,
1008
+ skillId: opts.skillId,
1009
+ responseMode: opts.responseMode,
1010
+ });
1011
+ if (opts.output && result.content) {
1012
+ ensureDirectoryForFile(resolve(opts.output));
1013
+ writeFileSync(resolve(opts.output), result.content, "utf8");
1014
+ console.log(`Saved ${opts.skillId} management content to ${resolve(opts.output)}`);
1015
+ }
1016
+ else if (opts.fetchRaw && result.content) {
1017
+ process.stdout.write(result.content);
1018
+ if (!result.content.endsWith("\n"))
1019
+ process.stdout.write("\n");
1020
+ }
1021
+ else {
1022
+ console.log(format(result, opts.pretty));
1023
+ }
1024
+ return 0;
1025
+ }
1026
+ const result = await getSkillManagementContent({
1027
+ ...token,
1028
+ businessDomain: opts.businessDomain,
1029
+ skillId: opts.skillId,
1030
+ responseMode: opts.responseMode,
1031
+ });
1032
+ console.log(format(result, opts.pretty));
1033
+ return 0;
1034
+ }
1035
+ if (subcommand === "management-read-file") {
1036
+ const opts = parseManagementReadFileArgs(rest);
1037
+ const result = await readSkillManagementFile({
1038
+ ...token,
1039
+ businessDomain: opts.businessDomain,
1040
+ skillId: opts.skillId,
1041
+ relPath: opts.relPath,
1042
+ });
1043
+ console.log(format(result, opts.pretty));
1044
+ return 0;
1045
+ }
1046
+ if (subcommand === "management-download") {
1047
+ const opts = parseManagementDownloadArgs(rest);
1048
+ const result = await downloadSkillManagementArchive({
1049
+ ...token,
1050
+ businessDomain: opts.businessDomain,
1051
+ skillId: opts.skillId,
1052
+ responseMode: opts.responseMode,
1053
+ });
1054
+ const output = resolve(opts.output ?? result.fileName);
1055
+ ensureDirectoryForFile(output);
1056
+ writeFileSync(output, result.bytes);
1057
+ console.log(`Saved ${opts.skillId} management archive to ${output}`);
1058
+ return 0;
1059
+ }
536
1060
  console.error(`Unknown skill subcommand: ${subcommand}`);
537
1061
  return 1;
538
1062
  });