cli-jaw 2.17.43 → 2.17.44
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.
- package/README.md +13 -2
- package/dist/bin/commands/slack.js +73 -7
- package/dist/bin/commands/slack.js.map +1 -1
- package/dist/server.js +46 -1
- package/dist/server.js.map +1 -1
- package/dist/src/agent/calendar-context.js +23 -0
- package/dist/src/agent/calendar-context.js.map +1 -0
- package/dist/src/agent/claude-runtime-run.js +10 -1
- package/dist/src/agent/claude-runtime-run.js.map +1 -1
- package/dist/src/agent/cursor-acp-models.js +139 -0
- package/dist/src/agent/cursor-acp-models.js.map +1 -0
- package/dist/src/agent/events/cursor.js +28 -4
- package/dist/src/agent/events/cursor.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +8 -2
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/native-runtime-run.js +22 -1
- package/dist/src/agent/native-runtime-run.js.map +1 -1
- package/dist/src/agent/runtime/acp/config.js +76 -11
- package/dist/src/agent/runtime/acp/config.js.map +1 -1
- package/dist/src/agent/runtime/acp/cursor-session.js +6 -1
- package/dist/src/agent/runtime/acp/cursor-session.js.map +1 -1
- package/dist/src/agent/runtime/liveness.js +24 -0
- package/dist/src/agent/runtime/liveness.js.map +1 -0
- package/dist/src/agent/runtime/start-failure.js +61 -0
- package/dist/src/agent/runtime/start-failure.js.map +1 -0
- package/dist/src/agent/spawn/queue.js +11 -6
- package/dist/src/agent/spawn/queue.js.map +1 -1
- package/dist/src/agent/spawn.js +59 -17
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/cli/api-auth.js +6 -0
- package/dist/src/cli/api-auth.js.map +1 -1
- package/dist/src/manager/design/watcher.js +10 -2
- package/dist/src/manager/design/watcher.js.map +1 -1
- package/dist/src/memory/heartbeat.js +6 -0
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/messaging/channel-validate.js +5 -3
- package/dist/src/messaging/channel-validate.js.map +1 -1
- package/dist/src/messaging/redact.js +30 -8
- package/dist/src/messaging/redact.js.map +1 -1
- package/dist/src/messaging/send.js +7 -0
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/orchestrator/collect.js +5 -3
- package/dist/src/orchestrator/collect.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +10 -3
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +21 -9
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/request-registry.js +2 -0
- package/dist/src/orchestrator/request-registry.js.map +1 -1
- package/dist/src/prompt/builder.js +74 -6
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +22 -5
- package/dist/src/routes/messaging.js +105 -27
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/settings.js +20 -8
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/slack-tools.js +176 -0
- package/dist/src/routes/slack-tools.js.map +1 -0
- package/dist/src/slack/action-rate.js +43 -0
- package/dist/src/slack/action-rate.js.map +1 -0
- package/dist/src/slack/action-runtime.js +243 -0
- package/dist/src/slack/action-runtime.js.map +1 -0
- package/dist/src/slack/action-store.js +84 -0
- package/dist/src/slack/action-store.js.map +1 -0
- package/dist/src/slack/action-types.js +6 -0
- package/dist/src/slack/action-types.js.map +1 -0
- package/dist/src/slack/actions-canvas.js +108 -0
- package/dist/src/slack/actions-canvas.js.map +1 -0
- package/dist/src/slack/actions-channel.js +88 -0
- package/dist/src/slack/actions-channel.js.map +1 -0
- package/dist/src/slack/actions-interactions.js +204 -0
- package/dist/src/slack/actions-interactions.js.map +1 -0
- package/dist/src/slack/actions-lists.js +308 -0
- package/dist/src/slack/actions-lists.js.map +1 -0
- package/dist/src/slack/actions-message.js +117 -0
- package/dist/src/slack/actions-message.js.map +1 -0
- package/dist/src/slack/actions-resources.js +62 -0
- package/dist/src/slack/actions-resources.js.map +1 -0
- package/dist/src/slack/actions-rts.js +88 -0
- package/dist/src/slack/actions-rts.js.map +1 -0
- package/dist/src/slack/actions-schedule.js +214 -0
- package/dist/src/slack/actions-schedule.js.map +1 -0
- package/dist/src/slack/actions.js +17 -0
- package/dist/src/slack/actions.js.map +1 -0
- package/dist/src/slack/api.js +56 -9
- package/dist/src/slack/api.js.map +1 -1
- package/dist/src/slack/blocks.js +162 -0
- package/dist/src/slack/blocks.js.map +1 -0
- package/dist/src/slack/bot.js +562 -378
- package/dist/src/slack/bot.js.map +1 -1
- package/dist/src/slack/commands.js +24 -5
- package/dist/src/slack/commands.js.map +1 -1
- package/dist/src/slack/context.js +15 -4
- package/dist/src/slack/context.js.map +1 -1
- package/dist/src/slack/conversation.js +135 -33
- package/dist/src/slack/conversation.js.map +1 -1
- package/dist/src/slack/events.js +41 -17
- package/dist/src/slack/events.js.map +1 -1
- package/dist/src/slack/format.js +181 -0
- package/dist/src/slack/format.js.map +1 -1
- package/dist/src/slack/history.js +133 -8
- package/dist/src/slack/history.js.map +1 -1
- package/dist/src/slack/ingress.js +26 -9
- package/dist/src/slack/ingress.js.map +1 -1
- package/dist/src/slack/interaction-store.js +56 -0
- package/dist/src/slack/interaction-store.js.map +1 -0
- package/dist/src/slack/manifest.js +3 -0
- package/dist/src/slack/manifest.js.map +1 -1
- package/dist/src/slack/message-content.js +132 -0
- package/dist/src/slack/message-content.js.map +1 -0
- package/dist/src/slack/message.js +58 -0
- package/dist/src/slack/message.js.map +1 -0
- package/dist/src/slack/notice-transport.js +49 -19
- package/dist/src/slack/notice-transport.js.map +1 -1
- package/dist/src/slack/operator-auth.js +62 -0
- package/dist/src/slack/operator-auth.js.map +1 -0
- package/dist/src/slack/progress-activity.js +210 -0
- package/dist/src/slack/progress-activity.js.map +1 -0
- package/dist/src/slack/progress-detail.js +473 -0
- package/dist/src/slack/progress-detail.js.map +1 -0
- package/dist/src/slack/progress-files.js +70 -0
- package/dist/src/slack/progress-files.js.map +1 -0
- package/dist/src/slack/progress-lifecycle.js +223 -0
- package/dist/src/slack/progress-lifecycle.js.map +1 -0
- package/dist/src/slack/progress-restore.js +81 -0
- package/dist/src/slack/progress-restore.js.map +1 -0
- package/dist/src/slack/progress.js +325 -143
- package/dist/src/slack/progress.js.map +1 -1
- package/dist/src/slack/quote.js +227 -0
- package/dist/src/slack/quote.js.map +1 -0
- package/dist/src/slack/render-features.js +105 -0
- package/dist/src/slack/render-features.js.map +1 -0
- package/dist/src/slack/reply-delivery.js +110 -0
- package/dist/src/slack/reply-delivery.js.map +1 -0
- package/dist/src/slack/rts-output-store.js +143 -0
- package/dist/src/slack/rts-output-store.js.map +1 -0
- package/dist/src/slack/scope-status.js +17 -3
- package/dist/src/slack/scope-status.js.map +1 -1
- package/dist/src/slack/search-quote.js +70 -0
- package/dist/src/slack/search-quote.js.map +1 -0
- package/dist/src/slack/search.js +54 -0
- package/dist/src/slack/search.js.map +1 -0
- package/dist/src/slack/send-handler.js +11 -7
- package/dist/src/slack/send-handler.js.map +1 -1
- package/dist/src/slack/send-only-client.js +116 -79
- package/dist/src/slack/send-only-client.js.map +1 -1
- package/dist/src/slack/table-content.js +253 -0
- package/dist/src/slack/table-content.js.map +1 -0
- package/dist/src/slack/table-verification.js +64 -0
- package/dist/src/slack/table-verification.js.map +1 -0
- package/dist/src/slack/task-input.js +55 -0
- package/dist/src/slack/task-input.js.map +1 -0
- package/dist/src/slack/tool-access.js +127 -0
- package/dist/src/slack/tool-access.js.map +1 -0
- package/dist/src/slack/tool-capabilities.js +47 -0
- package/dist/src/slack/tool-capabilities.js.map +1 -0
- package/dist/src/slack/tool-context.js +91 -0
- package/dist/src/slack/tool-context.js.map +1 -0
- package/dist/src/slack/verified-workspace.js +17 -6
- package/dist/src/slack/verified-workspace.js.map +1 -1
- package/dist/src/trace/redact.js +2 -1
- package/dist/src/trace/redact.js.map +1 -1
- package/package.json +1 -1
- package/public/dist/.vite/manifest.json +102 -102
- package/public/dist/assets/{Agent-CQ4EBgY8.js → Agent-CNad_A6t.js} +1 -1
- package/public/dist/assets/{ChannelEnablementControl-JsYvNMlM.js → ChannelEnablementControl-DwUDKjX9.js} +4 -4
- package/public/dist/assets/{ChannelSetupEntry-BpyRWEUE.js → ChannelSetupEntry-DH0AuNNX.js} +1 -1
- package/public/dist/assets/{ChannelsDiscord-DNfvz1jn.js → ChannelsDiscord-7NmoTjR7.js} +1 -1
- package/public/dist/assets/{ChannelsSlack-DzpxIdgW.js → ChannelsSlack-Ba0ax6iT.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-CUhFc5s6.js → ChannelsTelegram-DKA9atf2.js} +1 -1
- package/public/dist/assets/{app-Q0prKOFx.js → app-9OQNfmqw.js} +4 -4
- package/public/dist/assets/{bgtask-badge-DAcWaUfS.js → bgtask-badge-BvxHqMGi.js} +1 -1
- package/public/dist/assets/bgtask-badge-DeSZJGNN.js +1 -0
- package/public/dist/assets/{employees-CWS3Juca.js → employees-CkUqN4oh.js} +1 -1
- package/public/dist/assets/{iframe-renderer-DCDKBMb7.js → iframe-renderer-C2gchtOj.js} +2 -2
- package/public/dist/assets/iframe-renderer-DfvACXIn.js +1 -0
- package/public/dist/assets/{manager-v6GYfoPB.js → manager-rb5X-4DJ.js} +1 -1
- package/public/dist/assets/{memory-DhNdKZLO.js → memory-BiWzpoBq.js} +1 -1
- package/public/dist/assets/memory-Ckp1Eq5a.js +1 -0
- package/public/dist/assets/message-history-Bv0l_t7O.js +1 -0
- package/public/dist/assets/{message-history-DbRTl1P0.js → message-history-CuFefS02.js} +1 -1
- package/public/dist/assets/{render-DP8SJtdZ.js → render-DUGqq9Mu.js} +1 -1
- package/public/dist/assets/{settings-85n9NjvX.js → settings-BqUHavbH.js} +1 -1
- package/public/dist/assets/settings-C81Kf9uX.js +1 -0
- package/public/dist/assets/{settings-C9_D-pn0.js → settings-DQ1fLygB.js} +31 -30
- package/public/dist/assets/{settings-core-BcVD2FgV.js → settings-core-CzdXfoOK.js} +1 -1
- package/public/dist/assets/settings-core-DO_5M7Lv.js +1 -0
- package/public/dist/assets/{settings-embedding-BSpq785l.js → settings-embedding-BAKFrVLV.js} +1 -1
- package/public/dist/assets/{settings-types-B09BmpYe.js → settings-types-D3cd6SWy.js} +1 -1
- package/public/dist/assets/{sidebar-BVhLb5Ft.js → sidebar-CvGbp9x5.js} +3 -3
- package/public/dist/assets/skills-DFpPmMUR.js +1 -0
- package/public/dist/assets/{skills-X7qxmHka.js → skills-abLMqY5_.js} +1 -1
- package/public/dist/assets/slash-commands-BU58xYih.js +1 -0
- package/public/dist/assets/{slash-commands-BnDH4IU_.js → slash-commands-D8o9pqOS.js} +1 -1
- package/public/dist/assets/{trace-drawer-DasaS1z4.js → trace-drawer-C6RvkUAd.js} +1 -1
- package/public/dist/assets/{ui-BtiBTXng.js → ui-Bxapl_Eu.js} +1 -1
- package/public/dist/assets/ui-CUB4iwz3.js +1 -0
- package/public/dist/index.html +1 -1
- package/public/dist/manager/index.html +1 -1
- package/public/dist/settings/index.html +1 -1
- package/public/js/features/settings-cli-status.ts +11 -1
- package/public/js/features/settings-types.ts +21 -0
- package/public/locales/en.json +34 -1
- package/public/locales/ja.json +34 -1
- package/public/locales/ko.json +34 -1
- package/public/locales/zh.json +34 -1
- package/scripts/check-native-load.cjs +17 -4
- package/scripts/release-gates.mjs +84 -3
- package/scripts/service-artifact.mjs +157 -0
- package/scripts/service-shell/zsh/.zlogin +23 -0
- package/scripts/service-shell/zsh/.zlogout +23 -0
- package/scripts/service-shell/zsh/.zprofile +23 -0
- package/scripts/service-shell/zsh/.zshenv +23 -0
- package/scripts/service-shell/zsh/.zshrc +23 -0
- package/public/dist/assets/bgtask-badge-DHA2OQm8.js +0 -1
- package/public/dist/assets/iframe-renderer-RpvBly2x.js +0 -1
- package/public/dist/assets/memory-4YH8sz0L.js +0 -1
- package/public/dist/assets/message-history-lVcLpAw8.js +0 -1
- package/public/dist/assets/settings--EGy3_B9.js +0 -1
- package/public/dist/assets/settings-core-8wBl1mg-.js +0 -1
- package/public/dist/assets/skills-6GFkHTlQ.js +0 -1
- package/public/dist/assets/slash-commands-qu8fPAZ3.js +0 -1
- package/public/dist/assets/ui-BucJ1zMA.js +0 -1
package/public/locales/ko.json
CHANGED
|
@@ -938,5 +938,38 @@
|
|
|
938
938
|
"onboarding.hint.discord.guildId": "개발자 모드를 켠 뒤 서버를 우클릭해 ID 복사.",
|
|
939
939
|
"onboarding.hint.slack.botToken": "OAuth & Permissions의 Bot User OAuth Token (xoxb-로 시작).",
|
|
940
940
|
"onboarding.hint.slack.appToken": "Basic Information → App-Level Tokens (xapp-, connections:write).",
|
|
941
|
-
"onboarding.progressLabel": "{total}단계 중 {step}단계"
|
|
941
|
+
"onboarding.progressLabel": "{total}단계 중 {step}단계",
|
|
942
|
+
"slack.progress.title": "요청 진행 상황",
|
|
943
|
+
"slack.progress.activityTitle": "최근 작업",
|
|
944
|
+
"slack.progress.deliveryTitle": "답변 전달",
|
|
945
|
+
"slack.progress.queued": "대기열에서 대기 중",
|
|
946
|
+
"slack.progress.running": "작업 활동 관찰 중",
|
|
947
|
+
"slack.progress.waiting": "다음 업데이트를 기다리는 중",
|
|
948
|
+
"slack.progress.delivering": "답변 전달 중",
|
|
949
|
+
"slack.progress.complete": "작업 관찰 종료",
|
|
950
|
+
"slack.progress.error": "요청 실패",
|
|
951
|
+
"slack.progress.cancelled": "요청 취소됨",
|
|
952
|
+
"slack.progress.expired": "진행 표시가 종료되었습니다. 실행은 계속될 수 있습니다.",
|
|
953
|
+
"slack.progress.merged": "다른 요청과 합쳐짐",
|
|
954
|
+
"slack.progress.removed": "요청 제거됨",
|
|
955
|
+
"slack.progress.restored": "이전 진행 표시가 종료되었습니다. 실행 결과는 확인되지 않았습니다.",
|
|
956
|
+
"slack.progress.failure": "응답을 완료하지 못했습니다.",
|
|
957
|
+
"slack.progress.elapsed": "경과: {seconds}초",
|
|
958
|
+
"slack.progress.lastActivity": "마지막 활동: {seconds}초 전",
|
|
959
|
+
"slack.progress.category.read": "파일 읽기",
|
|
960
|
+
"slack.progress.category.write": "파일 편집",
|
|
961
|
+
"slack.progress.category.search": "검색",
|
|
962
|
+
"slack.progress.category.web": "웹페이지 읽기",
|
|
963
|
+
"slack.progress.category.command": "명령 실행",
|
|
964
|
+
"slack.progress.category.external": "외부 도구",
|
|
965
|
+
"slack.progress.category.tool": "도구 활동",
|
|
966
|
+
"slack.progress.status.observed": "관찰됨",
|
|
967
|
+
"slack.progress.status.in_progress": "진행 중",
|
|
968
|
+
"slack.progress.status.complete": "완료",
|
|
969
|
+
"slack.progress.status.error": "오류",
|
|
970
|
+
"slack.progress.status.stopped": "중단됨",
|
|
971
|
+
"slack.progress.status.unconfirmed": "완료 미확인",
|
|
972
|
+
"slack.progress.deliveryComplete": "답변 전달 완료",
|
|
973
|
+
"slack.progress.deliveryFailed": "답변 전달을 확인하지 못했습니다",
|
|
974
|
+
"slack.progress.deliveryUnconfirmed": "답변 전달 여부 미확인"
|
|
942
975
|
}
|
package/public/locales/zh.json
CHANGED
|
@@ -938,5 +938,38 @@
|
|
|
938
938
|
"settings.channel.testSend": "测试发送",
|
|
939
939
|
"settings.channel.testSendFail": "发送失败:{error}",
|
|
940
940
|
"settings.channel.testSendOk": "发送成功",
|
|
941
|
-
"onboarding.progressLabel": "第 {step} 步,共 {total} 步"
|
|
941
|
+
"onboarding.progressLabel": "第 {step} 步,共 {total} 步",
|
|
942
|
+
"slack.progress.title": "请求进度",
|
|
943
|
+
"slack.progress.activityTitle": "最近的工作",
|
|
944
|
+
"slack.progress.deliveryTitle": "答复发送",
|
|
945
|
+
"slack.progress.queued": "排队中",
|
|
946
|
+
"slack.progress.running": "正在观察活动",
|
|
947
|
+
"slack.progress.waiting": "等待下一次更新",
|
|
948
|
+
"slack.progress.delivering": "正在发送答复",
|
|
949
|
+
"slack.progress.complete": "工作观察已结束",
|
|
950
|
+
"slack.progress.error": "请求失败",
|
|
951
|
+
"slack.progress.cancelled": "请求已取消",
|
|
952
|
+
"slack.progress.expired": "进度显示已结束,执行可能仍在继续。",
|
|
953
|
+
"slack.progress.merged": "已合并至其他请求",
|
|
954
|
+
"slack.progress.removed": "请求已移除",
|
|
955
|
+
"slack.progress.restored": "之前的进度显示已结束,执行结果尚未确认。",
|
|
956
|
+
"slack.progress.failure": "未能完成回复。",
|
|
957
|
+
"slack.progress.elapsed": "已用时:{seconds}秒",
|
|
958
|
+
"slack.progress.lastActivity": "上次活动:{seconds}秒前",
|
|
959
|
+
"slack.progress.category.read": "读取文件",
|
|
960
|
+
"slack.progress.category.write": "编辑文件",
|
|
961
|
+
"slack.progress.category.search": "搜索",
|
|
962
|
+
"slack.progress.category.web": "读取网页",
|
|
963
|
+
"slack.progress.category.command": "执行命令",
|
|
964
|
+
"slack.progress.category.external": "外部工具",
|
|
965
|
+
"slack.progress.category.tool": "工具活动",
|
|
966
|
+
"slack.progress.status.observed": "已观察",
|
|
967
|
+
"slack.progress.status.in_progress": "运行中",
|
|
968
|
+
"slack.progress.status.complete": "完成",
|
|
969
|
+
"slack.progress.status.error": "错误",
|
|
970
|
+
"slack.progress.status.stopped": "已停止",
|
|
971
|
+
"slack.progress.status.unconfirmed": "完成未确认",
|
|
972
|
+
"slack.progress.deliveryComplete": "答复已发送",
|
|
973
|
+
"slack.progress.deliveryFailed": "无法确认答复已发送",
|
|
974
|
+
"slack.progress.deliveryUnconfirmed": "答复发送情况未确认"
|
|
942
975
|
}
|
|
@@ -98,14 +98,27 @@ if (!ptyRoot) {
|
|
|
98
98
|
|
|
99
99
|
// 2. spawn-helper must be present AND executable, or every pty dies at
|
|
100
100
|
// runtime with a permission error that no import check would catch.
|
|
101
|
-
|
|
101
|
+
//
|
|
102
|
+
// Resolved the same way the binary above is, and for the same reason.
|
|
103
|
+
// node-pty's install is `prebuild.js || node-gyp rebuild`: when the
|
|
104
|
+
// prebuilds match, prebuild.js exits 0, the source build never runs and
|
|
105
|
+
// build/Release is never created, so post-install.js has nothing to move
|
|
106
|
+
// there. Looking only in build/Release therefore failed the gate on a
|
|
107
|
+
// prebuild-only install even though node-pty itself would have loaded
|
|
108
|
+
// the prebuilt helper. Both locations are real; the executable bit is
|
|
109
|
+
// what actually has to hold.
|
|
102
110
|
if (process.platform !== 'win32') {
|
|
103
|
-
|
|
104
|
-
|
|
111
|
+
const helperCandidates = [
|
|
112
|
+
join(ptyRoot, 'build', 'Release', 'spawn-helper'),
|
|
113
|
+
join(ptyRoot, 'prebuilds', `${process.platform}-${process.arch}`, 'spawn-helper'),
|
|
114
|
+
];
|
|
115
|
+
const helper = helperCandidates.find((candidate) => existsSync(candidate));
|
|
116
|
+
if (!helper) {
|
|
117
|
+
fail(`missing spawn-helper: none of\n ${helperCandidates.join('\n ')}`);
|
|
105
118
|
} else {
|
|
106
119
|
try {
|
|
107
120
|
accessSync(helper, constants.X_OK);
|
|
108
|
-
note(`spawn-helper executable: mode ${(statSync(helper).mode & 0o777).toString(8)}`);
|
|
121
|
+
note(`spawn-helper executable: ${helper} (mode ${(statSync(helper).mode & 0o777).toString(8)})`);
|
|
109
122
|
} catch {
|
|
110
123
|
fail(`spawn-helper is not executable: ${helper} (mode ${(statSync(helper).mode & 0o777).toString(8)})`);
|
|
111
124
|
}
|
|
@@ -68,6 +68,70 @@ function readFile(rel) {
|
|
|
68
68
|
return fs.readFileSync(path.join(repoRoot, rel), 'utf8');
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
/**
|
|
72
|
+
* Lines only a git merge conflict produces. A bare `=======` is deliberately
|
|
73
|
+
* absent: it is also a Markdown setext H1 underline, so matching it would fail
|
|
74
|
+
* this gate on ordinary prose. Every real conflict carries the anchored
|
|
75
|
+
* `<<<<<<<`/`>>>>>>>` pair, so the pair is enough to see one.
|
|
76
|
+
*/
|
|
77
|
+
const CONFLICT_MARKER_RE = '^(<<<<<<< |\\|\\|\\|\\|\\|\\|\\| |>>>>>>> )';
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* tests/fixtures/manager-notes-wysiwyg holds canned conflict text on purpose —
|
|
81
|
+
* it is the INPUT to the notes conflict-rendering tests, not a merge leftover.
|
|
82
|
+
*/
|
|
83
|
+
const CONFLICT_SCAN_EXCLUDE = ':(exclude)tests/fixtures/manager-notes-wysiwyg/';
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Tracked files still carrying merge markers. `git grep` reads only tracked
|
|
87
|
+
* paths, so an untracked scratch file cannot fail the build, and `-I` skips
|
|
88
|
+
* binaries. A status other than 0 (found) or 1 (clean) means the scan did not
|
|
89
|
+
* actually run, which is reported rather than silently passed.
|
|
90
|
+
*/
|
|
91
|
+
function grepConflictMarkers(cwd, prefix) {
|
|
92
|
+
const r = run('git', ['grep', '-n', '-I', '-E', CONFLICT_MARKER_RE, '--', '.', CONFLICT_SCAN_EXCLUDE],
|
|
93
|
+
{ timeout: 60_000, cwd });
|
|
94
|
+
if (r.status === 1) return { hits: [] };
|
|
95
|
+
if (r.status !== 0) {
|
|
96
|
+
const why = [r.stderr, r.stdout].filter(Boolean).join(' ').trim() || `status ${r.status}`;
|
|
97
|
+
return { error: `conflict-marker scan could not run in ${prefix || '.'}: ${why}` };
|
|
98
|
+
}
|
|
99
|
+
const hits = String(r.stdout || '').split('\n').filter(Boolean)
|
|
100
|
+
.map(line => (prefix ? `${prefix}/${line}` : line));
|
|
101
|
+
return { hits };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* `git grep` stops at a gitlink, and a marker committed inside a submodule
|
|
106
|
+
* ships when that submodule is published — the same reason
|
|
107
|
+
* check-private-boundary.mjs enumerates submodule contents instead of trusting
|
|
108
|
+
* `ls-files`. So each CHECKED-OUT submodule is scanned in its own right. An
|
|
109
|
+
* uninitialised one holds no working tree to read; it is named in the detail
|
|
110
|
+
* rather than counted as clean, because "nothing to scan" is not "scanned and
|
|
111
|
+
* clean".
|
|
112
|
+
*/
|
|
113
|
+
function trackedConflictMarkers() {
|
|
114
|
+
const root = grepConflictMarkers(repoRoot, '');
|
|
115
|
+
if (root.error) return root;
|
|
116
|
+
const hits = [...root.hits];
|
|
117
|
+
const unscanned = [];
|
|
118
|
+
const listed = run('git', ['submodule', 'status'], { timeout: 30_000 });
|
|
119
|
+
if (listed.status === 0) {
|
|
120
|
+
for (const line of String(listed.stdout || '').split('\n').filter(Boolean)) {
|
|
121
|
+
// ' <sha> <path> (<describe>)', where a leading '-' means the
|
|
122
|
+
// submodule was never initialised in this checkout.
|
|
123
|
+
const parsed = line.match(/^(.)[0-9a-f]+\s+(\S+)/);
|
|
124
|
+
if (!parsed) continue;
|
|
125
|
+
const [, state, rel] = parsed;
|
|
126
|
+
if (state === '-') { unscanned.push(rel); continue; }
|
|
127
|
+
const nested = grepConflictMarkers(path.join(repoRoot, rel), rel);
|
|
128
|
+
if (nested.error) return nested;
|
|
129
|
+
hits.push(...nested.hits);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return { hits, unscanned };
|
|
133
|
+
}
|
|
134
|
+
|
|
71
135
|
const FORBIDDEN_IN_READY = [
|
|
72
136
|
/external[-\s]?cdp/i,
|
|
73
137
|
/remote[-\s]?cdp/i,
|
|
@@ -417,13 +481,30 @@ const GATES = {
|
|
|
417
481
|
},
|
|
418
482
|
},
|
|
419
483
|
'doc-drift': {
|
|
420
|
-
description: 'structure docs match live inventory (
|
|
484
|
+
description: 'no tracked file carries merge conflict markers (every run) + structure docs match live inventory (local only)',
|
|
421
485
|
check() {
|
|
486
|
+
// A merge that commits its own conflict markers is the one docs
|
|
487
|
+
// failure CI has to catch, and nothing did: the #660 merge landed 14
|
|
488
|
+
// unresolved blocks on dev (README.md, AGENTS.md, CLAUDE.md,
|
|
489
|
+
// structure/str_func.md) and gate:all still went green, because the
|
|
490
|
+
// inventory steps below are skipped on CI and nothing else reads
|
|
491
|
+
// those files' contents. This scan is a string match on tracked
|
|
492
|
+
// paths — platform-neutral — so it runs before that skip.
|
|
493
|
+
const markers = trackedConflictMarkers();
|
|
494
|
+
if (markers.error) return { ok: false, detail: markers.error };
|
|
495
|
+
if (markers.hits.length) {
|
|
496
|
+
const sample = markers.hits.slice(0, 5).join('; ');
|
|
497
|
+
const more = markers.hits.length > 5 ? ` (+${markers.hits.length - 5} more)` : '';
|
|
498
|
+
return { ok: false, detail: `${markers.hits.length} unresolved conflict marker line(s): ${sample}${more}` };
|
|
499
|
+
}
|
|
500
|
+
const unscanned = markers.unscanned?.length
|
|
501
|
+
? ` (not scanned, uninitialised submodule(s): ${markers.unscanned.join(', ')})`
|
|
502
|
+
: '';
|
|
422
503
|
// CI runners produce platform-dependent file/line inventories
|
|
423
504
|
// (no public/dist, different tracked-file set) that this gate
|
|
424
505
|
// cannot reconcile; it stays a local/pre-release discipline gate.
|
|
425
506
|
if (process.env.CI) {
|
|
426
|
-
return { ok: true, detail:
|
|
507
|
+
return { ok: true, detail: `conflict-marker scan clean${unscanned}; inventory steps skipped on CI (local/pre-release only)` };
|
|
427
508
|
}
|
|
428
509
|
const steps = [
|
|
429
510
|
{ name: 'docs:check', cmd: 'npm', args: ['run', 'docs:check', '--silent'], timeout: 120_000 },
|
|
@@ -435,7 +516,7 @@ const GATES = {
|
|
|
435
516
|
return { ok: false, detail: `${s.name} failed:\n${[r.stdout, r.stderr].filter(Boolean).join('\n').slice(-1500)}` };
|
|
436
517
|
}
|
|
437
518
|
}
|
|
438
|
-
return { ok: true, detail:
|
|
519
|
+
return { ok: true, detail: `conflict-marker scan clean${unscanned}; docs:check + check-doc-drift.sh clean` };
|
|
439
520
|
},
|
|
440
521
|
},
|
|
441
522
|
'path-length': {
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Local release launcher. No package imports: verification runs before the CLI.
|
|
3
|
+
// node scripts/service-artifact.mjs --root /absolute/release --manifest-sha256 HEX [--check] -- [CLI args]
|
|
4
|
+
// artifact-manifest.json: {schemaVersion:1,version:"2.17.42",entrypoint:"dist/bin/cli-jaw.js",files:{"relative/file":"sha256"}}
|
|
5
|
+
// The inventory covers every regular file, including this launcher, except the
|
|
6
|
+
// manifest itself. Package a runtime tree without symlinks (including .bin links).
|
|
7
|
+
// The digest is anchored outside the release, e.g. in launchd ProgramArguments.
|
|
8
|
+
// This detects drift, not a malicious owner changing both launcher and anchor.
|
|
9
|
+
// Keep releases immutable during verification/import; this is not a JS sandbox.
|
|
10
|
+
import { constants } from 'node:fs';
|
|
11
|
+
import { lstat, open, readdir, realpath } from 'node:fs/promises';
|
|
12
|
+
import { createHash } from 'node:crypto';
|
|
13
|
+
import { delimiter, dirname, isAbsolute, join, resolve } from 'node:path';
|
|
14
|
+
import { pathToFileURL } from 'node:url';
|
|
15
|
+
|
|
16
|
+
const MANIFEST = 'artifact-manifest.json';
|
|
17
|
+
const MAX_MANIFEST_BYTES = 16 * 1024 * 1024;
|
|
18
|
+
const MAX_FILES = 100_000;
|
|
19
|
+
const MAX_FILE_BYTES = 2 * 1024 * 1024 * 1024;
|
|
20
|
+
const SHA256 = /^[a-f0-9]{64}$/;
|
|
21
|
+
const ZSH_FILES = ['.zshenv', '.zprofile', '.zshrc', '.zlogin', '.zlogout'];
|
|
22
|
+
const ZSH_DIR = 'scripts/service-shell/zsh';
|
|
23
|
+
const fail = code => { throw new Error(code); };
|
|
24
|
+
const record = value => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
25
|
+
const exactKeys = (value, keys) => record(value) && Object.keys(value).length === keys.length
|
|
26
|
+
&& keys.every(key => Object.hasOwn(value, key));
|
|
27
|
+
|
|
28
|
+
function relativePath(value) {
|
|
29
|
+
return typeof value === 'string' && value.length > 0 && value.length <= 4096
|
|
30
|
+
&& !/[\\:\p{Cc}\p{Cf}]/u.test(value)
|
|
31
|
+
&& value.split('/').every(part => part && part !== '.' && part !== '..' && part === part.trim());
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function argumentsOf(args) {
|
|
35
|
+
const result = { check: false, cliArgs: [] };
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
for (let i = 0; i < args.length; i++) {
|
|
38
|
+
const flag = args[i];
|
|
39
|
+
if (flag === '--') { result.cliArgs = args.slice(i + 1); break; }
|
|
40
|
+
if (!['--root', '--manifest-sha256', '--check'].includes(flag) || seen.has(flag)) fail('invalid_arguments');
|
|
41
|
+
seen.add(flag);
|
|
42
|
+
if (flag === '--check') result.check = true;
|
|
43
|
+
else {
|
|
44
|
+
const value = args[++i];
|
|
45
|
+
if (!value || value.startsWith('--')) fail('invalid_arguments');
|
|
46
|
+
result[flag === '--root' ? 'root' : 'digest'] = value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (!result.root || !isAbsolute(result.root) || !SHA256.test(result.digest ?? '')) fail('invalid_arguments');
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function readRegular(file, limit, collect = false) {
|
|
54
|
+
const before = await lstat(file);
|
|
55
|
+
if (!before.isFile() || before.isSymbolicLink() || before.size > limit) fail('non_regular_or_oversized_file');
|
|
56
|
+
const handle = await open(file, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
57
|
+
try {
|
|
58
|
+
const opened = await handle.stat();
|
|
59
|
+
if (!opened.isFile() || opened.dev !== before.dev || opened.ino !== before.ino) fail('file_changed');
|
|
60
|
+
const hash = createHash('sha256'), chunks = [];
|
|
61
|
+
const buffer = Buffer.alloc(64 * 1024);
|
|
62
|
+
let bytes = 0;
|
|
63
|
+
for (;;) {
|
|
64
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, null);
|
|
65
|
+
if (!bytesRead) break;
|
|
66
|
+
bytes += bytesRead;
|
|
67
|
+
if (bytes > limit) fail('oversized_file');
|
|
68
|
+
hash.update(buffer.subarray(0, bytesRead));
|
|
69
|
+
if (collect) chunks.push(Buffer.from(buffer.subarray(0, bytesRead)));
|
|
70
|
+
}
|
|
71
|
+
const after = await handle.stat();
|
|
72
|
+
if (bytes !== before.size || after.size !== before.size || after.mtimeMs !== before.mtimeMs
|
|
73
|
+
|| after.ctimeMs !== before.ctimeMs) fail('file_changed');
|
|
74
|
+
return { digest: hash.digest('hex'), bytes, ...(collect ? { data: Buffer.concat(chunks) } : {}) };
|
|
75
|
+
} finally { await handle.close(); }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async function verify(options) {
|
|
79
|
+
const root = resolve(options.root);
|
|
80
|
+
if (await realpath(root) !== root || !(await lstat(root)).isDirectory()) fail('invalid_release_root');
|
|
81
|
+
const manifest = await readRegular(join(root, MANIFEST), MAX_MANIFEST_BYTES, true);
|
|
82
|
+
if (manifest.digest !== options.digest) fail('manifest_digest_mismatch');
|
|
83
|
+
let spec;
|
|
84
|
+
try { spec = JSON.parse(manifest.data.toString('utf8')); } catch { fail('invalid_manifest_json'); }
|
|
85
|
+
if (!exactKeys(spec, ['schemaVersion', 'version', 'entrypoint', 'files']) || spec.schemaVersion !== 1
|
|
86
|
+
|| typeof spec.version !== 'string' || !/^[0-9]+\.[0-9]+\.[0-9]+(?:[-+][A-Za-z0-9.+-]+)?$/.test(spec.version)
|
|
87
|
+
|| !relativePath(spec.entrypoint) || !/\.(?:mjs|js)$/.test(spec.entrypoint) || !record(spec.files)) fail('invalid_manifest');
|
|
88
|
+
const entries = Object.entries(spec.files);
|
|
89
|
+
if (!entries.length || entries.length > MAX_FILES || !Object.hasOwn(spec.files, spec.entrypoint)) fail('invalid_inventory');
|
|
90
|
+
for (const [file, digest] of entries) {
|
|
91
|
+
if (!relativePath(file) || file === MANIFEST || typeof digest !== 'string' || !SHA256.test(digest)) fail('invalid_inventory');
|
|
92
|
+
}
|
|
93
|
+
const seen = new Set();
|
|
94
|
+
const dirs = [''];
|
|
95
|
+
let directoryCount = 0, bytes = 0;
|
|
96
|
+
while (dirs.length) {
|
|
97
|
+
const relative = dirs.pop();
|
|
98
|
+
if (++directoryCount > MAX_FILES) fail('inventory_limit');
|
|
99
|
+
for (const name of await readdir(join(root, relative))) {
|
|
100
|
+
const file = relative ? `${relative}/${name}` : name;
|
|
101
|
+
if (!relativePath(file)) fail('unsafe_path');
|
|
102
|
+
const full = join(root, file), stat = await lstat(full);
|
|
103
|
+
if (stat.isSymbolicLink()) fail('symlink_not_allowed');
|
|
104
|
+
if (stat.isDirectory()) { dirs.push(file); continue; }
|
|
105
|
+
if (!stat.isFile()) fail('non_regular_file');
|
|
106
|
+
if (file === MANIFEST) continue;
|
|
107
|
+
if (!Object.hasOwn(spec.files, file)) fail('unlisted_file');
|
|
108
|
+
const verified = await readRegular(full, MAX_FILE_BYTES);
|
|
109
|
+
if (verified.digest !== spec.files[file]) fail('file_digest_mismatch');
|
|
110
|
+
seen.add(file); bytes += verified.bytes;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (seen.size !== entries.length) fail('missing_file');
|
|
114
|
+
const zshCount = ZSH_FILES.filter(name => seen.has(`${ZSH_DIR}/${name}`)).length;
|
|
115
|
+
if (zshCount && zshCount !== ZSH_FILES.length) fail('incomplete_shell_shims');
|
|
116
|
+
return { root, spec, receipt: { ok: true, schemaVersion: 1, version: spec.version,
|
|
117
|
+
manifestSha256: manifest.digest, entrypoint: spec.entrypoint, files: seen.size, bytes } };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const options = argumentsOf(process.argv.slice(2));
|
|
122
|
+
const { root, spec, receipt } = await verify(options);
|
|
123
|
+
if (options.check) console.log(JSON.stringify(receipt));
|
|
124
|
+
else {
|
|
125
|
+
const entry = join(root, spec.entrypoint);
|
|
126
|
+
process.argv = [process.execPath, entry, ...options.cliArgs];
|
|
127
|
+
process.env.CLI_JAW_BIN = entry;
|
|
128
|
+
// Packaging supplies hashed, regular-file jaw/cli-jaw aliases beside the
|
|
129
|
+
// entrypoint. Child tools must resolve those before npm's mutable bin.
|
|
130
|
+
const inheritedPath = process.env.PATH;
|
|
131
|
+
process.env.PATH = dirname(entry) + (inheritedPath ? delimiter + inheritedPath : '');
|
|
132
|
+
if (ZSH_FILES.every(name => Object.hasOwn(spec.files, `${ZSH_DIR}/${name}`))) {
|
|
133
|
+
// Forward the caller's ZDOTDIR, including unset versus explicitly empty.
|
|
134
|
+
// On launcher reentry retain the original user directory, not our shim.
|
|
135
|
+
const reentry = process.env.CLI_JAW_ZSH_SHIMS
|
|
136
|
+
&& process.env.ZDOTDIR === process.env.CLI_JAW_ZSH_SHIMS
|
|
137
|
+
&& ['0', '1'].includes(process.env.CLI_JAW_USER_ZDOTDIR_SET ?? '');
|
|
138
|
+
if (!reentry) {
|
|
139
|
+
process.env.CLI_JAW_USER_ZDOTDIR_SET = Object.hasOwn(process.env, 'ZDOTDIR') ? '1' : '0';
|
|
140
|
+
process.env.CLI_JAW_USER_ZDOTDIR = process.env.ZDOTDIR ?? '';
|
|
141
|
+
}
|
|
142
|
+
process.env.CLI_JAW_VERIFIED_BIN = dirname(entry);
|
|
143
|
+
process.env.CLI_JAW_ZSH_SHIMS = join(root, ZSH_DIR);
|
|
144
|
+
process.env.ZDOTDIR = process.env.CLI_JAW_ZSH_SHIMS;
|
|
145
|
+
}
|
|
146
|
+
await import(pathToFileURL(entry).href);
|
|
147
|
+
}
|
|
148
|
+
} catch (error) {
|
|
149
|
+
// Do not serialize paths, imported exception text or environment values.
|
|
150
|
+
const known = new Set(['invalid_arguments', 'non_regular_or_oversized_file', 'file_changed', 'oversized_file',
|
|
151
|
+
'invalid_release_root', 'manifest_digest_mismatch', 'invalid_manifest_json', 'invalid_manifest',
|
|
152
|
+
'invalid_inventory', 'inventory_limit', 'unsafe_path', 'symlink_not_allowed', 'non_regular_file',
|
|
153
|
+
'unlisted_file', 'file_digest_mismatch', 'missing_file', 'incomplete_shell_shims']);
|
|
154
|
+
const code = known.has(error?.message) ? error.message : error?.code === 'ENOENT' ? 'missing_file' : 'artifact_launch_failed';
|
|
155
|
+
console.error(JSON.stringify({ ok: false, error: code }));
|
|
156
|
+
process.exitCode = 1;
|
|
157
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Service-only zsh forwarding. Keep user configs at top level (no function scope).
|
|
2
|
+
# Reapply the verified bin after each usual config; this is not a shell sandbox.
|
|
3
|
+
# Bash/other shells, zsh -f, config exit/exec, and later PATH edits are not covered.
|
|
4
|
+
if [[ -n ${CLI_JAW_ZSH_SHIMS-} && -n ${CLI_JAW_VERIFIED_BIN-} ]]; then
|
|
5
|
+
if [[ ${CLI_JAW_USER_ZDOTDIR_SET-0} == 1 ]]; then
|
|
6
|
+
export ZDOTDIR="${CLI_JAW_USER_ZDOTDIR-}"
|
|
7
|
+
else
|
|
8
|
+
unset ZDOTDIR
|
|
9
|
+
fi
|
|
10
|
+
_CLI_JAW_ZSH_USER_FILE="${ZDOTDIR-${HOME}}/.zlogin"
|
|
11
|
+
if [[ -r "$_CLI_JAW_ZSH_USER_FILE" && "${_CLI_JAW_ZSH_USER_FILE:A}" != "${CLI_JAW_ZSH_SHIMS:A}/.zlogin" ]]; then
|
|
12
|
+
source "$_CLI_JAW_ZSH_USER_FILE"
|
|
13
|
+
fi
|
|
14
|
+
# Honor a user's ZDOTDIR reassignment for subsequent config files.
|
|
15
|
+
if (( ${+ZDOTDIR} )); then
|
|
16
|
+
export CLI_JAW_USER_ZDOTDIR_SET=1 CLI_JAW_USER_ZDOTDIR="$ZDOTDIR"
|
|
17
|
+
else
|
|
18
|
+
export CLI_JAW_USER_ZDOTDIR_SET=0 CLI_JAW_USER_ZDOTDIR=''
|
|
19
|
+
fi
|
|
20
|
+
unset _CLI_JAW_ZSH_USER_FILE
|
|
21
|
+
export ZDOTDIR="$CLI_JAW_ZSH_SHIMS"
|
|
22
|
+
export PATH="$CLI_JAW_VERIFIED_BIN${PATH:+:$PATH}"
|
|
23
|
+
fi
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Service-only zsh forwarding. Keep user configs at top level (no function scope).
|
|
2
|
+
# Reapply the verified bin after each usual config; this is not a shell sandbox.
|
|
3
|
+
# Bash/other shells, zsh -f, config exit/exec, and later PATH edits are not covered.
|
|
4
|
+
if [[ -n ${CLI_JAW_ZSH_SHIMS-} && -n ${CLI_JAW_VERIFIED_BIN-} ]]; then
|
|
5
|
+
if [[ ${CLI_JAW_USER_ZDOTDIR_SET-0} == 1 ]]; then
|
|
6
|
+
export ZDOTDIR="${CLI_JAW_USER_ZDOTDIR-}"
|
|
7
|
+
else
|
|
8
|
+
unset ZDOTDIR
|
|
9
|
+
fi
|
|
10
|
+
_CLI_JAW_ZSH_USER_FILE="${ZDOTDIR-${HOME}}/.zlogout"
|
|
11
|
+
if [[ -r "$_CLI_JAW_ZSH_USER_FILE" && "${_CLI_JAW_ZSH_USER_FILE:A}" != "${CLI_JAW_ZSH_SHIMS:A}/.zlogout" ]]; then
|
|
12
|
+
source "$_CLI_JAW_ZSH_USER_FILE"
|
|
13
|
+
fi
|
|
14
|
+
# Honor a user's ZDOTDIR reassignment for subsequent config files.
|
|
15
|
+
if (( ${+ZDOTDIR} )); then
|
|
16
|
+
export CLI_JAW_USER_ZDOTDIR_SET=1 CLI_JAW_USER_ZDOTDIR="$ZDOTDIR"
|
|
17
|
+
else
|
|
18
|
+
export CLI_JAW_USER_ZDOTDIR_SET=0 CLI_JAW_USER_ZDOTDIR=''
|
|
19
|
+
fi
|
|
20
|
+
unset _CLI_JAW_ZSH_USER_FILE
|
|
21
|
+
export ZDOTDIR="$CLI_JAW_ZSH_SHIMS"
|
|
22
|
+
export PATH="$CLI_JAW_VERIFIED_BIN${PATH:+:$PATH}"
|
|
23
|
+
fi
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Service-only zsh forwarding. Keep user configs at top level (no function scope).
|
|
2
|
+
# Reapply the verified bin after each usual config; this is not a shell sandbox.
|
|
3
|
+
# Bash/other shells, zsh -f, config exit/exec, and later PATH edits are not covered.
|
|
4
|
+
if [[ -n ${CLI_JAW_ZSH_SHIMS-} && -n ${CLI_JAW_VERIFIED_BIN-} ]]; then
|
|
5
|
+
if [[ ${CLI_JAW_USER_ZDOTDIR_SET-0} == 1 ]]; then
|
|
6
|
+
export ZDOTDIR="${CLI_JAW_USER_ZDOTDIR-}"
|
|
7
|
+
else
|
|
8
|
+
unset ZDOTDIR
|
|
9
|
+
fi
|
|
10
|
+
_CLI_JAW_ZSH_USER_FILE="${ZDOTDIR-${HOME}}/.zprofile"
|
|
11
|
+
if [[ -r "$_CLI_JAW_ZSH_USER_FILE" && "${_CLI_JAW_ZSH_USER_FILE:A}" != "${CLI_JAW_ZSH_SHIMS:A}/.zprofile" ]]; then
|
|
12
|
+
source "$_CLI_JAW_ZSH_USER_FILE"
|
|
13
|
+
fi
|
|
14
|
+
# Honor a user's ZDOTDIR reassignment for subsequent config files.
|
|
15
|
+
if (( ${+ZDOTDIR} )); then
|
|
16
|
+
export CLI_JAW_USER_ZDOTDIR_SET=1 CLI_JAW_USER_ZDOTDIR="$ZDOTDIR"
|
|
17
|
+
else
|
|
18
|
+
export CLI_JAW_USER_ZDOTDIR_SET=0 CLI_JAW_USER_ZDOTDIR=''
|
|
19
|
+
fi
|
|
20
|
+
unset _CLI_JAW_ZSH_USER_FILE
|
|
21
|
+
export ZDOTDIR="$CLI_JAW_ZSH_SHIMS"
|
|
22
|
+
export PATH="$CLI_JAW_VERIFIED_BIN${PATH:+:$PATH}"
|
|
23
|
+
fi
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Service-only zsh forwarding. Keep user configs at top level (no function scope).
|
|
2
|
+
# Reapply the verified bin after each usual config; this is not a shell sandbox.
|
|
3
|
+
# Bash/other shells, zsh -f, config exit/exec, and later PATH edits are not covered.
|
|
4
|
+
if [[ -n ${CLI_JAW_ZSH_SHIMS-} && -n ${CLI_JAW_VERIFIED_BIN-} ]]; then
|
|
5
|
+
if [[ ${CLI_JAW_USER_ZDOTDIR_SET-0} == 1 ]]; then
|
|
6
|
+
export ZDOTDIR="${CLI_JAW_USER_ZDOTDIR-}"
|
|
7
|
+
else
|
|
8
|
+
unset ZDOTDIR
|
|
9
|
+
fi
|
|
10
|
+
_CLI_JAW_ZSH_USER_FILE="${ZDOTDIR-${HOME}}/.zshenv"
|
|
11
|
+
if [[ -r "$_CLI_JAW_ZSH_USER_FILE" && "${_CLI_JAW_ZSH_USER_FILE:A}" != "${CLI_JAW_ZSH_SHIMS:A}/.zshenv" ]]; then
|
|
12
|
+
source "$_CLI_JAW_ZSH_USER_FILE"
|
|
13
|
+
fi
|
|
14
|
+
# Honor a user's ZDOTDIR reassignment for subsequent config files.
|
|
15
|
+
if (( ${+ZDOTDIR} )); then
|
|
16
|
+
export CLI_JAW_USER_ZDOTDIR_SET=1 CLI_JAW_USER_ZDOTDIR="$ZDOTDIR"
|
|
17
|
+
else
|
|
18
|
+
export CLI_JAW_USER_ZDOTDIR_SET=0 CLI_JAW_USER_ZDOTDIR=''
|
|
19
|
+
fi
|
|
20
|
+
unset _CLI_JAW_ZSH_USER_FILE
|
|
21
|
+
export ZDOTDIR="$CLI_JAW_ZSH_SHIMS"
|
|
22
|
+
export PATH="$CLI_JAW_VERIFIED_BIN${PATH:+:$PATH}"
|
|
23
|
+
fi
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Service-only zsh forwarding. Keep user configs at top level (no function scope).
|
|
2
|
+
# Reapply the verified bin after each usual config; this is not a shell sandbox.
|
|
3
|
+
# Bash/other shells, zsh -f, config exit/exec, and later PATH edits are not covered.
|
|
4
|
+
if [[ -n ${CLI_JAW_ZSH_SHIMS-} && -n ${CLI_JAW_VERIFIED_BIN-} ]]; then
|
|
5
|
+
if [[ ${CLI_JAW_USER_ZDOTDIR_SET-0} == 1 ]]; then
|
|
6
|
+
export ZDOTDIR="${CLI_JAW_USER_ZDOTDIR-}"
|
|
7
|
+
else
|
|
8
|
+
unset ZDOTDIR
|
|
9
|
+
fi
|
|
10
|
+
_CLI_JAW_ZSH_USER_FILE="${ZDOTDIR-${HOME}}/.zshrc"
|
|
11
|
+
if [[ -r "$_CLI_JAW_ZSH_USER_FILE" && "${_CLI_JAW_ZSH_USER_FILE:A}" != "${CLI_JAW_ZSH_SHIMS:A}/.zshrc" ]]; then
|
|
12
|
+
source "$_CLI_JAW_ZSH_USER_FILE"
|
|
13
|
+
fi
|
|
14
|
+
# Honor a user's ZDOTDIR reassignment for subsequent config files.
|
|
15
|
+
if (( ${+ZDOTDIR} )); then
|
|
16
|
+
export CLI_JAW_USER_ZDOTDIR_SET=1 CLI_JAW_USER_ZDOTDIR="$ZDOTDIR"
|
|
17
|
+
else
|
|
18
|
+
export CLI_JAW_USER_ZDOTDIR_SET=0 CLI_JAW_USER_ZDOTDIR=''
|
|
19
|
+
fi
|
|
20
|
+
unset _CLI_JAW_ZSH_USER_FILE
|
|
21
|
+
export ZDOTDIR="$CLI_JAW_ZSH_SHIMS"
|
|
22
|
+
export PATH="$CLI_JAW_VERIFIED_BIN${PATH:+:$PATH}"
|
|
23
|
+
fi
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./bgtask-badge-DAcWaUfS.js";export{t as applyBgtaskUpdate,e as refreshBgtaskBadge};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./iframe-renderer-DCDKBMb7.js";export{e as refreshFileWidget};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./memory-DhNdKZLO.js";export{e as refreshMemorySidebar};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e,s as t}from"./message-history-DbRTl1P0.js";export{e as historyReloadInFlight,t as loadMessages};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as e,n as t}from"./settings-core-BcVD2FgV.js";import"./settings-C9_D-pn0.js";export{t as loadSettings,e as updateSettings};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./settings-core-BcVD2FgV.js";export{e as refreshHeaderFromSettingsChange};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./skills-X7qxmHka.js";export{e as loadSkills};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./slash-commands-BnDH4IU_.js";export{e as loadCommands};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{p as e}from"./iframe-renderer-DCDKBMb7.js";import{I as t,s as n}from"./message-history-DbRTl1P0.js";import{r}from"./ui-BtiBTXng.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};
|