cuelo 0.10.52 → 0.10.53
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/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +35 -35
- package/.next/build-manifest.json +4 -4
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +549 -561
- package/.next/required-server-files.js +25 -25
- package/.next/required-server-files.json +25 -25
- package/.next/server/app/_global-error/page.js +3 -3
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/agent/[id]/account/route.js +1 -1
- package/.next/server/app/api/agent/[id]/account/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
- package/.next/server/app/api/agent/[id]/bash-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/[id]/events/route.js +2 -2
- package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/[id]/route.js +1 -1
- package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/new/route.js +1 -1
- package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/running/route.js +1 -1
- package/.next/server/app/api/agent/running/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/attachment-settings/route.js +1 -1
- package/.next/server/app/api/attachment-settings/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/attachments/[id]/transcription/route.js +2 -2
- package/.next/server/app/api/attachments/[id]/transcription/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/attachments/draft/route.js +1 -1
- package/.next/server/app/api/attachments/draft/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/attachments/route.js +2 -2
- package/.next/server/app/api/attachments/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/all-providers/route.js +1 -1
- package/.next/server/app/api/auth/all-providers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/api-key/[provider]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/login/[provider]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/logout/[provider]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/providers/route.js +1 -1
- package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/character-mode/route.js +1 -2
- package/.next/server/app/api/character-mode/route.js.nft.json +1 -1
- package/.next/server/app/api/character-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/cwd/browse/route.js +1 -1
- package/.next/server/app/api/cwd/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/cwd/validate/route.js +1 -1
- package/.next/server/app/api/cwd/validate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/default-cwd/route.js +1 -1
- package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/display-settings/route.js +1 -1
- package/.next/server/app/api/display-settings/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/document-text/route.js +2 -2
- package/.next/server/app/api/document-text/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/experiments/route.js +1 -1
- package/.next/server/app/api/experiments/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/file-index/route.js +1 -1
- package/.next/server/app/api/file-index/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/files/[...path]/route.js +1 -1
- package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/git/diff/route.js +1 -1
- package/.next/server/app/api/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/git/status/route.js +2 -2
- package/.next/server/app/api/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/github/projects/route.js +1 -1
- package/.next/server/app/api/github/projects/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/gpt6/handles/route.js +1 -1
- package/.next/server/app/api/gpt6/handles/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/gpt6/reply/route.js +1 -1
- package/.next/server/app/api/gpt6/reply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/gpt6/token/route.js +1 -1
- package/.next/server/app/api/gpt6/token/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/gpt6/web6-session/route.js +1 -1
- package/.next/server/app/api/gpt6/web6-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/home/route.js +1 -1
- package/.next/server/app/api/home/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/live/call/[callId]/route.js +2 -2
- package/.next/server/app/api/live/call/[callId]/route.js.nft.json +1 -1
- package/.next/server/app/api/live/call/[callId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/live/events/route.js +2 -2
- package/.next/server/app/api/live/events/route.js.nft.json +1 -1
- package/.next/server/app/api/live/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/live/interpret/route.js +2 -2
- package/.next/server/app/api/live/interpret/route.js.nft.json +1 -1
- package/.next/server/app/api/live/interpret/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/live/offer/route.js +1 -1
- package/.next/server/app/api/live/offer/route.js.nft.json +1 -1
- package/.next/server/app/api/live/offer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/live/voices/route.js +1 -1
- package/.next/server/app/api/live/voices/route.js.nft.json +1 -1
- package/.next/server/app/api/live/voices/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/route.js +2 -2
- package/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model-roles/route.js +1 -1
- package/.next/server/app/api/model-roles/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models/route.js +1 -1
- package/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models-config/catalog/route.js +1 -1
- package/.next/server/app/api/models-config/catalog/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models-config/discover/route.js +1 -1
- package/.next/server/app/api/models-config/discover/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models-config/route.js +3 -3
- package/.next/server/app/api/models-config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models-config/test/route.js +1 -1
- package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/office-characters/[...path]/route.js +1 -2
- package/.next/server/app/api/office-characters/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/office-characters/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/plugins/route.js +1 -1
- package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/project-docs/route.js +1 -1
- package/.next/server/app/api/project-docs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/project-trust/route.js +1 -1
- package/.next/server/app/api/project-trust/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/route.js +2 -2
- package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runs/[runId]/prelude/route.js +1 -1
- package/.next/server/app/api/runs/[runId]/prelude/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runs/[runId]/turns/route.js +1 -1
- package/.next/server/app/api/runs/[runId]/turns/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runs/route.js +1 -1
- package/.next/server/app/api/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/auto-name/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/export/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/state/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/search/route.js +1 -1
- package/.next/server/app/api/sessions/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/route.js +1 -1
- package/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidecars/[service]/[...path]/route.js +1 -1
- package/.next/server/app/api/sidecars/[service]/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/check/route.js +1 -1
- package/.next/server/app/api/skills/check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/install/route.js +2 -2
- package/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/search/route.js +1 -1
- package/.next/server/app/api/skills/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/update/route.js +1 -1
- package/.next/server/app/api/skills/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/subagents/eta/route.js +1 -1
- package/.next/server/app/api/subagents/eta/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/theme/route.js +1 -1
- package/.next/server/app/api/theme/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tool-image/route.js +1 -1
- package/.next/server/app/api/tool-image/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update-maintenance/route.js +2 -2
- package/.next/server/app/api/update-maintenance/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/updates/route.js +1 -1
- package/.next/server/app/api/updates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/web-access/recovery/route.js +1 -1
- package/.next/server/app/api/web-access/recovery/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/web-access/route.js +1 -1
- package/.next/server/app/api/web-access/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/web6/consults/route.js +1 -1
- package/.next/server/app/api/web6/consults/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/favicon.ico/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +5 -5
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recover/page.js +2 -2
- package/.next/server/app/recover/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recover.html +1 -1
- package/.next/server/app/recover.rsc +3 -3
- package/.next/server/app/recover.segments/_full.segment.rsc +3 -3
- package/.next/server/app/recover.segments/_head.segment.rsc +1 -1
- package/.next/server/app/recover.segments/_index.segment.rsc +2 -2
- package/.next/server/app/recover.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/recover.segments/recover.segment.rsc +1 -1
- package/.next/server/app-paths-manifest.json +35 -35
- package/.next/server/chunks/1008.js +2 -2
- package/.next/server/chunks/1966.js +2 -0
- package/.next/server/chunks/319.js +3 -3
- package/.next/server/chunks/6429.js +2 -2
- package/.next/server/chunks/6775.js +7 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/middleware.js +9 -9
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/app/_not-found/page-041b64675adcdf82.js +1 -0
- package/.next/static/chunks/app/layout-3b1f8b74c7fc5e77.js +1 -0
- package/.next/static/chunks/app/{page-3640086c732eb87d.js → page-efae4fdcf84b7a14.js} +4 -4
- package/.next/static/chunks/app/recover/{page-c0c40b3c215078a4.js → page-2bcd6a351f3eda3d.js} +1 -1
- package/.next/static/chunks/{main-app-fbc4aa3c15d48613.js → main-app-ca46ab75db2b4e4b.js} +1 -1
- package/.next/static/chunks/main-dd4c9daba44bef88.js +5 -0
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-dac2a58a3b9eb28e.js +1 -0
- package/.next/static/chunks/webpack-546c8221d1906945.js +1 -0
- package/.next/trace +107 -107
- package/.next/trace-build +1 -1
- package/.next/types/app/api/agent/[id]/account/route.ts +1 -1
- package/.next/types/app/api/agent/[id]/bash-output/route.ts +1 -1
- package/.next/types/app/api/agent/[id]/events/route.ts +1 -1
- package/.next/types/app/api/agent/[id]/route.ts +1 -1
- package/.next/types/app/api/agent/new/route.ts +1 -1
- package/.next/types/app/api/agent/running/route.ts +1 -1
- package/.next/types/app/api/attachment-settings/route.ts +1 -1
- package/.next/types/app/api/attachments/[id]/transcription/route.ts +1 -1
- package/.next/types/app/api/attachments/draft/route.ts +1 -1
- package/.next/types/app/api/attachments/route.ts +1 -1
- package/.next/types/app/api/auth/all-providers/route.ts +1 -1
- package/.next/types/app/api/auth/api-key/[provider]/route.ts +1 -1
- package/.next/types/app/api/auth/login/[provider]/route.ts +1 -1
- package/.next/types/app/api/auth/logout/[provider]/route.ts +1 -1
- package/.next/types/app/api/auth/providers/route.ts +1 -1
- package/.next/types/app/api/character-mode/route.ts +1 -1
- package/.next/types/app/api/cwd/browse/route.ts +1 -1
- package/.next/types/app/api/cwd/validate/route.ts +1 -1
- package/.next/types/app/api/default-cwd/route.ts +1 -1
- package/.next/types/app/api/display-settings/route.ts +1 -1
- package/.next/types/app/api/document-text/route.ts +1 -1
- package/.next/types/app/api/experiments/route.ts +1 -1
- package/.next/types/app/api/file-index/route.ts +1 -1
- package/.next/types/app/api/files/[...path]/route.ts +1 -1
- package/.next/types/app/api/git/diff/route.ts +1 -1
- package/.next/types/app/api/git/status/route.ts +1 -1
- package/.next/types/app/api/github/projects/route.ts +1 -1
- package/.next/types/app/api/gpt6/handles/route.ts +1 -1
- package/.next/types/app/api/gpt6/reply/route.ts +1 -1
- package/.next/types/app/api/gpt6/token/route.ts +1 -1
- package/.next/types/app/api/gpt6/web6-session/route.ts +1 -1
- package/.next/types/app/api/home/route.ts +1 -1
- package/.next/types/app/api/live/call/[callId]/route.ts +1 -1
- package/.next/types/app/api/live/events/route.ts +1 -1
- package/.next/types/app/api/live/interpret/route.ts +1 -1
- package/.next/types/app/api/live/offer/route.ts +1 -1
- package/.next/types/app/api/live/voices/route.ts +1 -1
- package/.next/types/app/api/mcp/route.ts +1 -1
- package/.next/types/app/api/model-roles/route.ts +1 -1
- package/.next/types/app/api/models/route.ts +1 -1
- package/.next/types/app/api/models-config/catalog/route.ts +1 -1
- package/.next/types/app/api/models-config/discover/route.ts +1 -1
- package/.next/types/app/api/models-config/route.ts +1 -1
- package/.next/types/app/api/models-config/test/route.ts +1 -1
- package/.next/types/app/api/office-characters/[...path]/route.ts +1 -1
- package/.next/types/app/api/plugins/route.ts +1 -1
- package/.next/types/app/api/project-docs/route.ts +1 -1
- package/.next/types/app/api/project-trust/route.ts +1 -1
- package/.next/types/app/api/projects/route.ts +1 -1
- package/.next/types/app/api/runs/[runId]/prelude/route.ts +1 -1
- package/.next/types/app/api/runs/[runId]/route.ts +1 -1
- package/.next/types/app/api/runs/[runId]/turns/route.ts +1 -1
- package/.next/types/app/api/runs/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/auto-name/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/context/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/entries/[entryId]/thinking/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/export/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/state/route.ts +1 -1
- package/.next/types/app/api/sessions/route.ts +1 -1
- package/.next/types/app/api/sessions/search/route.ts +1 -1
- package/.next/types/app/api/settings/route.ts +1 -1
- package/.next/types/app/api/sidecars/[service]/[...path]/route.ts +1 -1
- package/.next/types/app/api/skills/check/route.ts +1 -1
- package/.next/types/app/api/skills/install/route.ts +1 -1
- package/.next/types/app/api/skills/route.ts +1 -1
- package/.next/types/app/api/skills/search/route.ts +1 -1
- package/.next/types/app/api/skills/update/route.ts +1 -1
- package/.next/types/app/api/subagents/eta/route.ts +1 -1
- package/.next/types/app/api/theme/route.ts +1 -1
- package/.next/types/app/api/tool-image/route.ts +1 -1
- package/.next/types/app/api/update-maintenance/route.ts +1 -1
- package/.next/types/app/api/updates/route.ts +1 -1
- package/.next/types/app/api/web-access/recovery/route.ts +1 -1
- package/.next/types/app/api/web-access/route.ts +1 -1
- package/.next/types/app/api/web6/consults/route.ts +1 -1
- package/.next/types/app/api/worktrees/route.ts +1 -1
- package/.next/types/app/layout.ts +1 -1
- package/.next/types/app/page.ts +1 -1
- package/.next/types/app/recover/page.ts +1 -1
- package/LICENSE +22 -22
- package/README.md +273 -271
- package/Tools/CUELO_Setup/files/btw-server.js +346 -346
- package/Tools/CUELO_Setup/files/native-runtime-patch.js +238 -238
- package/Tools/CUELO_Setup/files/subagent-server.js +587 -587
- package/Tools/CUELO_Setup/files/usage-server.js +1057 -1057
- package/Tools/OMP_Global_Config/agent/AGENTS.md +144 -144
- package/Tools/OMP_Global_Config/agent/RULES.md +140 -140
- package/Tools/OMP_Global_Config/agent/TITLE_SYSTEM.md +17 -17
- package/Tools/OMP_Global_Config/agent/WATCHDOG.md +55 -55
- package/Tools/OMP_Global_Config/agent/agents/maker.md +413 -413
- package/Tools/OMP_Global_Config/agent/extensions/character-voice.ts +1035 -1035
- package/Tools/OMP_Global_Config/agent/extensions/command-guard/index.ts +1110 -1110
- package/Tools/OMP_Global_Config/agent/extensions/command-guard/interop-hint.ts +133 -133
- package/Tools/OMP_Global_Config/agent/extensions/command-guard/matcher.ts +2258 -2258
- package/Tools/OMP_Global_Config/agent/extensions/command-guard/powershell-syntax.ts +210 -210
- package/Tools/OMP_Global_Config/agent/extensions/command-guard/task-guard.ts +1137 -1121
- package/Tools/OMP_Global_Config/agent/extensions/cross-review.ts +132 -132
- package/Tools/OMP_Global_Config/agent/extensions/docmap-route.ts +133 -133
- package/Tools/OMP_Global_Config/agent/extensions/draft/markdown.ts +226 -226
- package/Tools/OMP_Global_Config/agent/extensions/draft/ooxml.ts +222 -222
- package/Tools/OMP_Global_Config/agent/extensions/draft/pdf.ts +63 -63
- package/Tools/OMP_Global_Config/agent/extensions/draft/zip.ts +73 -73
- package/Tools/OMP_Global_Config/agent/extensions/draft.ts +204 -204
- package/Tools/OMP_Global_Config/agent/extensions/edit-lessons.ts +159 -159
- package/Tools/OMP_Global_Config/agent/extensions/external-advice-check.ts +36 -36
- package/Tools/OMP_Global_Config/agent/extensions/gitnexus-autosync.ts +406 -406
- package/Tools/OMP_Global_Config/agent/extensions/image-question-router.ts +55 -55
- package/Tools/OMP_Global_Config/agent/extensions/jev-runtime.ts +2700 -2700
- package/Tools/OMP_Global_Config/agent/extensions/korean-reply-guard.ts +190 -190
- package/Tools/OMP_Global_Config/agent/extensions/lib/cross-review.ts +1208 -1208
- package/Tools/OMP_Global_Config/agent/extensions/lib/docmap-search.ts +612 -612
- package/Tools/OMP_Global_Config/agent/extensions/lib/job-observation.ts +182 -182
- package/Tools/OMP_Global_Config/agent/extensions/lib/maker-routing.ts +1332 -1332
- package/Tools/OMP_Global_Config/agent/extensions/lib/mcp-selection.ts +361 -361
- package/Tools/OMP_Global_Config/agent/extensions/lib/memory-excerpt.ts +5 -5
- package/Tools/OMP_Global_Config/agent/extensions/lib/native-judge.ts +113 -113
- package/Tools/OMP_Global_Config/agent/extensions/lib/prepared-task.ts +211 -211
- package/Tools/OMP_Global_Config/agent/extensions/lib/routing-ledger.ts +538 -538
- package/Tools/OMP_Global_Config/agent/extensions/lib/session-identity.ts +34 -34
- package/Tools/OMP_Global_Config/agent/extensions/lib/task-progress.ts +492 -492
- package/Tools/OMP_Global_Config/agent/extensions/mcp-selection.ts +301 -301
- package/Tools/OMP_Global_Config/agent/extensions/prompt-compact.ts +67 -67
- package/Tools/OMP_Global_Config/agent/extensions/report-chart-guard.ts +102 -102
- package/Tools/OMP_Global_Config/agent/extensions/skim.ts +332 -332
- package/Tools/OMP_Global_Config/agent/extensions/steering-reply-gate.ts +207 -207
- package/Tools/OMP_Global_Config/agent/extensions/todo-nudge.ts +80 -80
- package/Tools/OMP_Global_Config/agent/extensions/turn-end-guard.ts +421 -421
- package/Tools/OMP_Global_Config/agent/prompt-copies/AGENTS.en.md +147 -147
- package/Tools/OMP_Global_Config/agent/prompt-copies/RULES.en.md +49 -49
- package/Tools/OMP_Global_Config/agent/rules/docs-handoff.md +39 -39
- package/Tools/OMP_Global_Config/agent/rules/frontend.md +74 -74
- package/Tools/OMP_Global_Config/agent/rules/harness-policy.json +1224 -1224
- package/Tools/OMP_Global_Config/agent/rules/legacy-encoding.md +21 -21
- package/Tools/OMP_Global_Config/agent/rules/meta-harness.md +45 -45
- package/Tools/OMP_Global_Config/agent/rules/omp-harness.md +151 -151
- package/Tools/OMP_Global_Config/agent/rules/subagent.md +750 -750
- package/Tools/OMP_Global_Config/agent/rules/task-guard.md +62 -62
- package/Tools/OMP_Global_Config/agent/rules/verdict.md +210 -210
- package/Tools/OMP_Global_Config/agent/rules/web6-consult.md +83 -83
- package/Tools/OMP_Global_Config/agent/sop/_common.md +136 -136
- package/Tools/OMP_Global_Config/agent/sop/_writer.md +259 -259
- package/Tools/OMP_Global_Config/agent/sop/maker.md +9 -9
- package/Tools/OMP_Global_Config/agent/tools/git-finalizer/finalizer.ps1 +409 -409
- package/Tools/OMP_Global_Config/agent/tools/git-finalizer/index.ts +303 -303
- package/Tools/OMP_Global_Config/agent/tools/git-finalizer/sync-checkout.ts +184 -184
- package/Tools/OMP_Global_Config/agent/tools/git-finalizer/wsl-git.ts +96 -96
- package/Tools/OMP_Global_Config/agent/tools/windows-build/index.ts +387 -387
- package/Tools/OMP_Global_Config/agent/tools/windows-control/control.ps1 +200 -200
- package/Tools/OMP_Global_Config/agent/tools/windows-control/index.ts +255 -255
- package/Tools/OMP_Global_Config/notices/orchestrate.md +26 -26
- package/Tools/OMP_Global_Config/notices/ultrathink.md +9 -9
- package/Tools/OMP_Global_Config/notices/workflow.md +16 -16
- package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +18339 -18304
- package/Tools/OMP_Global_Config/patches/apply-notices.mjs +135 -135
- package/bin/cuelo-options.js +38 -38
- package/bin/cuelo.js +273 -273
- package/bin/docker-entrypoint.mjs +19 -19
- package/bin/password-prompt.js +100 -100
- package/bin/prepare-runtime.js +112 -112
- package/bin/runtime.js +134 -134
- package/bin/web-auth-store.d.ts +104 -104
- package/bin/web-auth-store.js +593 -593
- package/install.mjs +427 -427
- package/next.config.ts +104 -104
- package/package.json +141 -141
- package/public/audio/completion/voices.json +1393 -1393
- package/public/fonts/cuelo-display/NOTICE.txt +15 -15
- package/public/fonts/fonts.css +288 -288
- package/public/fonts/jetbrains-mono/OFL.txt +93 -93
- package/public/fonts/wanted-sans/OFL.txt +93 -93
- package/public/icons/catppuccin/LICENSE +22 -22
- package/public/icons/catppuccin/README.md +8 -8
- package/public/icons/catppuccin/latte/_file.svg +3 -3
- package/public/icons/catppuccin/latte/_folder.svg +3 -3
- package/public/icons/catppuccin/latte/_folder_open.svg +3 -3
- package/public/icons/catppuccin/latte/bash.svg +7 -7
- package/public/icons/catppuccin/latte/bun-lock.svg +8 -8
- package/public/icons/catppuccin/latte/config.svg +3 -3
- package/public/icons/catppuccin/latte/css.svg +6 -6
- package/public/icons/catppuccin/latte/database.svg +3 -3
- package/public/icons/catppuccin/latte/docker.svg +3 -3
- package/public/icons/catppuccin/latte/env.svg +3 -3
- package/public/icons/catppuccin/latte/eslint.svg +6 -6
- package/public/icons/catppuccin/latte/git.svg +6 -6
- package/public/icons/catppuccin/latte/go.svg +3 -3
- package/public/icons/catppuccin/latte/graphql.svg +3 -3
- package/public/icons/catppuccin/latte/html.svg +6 -6
- package/public/icons/catppuccin/latte/javascript-react.svg +8 -8
- package/public/icons/catppuccin/latte/javascript.svg +6 -6
- package/public/icons/catppuccin/latte/json.svg +3 -3
- package/public/icons/catppuccin/latte/lock.svg +3 -3
- package/public/icons/catppuccin/latte/markdown.svg +3 -3
- package/public/icons/catppuccin/latte/ms-word.svg +6 -6
- package/public/icons/catppuccin/latte/next.svg +6 -6
- package/public/icons/catppuccin/latte/npm-lock.svg +7 -7
- package/public/icons/catppuccin/latte/pdf.svg +3 -3
- package/public/icons/catppuccin/latte/python.svg +8 -8
- package/public/icons/catppuccin/latte/rust.svg +6 -6
- package/public/icons/catppuccin/latte/sass.svg +3 -3
- package/public/icons/catppuccin/latte/terraform.svg +3 -3
- package/public/icons/catppuccin/latte/toml.svg +3 -3
- package/public/icons/catppuccin/latte/typescript-react.svg +8 -8
- package/public/icons/catppuccin/latte/typescript.svg +6 -6
- package/public/icons/catppuccin/latte/yaml.svg +3 -3
- package/public/icons/catppuccin/mocha/_file.svg +3 -3
- package/public/icons/catppuccin/mocha/_folder.svg +3 -3
- package/public/icons/catppuccin/mocha/_folder_open.svg +3 -3
- package/public/icons/catppuccin/mocha/bash.svg +7 -7
- package/public/icons/catppuccin/mocha/bun-lock.svg +8 -8
- package/public/icons/catppuccin/mocha/config.svg +3 -3
- package/public/icons/catppuccin/mocha/css.svg +6 -6
- package/public/icons/catppuccin/mocha/database.svg +3 -3
- package/public/icons/catppuccin/mocha/docker.svg +3 -3
- package/public/icons/catppuccin/mocha/env.svg +3 -3
- package/public/icons/catppuccin/mocha/eslint.svg +6 -6
- package/public/icons/catppuccin/mocha/git.svg +6 -6
- package/public/icons/catppuccin/mocha/go.svg +3 -3
- package/public/icons/catppuccin/mocha/graphql.svg +3 -3
- package/public/icons/catppuccin/mocha/html.svg +6 -6
- package/public/icons/catppuccin/mocha/javascript-react.svg +8 -8
- package/public/icons/catppuccin/mocha/javascript.svg +6 -6
- package/public/icons/catppuccin/mocha/json.svg +3 -3
- package/public/icons/catppuccin/mocha/lock.svg +3 -3
- package/public/icons/catppuccin/mocha/markdown.svg +3 -3
- package/public/icons/catppuccin/mocha/ms-word.svg +6 -6
- package/public/icons/catppuccin/mocha/next.svg +6 -6
- package/public/icons/catppuccin/mocha/npm-lock.svg +7 -7
- package/public/icons/catppuccin/mocha/pdf.svg +3 -3
- package/public/icons/catppuccin/mocha/python.svg +8 -8
- package/public/icons/catppuccin/mocha/rust.svg +6 -6
- package/public/icons/catppuccin/mocha/sass.svg +3 -3
- package/public/icons/catppuccin/mocha/terraform.svg +3 -3
- package/public/icons/catppuccin/mocha/toml.svg +3 -3
- package/public/icons/catppuccin/mocha/typescript-react.svg +8 -8
- package/public/icons/catppuccin/mocha/typescript.svg +6 -6
- package/public/icons/catppuccin/mocha/yaml.svg +3 -3
- package/public/icons/cuelo-icon.svg +8 -8
- package/public/offline.html +145 -145
- package/public/sw.js +135 -135
- package/.next/server/chunks/205.js +0 -7
- package/.next/server/chunks/7738.js +0 -1
- package/.next/static/chunks/1966.b8f83f7ba376c962.js +0 -1
- package/.next/static/chunks/3899.3f761f7e3a944e8c.js +0 -1
- package/.next/static/chunks/app/_not-found/page-9e5295df095e2e41.js +0 -1
- package/.next/static/chunks/app/layout-8b29ba206a96135e.js +0 -1
- package/.next/static/chunks/main-1ddb405481ce21f6.js +0 -5
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-50782c8c9c06c8b5.js +0 -1
- package/.next/static/chunks/webpack-7b514b9855bd748c.js +0 -1
- /package/.next/static/{dQA--5NX6NZt_A6pLZUde → -mDQEyWQ8VQsAfLpiACIP}/_buildManifest.js +0 -0
- /package/.next/static/{dQA--5NX6NZt_A6pLZUde → -mDQEyWQ8VQsAfLpiACIP}/_ssgManifest.js +0 -0
|
@@ -1,210 +1,210 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OMP `bash` 도구의 셸은 PowerShell이 아니다(Windows는 내장 셸, WSL·Linux는 진짜 `/bin/bash`). PowerShell 전용
|
|
3
|
-
* 문법을 실행 위치에 쓰면 실행 뒤에 `pi-natives:command: syntax error`나 bash 오류로만 드러나므로, 실행 전에
|
|
4
|
-
* 같은 기준으로 거절한다.
|
|
5
|
-
* 따옴표 안의 값(grep 패턴, echo 인자 등)과 heredoc 본문은 다른 프로그램의 데이터라 검사하지 않는다.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const CMDLETS = new Set(
|
|
9
|
-
[
|
|
10
|
-
"Add-Content", "ConvertFrom-Json", "ConvertTo-Json", "Copy-Item", "ForEach-Object",
|
|
11
|
-
"Get-ChildItem", "Get-Command", "Get-Content", "Get-Date", "Get-Item", "Get-Location",
|
|
12
|
-
"Get-Process", "Invoke-Expression", "Invoke-WebRequest", "Join-Path", "Measure-Object",
|
|
13
|
-
"Move-Item", "New-Item", "Out-File", "Out-Null", "Out-String", "Pop-Location",
|
|
14
|
-
"Push-Location", "Remove-Item", "Rename-Item", "Resolve-Path", "Select-Object",
|
|
15
|
-
"Select-String", "Set-Content", "Set-Location", "Sort-Object", "Split-Path", "Start-Process",
|
|
16
|
-
"Stop-Process", "Test-Path", "Where-Object", "Write-Error", "Write-Host", "Write-Output",
|
|
17
|
-
].map((name) => name.toLowerCase()),
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
const GUIDANCE_WINDOWS =
|
|
21
|
-
"PowerShell 로직은 `write`로 .ps1 파일을 만든 뒤 PowerShell 7 `pwsh -NoProfile -ExecutionPolicy Bypass -File C:/절대/슬래시/경로.ps1`로 실행하세요(7이 없을 때만 `powershell.exe`).";
|
|
22
|
-
|
|
23
|
-
// WSL의 bash는 진짜 bash라 따옴표·`\$`가 정상 처리되고, Windows 프로그램에는 Windows 경로를 넘겨야 한다.
|
|
24
|
-
// Linux `pwsh`가 아니라 Windows PowerShell 7(`pwsh.exe`)을 부른다. 5.1은 BOM 없는 .ps1을 CP949로 읽는다.
|
|
25
|
-
// 7도 WSL로 넘기는 stdout은 시스템 코드페이지(CP949)라 한글이 깨진다(2026-10-09 7.6.6에서 관측).
|
|
26
|
-
const GUIDANCE_LINUX =
|
|
27
|
-
"PowerShell 로직은 `write`로 .ps1 파일을 만든 뒤 Windows PowerShell 7 `pwsh.exe -NoProfile -ExecutionPolicy Bypass -File \"$(wslpath -w /절대/경로.ps1)\"`로 실행하세요(7이 없을 때만 `powershell.exe`). " +
|
|
28
|
-
"한글을 출력하면 .ps1 첫 줄(짧은 `-Command`면 본문 맨 앞)에 `[Console]::OutputEncoding = [Text.UTF8Encoding]::new($false)`를 두세요. `powershell.exe`(5.1)로 실행하면 .ps1도 UTF-8 BOM으로 저장해야 합니다. " +
|
|
29
|
-
"짧은 `-Command` 본문은 작은따옴표로 감싸거나 `\\$`로 이스케이프하면 통과합니다.";
|
|
30
|
-
|
|
31
|
-
function reason(subject: string, platform: NodeJS.Platform): string {
|
|
32
|
-
const windows = platform === "win32";
|
|
33
|
-
return `bash 도구의 ${windows ? "내장 " : ""}셸은 PowerShell이 아니라서 ${subject}는 실행 전에 차단됩니다. ${windows ? GUIDANCE_WINDOWS : GUIDANCE_LINUX}`;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/** `<<[-]'WORD'` 형태의 heredoc 본문을 지워 스크립트 파일 내용이 명령으로 검사되지 않게 한다. */
|
|
37
|
-
function stripHeredocBodies(command: string): string {
|
|
38
|
-
const lines = command.split("\n");
|
|
39
|
-
const kept: string[] = [];
|
|
40
|
-
let delimiter: string | undefined;
|
|
41
|
-
for (const line of lines) {
|
|
42
|
-
if (delimiter !== undefined) {
|
|
43
|
-
if (line.replace(/\r$/, "").trim() === delimiter) delimiter = undefined;
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
kept.push(line);
|
|
47
|
-
const marker = /<<-?\s*(?:'([^']+)'|"([^"]+)"|([A-Za-z_][\w]*))/.exec(line);
|
|
48
|
-
if (marker) delimiter = marker[1] ?? marker[2] ?? marker[3];
|
|
49
|
-
}
|
|
50
|
-
return kept.join("\n");
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** 따옴표 안쪽 글자를 공백으로 바꿔 정규식이 데이터를 코드로 오인하지 않게 한다. */
|
|
54
|
-
function maskQuoted(command: string): string {
|
|
55
|
-
let out = "";
|
|
56
|
-
let quote: "'" | '"' | undefined;
|
|
57
|
-
for (let index = 0; index < command.length; index += 1) {
|
|
58
|
-
const character = command[index];
|
|
59
|
-
if (quote) {
|
|
60
|
-
if (character === quote) {
|
|
61
|
-
quote = undefined;
|
|
62
|
-
out += character;
|
|
63
|
-
} else if (quote === '"' && character === "\\" && index + 1 < command.length) {
|
|
64
|
-
out += " ";
|
|
65
|
-
index += 1;
|
|
66
|
-
} else {
|
|
67
|
-
out += character === "\n" ? "\n" : " ";
|
|
68
|
-
}
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
if (character === "'" || character === '"') quote = character;
|
|
72
|
-
out += character;
|
|
73
|
-
}
|
|
74
|
-
return out;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
interface Token {
|
|
78
|
-
value: string;
|
|
79
|
-
quoted: boolean;
|
|
80
|
-
/** posix 모드에서 bash가 `$`를 확장할 자리(따옴표 밖이나 큰따옴표 안의 이스케이프 안 된 `$name`·`${`·`$(` 등)가 있었는가. */
|
|
81
|
-
expands: boolean;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* 따옴표를 존중해 명령 구분자(; | & 줄바꿈 괄호)로 나눈 세그먼트별 토큰.
|
|
86
|
-
* `posix`는 진짜 bash(WSL·Linux)의 따옴표·백슬래시 이스케이프 규칙을 따른다. Windows 내장 셸 기준(`posix` false)은
|
|
87
|
-
* 백슬래시를 이스케이프로 읽지 않는 기존 동작을 그대로 유지한다.
|
|
88
|
-
*/
|
|
89
|
-
function segmentTokens(command: string, posix: boolean): Token[][] {
|
|
90
|
-
const segments: Token[][] = [];
|
|
91
|
-
let tokens: Token[] = [];
|
|
92
|
-
let value = "";
|
|
93
|
-
let started = false;
|
|
94
|
-
let quoted = false;
|
|
95
|
-
let expands = false;
|
|
96
|
-
let quote: "'" | '"' | undefined;
|
|
97
|
-
const endToken = (): void => {
|
|
98
|
-
if (started) tokens.push({ value, quoted, expands });
|
|
99
|
-
value = "";
|
|
100
|
-
started = false;
|
|
101
|
-
quoted = false;
|
|
102
|
-
expands = false;
|
|
103
|
-
};
|
|
104
|
-
const endSegment = (): void => {
|
|
105
|
-
endToken();
|
|
106
|
-
if (tokens.length > 0) segments.push(tokens);
|
|
107
|
-
tokens = [];
|
|
108
|
-
};
|
|
109
|
-
for (let index = 0; index < command.length; index += 1) {
|
|
110
|
-
const character = command[index];
|
|
111
|
-
// bash가 확장하는 `$` 꼴(`$name`, `$1`, `$_`, `${`, `$(`, `$?` 등). 뒤가 공백·따옴표·끝이면 글자 그대로 남는다.
|
|
112
|
-
const dollar = character === "$" && /[A-Za-z0-9_{(?!@*#$]/.test(command[index + 1] ?? "");
|
|
113
|
-
if (quote) {
|
|
114
|
-
if (character === quote) {
|
|
115
|
-
quote = undefined;
|
|
116
|
-
} else if (posix && quote === '"' && character === "\\" && index + 1 < command.length) {
|
|
117
|
-
value += character + command[index + 1];
|
|
118
|
-
index += 1;
|
|
119
|
-
} else {
|
|
120
|
-
if (posix && quote === '"' && dollar) expands = true;
|
|
121
|
-
value += character;
|
|
122
|
-
}
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
125
|
-
if (posix && character === "\\" && index + 1 < command.length && command[index + 1] !== "\n") {
|
|
126
|
-
value += character + command[index + 1];
|
|
127
|
-
started = true;
|
|
128
|
-
index += 1;
|
|
129
|
-
} else if (character === "'" || character === '"') {
|
|
130
|
-
quote = character;
|
|
131
|
-
started = true;
|
|
132
|
-
quoted = true;
|
|
133
|
-
} else if (character === "#" && !started) {
|
|
134
|
-
while (index + 1 < command.length && command[index + 1] !== "\n") index += 1;
|
|
135
|
-
} else if (/\s/.test(character) && character !== "\n") {
|
|
136
|
-
endToken();
|
|
137
|
-
} else if (/[;|&\n(){}]/.test(character)) {
|
|
138
|
-
endSegment();
|
|
139
|
-
} else {
|
|
140
|
-
if (posix && dollar) expands = true;
|
|
141
|
-
value += character;
|
|
142
|
-
started = true;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
endSegment();
|
|
146
|
-
return segments;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function commandBasename(value: string): string {
|
|
150
|
-
const normalized = value.replace(/\\/g, "/");
|
|
151
|
-
return normalized.slice(normalized.lastIndexOf("/") + 1).toLowerCase().replace(/\.exe$/, "");
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/** powershell/pwsh 호출의 판정: undefined면 허용, 문자열이면 차단 사유. */
|
|
155
|
-
function matchPowerShellHost(args: Token[], platform: NodeJS.Platform): string | undefined {
|
|
156
|
-
for (const arg of args) {
|
|
157
|
-
const option = arg.value.toLowerCase();
|
|
158
|
-
if (!arg.quoted && /^-f(?:i(?:le?)?)?$/.test(option)) return undefined;
|
|
159
|
-
if (!arg.quoted && (option === "-encodedcommand" || option === "-e" || option === "-ec")) {
|
|
160
|
-
return undefined;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
const commandIndex = args.findIndex(
|
|
164
|
-
(arg) => !arg.quoted && ["-c", "-command", "-commandwithargs"].includes(arg.value.toLowerCase()),
|
|
165
|
-
);
|
|
166
|
-
if (commandIndex < 0) return undefined;
|
|
167
|
-
// Windows 내장 셸은 따옴표 안의 `$`도 바꿔 넘기므로 모든 `$`를 막고, 진짜 bash는 확장되는 `$`만 막는다.
|
|
168
|
-
const dollar = platform === "win32"
|
|
169
|
-
? (arg: Token) => arg.value.includes("$")
|
|
170
|
-
: (arg: Token) => arg.expands;
|
|
171
|
-
if (args.slice(commandIndex + 1).some(dollar)) {
|
|
172
|
-
return reason("`-Command` 인자의 `$`(bash 층이 변형해 PowerShell이 다른 코드를 받습니다)", platform);
|
|
173
|
-
}
|
|
174
|
-
return undefined;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* bash 명령에 PowerShell 전용 문법이 실행 위치로 쓰였으면 차단 사유를, 아니면 undefined를 돌려준다.
|
|
179
|
-
* `platform`은 bash 도구가 실제로 도는 OS(기본 `process.platform`)이며 안내문과 `-Command`의 `$` 판정을 가른다.
|
|
180
|
-
*/
|
|
181
|
-
export function matchPowerShellSyntax(
|
|
182
|
-
command: string,
|
|
183
|
-
platform: NodeJS.Platform = process.platform,
|
|
184
|
-
): string | undefined {
|
|
185
|
-
const body = stripHeredocBodies(command);
|
|
186
|
-
|
|
187
|
-
for (const tokens of segmentTokens(body, platform !== "win32")) {
|
|
188
|
-
const head = tokens[0];
|
|
189
|
-
if (head.quoted) continue;
|
|
190
|
-
const name = commandBasename(head.value);
|
|
191
|
-
if (name === "powershell" || name === "pwsh") {
|
|
192
|
-
const hostReason = matchPowerShellHost(tokens.slice(1), platform);
|
|
193
|
-
if (hostReason) return hostReason;
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
if (CMDLETS.has(name)) return reason(`cmdlet \`${head.value}\``, platform);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
const masked = maskQuoted(body);
|
|
200
|
-
const envVariable = /\$env:[A-Za-z_]\w*/i.exec(masked);
|
|
201
|
-
if (envVariable) return reason(`\`${envVariable[0]}\``, platform);
|
|
202
|
-
|
|
203
|
-
const assignment = /(?:^|[;&|{\n])[ \t]*(\$[A-Za-z_]\w*)[ \t]*(?:[-+*/]|\?\?)?=(?!=)/.exec(masked);
|
|
204
|
-
if (assignment) return reason(`\`${assignment[1]} = ...\` 대입`, platform);
|
|
205
|
-
|
|
206
|
-
const block = /(?:^|[;&|{\n])[ \t]*(if|elseif|foreach|while)[ \t]*\([^\n]*\)[ \t]*\{/i.exec(masked);
|
|
207
|
-
if (block) return reason(`\`${block[1]} (...) { }\` 블록`, platform);
|
|
208
|
-
|
|
209
|
-
return undefined;
|
|
210
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* OMP `bash` 도구의 셸은 PowerShell이 아니다(Windows는 내장 셸, WSL·Linux는 진짜 `/bin/bash`). PowerShell 전용
|
|
3
|
+
* 문법을 실행 위치에 쓰면 실행 뒤에 `pi-natives:command: syntax error`나 bash 오류로만 드러나므로, 실행 전에
|
|
4
|
+
* 같은 기준으로 거절한다.
|
|
5
|
+
* 따옴표 안의 값(grep 패턴, echo 인자 등)과 heredoc 본문은 다른 프로그램의 데이터라 검사하지 않는다.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const CMDLETS = new Set(
|
|
9
|
+
[
|
|
10
|
+
"Add-Content", "ConvertFrom-Json", "ConvertTo-Json", "Copy-Item", "ForEach-Object",
|
|
11
|
+
"Get-ChildItem", "Get-Command", "Get-Content", "Get-Date", "Get-Item", "Get-Location",
|
|
12
|
+
"Get-Process", "Invoke-Expression", "Invoke-WebRequest", "Join-Path", "Measure-Object",
|
|
13
|
+
"Move-Item", "New-Item", "Out-File", "Out-Null", "Out-String", "Pop-Location",
|
|
14
|
+
"Push-Location", "Remove-Item", "Rename-Item", "Resolve-Path", "Select-Object",
|
|
15
|
+
"Select-String", "Set-Content", "Set-Location", "Sort-Object", "Split-Path", "Start-Process",
|
|
16
|
+
"Stop-Process", "Test-Path", "Where-Object", "Write-Error", "Write-Host", "Write-Output",
|
|
17
|
+
].map((name) => name.toLowerCase()),
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
const GUIDANCE_WINDOWS =
|
|
21
|
+
"PowerShell 로직은 `write`로 .ps1 파일을 만든 뒤 PowerShell 7 `pwsh -NoProfile -ExecutionPolicy Bypass -File C:/절대/슬래시/경로.ps1`로 실행하세요(7이 없을 때만 `powershell.exe`).";
|
|
22
|
+
|
|
23
|
+
// WSL의 bash는 진짜 bash라 따옴표·`\$`가 정상 처리되고, Windows 프로그램에는 Windows 경로를 넘겨야 한다.
|
|
24
|
+
// Linux `pwsh`가 아니라 Windows PowerShell 7(`pwsh.exe`)을 부른다. 5.1은 BOM 없는 .ps1을 CP949로 읽는다.
|
|
25
|
+
// 7도 WSL로 넘기는 stdout은 시스템 코드페이지(CP949)라 한글이 깨진다(2026-10-09 7.6.6에서 관측).
|
|
26
|
+
const GUIDANCE_LINUX =
|
|
27
|
+
"PowerShell 로직은 `write`로 .ps1 파일을 만든 뒤 Windows PowerShell 7 `pwsh.exe -NoProfile -ExecutionPolicy Bypass -File \"$(wslpath -w /절대/경로.ps1)\"`로 실행하세요(7이 없을 때만 `powershell.exe`). " +
|
|
28
|
+
"한글을 출력하면 .ps1 첫 줄(짧은 `-Command`면 본문 맨 앞)에 `[Console]::OutputEncoding = [Text.UTF8Encoding]::new($false)`를 두세요. `powershell.exe`(5.1)로 실행하면 .ps1도 UTF-8 BOM으로 저장해야 합니다. " +
|
|
29
|
+
"짧은 `-Command` 본문은 작은따옴표로 감싸거나 `\\$`로 이스케이프하면 통과합니다.";
|
|
30
|
+
|
|
31
|
+
function reason(subject: string, platform: NodeJS.Platform): string {
|
|
32
|
+
const windows = platform === "win32";
|
|
33
|
+
return `bash 도구의 ${windows ? "내장 " : ""}셸은 PowerShell이 아니라서 ${subject}는 실행 전에 차단됩니다. ${windows ? GUIDANCE_WINDOWS : GUIDANCE_LINUX}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** `<<[-]'WORD'` 형태의 heredoc 본문을 지워 스크립트 파일 내용이 명령으로 검사되지 않게 한다. */
|
|
37
|
+
function stripHeredocBodies(command: string): string {
|
|
38
|
+
const lines = command.split("\n");
|
|
39
|
+
const kept: string[] = [];
|
|
40
|
+
let delimiter: string | undefined;
|
|
41
|
+
for (const line of lines) {
|
|
42
|
+
if (delimiter !== undefined) {
|
|
43
|
+
if (line.replace(/\r$/, "").trim() === delimiter) delimiter = undefined;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
kept.push(line);
|
|
47
|
+
const marker = /<<-?\s*(?:'([^']+)'|"([^"]+)"|([A-Za-z_][\w]*))/.exec(line);
|
|
48
|
+
if (marker) delimiter = marker[1] ?? marker[2] ?? marker[3];
|
|
49
|
+
}
|
|
50
|
+
return kept.join("\n");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** 따옴표 안쪽 글자를 공백으로 바꿔 정규식이 데이터를 코드로 오인하지 않게 한다. */
|
|
54
|
+
function maskQuoted(command: string): string {
|
|
55
|
+
let out = "";
|
|
56
|
+
let quote: "'" | '"' | undefined;
|
|
57
|
+
for (let index = 0; index < command.length; index += 1) {
|
|
58
|
+
const character = command[index];
|
|
59
|
+
if (quote) {
|
|
60
|
+
if (character === quote) {
|
|
61
|
+
quote = undefined;
|
|
62
|
+
out += character;
|
|
63
|
+
} else if (quote === '"' && character === "\\" && index + 1 < command.length) {
|
|
64
|
+
out += " ";
|
|
65
|
+
index += 1;
|
|
66
|
+
} else {
|
|
67
|
+
out += character === "\n" ? "\n" : " ";
|
|
68
|
+
}
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (character === "'" || character === '"') quote = character;
|
|
72
|
+
out += character;
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
interface Token {
|
|
78
|
+
value: string;
|
|
79
|
+
quoted: boolean;
|
|
80
|
+
/** posix 모드에서 bash가 `$`를 확장할 자리(따옴표 밖이나 큰따옴표 안의 이스케이프 안 된 `$name`·`${`·`$(` 등)가 있었는가. */
|
|
81
|
+
expands: boolean;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 따옴표를 존중해 명령 구분자(; | & 줄바꿈 괄호)로 나눈 세그먼트별 토큰.
|
|
86
|
+
* `posix`는 진짜 bash(WSL·Linux)의 따옴표·백슬래시 이스케이프 규칙을 따른다. Windows 내장 셸 기준(`posix` false)은
|
|
87
|
+
* 백슬래시를 이스케이프로 읽지 않는 기존 동작을 그대로 유지한다.
|
|
88
|
+
*/
|
|
89
|
+
function segmentTokens(command: string, posix: boolean): Token[][] {
|
|
90
|
+
const segments: Token[][] = [];
|
|
91
|
+
let tokens: Token[] = [];
|
|
92
|
+
let value = "";
|
|
93
|
+
let started = false;
|
|
94
|
+
let quoted = false;
|
|
95
|
+
let expands = false;
|
|
96
|
+
let quote: "'" | '"' | undefined;
|
|
97
|
+
const endToken = (): void => {
|
|
98
|
+
if (started) tokens.push({ value, quoted, expands });
|
|
99
|
+
value = "";
|
|
100
|
+
started = false;
|
|
101
|
+
quoted = false;
|
|
102
|
+
expands = false;
|
|
103
|
+
};
|
|
104
|
+
const endSegment = (): void => {
|
|
105
|
+
endToken();
|
|
106
|
+
if (tokens.length > 0) segments.push(tokens);
|
|
107
|
+
tokens = [];
|
|
108
|
+
};
|
|
109
|
+
for (let index = 0; index < command.length; index += 1) {
|
|
110
|
+
const character = command[index];
|
|
111
|
+
// bash가 확장하는 `$` 꼴(`$name`, `$1`, `$_`, `${`, `$(`, `$?` 등). 뒤가 공백·따옴표·끝이면 글자 그대로 남는다.
|
|
112
|
+
const dollar = character === "$" && /[A-Za-z0-9_{(?!@*#$]/.test(command[index + 1] ?? "");
|
|
113
|
+
if (quote) {
|
|
114
|
+
if (character === quote) {
|
|
115
|
+
quote = undefined;
|
|
116
|
+
} else if (posix && quote === '"' && character === "\\" && index + 1 < command.length) {
|
|
117
|
+
value += character + command[index + 1];
|
|
118
|
+
index += 1;
|
|
119
|
+
} else {
|
|
120
|
+
if (posix && quote === '"' && dollar) expands = true;
|
|
121
|
+
value += character;
|
|
122
|
+
}
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (posix && character === "\\" && index + 1 < command.length && command[index + 1] !== "\n") {
|
|
126
|
+
value += character + command[index + 1];
|
|
127
|
+
started = true;
|
|
128
|
+
index += 1;
|
|
129
|
+
} else if (character === "'" || character === '"') {
|
|
130
|
+
quote = character;
|
|
131
|
+
started = true;
|
|
132
|
+
quoted = true;
|
|
133
|
+
} else if (character === "#" && !started) {
|
|
134
|
+
while (index + 1 < command.length && command[index + 1] !== "\n") index += 1;
|
|
135
|
+
} else if (/\s/.test(character) && character !== "\n") {
|
|
136
|
+
endToken();
|
|
137
|
+
} else if (/[;|&\n(){}]/.test(character)) {
|
|
138
|
+
endSegment();
|
|
139
|
+
} else {
|
|
140
|
+
if (posix && dollar) expands = true;
|
|
141
|
+
value += character;
|
|
142
|
+
started = true;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
endSegment();
|
|
146
|
+
return segments;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function commandBasename(value: string): string {
|
|
150
|
+
const normalized = value.replace(/\\/g, "/");
|
|
151
|
+
return normalized.slice(normalized.lastIndexOf("/") + 1).toLowerCase().replace(/\.exe$/, "");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** powershell/pwsh 호출의 판정: undefined면 허용, 문자열이면 차단 사유. */
|
|
155
|
+
function matchPowerShellHost(args: Token[], platform: NodeJS.Platform): string | undefined {
|
|
156
|
+
for (const arg of args) {
|
|
157
|
+
const option = arg.value.toLowerCase();
|
|
158
|
+
if (!arg.quoted && /^-f(?:i(?:le?)?)?$/.test(option)) return undefined;
|
|
159
|
+
if (!arg.quoted && (option === "-encodedcommand" || option === "-e" || option === "-ec")) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const commandIndex = args.findIndex(
|
|
164
|
+
(arg) => !arg.quoted && ["-c", "-command", "-commandwithargs"].includes(arg.value.toLowerCase()),
|
|
165
|
+
);
|
|
166
|
+
if (commandIndex < 0) return undefined;
|
|
167
|
+
// Windows 내장 셸은 따옴표 안의 `$`도 바꿔 넘기므로 모든 `$`를 막고, 진짜 bash는 확장되는 `$`만 막는다.
|
|
168
|
+
const dollar = platform === "win32"
|
|
169
|
+
? (arg: Token) => arg.value.includes("$")
|
|
170
|
+
: (arg: Token) => arg.expands;
|
|
171
|
+
if (args.slice(commandIndex + 1).some(dollar)) {
|
|
172
|
+
return reason("`-Command` 인자의 `$`(bash 층이 변형해 PowerShell이 다른 코드를 받습니다)", platform);
|
|
173
|
+
}
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* bash 명령에 PowerShell 전용 문법이 실행 위치로 쓰였으면 차단 사유를, 아니면 undefined를 돌려준다.
|
|
179
|
+
* `platform`은 bash 도구가 실제로 도는 OS(기본 `process.platform`)이며 안내문과 `-Command`의 `$` 판정을 가른다.
|
|
180
|
+
*/
|
|
181
|
+
export function matchPowerShellSyntax(
|
|
182
|
+
command: string,
|
|
183
|
+
platform: NodeJS.Platform = process.platform,
|
|
184
|
+
): string | undefined {
|
|
185
|
+
const body = stripHeredocBodies(command);
|
|
186
|
+
|
|
187
|
+
for (const tokens of segmentTokens(body, platform !== "win32")) {
|
|
188
|
+
const head = tokens[0];
|
|
189
|
+
if (head.quoted) continue;
|
|
190
|
+
const name = commandBasename(head.value);
|
|
191
|
+
if (name === "powershell" || name === "pwsh") {
|
|
192
|
+
const hostReason = matchPowerShellHost(tokens.slice(1), platform);
|
|
193
|
+
if (hostReason) return hostReason;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (CMDLETS.has(name)) return reason(`cmdlet \`${head.value}\``, platform);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const masked = maskQuoted(body);
|
|
200
|
+
const envVariable = /\$env:[A-Za-z_]\w*/i.exec(masked);
|
|
201
|
+
if (envVariable) return reason(`\`${envVariable[0]}\``, platform);
|
|
202
|
+
|
|
203
|
+
const assignment = /(?:^|[;&|{\n])[ \t]*(\$[A-Za-z_]\w*)[ \t]*(?:[-+*/]|\?\?)?=(?!=)/.exec(masked);
|
|
204
|
+
if (assignment) return reason(`\`${assignment[1]} = ...\` 대입`, platform);
|
|
205
|
+
|
|
206
|
+
const block = /(?:^|[;&|{\n])[ \t]*(if|elseif|foreach|while)[ \t]*\([^\n]*\)[ \t]*\{/i.exec(masked);
|
|
207
|
+
if (block) return reason(`\`${block[1]} (...) { }\` 블록`, platform);
|
|
208
|
+
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|