chainlesschain 0.162.156 → 0.162.158

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 (195) hide show
  1. package/README.md +1 -1
  2. package/package.json +2 -2
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-DjBXlypQ.js → AIOps-BwpTJTN_.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-Cv9er9bp.js → ActionButton-BtQOoo3l.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-CLKDjSNs.js → Analytics-Duf_rXZa.js} +3 -3
  7. package/src/assets/web-panel/assets/AppLayout-XQK3wjvB.js +9 -0
  8. package/src/assets/web-panel/assets/Artifacts-CTVt96zW.css +1 -0
  9. package/src/assets/web-panel/assets/Artifacts-DQvJoQ6E.js +1 -0
  10. package/src/assets/web-panel/assets/{Audit-CXafD178.js → Audit-DNjOGQLh.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-CP5c-GSd.js → BackgroundAgents-FH9RAfB5.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-BbYLQfyt.js → Backup-ZIbrR4-U.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-Bqe0MwZL.js → BaseInput-DSt3NaND.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-jNA_yUPH.js → Chat-CY-wvbjv.js} +6 -6
  15. package/src/assets/web-panel/assets/Chat-KSGPtU0L.css +1 -0
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BOFLF01s.js → ChatBubbleRenderer-BAV9V-t-.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-Dlzz-zD1.js → Checkbox-8JVadE_B.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-BAsDQjGf.js → Codegen-CN83nPYI.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-Ju0HrAuS.js → Col-xPSvqdN8.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-DynJd43Z.js → Community-D78cnIjG.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-CabbZVww.js → Compact-CSw6Csbp.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-DW4BmAoh.js → Compliance-E_HhjcYR.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-Bk1S_7X-.js → Cowork-DybeQjmm.js} +3 -3
  24. package/src/assets/web-panel/assets/{Cron-By4sh_NM.js → Cron-DS0BJeLY.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-DdZdbS1C.js → Crosschain-BOwVgkbs.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-CkL-sQyS.js → DID-DRUr9YuX.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-g_mOpumg.js → Dashboard-Cht-yUKW.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-DtHyE7Ao.js → Dropdown-BLr_EJ9X.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-Kpvov5Wr.js → EmailListRenderer-Drexuh5W.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-C4kZoePR.js → FamilyGuardDashboard-D9Q2Kq63.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-BAwWoK2N.js → Federation-C-Z1xI-T.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DeI0i5f8.js → FormItemContext-DLHPMkQF.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-CkcKRtos.js → GenericCardRenderer-DxxEdn2r.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-kX6jjI9y.js → Git-syATcaBt.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-BXJCBm6x.js → Governance-CYe_r8Zf.js} +1 -1
  36. package/src/assets/web-panel/assets/Inference-GWxErB7k.js +1 -0
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-3Dnuf1Wh.js → KnowledgeGraph-qQvVCZoi.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-lVAZCtUB.js → Logs-BenAU2W8.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-7agE3Or1.js +1 -0
  40. package/src/assets/web-panel/assets/MarkdownRenderer-DbzhFwvz.css +1 -0
  41. package/src/assets/web-panel/assets/Marketplace-D4Jn5fpD.js +1 -0
  42. package/src/assets/web-panel/assets/{McpTools-CqjzefRU.js → McpTools-DtAwoqiQ.js} +4 -4
  43. package/src/assets/web-panel/assets/{Memory-BFiPAxk6.js → Memory-BI_O50I8.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-D0O43VwF.js → MobileBridge-CQWE2lqx.js} +1 -1
  45. package/src/assets/web-panel/assets/{MobileProjects-B3now48t.js → MobileProjects-CVtTqgtg.js} +1 -1
  46. package/src/assets/web-panel/assets/{Mtc-DybhtaCS.js → Mtc-Dnr16qsn.js} +2 -2
  47. package/src/assets/web-panel/assets/{MtcAudit-D7MmY4F0.js → MtcAudit-CQ5Xe4-a.js} +5 -5
  48. package/src/assets/web-panel/assets/{Multisig-wZvGJnB8.js → Multisig-Bjr8O-wy.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-BNPpgfvn.js → NLProgramming-CEe-KirU.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-B6FS3KBj.js → Notes-spKJIKF9.js} +4 -4
  51. package/src/assets/web-panel/assets/{NotificationSettings-CK0yla9U.js → NotificationSettings-DRp83LFG.js} +1 -1
  52. package/src/assets/web-panel/assets/OrderTableRenderer-h1A0XB2a.js +1 -0
  53. package/src/assets/web-panel/assets/{Organization-geqgwN1T.js → Organization-BlgB0IYg.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-BWJYZFbC.js → Overflow-a_35HqZI.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P-DnU1505F.js → P2P-CSNHCNPC.js} +2 -2
  56. package/src/assets/web-panel/assets/{PdhVaultBrowser-BGY74KnC.js → PdhVaultBrowser-C8M1JH-1.js} +5 -5
  57. package/src/assets/web-panel/assets/{Permissions-CgArrWtQ.js → Permissions-DmjJi9Ms.js} +4 -4
  58. package/src/assets/web-panel/assets/{PersonalDataHub-C2vYE61a.js → PersonalDataHub-DfuwRyf4.js} +2 -2
  59. package/src/assets/web-panel/assets/{Pipeline-CBYLI4yW.js → Pipeline-B2-S4ekE.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-B-PdW9aN.js → Privacy-B1dOiBLC.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-CuWQegbV.js → ProjectInit-_pNmc-DX.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-4d32m_cS.js → ProjectSettings-DmwG2Ii1.js} +2 -2
  63. package/src/assets/web-panel/assets/{Projects-VLA7ttwd.js → Projects-COATmHxF.js} +1 -1
  64. package/src/assets/web-panel/assets/{Providers-B_Izb_oa.js → Providers-C6HSjg1d.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-C6B_ndXV.js → QrScannerModal-CrDmS7l1.js} +1 -1
  66. package/src/assets/web-panel/assets/{QuickAsk-C6tavL-y.js → QuickAsk-CfKvWt-x.js} +1 -1
  67. package/src/assets/web-panel/assets/{Recommend-CF-LaZ6x.js → Recommend-DMa6Kuzv.js} +1 -1
  68. package/src/assets/web-panel/assets/RemoteSession-DrktUo5x.js +4 -0
  69. package/src/assets/web-panel/assets/Reputation-BTPQ1vjL.js +1 -0
  70. package/src/assets/web-panel/assets/{Row-DO0fd48A.js → Row-B6Q7QkMG.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-BV5LDzFR.js → RssFeed-B1IJhAmX.js} +3 -3
  72. package/src/assets/web-panel/assets/Search-xbea1kGD.js +1 -0
  73. package/src/assets/web-panel/assets/{Security-DwSrWRCw.js → Security-7rs0cO3F.js} +4 -4
  74. package/src/assets/web-panel/assets/{Services-BEf1QyM4.js → Services-0fjixK0S.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-LZXTpovy.js → Skeleton-B_rVq9Cu.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-SKgc0Zug.js → Skills-C5uM90b9.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-C_QVOtkN.js → Sla-U4pYCIZH.js} +1 -1
  78. package/src/assets/web-panel/assets/{SpeechSettings-v5TW2V-X.js → SpeechSettings-Cdz4yTWx.js} +1 -1
  79. package/src/assets/web-panel/assets/{SyncSettings-CQPjHdqU.js → SyncSettings-Me3aetHv.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-DCd-uYcI.js → Tasks-Cf6aNkL_.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-62VDIjtj.js → Templates-CYatk4tU.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-BnFQ0pNy.js → Tenant-DIMKLw7o.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal-D3v0MGSj.js → Terminal-C_cp-uSJ.js} +2 -2
  84. package/src/assets/web-panel/assets/{TimelineRenderer-BI1Ka-cu.js → TimelineRenderer-cUPVNADp.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-BwX1jXYP.js → Tokens-CiaEIXVf.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-CSA8TqNx.js → Trigger-DB1WU5lQ.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-Bn3IjCx7.js → Trust-Cfht9Ijy.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-pUbOAqNi.js → UkeySign-K3P4Vt9S.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-Db2RercF.js → VideoEditing-DWjhjXRh.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-CpR1BVAl.js → Wallet-D9-Q1Kan.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-Yxtkn7Zp.js → WebAuthn-BDszy-oV.js} +5 -5
  92. package/src/assets/web-panel/assets/{WorkflowEditor-CYLe9a2E.js → WorkflowEditor-DIhij4rA.js} +1 -1
  93. package/src/assets/web-panel/assets/{chat-gsOGdak0.js → chat-D7VCiKbh.js} +1 -1
  94. package/src/assets/web-panel/assets/{colors-D9fN299a.js → colors-BvOd9pVn.js} +1 -1
  95. package/src/assets/web-panel/assets/{compact-item-vkd7s-ay.js → compact-item-DoqXBiAO.js} +1 -1
  96. package/src/assets/web-panel/assets/{createContext-C7YkbMyy.js → createContext-CrKRzUtp.js} +1 -1
  97. package/src/assets/web-panel/assets/devWarning-nDB--2xr.js +1 -0
  98. package/src/assets/web-panel/assets/{hasIn-ig7reRSU.js → hasIn-BWAev4WC.js} +1 -1
  99. package/src/assets/web-panel/assets/{icons-DEmcnxBf.js → icons-DG5UD-6K.js} +4 -4
  100. package/src/assets/web-panel/assets/{index-W52sHRdr.js → index-1poMpMU0.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DZAxCnjS.js → index-8g5TJCZ3.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-9TxdMYju.js → index-B0vGEbJT.js} +1 -1
  103. package/src/assets/web-panel/assets/index-B1_pRTtB.js +1 -0
  104. package/src/assets/web-panel/assets/{index-DhdXbsXX.js → index-B30NvR21.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-B7QRpKif.js → index-BCyP071m.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Bt-9ZhIu.js → index-BHOcVYrx.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BYe9HRSt.js → index-BN9m4Ux2.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BkP17Z95.js → index-BWWsaimP.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CDWTycrg.js → index-BXyl8O23.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CspGymmg.js → index-BZGk8AbZ.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DFfxF7Vt.js → index-Bf9YlbDn.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DQ8U7kzC.js → index-Bj7EgmOp.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-D2yhtk6a.js → index-BkgnGX7v.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-FzGr6CVk.js → index-BoYrS_L2.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BMw48d19.js → index-Bq_ctRpz.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CAkz1f1r.js → index-C5kRmj3P.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-SDrcQXO1.js → index-CDGLdn12.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-gj8kxcAi.js → index-CEPHMSih.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-PkH39qsp.js → index-CEXfKSiI.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BHHN_KTS.js → index-CSb-tnIo.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-gpurplyq.js → index-CmJ6xKBO.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BfpVcXKa.js → index-CoD31Ndm.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CGzGe5tv.js → index-Cx7M7PSF.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BhftELHI.js → index-D23L1V76.js} +3 -3
  125. package/src/assets/web-panel/assets/{index-DPguq3X7.js → index-DV-Rfmfx.js} +4 -4
  126. package/src/assets/web-panel/assets/{index-BpGlLbRv.js → index-DlGu7As6.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C8HZMygt.js → index-DvDOpsJB.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DuwbKHoS.js → index-HwHdTusY.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C7AY39sg.js → index-ISvPZ05r.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-nX8YE6cj.js → index-JzUmJMvn.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DvCJXmrx.js → index-KR1-Em9C.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Co2NYyew.js → index-PDxGjKRu.js} +1 -1
  133. package/src/assets/web-panel/assets/index-TMM9FuW-.js +1 -0
  134. package/src/assets/web-panel/assets/{index-D6s_kbjt.js → index-YGDy7nNq.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Dy_TKZ9h.js → index-gmxqu5Kk.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DFM1oNe1.js → index-oY45XrkG.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-bVbgYBhv.js → index-ww1QtLnX.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-BvDEukXe.js → index-zH-tuuGZ.js} +1 -1
  139. package/src/assets/web-panel/assets/{initDefaultProps-BrgfVRg9.js → initDefaultProps-XW-OR3mL.js} +1 -1
  140. package/src/assets/web-panel/assets/{motion-D_3xmwac.js → motion-CeuEHh20.js} +1 -1
  141. package/src/assets/web-panel/assets/{move-DDDJdlxw.js → move-Dva79Keg.js} +1 -1
  142. package/src/assets/web-panel/assets/{mtc-parser-BK2uEWwn.js → mtc-parser-C0B6bD2j.js} +1 -1
  143. package/src/assets/web-panel/assets/{omit-BPHKbDcf.js → omit-AkZvO-a2.js} +1 -1
  144. package/src/assets/web-panel/assets/{pickAttrs-LNnTscuz.js → pickAttrs-B4r55qGc.js} +1 -1
  145. package/src/assets/web-panel/assets/{placementArrow-CvmTZll5.js → placementArrow-BLH-z7YE.js} +1 -1
  146. package/src/assets/web-panel/assets/{responsiveObserve-eBj7qi2J.js → responsiveObserve-ksEGZ2Wf.js} +1 -1
  147. package/src/assets/web-panel/assets/{slide-D68hHkrM.js → slide-Cth4OD1Z.js} +1 -1
  148. package/src/assets/web-panel/assets/{statusUtils-daTlaeo0.js → statusUtils-9S83ezxw.js} +1 -1
  149. package/src/assets/web-panel/assets/{styleChecker-DtyKMtHB.js → styleChecker-7yQmQGZ4.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFlexGapSupport-ekFwFs9h.js → useFlexGapSupport-DpGnMmPc.js} +1 -1
  151. package/src/assets/web-panel/assets/{useFs-jRaSEoF4.js → useFs-C4zDZIXH.js} +1 -1
  152. package/src/assets/web-panel/assets/{usePersonalDataHub-DD5nGzjA.js → usePersonalDataHub-CoLICdUZ.js} +1 -1
  153. package/src/assets/web-panel/assets/{vnode-KcgLUiom.js → vnode-CKyH-35X.js} +1 -1
  154. package/src/assets/web-panel/assets/{zoom-Cyk2PQ-s.js → zoom-DRDGit17.js} +1 -1
  155. package/src/assets/web-panel/index.html +2 -2
  156. package/src/command-manifest.json +8 -1
  157. package/src/commands/agent.js +49 -5
  158. package/src/commands/artifacts.js +161 -0
  159. package/src/commands/browse.js +204 -2
  160. package/src/data/changelog.json +13 -2
  161. package/src/gateways/ws/artifact-protocol.js +219 -0
  162. package/src/gateways/ws/message-dispatcher.js +6 -0
  163. package/src/gateways/ws/ws-server.js +32 -0
  164. package/src/index.js +6 -0
  165. package/src/lib/accessibility.js +55 -0
  166. package/src/lib/artifact-store.js +236 -0
  167. package/src/lib/chrome-connector.js +349 -0
  168. package/src/lib/hook-runner.cjs +47 -7
  169. package/src/lib/ide-context.js +84 -0
  170. package/src/lib/permission-rules.cjs +26 -3
  171. package/src/lib/plugin-runtime/scopes.js +12 -0
  172. package/src/lib/remote-control.js +35 -0
  173. package/src/lib/safe-mode.js +40 -0
  174. package/src/lib/shell-selector.cjs +203 -0
  175. package/src/lib/skill-loader.js +19 -0
  176. package/src/lib/slash-dispatch.js +34 -0
  177. package/src/lib/web-ui-server.js +120 -7
  178. package/src/repl/agent-repl.js +330 -116
  179. package/src/repl/remote-approval.js +111 -0
  180. package/src/runtime/agent-core.js +129 -8
  181. package/src/runtime/coding-agent-contract-shared.cjs +105 -0
  182. package/src/runtime/coding-agent-policy.cjs +31 -0
  183. package/src/runtime/headless-stream.js +51 -1
  184. package/src/runtime/policies/agent-policy.js +4 -0
  185. package/src/assets/web-panel/assets/AppLayout-CfyZNzmJ.js +0 -9
  186. package/src/assets/web-panel/assets/Chat-DDh58PCf.css +0 -1
  187. package/src/assets/web-panel/assets/Inference-ujD2JSKo.js +0 -1
  188. package/src/assets/web-panel/assets/Marketplace-qnzNPm-A.js +0 -1
  189. package/src/assets/web-panel/assets/OrderTableRenderer-CXfPHIpy.js +0 -1
  190. package/src/assets/web-panel/assets/RemoteSession-DBqTTQ9_.js +0 -4
  191. package/src/assets/web-panel/assets/Reputation-B01FALUi.js +0 -1
  192. package/src/assets/web-panel/assets/Search-CTti4_MP.js +0 -1
  193. package/src/assets/web-panel/assets/devWarning-DEcR2h6k.js +0 -1
  194. package/src/assets/web-panel/assets/index-BEibanjg.js +0 -1
  195. package/src/assets/web-panel/assets/index-z_25tU3p.js +0 -1
@@ -168,6 +168,18 @@ export function registerAgentCommand(program) {
168
168
  "--safe-mode",
169
169
  "Run bare: disable project memory, settings hooks, memory recall, IDE context, status line and update notice (permission rules STAY active)",
170
170
  )
171
+ .option(
172
+ "--bare",
173
+ "Everything --safe-mode disables PLUS skills, plugins and MCP/IDE auto-connect — minimal fast surface for scripted calls (explicit --mcp-config still loads; permission rules STAY active)",
174
+ )
175
+ .option(
176
+ "--disable-slash-commands",
177
+ "Interactive REPL: don't dispatch '/' input as slash commands — it reaches the model verbatim (/exit and /quit stay live)",
178
+ )
179
+ .option(
180
+ "--ax-screen-reader",
181
+ "Screen-reader friendly output: no ANSI colors, no in-place status line repaints (also CC_SCREEN_READER=1)",
182
+ )
171
183
  .option(
172
184
  "--worktree",
173
185
  "Run this session in a fresh git worktree (isolated branch; auto-removed when the session changes nothing)",
@@ -317,7 +329,7 @@ export function registerAgentCommand(program) {
317
329
  )
318
330
  .option(
319
331
  "--remote-control",
320
- "Headless: route confirm-tier approvals to paired mobile/web devices — prints a pairing URI/QR, waits for remote allow/deny (fail-closed on timeout)",
332
+ "Route confirm-tier approvals to paired mobile/web devices — prints a pairing URI/QR. Headless waits for the remote allow/deny (fail-closed on timeout); interactive races the terminal prompt (first answer wins; also /remote-control)",
321
333
  )
322
334
  .option(
323
335
  "--settings <file>",
@@ -371,17 +383,44 @@ export function registerAgentCommand(program) {
371
383
  }
372
384
  // --safe-mode flag OR CC_SAFE_MODE / CLAUDE_CODE_SAFE_MODE env (Claude-Code
373
385
  // 2.1.169 parity): flip every customization kill-switch BEFORE anything
374
- // loads. Permission rules stay active.
386
+ // loads. Permission rules stay active. --bare (CC_BARE) is safe mode
387
+ // PLUS skills, plugins and MCP/IDE/PDH/JetBrains auto-connect off.
375
388
  {
376
- const { applySafeMode, safeModeRequested } =
377
- await import("../lib/safe-mode.js");
378
- if (safeModeRequested(options)) {
389
+ const {
390
+ applySafeMode,
391
+ safeModeRequested,
392
+ applyBareMode,
393
+ bareModeRequested,
394
+ } = await import("../lib/safe-mode.js");
395
+ if (bareModeRequested(options)) {
396
+ const applied = applyBareMode();
397
+ // Ambient auto-connects off; an EXPLICIT --ide/--pdh/--jetbrains
398
+ // (or --mcp-config, handled downstream) still wins — bare kills
399
+ // defaults, not explicit input.
400
+ options.mcp = false;
401
+ if (options.ide === undefined) options.ide = false;
402
+ if (options.pdh === undefined) options.pdh = false;
403
+ if (options.jetbrains === undefined) options.jetbrains = false;
404
+ process.stderr.write(
405
+ `bare mode: hooks/skills/plugins/memory/MCP-auto-connect disabled (${applied.join(", ")}) — permission rules stay active.\n`,
406
+ );
407
+ } else if (safeModeRequested(options)) {
379
408
  const applied = applySafeMode();
380
409
  process.stderr.write(
381
410
  `safe mode: customizations disabled (${applied.join(", ")}) — permission rules stay active.\n`,
382
411
  );
383
412
  }
384
413
  }
414
+ // --ax-screen-reader flag OR CC_SCREEN_READER env: linear output for
415
+ // screen readers (mono theme + no repainting status line). Applied
416
+ // before anything renders.
417
+ {
418
+ const { screenReaderRequested, applyScreenReaderMode } =
419
+ await import("../lib/accessibility.js");
420
+ if (screenReaderRequested(options)) {
421
+ applyScreenReaderMode();
422
+ }
423
+ }
385
424
  // --project-mcp: opt IN to project-scoped `.mcp.json` discovery, which is
386
425
  // off by default (a checked-in .mcp.json can spawn commands). loadProjectMcp
387
426
  // reads CC_PROJECT_MCP; set it here so the opt-in reaches every run mode
@@ -1089,6 +1128,11 @@ export function registerAgentCommand(program) {
1089
1128
  pdh: options.pdh,
1090
1129
  // --jetbrains / --no-jetbrains: IDEA built-in MCP for the interactive session
1091
1130
  jetbrains: options.jetbrains,
1131
+ // --disable-slash-commands: REPL sends "/" input to the model verbatim
1132
+ disableSlashCommands: options.disableSlashCommands === true,
1133
+ // --remote-control: start the paired-device approval bridge for the
1134
+ // interactive session too (terminal prompt races the device).
1135
+ remoteControl: options.remoteControl === true,
1092
1136
  });
1093
1137
  await runtime.startAgentSession();
1094
1138
  // Interactive session ended (REPL closed) — settle the worktree.
@@ -0,0 +1,161 @@
1
+ /**
2
+ * `cc artifacts` — browse/manage the agent-published deliverable store
3
+ * (gap-analysis P1 #10). The `publish_artifact` agent tool copies finished
4
+ * deliverables (reports/patches/screenshots/logs) into
5
+ * `~/.chainlesschain/artifacts/`; this command is the user-facing surface:
6
+ *
7
+ * cc artifacts list [--session <id>] [--kind <k>] [--json]
8
+ * cc artifacts show <id> [--json] metadata + stored path
9
+ * cc artifacts open <id> print the stored path (pipe/open)
10
+ * cc artifacts remove <id>
11
+ * cc artifacts clean [--json] drop expired artifacts (TTL)
12
+ */
13
+
14
+ import chalk from "chalk";
15
+ import { ArtifactStore } from "../lib/artifact-store.js";
16
+
17
+ export function registerArtifactsCommand(program) {
18
+ const cmd = program
19
+ .command("artifacts")
20
+ .alias("artifact")
21
+ .description(
22
+ "Browse agent-published deliverables (reports/patches/screenshots; see the publish_artifact tool)",
23
+ );
24
+
25
+ cmd
26
+ .command("list", { isDefault: true })
27
+ .description("List published artifacts")
28
+ .option("--session <id>", "Only artifacts from one agent session")
29
+ .option(
30
+ "--kind <kind>",
31
+ "Filter by kind (report|patch|screenshot|log|data|other)",
32
+ )
33
+ .option("--json", "Machine-readable JSON output")
34
+ .action((options) => {
35
+ process.exitCode = runArtifactsList(options);
36
+ });
37
+
38
+ cmd
39
+ .command("show <id>")
40
+ .description("Show one artifact's metadata + stored path")
41
+ .option("--json", "Machine-readable JSON output")
42
+ .action((id, options) => {
43
+ process.exitCode = runArtifactsShow(id, options);
44
+ });
45
+
46
+ cmd
47
+ .command("open <id>")
48
+ .description("Print the artifact's stored file path (for piping/opening)")
49
+ .action((id) => {
50
+ process.exitCode = runArtifactsOpen(id);
51
+ });
52
+
53
+ cmd
54
+ .command("remove <id>")
55
+ .alias("rm")
56
+ .description("Remove one artifact (stored copy + metadata)")
57
+ .option("--json", "Machine-readable JSON output")
58
+ .action((id, options) => {
59
+ process.exitCode = runArtifactsRemove(id, options);
60
+ });
61
+
62
+ cmd
63
+ .command("clean")
64
+ .description("Remove expired artifacts (past their TTL)")
65
+ .option("--json", "Machine-readable JSON output")
66
+ .action((options) => {
67
+ process.exitCode = runArtifactsClean(options);
68
+ });
69
+ }
70
+
71
+ export function runArtifactsList(options = {}, deps = {}) {
72
+ const store = deps.store || new ArtifactStore();
73
+ let entries = store.list({ sessionId: options.session });
74
+ if (options.kind) {
75
+ entries = entries.filter((e) => e.kind === String(options.kind));
76
+ }
77
+ if (options.json) {
78
+ console.log(JSON.stringify({ artifacts: entries }, null, 2));
79
+ return 0;
80
+ }
81
+ if (entries.length === 0) {
82
+ console.log(
83
+ chalk.dim(
84
+ "No artifacts. Agents publish deliverables with the publish_artifact tool.",
85
+ ),
86
+ );
87
+ return 0;
88
+ }
89
+ for (const e of entries) {
90
+ console.log(
91
+ `${chalk.cyan(e.id)} ${chalk.bold(e.title)} ${chalk.dim(
92
+ `[${e.kind}] ${e.mime} ${e.size}B ${e.createdAt}${
93
+ e.sessionId ? ` session=${e.sessionId}` : ""
94
+ }`,
95
+ )}`,
96
+ );
97
+ }
98
+ console.log(
99
+ chalk.dim(`${entries.length} artifact(s). cc artifacts show <id>`),
100
+ );
101
+ return 0;
102
+ }
103
+
104
+ export function runArtifactsShow(id, options = {}, deps = {}) {
105
+ const store = deps.store || new ArtifactStore();
106
+ const entry = store.get(id);
107
+ if (!entry) {
108
+ console.error(chalk.red(`No artifact with id "${id}".`));
109
+ return 1;
110
+ }
111
+ const payload = { ...entry, storedPath: store.storedPath(entry) };
112
+ if (options.json) {
113
+ console.log(JSON.stringify(payload, null, 2));
114
+ return 0;
115
+ }
116
+ for (const [k, v] of Object.entries(payload)) {
117
+ console.log(`${chalk.dim(k.padEnd(11))} ${v == null ? "" : v}`);
118
+ }
119
+ return 0;
120
+ }
121
+
122
+ export function runArtifactsOpen(id, deps = {}) {
123
+ const store = deps.store || new ArtifactStore();
124
+ const entry = store.get(id);
125
+ if (!entry) {
126
+ console.error(chalk.red(`No artifact with id "${id}".`));
127
+ return 1;
128
+ }
129
+ console.log(store.storedPath(entry));
130
+ return 0;
131
+ }
132
+
133
+ export function runArtifactsRemove(id, options = {}, deps = {}) {
134
+ const store = deps.store || new ArtifactStore();
135
+ const found = store.remove(id);
136
+ if (options.json) {
137
+ console.log(JSON.stringify({ removed: found ? id : null, found }));
138
+ return found ? 0 : 1;
139
+ }
140
+ if (!found) {
141
+ console.error(chalk.red(`No artifact with id "${id}".`));
142
+ return 1;
143
+ }
144
+ console.log(chalk.green(`Removed ${id}.`));
145
+ return 0;
146
+ }
147
+
148
+ export function runArtifactsClean(options = {}, deps = {}) {
149
+ const store = deps.store || new ArtifactStore();
150
+ const { removed } = store.cleanupExpired();
151
+ if (options.json) {
152
+ console.log(JSON.stringify({ removed }));
153
+ return 0;
154
+ }
155
+ console.log(
156
+ removed > 0
157
+ ? chalk.green(`Removed ${removed} expired artifact(s).`)
158
+ : chalk.dim("Nothing expired."),
159
+ );
160
+ return 0;
161
+ }
@@ -168,8 +168,18 @@ export function registerBrowseCommand(program) {
168
168
  try {
169
169
  const spinner = ora(`Taking screenshot of ${url}...`).start();
170
170
  const result = await takeScreenshot(url, options.output, {
171
- width: numericOption(options.width, { name: "--width", integer: true, min: 1, fallback: 1280 }),
172
- height: numericOption(options.height, { name: "--height", integer: true, min: 1, fallback: 720 }),
171
+ width: numericOption(options.width, {
172
+ name: "--width",
173
+ integer: true,
174
+ min: 1,
175
+ fallback: 1280,
176
+ }),
177
+ height: numericOption(options.height, {
178
+ name: "--height",
179
+ integer: true,
180
+ min: 1,
181
+ fallback: 720,
182
+ }),
173
183
  fullPage: !!options.fullPage,
174
184
  });
175
185
  spinner.stop();
@@ -188,9 +198,201 @@ export function registerBrowseCommand(program) {
188
198
  }
189
199
  });
190
200
 
201
+ registerBrowseChromeCommand(browse);
191
202
  registerBrowseV2Command(browse);
192
203
  }
193
204
 
205
+ /**
206
+ * `cc browse chrome` — Chrome connector: attach to the USER'S real Chrome
207
+ * over CDP so page state (DOM/console/network/screenshot) is captured WITH
208
+ * their login sessions. `launch` starts a debuggable Chrome (dedicated
209
+ * profile by default; `--default-profile` reuses the real one but requires
210
+ * every Chrome window to be closed first); `status` checks the port;
211
+ * `state` attaches, observes, and prints the page state.
212
+ */
213
+ export function registerBrowseChromeCommand(browse) {
214
+ const chrome = browse
215
+ .command("chrome")
216
+ .description(
217
+ "Chrome connector — capture page state from YOUR logged-in Chrome over CDP",
218
+ );
219
+
220
+ chrome
221
+ .command("status")
222
+ .description("Is a debuggable Chrome listening on the CDP port?")
223
+ .option("-p, --port <port>", "CDP port", "9222")
224
+ .option("--json", "Output as JSON")
225
+ .action(async (options) => {
226
+ const { discoverCdp } = await import("../lib/chrome-connector.js");
227
+ const port = numericOption(options.port, {
228
+ name: "--port",
229
+ integer: true,
230
+ min: 1,
231
+ fallback: 9222,
232
+ });
233
+ const res = await discoverCdp({ port });
234
+ if (options.json) {
235
+ console.log(JSON.stringify(res, null, 2));
236
+ return;
237
+ }
238
+ if (res.ok) {
239
+ logger.success(`Debuggable Chrome on port ${port}: ${res.browser}`);
240
+ } else {
241
+ logger.info(
242
+ `No debuggable Chrome on port ${port}. Start one: cc browse chrome launch`,
243
+ );
244
+ }
245
+ });
246
+
247
+ chrome
248
+ .command("launch")
249
+ .description(
250
+ "Launch a debuggable Chrome (dedicated profile; sign in once there and it persists)",
251
+ )
252
+ .option("-p, --port <port>", "CDP port", "9222")
253
+ .option("-u, --url <url>", "Open this URL")
254
+ .option(
255
+ "--default-profile",
256
+ "Reuse your REAL Chrome profile (requires ALL Chrome windows closed; the CDP port then controls your logged-in browser)",
257
+ )
258
+ .option("--profile <dir>", "Custom profile directory")
259
+ .option("--json", "Output as JSON")
260
+ .action(async (options) => {
261
+ const { discoverCdp, launchChrome } =
262
+ await import("../lib/chrome-connector.js");
263
+ const port = numericOption(options.port, {
264
+ name: "--port",
265
+ integer: true,
266
+ min: 1,
267
+ fallback: 9222,
268
+ });
269
+ const existing = await discoverCdp({ port });
270
+ if (existing.ok) {
271
+ if (options.json) {
272
+ console.log(
273
+ JSON.stringify({ ok: true, already: true, port }, null, 2),
274
+ );
275
+ } else {
276
+ logger.success(
277
+ `A debuggable Chrome is already on port ${port} (${existing.browser})`,
278
+ );
279
+ }
280
+ return;
281
+ }
282
+ const res = launchChrome({
283
+ port,
284
+ url: options.url,
285
+ defaultProfile: options.defaultProfile === true,
286
+ profileDir: options.profile,
287
+ });
288
+ if (options.json) {
289
+ console.log(JSON.stringify({ ...res, port }, null, 2));
290
+ return;
291
+ }
292
+ if (!res.ok) {
293
+ logger.error(res.error);
294
+ process.exitCode = 1;
295
+ return;
296
+ }
297
+ logger.success(`Launched ${res.executable} (CDP port ${port})`);
298
+ if (options.defaultProfile) {
299
+ logger.info(
300
+ "Default profile requested — if the window did NOT get the debug port, close every Chrome window and retry.",
301
+ );
302
+ } else {
303
+ logger.info(
304
+ "Dedicated connector profile — sign in to your sites once there; the login state persists.",
305
+ );
306
+ }
307
+ logger.warn(
308
+ "The CDP port is an unauthenticated local control channel — close this Chrome when you are done.",
309
+ );
310
+ });
311
+
312
+ chrome
313
+ .command("state")
314
+ .description(
315
+ "Attach to the connected Chrome and capture a tab's state (DOM/console/network/screenshot)",
316
+ )
317
+ .option("-p, --port <port>", "CDP port", "9222")
318
+ .option("-t, --tab <n>", "Tab index (see the tabs list in the output)", "0")
319
+ .option(
320
+ "--watch-ms <ms>",
321
+ "Observe console/network for this long (collected from attach time)",
322
+ "3000",
323
+ )
324
+ .option(
325
+ "--reload",
326
+ "Reload the tab first so load-time console/network is captured",
327
+ )
328
+ .option("--no-dom", "Skip the DOM snapshot")
329
+ .option("--dom-cap <chars>", "DOM snapshot cap", "150000")
330
+ .option("--screenshot <file>", "Also write a screenshot")
331
+ .option("--json", "Output as JSON")
332
+ .action(async (options) => {
333
+ const { captureState } = await import("../lib/chrome-connector.js");
334
+ const state = await captureState({
335
+ port: numericOption(options.port, {
336
+ name: "--port",
337
+ integer: true,
338
+ min: 1,
339
+ fallback: 9222,
340
+ }),
341
+ tab: numericOption(options.tab, {
342
+ name: "--tab",
343
+ integer: true,
344
+ min: 0,
345
+ fallback: 0,
346
+ }),
347
+ watchMs: numericOption(options.watchMs, {
348
+ name: "--watch-ms",
349
+ integer: true,
350
+ min: 0,
351
+ fallback: 3000,
352
+ }),
353
+ reload: options.reload === true,
354
+ includeDom: options.dom !== false,
355
+ domCap: numericOption(options.domCap, {
356
+ name: "--dom-cap",
357
+ integer: true,
358
+ min: 1000,
359
+ fallback: 150000,
360
+ }),
361
+ screenshotPath: options.screenshot || null,
362
+ });
363
+ if (options.json) {
364
+ console.log(JSON.stringify(state, null, 2));
365
+ return;
366
+ }
367
+ if (!state.ok) {
368
+ logger.error(state.error);
369
+ process.exitCode = 1;
370
+ return;
371
+ }
372
+ logger.log(
373
+ chalk.bold(`Tab ${state.tab}: ${state.title || "(untitled)"}`),
374
+ );
375
+ logger.log(` ${chalk.cyan(state.url)}`);
376
+ logger.log(
377
+ ` tabs: ${state.tabs.length} console: ${state.console.length} network issues: ${state.network.length}` +
378
+ (state.html
379
+ ? ` dom: ${state.html.length}${state.htmlTruncated ? "+ (truncated)" : ""} chars`
380
+ : ""),
381
+ );
382
+ for (const c of state.console.slice(0, 20)) {
383
+ logger.log(` [console:${c.type}] ${c.text}`);
384
+ }
385
+ for (const nw of state.network.slice(0, 20)) {
386
+ logger.log(
387
+ ` [net:${nw.kind}] ${nw.url}${nw.status ? ` → ${nw.status}` : ""}${nw.error ? ` (${nw.error})` : ""}`,
388
+ );
389
+ }
390
+ if (state.screenshotPath) {
391
+ logger.success(`Screenshot: ${state.screenshotPath}`);
392
+ }
393
+ });
394
+ }
395
+
194
396
  import {
195
397
  BROWSE_TARGET_MATURITY_V2,
196
398
  BROWSE_ACTION_LIFECYCLE_V2,
@@ -3,9 +3,10 @@
3
3
  "releases": [
4
4
  {
5
5
  "productVersion": "Unreleased",
6
- "cliVersion": "0.162.156",
6
+ "cliVersion": "0.162.158",
7
7
  "cliVersions": [
8
8
  "0.4.46",
9
+ "0.4.51",
9
10
  "0.37.4",
10
11
  "0.162.150",
11
12
  "0.162.151",
@@ -13,11 +14,21 @@
13
14
  "0.162.153",
14
15
  "0.162.154",
15
16
  "0.162.155",
16
- "0.162.156"
17
+ "0.162.156",
18
+ "0.162.157",
19
+ "0.162.158"
17
20
  ],
18
21
  "date": null,
19
22
  "title": "",
20
23
  "sections": [
24
+ {
25
+ "heading": "Added — cc CLI 0.162.158:browser_state agent 工具 + REPL /remote-control + web-panel 直连配对/审批卡片 + 交付物预览下载(CLI-only npm 发版)",
26
+ "body": "> `chainlesschain` 0.162.157 → **0.162.158** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` + web-panel dist 随包;未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。命令数不变(**173**);AGENT_TOOLS **24 → 25**(新增 `browser_state`)。\n\n- **`browser_state` 一等 agent 工具(IDE gap P1 #8 收口)**:Chrome CDP 连接器(`cc browse chrome`)暴露为第 25 个 agent 工具——URL/标题/标签页 + 观察窗口 console/失败网络请求 + DOM 快照(agent 面 40k cap,CLI 命令面 150k)+ 可选截图(**生成的**临时路径,防 agent 自选路径经读工具覆盖任意文件);LOW/READ/plan 模式可用,纯观察不点击不输入不导航,仅 loopback CDP。\n- **REPL `/remote-control`(别名 `/rc`)on|off|status(批 26)**:交互式会话内起自托管 WS + RemoteApprovalBridge 配对(URI + 可选二维码),TAB 补全 + /help;`cc agent --remote-control` 对交互式会话同样生效(启动失败降级 local-only 不中断会话)。**交互式远程审批赛跑语义**(新 `src/repl/remote-approval.js`):两个交互 confirmer(ApprovalGate + settings/hook ask)把终端 prompt 与已配对设备赛跑,先答先赢;与 headless 刻意不同——远端超时/断开**不是决定**(静默的手机永不代键盘用户 auto-deny),设备先答则取消本地 readline 并压掉其搁浅的 idle-timeout。\n- **web-panel 直连(direct-LAN)配对 + `permission.request` 审批卡片(批 28)**:remoteSession store 自动识别双 URI 方案——relay E2EE 路径不变,新增 `chainlesschain://remote-control/pair#` 直连 transport(browser 版 parseDirectPairingUri + 客户端过期检查);直连控制走 remote-session-publish **顶层 commandId+seq**(applyControlIdempotent direct-client 契约);一次性 pairing token → 直连断开**刻意不自动重连**(重 join 必失败,诚实 disconnected 态 + 重配对提示);两种 transport 喂同一 pendingApprovals 卡片(requestId 去重 + permission.resolved 任意裁决方清除 + 首等公民审批卡列表批准/拒绝)。\n- **交付物 Markdown 预览 + 浏览器下载(批 25)**:面板 text/markdown 预览走既有 MarkdownRenderer(marked+DOMPurify+hljs,零新依赖);新 `GET /api/artifacts/<id>/download` 流式下载完整存档副本(WS 预览仍 cap)——Content-Disposition(RFC 5987)+ no-store/nosniff + 配置 wsToken 时同 WS 强度 token 门(sha256+timingSafeEqual,Bearer 头不进 URL)+ basename 防篡改守卫。\n- **安全修复 ×2**:① **直连配对信任边界**——直连(LAN)配对无密码学主机身份(区别 relay E2EE),钓鱼配对 URI 可把面板指向任意公网 ws:// 端点导走 serverToken/prompt/审批决定;两端 parser(web-panel + CLI 孪生)现拒绝指向非私网主机的明文 ws://(仅 loopback/RFC-1918/link-local/ULA,即 pickLanAddress 可能产出的全集;wss:// 不限),IPv6 括号 + IPv4-mapped 点分/hex 双形态识别,RED 反证过。② **chrome-connector launch-arg 加固**——launch URL 曾逐字进 Chrome argv(`--` 开头值被 Chrome 当开关解析=潜在命令执行面),现限 http(s)://、about:(URL parse 校验字节原样透传)+ CDP 端口处处整型边界校验。\n- **健壮性**:web-panel 审批卡发送失败恢复——approve() 乐观清除后若答复未离开本端(直连 publish 拒绝/socket 断/relay 未配对)恢复卡片并浮错,可重新裁决;失败窗口内别设备已 resolved 则抑制恢复(无僵尸卡)。RED 反证 + web-panel 全套 2512 绿。\n- **测试稳健性(仓库面,不进 npm 包)**:checkpoint-store `vi.setConfig 30s` + web-panel doctor 90s 两处负载敏感预算加固(trap #31 形态);ai-doc-creator 集成测试改 chdir tmpDir,不再向仓库根泄漏 12 个产物文件。"
27
+ },
28
+ {
29
+ "heading": "Added — cc CLI 0.162.157:diff 审阅修订摘要 + plan 审阅快照 + Chrome 连接器 + Artifacts + Windows/PowerShell 一等 + --bare/无斜杠/读屏模式(CLI-only npm 发版)",
30
+ "body": "> `chainlesschain` 0.162.156 → **0.162.157** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`)。纯 `packages/cli/src` + 依赖指针(`@chainlesschain/personal-data-hub` 0.4.50→**0.4.51**,交易短信→金额事件,已先行在 npm);命令数 **172 → 173**(新增顶层 `cc artifacts`,13 文档面已扫);无 Android cc bundle rollover / 无 USR_VERSION 改动。agent-sdk 0.1.1(plan review payload additive 类型)此前已在 npm。\n\n- **Artifacts v1:`publish_artifact` agent 工具 + `cc artifacts` 命令**:agent 完成的交付物(报告/图表/构建产物)发布到 `~/.chainlesschain/artifacts`(index.jsonl + 按 id 存文件,title/kind/mime/sha256/session/TTL 元数据,100MB 守卫)——**只有元数据进对话/transcript**,大产物不再撑爆上下文;`cc artifacts list|show|open|remove|clean`(别名 `artifact`)管理与打开;工具 LOW 风险、plan 模式禁用(AGENT_TOOLS 23→24)。\n- **Windows/PowerShell 一等公民(批 22)**:run_shell 新增可选 `shell` 参数(`default|cmd|powershell|pwsh`),选择链 per-call > settings `shell.windowsDefault`(win32-only 分层,`CC_WINDOWS_SHELL` env 胜出)> 平台默认(未配置路径字节不变);PowerShell 经**显式 argv** 运行(`-NoProfile [-ExecutionPolicy <enum 校验>] -Command`,防 argv 走私);权限规则新增 `PowerShell(...)` 伞形族与 `shell:pwsh` 参数域;settings hooks 每 hook 可声明 `shell: powershell|pwsh`。结果携带 `shell`/`shell_note`。\n\n- **IDE diff 审阅:agent 能看到你改了什么(gap #4 收口的 CLI 面)**:在 IDE diff 里编辑 proposed content 后 Accept,工具结果此前只带 `userEdited: true` 布尔——agent 不知道你具体改了什么,其对文件的心智模型仍是它自己的原提案。现在新增 `userAmendments`:新纯核 `summarizeUserAmendments`(`lib/ide-context.js`)产出提案→实际写入的 -/+ 行级摘要,按最终文件 1-based 行锚定分块(复用 note-versioning 的 simpleDiff LCS;纯插入/删除直排防幻影空行;1M cell 守卫降级粗块;行数/字符双 cap)。配合 JetBrains 0.4.55(可编辑右栏回读)/ VS Code 0.37.x(原生支持)形成端到端闭环。\n- **plan 审阅快照写入会话(IDE plan review 的 CLI 协议面)**:`{type:\"plan\", action:\"approve\"|\"reject\"}` 控制消息现可携带 `review` 载荷(IDE 端 Markdown 审阅文档的快照 + 元数据,24k cap),CLI 把它写进会话 transcript——计划批准/拒绝留档可审计可回放(headless-stream.js;agent-sdk 0.1.1 `PlanControlInput.review` 类型同步)。\n- **`--bare`(`CC_BARE`)裸模式**:`--safe-mode` 全开关之上再关 skills(`CC_SKILLS=0`)、plugins(`CC_PLUGINS=0`)与 MCP/IDE/PDH/JetBrains 自动连接——两个新 env 各在单一咽喉点生效(skill-loader `loadAll` / plugin-runtime `discoverPlugins`);显式 `--mcp-config/--ide/--pdh/--jetbrains` 仍胜出;权限规则不放松。最小攻击面/最快启动的干净 agent 环境。\n- **`--disable-slash-commands`(`CC_DISABLE_SLASH_COMMANDS`)**:REPL 里 `/` 开头输入原样送模型(纯谓词 + NUL 哨兵,`lib/slash-dispatch`);`/exit`、`/quit` 保留;TAB 补全不再提示斜杠命令;宏与 MCP prompt 展开一并旁路。粘贴含 `/` 行首文本不再误触发。\n- **`--ax-screen-reader`(`CC_SCREEN_READER`)读屏友好模式**:mono 主题(零 ANSI 色)+ 状态栏关闭(新 `lib/accessibility.js`)——读屏器不再逐字念转义序列与高频刷新的状态行。\n- **`cc browse chrome status|launch|state`**:与 `browse fetch/scrape`(每次冷启空白 headless 浏览器)不同,连接器经 CDP attach 到**用户自己的 Chrome**,页面状态带着登录会话。`launch` 启动可调试 Chrome(默认**专用配置目录** `~/.chainlesschain/chrome-profile`——登录一次持久复用;`--default-profile` 可选复用真实配置但要求所有 Chrome 窗口先关闭);`status` 探测 CDP 端口;`state` attach 后观察窗口期内的 console 消息与失败/4xx-5xx 网络请求(CDP 无追溯历史,`--reload` 可捕获加载期输出),快照 URL/标题/DOM(默认 150k cap)/可选截图,断开不杀浏览器。安全注记:CDP 端口是本机无鉴权控制通道,仅绑 loopback,用完关闭该 Chrome。查找 Chrome/Edge 可执行文件跨三平台(`CHROME_PATH` 优先)。attach 后 page targets 有挂载延迟——轮询 3s 而非误报\"无标签页\"。6 单测(注入 deps)+ 真 Chrome 145 live e2e(discover→attach→console/network 捕获→DOM→截图→干净断开)。两 IDE 插件入口(VS `ChainlessChain: Chrome Connector` / JB Tools 同名)已随 VS Code 0.37.10 / JetBrains 0.4.53 上市场——本版补上其依赖的 CLI 端命令。"
31
+ },
21
32
  {
22
33
  "heading": "Added — cc CLI 0.162.156:agenda/batch 双命令(第四阶段收口)+ @chainlesschain/agent-sdk 0.1.0 npm 首发(CLI-only npm 发版)",
23
34
  "body": "> `chainlesschain` 0.162.155 → **0.162.156** 发 npm `latest`(经 `npm-publish.yml`,`--provenance --access public`);**`@chainlesschain/agent-sdk` 0.1.0 同 run 首发 npm**(平台化第三阶段产物,npm-publish.yml / release.yml 均已加发布 step,防 trap #127 漏发)。纯 `packages/cli/src`(+web-panel dist 随包)+ 新独立包,未触 `pdh/lib` → 无 Android cc bundle rollover / 无 USR_VERSION 改动。命令数 **170 → 172**(新增顶层 `agenda`/`batch`,清单已重生,13 文档面已扫)。\n\n- **`cc agenda` + notify/schedule 双 agent 工具(第四阶段批19)**:Monitor/Cron/Push 暴露为 agent 可调工具(AGENT_TOOLS 21→23)——`notify` 推送到用户已配置的多通道通知器(Telegram/企业微信/钉钉/飞书);`schedule` 一工具五动作(wakeup/cron/monitor/list/cancel),单轮进程持不住定时器 → 意图持久化到 `~/.chainlesschain/agent-schedule/*.jsonl`(0600),由 `cc agenda list|run|cancel` 消费触发(wakeup/cron 到期 spawn `cc agent -p`,monitor 跑命令匹配 stop_when 即通知)。两工具 LOW 风险、plan 模式禁用;29 单测 + 真进程 smoke。\n- **`cc batch` 动态 worktree 批处理(第四阶段批20,第四阶段全收口)**:把大改动拆成独立单元并行跑——`--units <file>` 或 `--decompose <goal> --parts N`(agent 经 `--json-schema` 产单元 JSON,`--plan-only` 只打印);每单元独立 git worktree(复用 `cc team --worktree` 的 worktree-isolator),`--test` 门控、`--merge` 顺序集成(后合分支与已合冲突时报告不强合、测试失败单元永不合并);15 单测 + 2 真 git/worktree 集成测试。\n- **`@chainlesschain/agent-sdk` 0.1.0 首发**:`cc agent` stream-json 双工协议的 TypeScript 正式契约(Agent Protocol v1)——流式事件全词汇 + 审批回调(fail-closed)+ 检查点 + 会话恢复;`AgentSession` spawn 客户端(Windows `cmd.exe /c` shim + `NoDefaultCurrentDirectoryInExePath` 反劫持 + `taskkill /T` 进程树回收内置)、`attachBackgroundSession` 后台管道接管、`/browser` 浏览器安全入口(web-panel bg-\\* 帧)、`/protocol` 纯类型入口;双构建 ESM+CJS,零运行时依赖,36 测试(单元+真管道集成+真 CLI e2e)。VS Code 扩展(vendored)与 web-panel(vite alias)已消费;JetBrains 对齐语言中立 `docs/PROTOCOL.md`。用户文档 `docs-site/docs/chainlesschain/agent-sdk.md`。\n- 修复(随本版仓内,不在 cli 包面):SDK 真 CLI e2e 抓出的两 IDE 首会话不落盘洞(IDE 重载后 resume 静默空会话)已在两插件修复,随各自下次插件发版出货。"