@shield-agent/kya 0.34.0 → 0.35.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 (181) hide show
  1. package/.cursor-plugin/plugin.json +2 -2
  2. package/.mcp.json +1 -1
  3. package/LIMITATIONS.md +2 -1
  4. package/README.md +37 -655
  5. package/amp/settings.example.json +1 -1
  6. package/assets/report-blocked.png +0 -0
  7. package/assets/report-certify.png +0 -0
  8. package/assets/report-overview.png +0 -0
  9. package/assets/screenshot-features.json +1 -0
  10. package/claude/claude_desktop_config.example.json +1 -1
  11. package/cline/cline_mcp_settings.example.json +1 -1
  12. package/copilot/mcp-config.example.json +1 -1
  13. package/dist/alerts/triage-setup.d.ts +4 -0
  14. package/dist/alerts/triage-setup.d.ts.map +1 -1
  15. package/dist/alerts/triage-setup.js +11 -1
  16. package/dist/alerts/triage-setup.js.map +1 -1
  17. package/dist/card-png.d.ts +3 -0
  18. package/dist/card-png.d.ts.map +1 -0
  19. package/dist/card-png.js +54 -0
  20. package/dist/card-png.js.map +1 -0
  21. package/dist/card.d.ts +62 -0
  22. package/dist/card.d.ts.map +1 -0
  23. package/dist/card.js +154 -0
  24. package/dist/card.js.map +1 -0
  25. package/dist/certify/evaluate.d.ts +11 -1
  26. package/dist/certify/evaluate.d.ts.map +1 -1
  27. package/dist/certify/evaluate.js +8 -1
  28. package/dist/certify/evaluate.js.map +1 -1
  29. package/dist/certify/render.d.ts.map +1 -1
  30. package/dist/certify/render.js +10 -1
  31. package/dist/certify/render.js.map +1 -1
  32. package/dist/cli.d.ts +2 -0
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +223 -52
  35. package/dist/cli.js.map +1 -1
  36. package/dist/commands/connect.d.ts.map +1 -1
  37. package/dist/commands/connect.js +4 -3
  38. package/dist/commands/connect.js.map +1 -1
  39. package/dist/commands/doctor.d.ts.map +1 -1
  40. package/dist/commands/doctor.js +12 -1
  41. package/dist/commands/doctor.js.map +1 -1
  42. package/dist/commands/hook.d.ts.map +1 -1
  43. package/dist/commands/hook.js +94 -8
  44. package/dist/commands/hook.js.map +1 -1
  45. package/dist/commands/init.d.ts +2 -0
  46. package/dist/commands/init.d.ts.map +1 -1
  47. package/dist/commands/init.js +2 -0
  48. package/dist/commands/init.js.map +1 -1
  49. package/dist/commands/receipt.d.ts +19 -0
  50. package/dist/commands/receipt.d.ts.map +1 -1
  51. package/dist/commands/receipt.js +21 -1
  52. package/dist/commands/receipt.js.map +1 -1
  53. package/dist/commands/serve-mcp.d.ts +2 -0
  54. package/dist/commands/serve-mcp.d.ts.map +1 -1
  55. package/dist/commands/serve-mcp.js +2 -0
  56. package/dist/commands/serve-mcp.js.map +1 -1
  57. package/dist/commands/start.d.ts +50 -2
  58. package/dist/commands/start.d.ts.map +1 -1
  59. package/dist/commands/start.js +233 -27
  60. package/dist/commands/start.js.map +1 -1
  61. package/dist/commands/team.d.ts +19 -2
  62. package/dist/commands/team.d.ts.map +1 -1
  63. package/dist/commands/team.js +93 -13
  64. package/dist/commands/team.js.map +1 -1
  65. package/dist/commands/uninstall.d.ts +20 -0
  66. package/dist/commands/uninstall.d.ts.map +1 -0
  67. package/dist/commands/uninstall.js +378 -0
  68. package/dist/commands/uninstall.js.map +1 -0
  69. package/dist/commands/wire-hooks.d.ts +16 -2
  70. package/dist/commands/wire-hooks.d.ts.map +1 -1
  71. package/dist/commands/wire-hooks.js +86 -21
  72. package/dist/commands/wire-hooks.js.map +1 -1
  73. package/dist/cta.d.ts +3 -1
  74. package/dist/cta.d.ts.map +1 -1
  75. package/dist/cta.js +11 -6
  76. package/dist/cta.js.map +1 -1
  77. package/dist/fs-atomic.d.ts.map +1 -1
  78. package/dist/fs-atomic.js +9 -2
  79. package/dist/fs-atomic.js.map +1 -1
  80. package/dist/guard-demo.d.ts +23 -0
  81. package/dist/guard-demo.d.ts.map +1 -0
  82. package/dist/guard-demo.js +34 -0
  83. package/dist/guard-demo.js.map +1 -0
  84. package/dist/guard-entry.d.ts +2 -0
  85. package/dist/guard-entry.d.ts.map +1 -0
  86. package/dist/guard-entry.js +50 -0
  87. package/dist/guard-entry.js.map +1 -0
  88. package/dist/guard-lite.d.ts +27 -0
  89. package/dist/guard-lite.d.ts.map +1 -0
  90. package/dist/guard-lite.js +274 -0
  91. package/dist/guard-lite.js.map +1 -0
  92. package/dist/guard-pack.d.ts +7 -2
  93. package/dist/guard-pack.d.ts.map +1 -1
  94. package/dist/guard-pack.js +202 -4
  95. package/dist/guard-pack.js.map +1 -1
  96. package/dist/hook-health.d.ts +7 -0
  97. package/dist/hook-health.d.ts.map +1 -0
  98. package/dist/hook-health.js +105 -0
  99. package/dist/hook-health.js.map +1 -0
  100. package/dist/manifest.d.ts +106 -0
  101. package/dist/manifest.d.ts.map +1 -0
  102. package/dist/manifest.js +454 -0
  103. package/dist/manifest.js.map +1 -0
  104. package/dist/mcp/http.d.ts +1 -0
  105. package/dist/mcp/http.d.ts.map +1 -1
  106. package/dist/mcp/http.js +1 -0
  107. package/dist/mcp/http.js.map +1 -1
  108. package/dist/mcp/protocol.d.ts +2 -0
  109. package/dist/mcp/protocol.d.ts.map +1 -1
  110. package/dist/mcp/protocol.js +5 -1
  111. package/dist/mcp/protocol.js.map +1 -1
  112. package/dist/mcp/stdio.d.ts +1 -0
  113. package/dist/mcp/stdio.d.ts.map +1 -1
  114. package/dist/mcp/stdio.js +1 -0
  115. package/dist/mcp/stdio.js.map +1 -1
  116. package/dist/never-list-input.d.ts +2 -0
  117. package/dist/never-list-input.d.ts.map +1 -1
  118. package/dist/never-list-input.js +30 -30
  119. package/dist/never-list-input.js.map +1 -1
  120. package/dist/offline-evaluate.d.ts.map +1 -1
  121. package/dist/offline-evaluate.js +2 -1
  122. package/dist/offline-evaluate.js.map +1 -1
  123. package/dist/parse-args.js +1 -1
  124. package/dist/parse-args.js.map +1 -1
  125. package/dist/receipt/changes.d.ts +2 -1
  126. package/dist/receipt/changes.d.ts.map +1 -1
  127. package/dist/receipt/changes.js +9 -0
  128. package/dist/receipt/changes.js.map +1 -1
  129. package/dist/receipt/dashboard.d.ts +14 -1
  130. package/dist/receipt/dashboard.d.ts.map +1 -1
  131. package/dist/receipt/dashboard.js +20 -2
  132. package/dist/receipt/dashboard.js.map +1 -1
  133. package/dist/receipt/live-server.d.ts +15 -0
  134. package/dist/receipt/live-server.d.ts.map +1 -1
  135. package/dist/receipt/live-server.js +71 -0
  136. package/dist/receipt/live-server.js.map +1 -1
  137. package/dist/receipt/receipt-css.d.ts.map +1 -1
  138. package/dist/receipt/receipt-css.js +45 -0
  139. package/dist/receipt/receipt-css.js.map +1 -1
  140. package/dist/receipt/render-receipt.d.ts +14 -0
  141. package/dist/receipt/render-receipt.d.ts.map +1 -1
  142. package/dist/receipt/render-receipt.js +451 -79
  143. package/dist/receipt/render-receipt.js.map +1 -1
  144. package/dist/receipt/search.d.ts.map +1 -1
  145. package/dist/receipt/search.js +2 -0
  146. package/dist/receipt/search.js.map +1 -1
  147. package/dist/receipt/semantic-setup.d.ts +4 -0
  148. package/dist/receipt/semantic-setup.d.ts.map +1 -1
  149. package/dist/receipt/semantic-setup.js +10 -1
  150. package/dist/receipt/semantic-setup.js.map +1 -1
  151. package/dist/receipt/share.d.ts +15 -0
  152. package/dist/receipt/share.d.ts.map +1 -1
  153. package/dist/receipt/share.js +34 -1
  154. package/dist/receipt/share.js.map +1 -1
  155. package/dist/telemetry.d.ts +17 -2
  156. package/dist/telemetry.d.ts.map +1 -1
  157. package/dist/telemetry.js +67 -7
  158. package/dist/telemetry.js.map +1 -1
  159. package/dist/trail.d.ts +39 -0
  160. package/dist/trail.d.ts.map +1 -1
  161. package/dist/trail.js +27 -0
  162. package/dist/trail.js.map +1 -1
  163. package/dist/write-journal.d.ts +39 -0
  164. package/dist/write-journal.d.ts.map +1 -0
  165. package/dist/write-journal.js +107 -0
  166. package/dist/write-journal.js.map +1 -0
  167. package/droid/README.md +1 -1
  168. package/droid/mcp.example.json +1 -1
  169. package/gemini/settings.example.json +1 -1
  170. package/grok/README.md +1 -1
  171. package/kilo/kilo.example.json +1 -1
  172. package/kimi/mcp.example.json +1 -1
  173. package/kiro/mcp.example.json +1 -1
  174. package/manifest.json +2 -2
  175. package/mastracode/mcp.example.json +1 -1
  176. package/mcp.json +1 -1
  177. package/openai/codex.config.example.toml +1 -1
  178. package/opencode/opencode.example.json +1 -1
  179. package/package.json +9 -3
  180. package/qwen/settings.example.json +1 -1
  181. package/server.json +3 -3
@@ -29,6 +29,15 @@ function mdText(s) {
29
29
  .replace(/\|/g, "\\|")
30
30
  .replace(/([[\]<>])/g, "\\$1");
31
31
  }
32
+ /** Counts by outcome when the trail records them (a call that ran is not a review), else by verdict as before. */
33
+ function trailMix(t) {
34
+ if (t.outcomes) {
35
+ const o = t.outcomes;
36
+ const earlier = t.eventCount - (o.ran + o.blocked + o.held + o.error);
37
+ return `ran ${o.ran} · blocked ${o.blocked} · held ${o.held}${o.error > 0 ? ` · error ${o.error}` : ""}${earlier > 0 ? ` · ${earlier} earlier with no outcome` : ""}`;
38
+ }
39
+ return `allow ${t.verdictMix.ALLOW} · deny ${t.verdictMix.DENY} · review ${t.verdictMix.REQUIRE_APPROVE}`;
40
+ }
32
41
  export function formatCertifyMarkdown(report) {
33
42
  const o = report.overall;
34
43
  const lines = [
@@ -37,7 +46,7 @@ export function formatCertifyMarkdown(report) {
37
46
  `- **Result:** ${o.result === "gap" ? "GAP" : "PASS"}`,
38
47
  `- **Generated:** ${mdText(report.generatedAt)}`,
39
48
  `- **Window:** last ${report.window.days} days (${mdText(report.window.since)} → ${mdText(report.window.until)})`,
40
- `- **Trail:** ${report.trail.eventCount} events in window - allow ${report.trail.verdictMix.ALLOW} · deny ${report.trail.verdictMix.DENY} · review ${report.trail.verdictMix.REQUIRE_APPROVE}`,
49
+ `- **Trail:** ${report.trail.eventCount} events in window - ${trailMix(report.trail)}`,
41
50
  `- **Tally:** ${o.pass} pass · ${o.gap} gap · ${o.insufficientEvidence} insufficient evidence · ${o.attested} attested`,
42
51
  "",
43
52
  "## Gaps (work plan)",
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/certify/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/certify/render.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -7,6 +7,8 @@
7
7
  * Fail-closed: empty KYA_API_KEY against auth plane → non-zero exit.
8
8
  * Offline sample: eval-tool --offline (demo only; not production PEP).
9
9
  */
10
+ /** The Commands entries whose first word is `name` (`orr` finds "orr run"), cut from the full help text. */
11
+ export declare function helpSection(full: string, name: string): string | undefined;
10
12
  export interface CliIo {
11
13
  readonly log: (msg: string) => void;
12
14
  readonly error: (msg: string) => void;
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAoLH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,qGAAqG;IACrG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AAcD,sFAAsF;AACtF,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,+FAA+F;AAC/F,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAAiB,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAm8BjB"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AA0NH,4GAA4G;AAC5G,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS1E;AAqBD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,qGAAqG;IACrG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AAcD,sFAAsF;AACtF,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,+FAA+F;AAC/F,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAAiB,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAmiCjB"}
package/dist/cli.js CHANGED
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { realpathSync, writeSync } from "node:fs";
11
11
  import { fileURLToPath } from "node:url";
12
- import { resolveConfig } from "./config.js";
12
+ import { globalConfigDir, resolveConfig } from "./config.js";
13
13
  import { AuthRequiredError, KyaError } from "./errors.js";
14
14
  import { flagBool, flagString, parseArgs } from "./parse-args.js";
15
15
  import { ensureSupportedNode } from "./node-upgrade.js";
@@ -21,11 +21,19 @@ Usage:
21
21
  kya <command> [options]
22
22
 
23
23
  Commands:
24
+ Guard:
24
25
  version Print the package version (same as --version)
25
- start ONE LINER: init + wire local MCP + open live report
26
- (report runs in the background - returns your terminal)
27
- Auto-bootstraps the gateway for third-party MCP servers
28
- found in host configs (--no-gate or KYA_GATE=off skips)
26
+ start ONE LINER: wire local MCP + open live report. Prints a plan first
27
+ (each file, created or merged, exact keys) and asks "Apply? [Y/n]".
28
+ --yes or KYA_YES=1 skips the question; off a terminal or in CI it
29
+ applies only with --yes. --dry-run prints the plan, writes nothing.
30
+ Wires only hosts found on this machine. Report runs in the
31
+ background - returns your terminal. Auto-bootstraps the gateway for
32
+ third-party MCP servers found in host configs (--no-gate or
33
+ KYA_GATE=off skips)
34
+ uninstall Undo kya start / kya connect from ~/.kya/manifest.json: removes only
35
+ the keys KYA added, deletes files KYA created if unchanged, prints
36
+ what it left alone (--project: this directory only, --dry-run)
29
37
  stop Stop the background report server started by kya start
30
38
  (--all also stops orphaned report daemons from other
31
39
  directories or older installs)
@@ -37,21 +45,8 @@ Commands:
37
45
  gate Local MCP gateway: govern + audit tool calls to any MCP server
38
46
  (init | setup | doctor | status | run | stop)
39
47
  init Scaffold .kya/ config + sample tools + .env.example
40
- team init Enable the Claude Code plugin for everyone who opens this repo:
41
- merges a tag-pinned marketplace + enabledPlugins into the project's
42
- .claude/settings.json (--dry-run shows the change, writes nothing)
43
- team managed-settings Print the managed-settings JSON an admin deploys
44
- login Link this machine to the hosted console (device code). Saves a 0600
45
- key in ~/.kya/hosted-credentials.json. --base-url <url> or KYA_BASE_URL
46
- logout Delete the saved hosted key (the key stays active until you revoke it)
47
48
  update Self-update to the latest npm version (kya start warns when
48
49
  a newer release exists; --no-update-check / KYA_UPDATE_CHECK=0 opts out)
49
- register-agent POST /api/v1/kya/agents (human mint; server applies allow/break-glass/approve)
50
- eval-tool Policy evaluate (HTTP plane or --offline sample)
51
- wrap Evaluate + record trail. With --tool-id it never executes.
52
- wrap [--offline] -- <cmd...>: gate the command as a shell call, run it
53
- only if allowed (exit = the command's; 1 denied, 4 Hold pending).
54
- Default observe: no Hold ticket (no second approve). --hold / KYA_HOLD=1 for org Hold.
55
50
  hook PreToolUse interception for native-hook hosts (claude|grok|kimi|…)
56
51
  Reads the hook payload from stdin; exit 2 blocks. --strict denies advisory.
57
52
  --fail-closed (hosted): internal error, malformed payload or async
@@ -73,12 +68,49 @@ Commands:
73
68
  fail closed; key/URL/agent come only from that 0600 file.
74
69
  --plane-shadow records hosted verdicts without blocking;
75
70
  --plane-budget-ms <n> total plane budget (default 3000, max 4000).
71
+ wrap Evaluate + record trail. With --tool-id it never executes.
72
+ wrap [--offline] -- <cmd...>: gate the command as a shell call, run it
73
+ only if allowed (exit = the command's; 1 denied, 4 Hold pending).
74
+ Default observe: no Hold ticket (no second approve). --hold / KYA_HOLD=1 for org Hold.
75
+ doctor Local checks. doctor --iocs scans this machine now for known supply-chain
76
+ indicators (advisory; read-only, offline). --json for scripts. Last result: kya dash/receipt
77
+ Background daily scan (from kya hook) is off with KYA_IOC=0 or ioc.enabled=false in ~/.kya/config.json
78
+ serve-mcp Local MCP gate (HTTP default; --stdio for hosts)
79
+ sandbox Opt-in Firecracker wrap (spawn|exec|kill|status). Not MCP.
80
+ Requires KYA_SANDBOX=mock|firecracker. MCP still never execs.
81
+ telemetry Opt-in anonymous usage stats, OFF by default
82
+ (status | on | off [--purge] | show | reset) - see docs/telemetry.md
83
+ posture Developer posture report, OFF by default. status | on [--yes] | off |
84
+ send [--dry-run --json] | label NAME. "on" prints the exact report first.
85
+ Sent once a day only when the local toggle AND the workspace allow it.
86
+
87
+ Report:
76
88
  receipt Activity report HTML/JSON/MD (default: last 3 days, all tools; --open)
77
89
  --q pre-fills feed search · --share publishes a redacted summary (see --share-url)
78
90
  map Map of agent actions: device, agent, tool and target graph with KYA verdicts (local only)
79
91
  --days <n> window (default 3) · --json · --html <file> · --session <id>
80
92
  export Local trail as an agent-flow JSONL event log (classes only, no args; local only)
81
93
  --format agent-flow · --days <n> (default 3) · --session <id> · --out <file>
94
+ dash Terminal desk (FREE panes; actions on a TTY, --once for CI)
95
+ investigate Deterministic trail analysis: detectors, grouped incidents,
96
+ markdown fix briefs for coding agents (--json)
97
+ alerts Security alerts for detected incidents, optional local triage model, off by default, advisory
98
+ (status [--json] | test | on | off) - see docs/alerts.md
99
+ discover Scan this endpoint for AI agents, IDEs, runtimes, and MCP servers
100
+ (--json, --diff <snapshot>, --push)
101
+
102
+ Team and hosted:
103
+ team init Enable the Claude Code plugin for everyone who opens this repo:
104
+ merges a tag-pinned marketplace + enabledPlugins into the project's
105
+ .claude/settings.json (--dry-run shows the change, writes nothing).
106
+ --guard enables the kya-guard plugin instead: prints the diff and a README badge,
107
+ kya uninstall --project reverses it
108
+ team managed-settings Print the managed-settings JSON an admin deploys
109
+ login Link this machine to the hosted console (device code). Saves a 0600
110
+ key in ~/.kya/hosted-credentials.json. --base-url <url> or KYA_BASE_URL
111
+ logout Delete the saved hosted key (the key stays active until you revoke it)
112
+ register-agent POST /api/v1/kya/agents (human mint; server applies allow/break-glass/approve)
113
+ eval-tool Policy evaluate (HTTP plane or --offline sample)
82
114
  invoke Authorize on the plane after Allow or APPROVED. Never runs the write here.
83
115
  approve Human APPROVE an approval id (kya.approve scope)
84
116
  reject Human REJECT an approval id (kya.approve scope)
@@ -89,34 +121,18 @@ Commands:
89
121
  approvals List the human queue
90
122
  sessions List observed sessions
91
123
  shrink Drop session clearance (--id --to BUILD|READ|DEPLOY)
92
- serve-mcp Local MCP gate (HTTP default; --stdio for hosts)
93
- telemetry Opt-in anonymous usage stats, OFF by default
94
- (status | on | off [--purge] | show | reset) - see docs/telemetry.md
95
- orr run Read-only ORR board (reporting only - not a second PEP)
96
- Optional: --producer harness.agentshield [--agentshield-json <file>]
97
- dash Terminal desk (FREE panes; actions on a TTY, --once for CI)
98
- doctor Local checks. doctor --iocs scans this machine now for known supply-chain
99
- indicators (advisory; read-only, offline). --json for scripts. Last result: kya dash/receipt
100
- Background daily scan (from kya hook) is off with KYA_IOC=0 or ioc.enabled=false in ~/.kya/config.json
101
- posture Developer posture report, OFF by default. status | on [--yes] | off |
102
- send [--dry-run --json] | label NAME. "on" prints the exact report first.
103
- Sent once a day only when the local toggle AND the workspace allow it.
104
- sandbox Opt-in Firecracker wrap (spawn|exec|kill|status). Not MCP.
105
- Requires KYA_SANDBOX=mock|firecracker. MCP still never execs.
124
+
125
+ Compliance and evidence:
106
126
  certify Agent Trust Baseline gap report from local evidence
107
127
  (JSON/MD/HTML to .kya/certify/; exit 1 on gaps, exit 2 usage)
108
128
  --attest REQ-ID --text "…" records a local attestation
109
129
  --sign also writes an ed25519-signed evidence-bundle.json
110
130
  (self-signed: integrity + key continuity, NOT identity)
131
+ orr run Read-only ORR board (reporting only - not a second PEP)
132
+ Optional: --producer harness.agentshield [--agentshield-json <file>]
111
133
  import Import foreign traces into the local trail so the receipt
112
134
  and certify see them (--from langsmith|langfuse|phoenix|otel|adr-sensor|openshell
113
135
  <file>, or --from agt [--file <path>] for the AGT audit log)
114
- investigate Deterministic trail analysis: detectors, grouped incidents,
115
- markdown fix briefs for coding agents (--json)
116
- alerts Security alerts for detected incidents, optional local triage model, off by default, advisory
117
- (status [--json] | test | on | off) - see docs/alerts.md
118
- discover Scan this endpoint for AI agents, IDEs, runtimes, and MCP servers
119
- (--json, --diff <snapshot>, --push)
120
136
 
121
137
  Options (shared):
122
138
  --base-url <url> Control plane origin (or KYA_BASE_URL)
@@ -128,6 +144,7 @@ Options (shared):
128
144
  --days <n> receipt: history window (default 3)
129
145
  --session <id> receipt: single session only (optional)
130
146
  --q <query> receipt: pre-fill the activity-feed search
147
+ --card receipt: make a near-miss card (image, no private data) for the last denied call; --id <id> picks another
131
148
  --share receipt: publish a redacted summary, print the public URL
132
149
  --share-url <url> receipt: share endpoint base (or KYA_SHARE_URL; default https://shield-agent.com)
133
150
  --share-retries <n> receipt: retry --share on 429/5xx/network with backoff (max 3; default 0 = single attempt)
@@ -143,6 +160,9 @@ Options (shared):
143
160
 
144
161
  Examples:
145
162
  kya start
163
+ kya start --dry-run
164
+ kya start --yes
165
+ kya uninstall
146
166
  kya connect qwen
147
167
  kya connect opencode --project
148
168
  npx @shield-agent/kya init --base-url http://127.0.0.1:8090 --host ide
@@ -177,11 +197,59 @@ Examples:
177
197
  Docs: https://shield-agent.com/install · docs/guides/kya-light-install.md
178
198
  Doctrine: sole PEP is Shield; DENY is hard; missing APPROVED ⇒ no irreversible side effect.
179
199
  `;
180
- /** Help text. The host list comes from the connect registry, loaded on demand so `kya hook` stays light. */
200
+ /** Default help: the six commands a new user needs. `kya help --all` prints the full text above. */
201
+ const SHORT_HELP = `Shield KYA - stops your coding agent from deleting, leaking or dropping things.
202
+
203
+ Usage:
204
+ kya <command>
205
+
206
+ kya start Guard this machine and open the report
207
+ kya receipt Open or share the report
208
+ kya connect <host> Add another coding agent
209
+ kya doctor Check that the guard is live
210
+ kya stop Stop the report server
211
+ kya uninstall Remove everything KYA added
212
+
213
+ More commands: kya help --all
214
+ One command: kya help <command>
215
+ Docs: https://shield-agent.com/install
216
+ `;
217
+ /** Full help text. The host list comes from the connect registry, loaded on demand so `kya hook` stays light. */
181
218
  async function helpText() {
182
219
  const { connectableHosts } = await import("./commands/connect.js");
183
220
  return helpFor(connectableHosts().join("|"));
184
221
  }
222
+ /** The Commands entries whose first word is `name` (`orr` finds "orr run"), cut from the full help text. */
223
+ export function helpSection(full, name) {
224
+ const start = full.indexOf("\nCommands:\n") + "\nCommands:\n".length;
225
+ const entries = [];
226
+ for (const line of full.slice(start, full.indexOf("\nOptions (shared):")).split("\n")) {
227
+ if (/^ {2}\S/.test(line))
228
+ entries.push([line]);
229
+ else if (/^\s+\S/.test(line) && entries.length > 0)
230
+ entries[entries.length - 1].push(line);
231
+ }
232
+ const hits = entries.filter((e) => e[0].trim().split(/\s+/)[0] === name);
233
+ return hits.length > 0 ? hits.map((e) => e.join("\n")).join("\n") : undefined;
234
+ }
235
+ /** What `kya help`, `kya --help` and `kya <command> --help` print. Returns the exit code. */
236
+ async function printHelp(io, command, all) {
237
+ if (all) {
238
+ io.log(await helpText());
239
+ return 0;
240
+ }
241
+ if (command === undefined) {
242
+ io.log(SHORT_HELP);
243
+ return 0;
244
+ }
245
+ const section = helpSection(await helpText(), command);
246
+ if (section === undefined) {
247
+ io.error(`No help for "${command}". Run kya help --all to list every command.`);
248
+ return 2;
249
+ }
250
+ io.log(`${section}\n\nEvery command and option: kya help --all`);
251
+ return 0;
252
+ }
185
253
  const defaultIo = {
186
254
  log: (m) => console.log(m),
187
255
  error: (m) => console.error(m),
@@ -211,8 +279,10 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
211
279
  parsed.command === "help" ||
212
280
  parsed.flags["help"] === true ||
213
281
  parsed.flags["h"] === true) {
214
- io.log(await helpText());
215
- return 0;
282
+ const all = parsed.flags["all"] !== undefined && parsed.flags["all"] !== false;
283
+ // `kya help <command>` names it in the first positional; `kya <command> --help` is the command itself.
284
+ const target = parsed.command === "help" ? parsed.positionals[0] : parsed.command;
285
+ return printHelp(io, target, all);
216
286
  }
217
287
  try {
218
288
  const nodeHandoff = await ensureSupportedNode(io, env, argv, parsed.command);
@@ -220,7 +290,8 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
220
290
  return nodeHandoff;
221
291
  switch (parsed.command) {
222
292
  case "start": {
223
- const { formatStartHuman, runStart } = await import("./commands/start.js");
293
+ const { askApply, envYes, formatPlanHuman, formatStartHuman, planStart, runStart } = await import("./commands/start.js");
294
+ const { homedir } = await import("node:os");
224
295
  const { maybePrintStarCta } = await import("./star-cta.js");
225
296
  const { checkForUpdate, formatUpdateBanner, shouldSkipUpdateCheck } = await import("./update-check.js");
226
297
  const { maybePromptConsent } = await import("./telemetry.js");
@@ -235,24 +306,66 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
235
306
  const force = parsed.flags["force"] === true || parsed.flags["force"] === "true";
236
307
  const noOpen = parsed.flags["no-open"] === true || parsed.flags["no-open"] === "true";
237
308
  const noGate = parsed.flags["no-gate"] === true || parsed.flags["no-gate"] === "true";
309
+ const switchOn = (v) => v !== undefined && v !== false && !/^(false|0)$/i.test(String(v));
310
+ const dryRun = switchOn(parsed.flags["dry-run"]);
311
+ const yes = switchOn(parsed.flags["yes"]) || envYes(env);
312
+ const home = env.KYA_HOME?.trim() || undefined;
313
+ const plan = await planStart(config, { force, open: !noOpen, gate: !noGate, ...(home ? { home } : {}) });
314
+ const planHome = home ?? homedir();
315
+ if (!config.json)
316
+ io.log(formatPlanHuman(plan, cwd, planHome));
317
+ if (dryRun) {
318
+ if (config.json)
319
+ io.log(JSON.stringify({ applied: false, dryRun: true, plan }, null, 2));
320
+ else
321
+ io.log("Dry run: nothing was written.");
322
+ return 0;
323
+ }
324
+ if (plan.needsConsent && !yes) {
325
+ // A terminal gets one question; a pipe, CI or --json never applies without --yes / KYA_YES=1.
326
+ const interactive = (io.isTty ?? Boolean(process.stdin.isTTY && process.stdout.isTTY)) && !config.json && !env.CI;
327
+ const apply = interactive && /^(|y|yes)$/i.test((await (io.ask ?? askApply)("Apply? [Y/n]")).trim());
328
+ if (!apply) {
329
+ if (config.json)
330
+ io.log(JSON.stringify({ applied: false, dryRun: false, plan }, null, 2));
331
+ if (interactive) {
332
+ io.log("Nothing was changed.");
333
+ }
334
+ else {
335
+ // On stderr (and on stdout in text mode), so a wrapper that only shows stderr still says why nothing happened.
336
+ const line = "Nothing was written (not a terminal). Run again with --yes (or KYA_YES=1) to apply, or --dry-run to preview.";
337
+ if (!config.json)
338
+ io.log(line);
339
+ io.error(line);
340
+ }
341
+ return 0;
342
+ }
343
+ }
238
344
  if (!config.json)
239
345
  await maybePromptConsent(io, env);
240
346
  // Before the report server starts, so the first search already sees the runtime. Never fails start.
241
347
  if (!config.json) {
242
348
  const { maybeOfferSemanticSearch } = await import("./receipt/semantic-setup.js");
243
- await maybeOfferSemanticSearch(io, env).catch(() => undefined);
349
+ // The "is off" hints are not printed here: `kya doctor` shows them (quietHint).
350
+ await maybeOfferSemanticSearch({ ...io, quietHint: true }, env).catch(() => undefined);
244
351
  // Security alerts with optional local triage: asked once, after the search offer, same rules. Never fails start.
245
352
  const { maybeOfferTriageAlerts } = await import("./alerts/triage-setup.js");
246
- await maybeOfferTriageAlerts(io, env).catch(() => undefined);
353
+ await maybeOfferTriageAlerts({ ...io, quietHint: true }, env).catch(() => undefined);
247
354
  }
248
- const result = await runStart(config, { force, open: !noOpen, gate: !noGate });
355
+ const result = await runStart(config, { force, open: !noOpen, gate: !noGate, ...(home ? { home } : {}) });
249
356
  if (config.json) {
250
- io.log(JSON.stringify(result, null, 2));
357
+ io.log(JSON.stringify({ ...result, applied: true, plan }, null, 2));
251
358
  }
252
359
  else {
253
360
  io.log(formatStartHuman(result));
254
361
  if (result.liveUrl)
255
362
  maybePrintStarCta(cwd, 3, io.log);
363
+ // F4: once there is something worth sharing. Same once-a-day, terminal-only rules as every CTA.
364
+ const { maybeCta, START_SHARE_MIN_EVENTS } = await import("./cta.js");
365
+ const { readTrail } = await import("./trail.js");
366
+ if (readTrail(cwd, env).length >= START_SHARE_MIN_EVENTS) {
367
+ maybeCta("start-share", { env, cwd, isTty: io.isTty ?? Boolean(process.stdout.isTTY) }, io.log);
368
+ }
256
369
  // Cached 24h; silent on any failure. Skipped in CI / --json / opt-out.
257
370
  if (!shouldSkipUpdateCheck(parsed.command, parsed.flags, env)) {
258
371
  const update = await checkForUpdate({ env });
@@ -262,6 +375,13 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
262
375
  }
263
376
  return 0;
264
377
  }
378
+ case "uninstall": {
379
+ const { formatUninstallHuman, runUninstall } = await import("./commands/uninstall.js");
380
+ const sw = (v) => v !== undefined && v !== false && !/^(false|0)$/i.test(String(v));
381
+ const result = runUninstall({ env, cwd, project: sw(parsed.flags["project"]), dryRun: sw(parsed.flags["dry-run"]) });
382
+ io.log(flagBool(parsed.flags, "json") ? JSON.stringify(result, null, 2) : formatUninstallHuman(result, cwd));
383
+ return 0;
384
+ }
265
385
  case "login": {
266
386
  const { loginBrowserOpener, runLogin } = await import("./commands/login.js");
267
387
  const { openPath } = await import("./commands/receipt.js");
@@ -358,7 +478,17 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
358
478
  shadow: flagBool(parsed.flags, "plane-shadow"),
359
479
  }
360
480
  : undefined;
361
- const result = await runConnect(config, { host, scope, force, hooks, hosted, ...(gate ? { gateUrl: gateMcpUrl(env) } : {}) }, env);
481
+ // Every write lands in ~/.kya/manifest.json so `kya uninstall` can undo it.
482
+ const { liveJournal } = await import("./manifest.js");
483
+ const { withJournal } = await import("./write-journal.js");
484
+ const { journal, finish } = liveJournal({ globalDir: globalConfigDir(env), cwd });
485
+ let result;
486
+ try {
487
+ result = await withJournal(journal, () => runConnect(config, { host, scope, force, hooks, hosted, ...(gate ? { gateUrl: gateMcpUrl(env) } : {}) }, env));
488
+ }
489
+ finally {
490
+ finish();
491
+ }
362
492
  if (config.json) {
363
493
  io.log(JSON.stringify(result, null, 2));
364
494
  }
@@ -479,13 +609,29 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
479
609
  return 0;
480
610
  }
481
611
  if (sub !== "init") {
482
- io.error("Usage: kya team init [--dry-run] [--json] | kya team managed-settings");
612
+ io.error("Usage: kya team init [--guard] [--dry-run] [--json] | kya team managed-settings");
483
613
  return 2;
484
614
  }
485
615
  // Present means on (like --fail-closed): parseArgs would let `--dry-run x` swallow x.
486
616
  const dr = parsed.flags["dry-run"];
487
617
  const dryRun = dr !== undefined && dr !== false && !/^(false|0)$/i.test(String(dr));
488
- const result = runTeamInit({ cwd, env, dryRun });
618
+ const guard = parsed.flags["guard"] !== undefined && parsed.flags["guard"] !== false && !/^(false|0)$/i.test(String(parsed.flags["guard"]));
619
+ let result;
620
+ if (guard && !dryRun) {
621
+ // Every write lands in ~/.kya/manifest.json so `kya uninstall --project` can undo it.
622
+ const { liveJournal } = await import("./manifest.js");
623
+ const { withJournal } = await import("./write-journal.js");
624
+ const { journal, finish } = liveJournal({ globalDir: globalConfigDir(env), cwd });
625
+ try {
626
+ result = await withJournal(journal, () => runTeamInit({ cwd, env, dryRun, guard }));
627
+ }
628
+ finally {
629
+ finish();
630
+ }
631
+ }
632
+ else {
633
+ result = runTeamInit({ cwd, env, dryRun, guard });
634
+ }
489
635
  io.log(flagBool(parsed.flags, "json") ? JSON.stringify(result, null, 2) : formatTeamInitHuman(result));
490
636
  return 0;
491
637
  }
@@ -548,7 +694,7 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
548
694
  }
549
695
  case "receipt": {
550
696
  const { formatReceiptHuman, receiptInputFromArgs, runReceipt, runReceiptShare } = await import("./commands/receipt.js");
551
- const { SHARE_HOSTED_HINT, formatShareLine } = await import("./receipt/share.js");
697
+ const { SHARE_CONNECT_HINT, SHARE_HOSTED_HINT, formatShareLine } = await import("./receipt/share.js");
552
698
  const { maybePrintStarCta } = await import("./star-cta.js");
553
699
  const config = resolveConfig({
554
700
  cwd,
@@ -559,6 +705,17 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
559
705
  offline: true,
560
706
  });
561
707
  const input = receiptInputFromArgs(parsed);
708
+ if (flagBool(parsed.flags, "card")) {
709
+ const { runReceiptCard } = await import("./commands/receipt.js");
710
+ const { cardCaption } = await import("./card.js");
711
+ const made = runReceiptCard(env, { id: flagString(parsed.flags, "id") });
712
+ if (!made.ok) {
713
+ io.error(made.message);
714
+ return 1;
715
+ }
716
+ io.log(config.json ? JSON.stringify({ id: made.id, svg: made.svgPath, png: made.pngPath ?? null, caption: cardCaption(made.input) }) : made.text.trimEnd());
717
+ return 0;
718
+ }
562
719
  if (flagBool(parsed.flags, "share")) {
563
720
  const shared = await runReceiptShare(config, {
564
721
  sessionId: input.sessionId,
@@ -576,6 +733,7 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
576
733
  else {
577
734
  io.log(formatShareLine(shared.url, shared.expiresAt));
578
735
  io.log(SHARE_HOSTED_HINT);
736
+ io.log(SHARE_CONNECT_HINT);
579
737
  }
580
738
  return 0;
581
739
  }
@@ -720,11 +878,23 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
720
878
  flags: parsed.flags,
721
879
  requireApiKey: true,
722
880
  });
723
- const opts = serveMcpOptionsFromArgs(parsed);
881
+ // The client may say who it is before the beacon exists (it starts after the server): keep the name.
882
+ let client;
883
+ let setClient;
884
+ const opts = {
885
+ ...serveMcpOptionsFromArgs(parsed),
886
+ onClientInfo: (name) => {
887
+ client ??= name;
888
+ setClient?.(name);
889
+ },
890
+ };
724
891
  const result = await runServeMcp(config, opts);
725
892
  // Opt-in anonymous session beacon. Silent by construction: no stdout/stderr, because an MCP
726
893
  // stdio process owns stdout as its protocol channel.
727
894
  const beacon = startSessionBeacon(result.mode === "http" ? "mcp-http" : "mcp-stdio", { env, cwd });
895
+ setClient = (name) => beacon.setClient(name);
896
+ if (client !== undefined)
897
+ beacon.setClient(client);
728
898
  try {
729
899
  if (result.mode === "http" && result.http) {
730
900
  io.log(`KYA MCP gate listening on ${result.http.url} (host=${config.host})`);
@@ -1098,7 +1268,8 @@ export async function runCli(argv, io = defaultIo, env = process.env, cwd = proc
1098
1268
  }
1099
1269
  default:
1100
1270
  io.error(`Unknown command: ${parsed.command}`);
1101
- io.log(await helpText());
1271
+ io.error("Run kya help --all to list every command.");
1272
+ io.log(SHORT_HELP);
1102
1273
  return 2;
1103
1274
  }
1104
1275
  }