@yanglaofish/fishtools 0.5.1 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -11
- package/manual/README.md +25 -11
- package/manual/docs/deployment.md +3 -3
- package/manual/docs/examples/action-plugin/package.json +1 -1
- package/manual/docs/modules.md +2 -0
- package/manual/docs/plugin-development.md +18 -5
- package/manual/docs/releases.md +56 -6
- package/manual/docs/superpowers/plans/2026-10-13-command-shortcuts.md +108 -0
- package/manual/docs/superpowers/plans/2026-10-13-global-plugins.md +56 -0
- package/manual/docs/superpowers/plans/2026-10-13-tui-readable-sessions.md +21 -0
- package/manual/docs/superpowers/reviews/2026-10-13-0.5.0-followup-review.md +4 -1
- package/manual/docs/superpowers/reviews/2026-10-13-0.5.3-review.md +28 -0
- package/manual/docs/superpowers/reviews/2026-10-13-command-shortcuts-review.md +70 -0
- package/manual/docs/superpowers/reviews/2026-10-13-tui-sessions-review.md +55 -0
- package/manual/docs/superpowers/specs/2026-10-12-workflow-variation-design.md +1 -1
- package/manual/docs/superpowers/specs/2026-10-13-command-shortcuts-design.md +56 -0
- package/manual/docs/superpowers/specs/2026-10-13-issue-4-workflow-menu.md +51 -0
- package/manual/docs/superpowers/specs/2026-10-13-issue-5-results-and-history.md +20 -0
- package/manual/docs/terminal-commands.md +72 -0
- package/manual/docs/verification.md +56 -1
- package/manual/packages/core/README.md +5 -1
- package/manual/packages/core/package.json +2 -1
- package/manual/packages/core/src/application.js +203 -57
- package/manual/packages/core/src/development-watch-worker.js +10 -1
- package/manual/packages/core/src/development.js +1 -1
- package/manual/packages/core/src/export-snapshot.js +20 -1
- package/manual/packages/core/src/plugin-catalog.js +42 -0
- package/manual/packages/core/src/version.js +1 -1
- package/manual/packages/fst-cli/README.md +6 -0
- package/manual/packages/fst-cli/bin/fst.js +7 -6
- package/manual/packages/fst-cli/package.json +1 -1
- package/manual/packages/fst-cli/src/development.js +6 -1
- package/manual/packages/fst-cli/src/terminal/command-menu.js +191 -0
- package/manual/packages/fst-cli/src/terminal/navigation.js +6 -3
- package/manual/packages/fst-cli/src/terminal/presentation.js +4 -3
- package/manual/packages/fst-cli/src/terminal/run-feed.js +69 -13
- package/manual/packages/fst-cli/src/terminal/run-presentation.js +55 -12
- package/manual/packages/fst-cli/src/terminal/run-viewer.js +26 -10
- package/manual/packages/fst-cli/src/terminal/session-history.js +82 -0
- package/manual/packages/fst-cli/src/terminal/session.js +153 -43
- package/manual/packages/fst-cli/src/terminal/view.js +74 -16
- package/manual/packages/fst-cli/src/terminal/workflow-menu.js +15 -15
- package/manual/packages/fst-devtools/package.json +2 -2
- package/manual/packages/fst-devtools/src/documentation.js +2 -1
- package/manual/packages/fst-devtools/src/plugin-tools.js +1 -1
- package/manual/packages/fst-logs/README.md +23 -2
- package/manual/packages/fst-logs/package.json +2 -1
- package/manual/packages/fst-logs/src/file-identity.js +23 -0
- package/manual/packages/fst-logs/src/markdown-log.js +4 -3
- package/manual/packages/fst-logs/src/run-logs.js +3 -2
- package/manual/packages/fst-logs/src/session-history.js +180 -0
- package/manual/packages/fst-platform/README.md +15 -0
- package/manual/packages/fst-platform/package.json +4 -3
- package/manual/packages/fst-platform/src/process.js +15 -8
- package/manual/packages/fst-platform/src/shell.js +103 -0
- package/manual/packages/fst-plugin/package.json +1 -1
- package/manual/packages/fst-plugin/src/contracts.js +6 -2
- package/manual/packages/fst-plugin/src/host.js +31 -23
- package/manual/packages/fst-workflow/package.json +1 -1
- package/manual/packages/fst-workflow/src/engine.js +1 -1
- package/manual/packages/fst-workspace/README.md +5 -0
- package/manual/packages/fst-workspace/package.json +3 -1
- package/manual/packages/fst-workspace/src/plugin-registry.js +58 -0
- package/manual/packages/fst-workspace/src/plugins.js +7 -4
- package/manual/packages/fst-workspace/src/shortcuts.js +119 -0
- package/manual/packages/fst-workspace/src/workflows.js +5 -3
- package/manual/packages/pack/index.js +1 -1
- package/manual/packages/pack/package.json +3 -3
- package/manual/packages/pack/runtime-cache.js +26 -0
- package/manual/packages/pack/runtime.js +6 -10
- package/manual/plugins/commands/LICENSE +21 -0
- package/manual/plugins/commands/README.md +41 -0
- package/manual/plugins/commands/index.js +94 -0
- package/manual/plugins/commands/package.json +17 -0
- package/node_modules/@mytools/commands/LICENSE +21 -0
- package/node_modules/@mytools/commands/README.md +41 -0
- package/node_modules/@mytools/commands/index.js +94 -0
- package/node_modules/@mytools/commands/package.json +17 -0
- package/node_modules/@mytools/core/README.md +5 -1
- package/node_modules/@mytools/core/package.json +2 -1
- package/node_modules/@mytools/core/src/application.js +203 -57
- package/node_modules/@mytools/core/src/development-watch-worker.js +10 -1
- package/node_modules/@mytools/core/src/development.js +1 -1
- package/node_modules/@mytools/core/src/export-snapshot.js +20 -1
- package/node_modules/@mytools/core/src/plugin-catalog.js +42 -0
- package/node_modules/@mytools/core/src/version.js +1 -1
- package/node_modules/@mytools/fst-cli/README.md +6 -0
- package/node_modules/@mytools/fst-cli/bin/fst.js +7 -6
- package/node_modules/@mytools/fst-cli/package.json +1 -1
- package/node_modules/@mytools/fst-cli/src/development.js +6 -1
- package/node_modules/@mytools/fst-cli/src/terminal/command-menu.js +191 -0
- package/node_modules/@mytools/fst-cli/src/terminal/navigation.js +6 -3
- package/node_modules/@mytools/fst-cli/src/terminal/presentation.js +4 -3
- package/node_modules/@mytools/fst-cli/src/terminal/run-feed.js +69 -13
- package/node_modules/@mytools/fst-cli/src/terminal/run-presentation.js +55 -12
- package/node_modules/@mytools/fst-cli/src/terminal/run-viewer.js +26 -10
- package/node_modules/@mytools/fst-cli/src/terminal/session-history.js +82 -0
- package/node_modules/@mytools/fst-cli/src/terminal/session.js +153 -43
- package/node_modules/@mytools/fst-cli/src/terminal/view.js +74 -16
- package/node_modules/@mytools/fst-cli/src/terminal/workflow-menu.js +15 -15
- package/node_modules/@mytools/fst-devtools/package.json +2 -2
- package/node_modules/@mytools/fst-devtools/src/documentation.js +2 -1
- package/node_modules/@mytools/fst-devtools/src/plugin-tools.js +1 -1
- package/node_modules/@mytools/fst-logs/README.md +23 -2
- package/node_modules/@mytools/fst-logs/package.json +2 -1
- package/node_modules/@mytools/fst-logs/src/file-identity.js +23 -0
- package/node_modules/@mytools/fst-logs/src/markdown-log.js +4 -3
- package/node_modules/@mytools/fst-logs/src/run-logs.js +3 -2
- package/node_modules/@mytools/fst-logs/src/session-history.js +180 -0
- package/node_modules/@mytools/fst-platform/README.md +15 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/LICENSE +21 -0
- package/node_modules/{undici/docs/docs/index.md → @mytools/fst-platform/node_modules/undici/README.md} +85 -137
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Agent.md +84 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/BalancedPool.md +99 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/CacheStorage.md +30 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/CacheStore.md +164 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Client.md +288 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/ClientStats.md +27 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Connector.md +115 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/ContentType.md +57 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Cookies.md +128 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Debug.md +62 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +317 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Dispatcher.md +1393 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +159 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Errors.md +49 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/EventSource.md +45 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Fetch.md +60 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/GlobalInstallation.md +139 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/H2CClient.md +263 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockAgent.md +603 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockCallHistory.md +197 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +43 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockClient.md +81 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockErrors.md +12 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/MockPool.md +555 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Pool.md +84 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/PoolStats.md +35 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/ProxyAgent.md +229 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RedirectHandler.md +93 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RetryAgent.md +50 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RetryHandler.md +118 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/RoundRobinPool.md +145 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/SnapshotAgent.md +616 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +275 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/Util.md +25 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/WebSocket.md +141 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/api/api-lifecycle.md +91 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/client-certificate.md +64 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/docs/docs/best-practices/crawling.md +1 -3
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/mocking-request.md +190 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/proxy.md +127 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/docs/docs/best-practices/undici-vs-builtin-fetch.md +8 -10
- package/node_modules/@mytools/fst-platform/node_modules/undici/docs/docs/best-practices/writing-tests.md +63 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/index-fetch.js +65 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/index.d.ts +3 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/index.js +234 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/abort-signal.js +59 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-connect.js +110 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-pipeline.js +252 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-request.js +214 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-stream.js +209 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/api-upgrade.js +111 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/index.js +7 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/api/readable.js +580 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/cache/memory-cache-store.js +3 -3
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/cache/sqlite-cache-store.js +1 -3
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/connect.js +153 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/constants.js +143 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/diagnostics.js +227 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/errors.js +477 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/request.js +485 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/symbols.js +75 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/tree.js +160 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/core/util.js +992 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/agent.js +158 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/balanced-pool.js +221 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/client-h1.js +1746 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/client-h2.js +1060 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/client.js +668 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/dispatcher-base.js +184 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/dispatcher.js +48 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +146 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/fixed-queue.js +135 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/dispatcher/h2c-client.js +4 -4
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/pool-base.js +214 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/pool.js +118 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/proxy-agent.js +319 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/dispatcher/retry-agent.js +35 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/dispatcher/round-robin-pool.js +10 -32
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/dispatcher/socks5-proxy-agent.js +63 -153
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/global.js +59 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/handler/cache-handler.js +7 -49
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/handler/cache-revalidation-handler.js +0 -10
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/decorator-handler.js +67 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/handler/deduplication-handler.js +10 -29
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/redirect-handler.js +238 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/retry-handler.js +504 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/unwrap-handler.js +106 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/handler/wrap-handler.js +105 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/interceptor/cache.js +26 -79
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/interceptor/decompress.js +3 -13
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/interceptor/deduplicate.js +4 -5
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/dns.js +571 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/dump.js +99 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/redirect.js +21 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/response-error.js +95 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/interceptor/retry.js +19 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/.gitkeep +0 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/constants.js +531 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/llhttp-wasm.js +15 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +15 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/llhttp/utils.js +12 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-agent.js +232 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/mock-call-history.js +1 -1
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-client.js +68 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-errors.js +29 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-interceptor.js +209 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-pool.js +68 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-symbols.js +32 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/mock-utils.js +486 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/mock/pending-interceptors-formatter.js +43 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/snapshot-agent.js +7 -25
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/snapshot-recorder.js +3 -38
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/cache.js +10 -92
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/util/promise.js +28 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/runtime-features.js +34 -3
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/util/timers.js +425 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cache/cache.js +864 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cache/cachestorage.js +152 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cache/util.js +45 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/constants.js +12 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/index.js +199 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/parse.js +314 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/cookies/util.js +352 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/eventsource/eventsource-stream.js +494 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/eventsource/eventsource.js +501 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/eventsource/util.js +29 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/LICENSE +21 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/body.js +509 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/constants.js +131 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/data-url.js +596 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/formdata-parser.js +586 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/formdata.js +259 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/global.js +40 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/headers.js +719 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/index.js +2413 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/request.js +1115 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/response.js +641 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/fetch/util.js +1522 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/infra/index.js +1 -16
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/webidl/index.js +21 -7
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/connection.js +339 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/constants.js +126 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/events.js +331 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/frame.js +133 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/permessage-deflate.js +105 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/receiver.js +507 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/sender.js +109 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/websocket/stream/websocketerror.js +10 -13
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/websocket/stream/websocketstream.js +14 -29
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/util.js +347 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/lib/web/websocket/websocket.js +758 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/package.json +152 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/scripts/strip-comments.js +10 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/README.md +6 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/agent.d.ts +32 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/api.d.ts +43 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/balanced-pool.d.ts +30 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/cache.d.ts +36 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/client.d.ts +139 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/connector.d.ts +36 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/content-type.d.ts +21 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/cookies.d.ts +30 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/diagnostics-channel.d.ts +74 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/dispatcher.d.ts +275 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/env-http-proxy-agent.d.ts +22 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/errors.d.ts +177 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/eventsource.d.ts +66 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/fetch.d.ts +231 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/formdata.d.ts +114 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/global-dispatcher.d.ts +9 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/global-origin.d.ts +7 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/h2c-client.d.ts +6 -6
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/handlers.d.ts +14 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/header.d.ts +160 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/index.d.ts +91 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/interceptors.d.ts +82 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-agent.d.ts +68 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-client.d.ts +27 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-errors.d.ts +12 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-interceptor.d.ts +94 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/mock-pool.d.ts +27 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/patch.d.ts +29 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/pool-stats.d.ts +19 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/pool.d.ts +41 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/proxy-agent.d.ts +29 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/readable.d.ts +68 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/retry-agent.d.ts +8 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/retry-handler.d.ts +125 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/round-robin-pool.d.ts +2 -0
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/snapshot-agent.d.ts +0 -4
- package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/socks5-proxy-agent.d.ts +2 -4
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/util.d.ts +18 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/webidl.d.ts +347 -0
- package/node_modules/@mytools/fst-platform/node_modules/undici/types/websocket.d.ts +188 -0
- package/node_modules/@mytools/fst-platform/package.json +4 -3
- package/node_modules/@mytools/fst-platform/src/process.js +15 -8
- package/node_modules/@mytools/fst-platform/src/shell.js +103 -0
- package/node_modules/@mytools/fst-plugin/package.json +1 -1
- package/node_modules/@mytools/fst-plugin/src/contracts.js +6 -2
- package/node_modules/@mytools/fst-plugin/src/host.js +31 -23
- package/node_modules/@mytools/fst-workflow/package.json +1 -1
- package/node_modules/@mytools/fst-workflow/src/engine.js +1 -1
- package/node_modules/@mytools/fst-workspace/README.md +5 -0
- package/node_modules/@mytools/fst-workspace/package.json +3 -1
- package/node_modules/@mytools/fst-workspace/src/plugin-registry.js +58 -0
- package/node_modules/@mytools/fst-workspace/src/plugins.js +7 -4
- package/node_modules/@mytools/fst-workspace/src/shortcuts.js +119 -0
- package/node_modules/@mytools/fst-workspace/src/workflows.js +5 -3
- package/node_modules/@mytools/pack/index.js +1 -1
- package/node_modules/@mytools/pack/package.json +3 -3
- package/node_modules/@mytools/pack/runtime-cache.js +26 -0
- package/node_modules/@mytools/pack/runtime.js +6 -10
- package/node_modules/@mytools/web/public/THIRD_PARTY_NOTICES.txt +1246 -1232
- package/node_modules/@npmcli/agent/lib/agents.js +0 -10
- package/node_modules/@npmcli/agent/package.json +12 -11
- package/node_modules/@npmcli/arborist/README.md +2 -2
- package/node_modules/@npmcli/arborist/bin/index.js +2 -1
- package/node_modules/@npmcli/arborist/bin/shrinkwrap.js +7 -0
- package/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js +25 -159
- package/node_modules/@npmcli/arborist/lib/arborist/isolated-reifier.js +49 -11
- package/node_modules/@npmcli/arborist/lib/arborist/load-actual.js +0 -67
- package/node_modules/@npmcli/arborist/lib/arborist/load-virtual.js +37 -5
- package/node_modules/@npmcli/arborist/lib/arborist/rebuild.js +8 -15
- package/node_modules/@npmcli/arborist/lib/arborist/reify.js +42 -59
- package/node_modules/@npmcli/arborist/lib/consistent-resolve.js +1 -1
- package/node_modules/@npmcli/arborist/lib/diff.js +22 -17
- package/node_modules/@npmcli/arborist/lib/edge.js +2 -22
- package/node_modules/@npmcli/arborist/lib/index.js +0 -2
- package/node_modules/@npmcli/arborist/lib/isolated-classes.js +1 -4
- package/node_modules/@npmcli/arborist/lib/node.js +9 -13
- package/node_modules/@npmcli/arborist/lib/place-dep.js +0 -6
- package/node_modules/@npmcli/arborist/lib/printable.js +5 -0
- package/node_modules/@npmcli/arborist/lib/shrinkwrap.js +32 -55
- package/node_modules/@npmcli/arborist/package.json +26 -32
- package/node_modules/@npmcli/fs/lib/move-file.js +5 -5
- package/node_modules/@npmcli/fs/package.json +5 -5
- package/node_modules/@npmcli/git/package.json +12 -13
- package/node_modules/@npmcli/installed-package-contents/package.json +7 -7
- package/node_modules/@npmcli/map-workspaces/package.json +7 -7
- package/node_modules/@npmcli/metavuln-calculator/package.json +16 -10
- package/node_modules/@npmcli/name-from-folder/package.json +16 -13
- package/node_modules/@npmcli/node-gyp/package.json +5 -5
- package/node_modules/@npmcli/package-json/lib/index.js +1 -2
- package/node_modules/@npmcli/package-json/lib/normalize.js +22 -23
- package/node_modules/@npmcli/package-json/package.json +10 -11
- package/node_modules/@npmcli/promise-spawn/README.md +2 -1
- package/node_modules/@npmcli/promise-spawn/package.json +5 -5
- package/node_modules/@npmcli/redact/package.json +4 -4
- package/node_modules/@npmcli/run-script/lib/is-server-package.js +11 -0
- package/node_modules/@npmcli/run-script/lib/make-spawn-args.js +6 -5
- package/node_modules/@npmcli/run-script/lib/run-script-pkg.js +13 -4
- package/node_modules/@npmcli/run-script/lib/run-script.js +2 -1
- package/node_modules/@npmcli/run-script/package.json +11 -12
- package/node_modules/@sigstore/bundle/README.md +1 -1
- package/node_modules/@sigstore/bundle/dist/error.js +0 -1
- package/node_modules/@sigstore/bundle/package.json +2 -2
- package/node_modules/@sigstore/core/README.md +1 -1
- package/node_modules/@sigstore/core/dist/asn1/length.js +1 -12
- package/node_modules/@sigstore/core/dist/asn1/obj.js +7 -25
- package/node_modules/@sigstore/core/dist/asn1/parse.js +5 -24
- package/node_modules/@sigstore/core/package.json +2 -2
- package/node_modules/@sigstore/sign/README.md +1 -1
- package/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js +1 -1
- package/node_modules/@sigstore/sign/package.json +9 -9
- package/node_modules/@sigstore/tuf/README.md +1 -1
- package/node_modules/@sigstore/tuf/package.json +4 -4
- package/node_modules/@sigstore/tuf/seeds.json +1 -1
- package/node_modules/@sigstore/verify/README.md +1 -1
- package/node_modules/@sigstore/verify/dist/bundle/dsse.d.ts +0 -1
- package/node_modules/@sigstore/verify/dist/bundle/dsse.js +0 -6
- package/node_modules/@sigstore/verify/dist/bundle/message.d.ts +0 -1
- package/node_modules/@sigstore/verify/dist/bundle/message.js +0 -5
- package/node_modules/@sigstore/verify/dist/policy.d.ts +1 -1
- package/node_modules/@sigstore/verify/dist/policy.js +2 -0
- package/node_modules/@sigstore/verify/dist/shared.types.d.ts +1 -6
- package/node_modules/@sigstore/verify/dist/tlog/checkpoint.js +3 -17
- package/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js +4 -4
- package/node_modules/@sigstore/verify/dist/tlog/index.js +1 -13
- package/node_modules/@sigstore/verify/dist/tlog/merkle.js +1 -12
- package/node_modules/@sigstore/verify/dist/verifier.js +5 -13
- package/node_modules/@sigstore/verify/package.json +5 -5
- package/node_modules/@tufjs/models/package.json +3 -3
- package/node_modules/abbrev/package.json +8 -9
- package/node_modules/agent-base/dist/helpers.d.ts +5 -0
- package/node_modules/agent-base/dist/helpers.d.ts.map +1 -1
- package/node_modules/agent-base/dist/helpers.js +34 -5
- package/node_modules/agent-base/dist/helpers.js.map +1 -1
- package/node_modules/agent-base/dist/index.d.ts +5 -1
- package/node_modules/agent-base/dist/index.d.ts.map +1 -1
- package/node_modules/agent-base/dist/index.js +40 -8
- package/node_modules/agent-base/dist/index.js.map +1 -1
- package/node_modules/agent-base/package.json +12 -12
- package/node_modules/bin-links/README.md +4 -5
- package/node_modules/bin-links/lib/fix-bin.js +1 -3
- package/node_modules/bin-links/lib/index.js +16 -8
- package/node_modules/bin-links/lib/link-mans.js +53 -0
- package/node_modules/bin-links/package.json +12 -11
- package/node_modules/cacache/lib/content/write.js +0 -2
- package/node_modules/cacache/lib/entry-index.js +0 -3
- package/node_modules/cacache/lib/rm.js +0 -1
- package/node_modules/cacache/lib/util/tmp.js +1 -5
- package/node_modules/cacache/lib/verify.js +2 -2
- package/node_modules/cacache/package.json +7 -7
- package/node_modules/cmd-shim/lib/index.js +32 -67
- package/node_modules/cmd-shim/package.json +5 -5
- package/node_modules/hosted-git-info/README.md +1 -1
- package/node_modules/hosted-git-info/lib/parse-url.js +3 -1
- package/node_modules/hosted-git-info/package.json +4 -4
- package/node_modules/http-proxy-agent/dist/index.d.ts +5 -8
- package/node_modules/http-proxy-agent/dist/index.d.ts.map +1 -1
- package/node_modules/http-proxy-agent/dist/index.js +42 -26
- package/node_modules/http-proxy-agent/dist/index.js.map +1 -1
- package/node_modules/http-proxy-agent/package.json +14 -15
- package/node_modules/https-proxy-agent/dist/index.d.ts +5 -9
- package/node_modules/https-proxy-agent/dist/index.d.ts.map +1 -1
- package/node_modules/https-proxy-agent/dist/index.js +44 -98
- package/node_modules/https-proxy-agent/dist/index.js.map +1 -1
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +3 -0
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts.map +1 -1
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.js +10 -3
- package/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -1
- package/node_modules/https-proxy-agent/package.json +15 -16
- package/node_modules/ignore-walk/package.json +4 -4
- package/node_modules/ini/package.json +5 -5
- package/node_modules/ip-address/README.md +70 -70
- package/node_modules/ip-address/dist/ipv6.js +7 -4
- package/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/ip-address/dist/v6/constants.d.ts +3 -0
- package/node_modules/ip-address/dist/v6/constants.js +3 -0
- package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/ip-address/package.json +2 -1
- package/node_modules/json-parse-even-better-errors/lib/index.js +1 -3
- package/node_modules/json-parse-even-better-errors/package.json +17 -13
- package/node_modules/make-fetch-happen/package.json +11 -11
- package/node_modules/minipass-fetch/package.json +4 -4
- package/node_modules/node-gyp/.release-please-manifest.json +1 -1
- package/node_modules/node-gyp/CHANGELOG.md +0 -102
- package/node_modules/node-gyp/README.md +2 -3
- package/node_modules/node-gyp/eslint.config.js +1 -4
- package/node_modules/node-gyp/gyp/.release-please-manifest.json +1 -1
- package/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +19 -14
- package/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +2 -7
- package/node_modules/node-gyp/gyp/pyproject.toml +1 -1
- package/node_modules/node-gyp/lib/build.js +6 -18
- package/node_modules/node-gyp/lib/create-config-gypi.js +0 -5
- package/node_modules/node-gyp/lib/node-gyp.js +2 -9
- package/node_modules/node-gyp/lib/rebuild.js +3 -3
- package/node_modules/node-gyp/package.json +9 -11
- package/node_modules/nopt/README.md +4 -2
- package/node_modules/nopt/lib/debug.js +5 -0
- package/node_modules/nopt/lib/nopt-lib.js +43 -7
- package/node_modules/nopt/lib/nopt.js +4 -2
- package/node_modules/nopt/lib/type-defs.js +13 -8
- package/node_modules/nopt/package.json +17 -15
- package/node_modules/npm-bundled/package.json +6 -6
- package/node_modules/npm-install-checks/package.json +5 -5
- package/node_modules/npm-normalize-package-bin/package.json +16 -13
- package/node_modules/npm-package-arg/package.json +7 -7
- package/node_modules/npm-packlist/README.md +30 -45
- package/node_modules/npm-packlist/lib/index.js +47 -115
- package/node_modules/npm-packlist/package.json +8 -10
- package/node_modules/npm-pick-manifest/package.json +19 -15
- package/node_modules/npm-registry-fetch/lib/errors.js +3 -8
- package/node_modules/npm-registry-fetch/package.json +12 -12
- package/node_modules/pacote/lib/dir.js +5 -60
- package/node_modules/pacote/lib/fetcher.js +0 -4
- package/node_modules/pacote/lib/git.js +3 -11
- package/node_modules/pacote/lib/util/add-git-sha.js +1 -1
- package/node_modules/pacote/package.json +18 -19
- package/node_modules/parse-conflict-json/package.json +6 -6
- package/node_modules/proc-log/package.json +4 -4
- package/node_modules/read-cmd-shim/lib/index.js +1 -1
- package/node_modules/read-cmd-shim/package.json +18 -14
- package/node_modules/sigstore/README.md +1 -1
- package/node_modules/sigstore/package.json +10 -10
- package/node_modules/socks-proxy-agent/dist/index.d.ts +3 -1
- package/node_modules/socks-proxy-agent/dist/index.d.ts.map +1 -1
- package/node_modules/socks-proxy-agent/dist/index.js +43 -17
- package/node_modules/socks-proxy-agent/dist/index.js.map +1 -1
- package/node_modules/socks-proxy-agent/package.json +15 -15
- package/node_modules/ssri/package.json +4 -4
- package/node_modules/tuf-js/dist/config.d.ts +2 -2
- package/node_modules/tuf-js/dist/fetcher.d.ts +4 -4
- package/node_modules/tuf-js/dist/fetcher.js +16 -55
- package/node_modules/tuf-js/dist/updater.js +2 -2
- package/node_modules/tuf-js/package.json +8 -8
- package/node_modules/undici/README.md +72 -405
- package/node_modules/undici/docs/docs/api/Agent.md +41 -252
- package/node_modules/undici/docs/docs/api/BalancedPool.md +48 -246
- package/node_modules/undici/docs/docs/api/CacheStorage.md +13 -171
- package/node_modules/undici/docs/docs/api/Client.md +139 -395
- package/node_modules/undici/docs/docs/api/Connector.md +35 -118
- package/node_modules/undici/docs/docs/api/ContentType.md +25 -65
- package/node_modules/undici/docs/docs/api/Cookies.md +47 -125
- package/node_modules/undici/docs/docs/api/Debug.md +31 -47
- package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +97 -409
- package/node_modules/undici/docs/docs/api/DispatchInterceptor.md +60 -0
- package/node_modules/undici/docs/docs/api/Dispatcher.md +1011 -500
- package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +96 -105
- package/node_modules/undici/docs/docs/api/Errors.md +28 -528
- package/node_modules/undici/docs/docs/api/EventSource.md +13 -326
- package/node_modules/undici/docs/docs/api/Fetch.md +24 -693
- package/node_modules/undici/docs/docs/api/MockAgent.md +264 -346
- package/node_modules/undici/docs/docs/api/MockClient.md +31 -153
- package/node_modules/undici/docs/docs/api/MockErrors.md +5 -56
- package/node_modules/undici/docs/docs/api/MockPool.md +253 -324
- package/node_modules/undici/docs/docs/api/Pool.md +41 -235
- package/node_modules/undici/docs/docs/api/PoolStats.md +13 -119
- package/node_modules/undici/docs/docs/api/ProxyAgent.md +81 -198
- package/node_modules/undici/docs/docs/api/RedirectHandler.md +58 -238
- package/node_modules/undici/docs/docs/api/RetryAgent.md +28 -119
- package/node_modules/undici/docs/docs/api/RetryHandler.md +78 -161
- package/node_modules/undici/docs/docs/api/Util.md +11 -68
- package/node_modules/undici/docs/docs/api/WebSocket.md +24 -509
- package/node_modules/undici/docs/docs/api/api-lifecycle.md +33 -101
- package/node_modules/undici/docs/docs/best-practices/client-certificate.md +0 -2
- package/node_modules/undici/docs/docs/best-practices/mocking-request.md +2 -58
- package/node_modules/undici/docs/docs/best-practices/proxy.md +1 -3
- package/node_modules/undici/docs/docs/best-practices/writing-tests.md +0 -45
- package/node_modules/undici/index-fetch.js +4 -34
- package/node_modules/undici/index.d.ts +1 -1
- package/node_modules/undici/index.js +20 -87
- package/node_modules/undici/lib/api/abort-signal.js +0 -2
- package/node_modules/undici/lib/api/api-connect.js +11 -15
- package/node_modules/undici/lib/api/api-pipeline.js +19 -33
- package/node_modules/undici/lib/api/api-request.js +59 -89
- package/node_modules/undici/lib/api/api-stream.js +64 -114
- package/node_modules/undici/lib/api/api-upgrade.js +13 -26
- package/node_modules/undici/lib/api/readable.js +87 -317
- package/node_modules/undici/lib/api/util.js +93 -0
- package/node_modules/undici/lib/core/connect.js +125 -77
- package/node_modules/undici/lib/core/constants.js +9 -11
- package/node_modules/undici/lib/core/diagnostics.js +129 -154
- package/node_modules/undici/lib/core/errors.js +50 -122
- package/node_modules/undici/lib/core/request.js +87 -172
- package/node_modules/undici/lib/core/symbols.js +2 -14
- package/node_modules/undici/lib/core/tree.js +2 -10
- package/node_modules/undici/lib/core/util.js +190 -481
- package/node_modules/undici/lib/dispatcher/agent.js +35 -83
- package/node_modules/undici/lib/dispatcher/balanced-pool.js +38 -46
- package/node_modules/undici/lib/dispatcher/client-h1.js +199 -492
- package/node_modules/undici/lib/dispatcher/client-h2.js +380 -1409
- package/node_modules/undici/lib/dispatcher/client.js +130 -253
- package/node_modules/undici/lib/dispatcher/dispatcher-base.js +52 -50
- package/node_modules/undici/lib/dispatcher/dispatcher.js +24 -17
- package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +45 -75
- package/node_modules/undici/lib/dispatcher/fixed-queue.js +50 -68
- package/node_modules/undici/lib/dispatcher/pool-base.js +54 -153
- package/node_modules/undici/lib/dispatcher/pool-stats.js +34 -0
- package/node_modules/undici/lib/dispatcher/pool.js +16 -135
- package/node_modules/undici/lib/dispatcher/proxy-agent.js +41 -175
- package/node_modules/undici/lib/dispatcher/retry-agent.js +0 -3
- package/node_modules/undici/lib/global.js +9 -59
- package/node_modules/undici/lib/handler/decorator-handler.js +15 -43
- package/node_modules/undici/lib/handler/redirect-handler.js +116 -127
- package/node_modules/undici/lib/handler/retry-handler.js +182 -398
- package/node_modules/undici/lib/interceptor/dns.js +47 -254
- package/node_modules/undici/lib/interceptor/dump.js +56 -32
- package/node_modules/undici/lib/interceptor/redirect-interceptor.js +21 -0
- package/node_modules/undici/lib/interceptor/redirect.js +14 -11
- package/node_modules/undici/lib/interceptor/response-error.js +22 -31
- package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
- package/node_modules/undici/lib/llhttp/constants.js +193 -446
- package/node_modules/undici/lib/llhttp/llhttp-wasm.js +1 -11
- package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +1 -11
- package/node_modules/undici/lib/llhttp/utils.js +12 -9
- package/node_modules/undici/lib/mock/mock-agent.js +22 -106
- package/node_modules/undici/lib/mock/mock-client.js +4 -13
- package/node_modules/undici/lib/mock/mock-errors.js +2 -3
- package/node_modules/undici/lib/mock/mock-interceptor.js +13 -33
- package/node_modules/undici/lib/mock/mock-pool.js +4 -13
- package/node_modules/undici/lib/mock/mock-symbols.js +1 -10
- package/node_modules/undici/lib/mock/mock-utils.js +51 -404
- package/node_modules/undici/lib/mock/pluralizer.js +29 -0
- package/node_modules/undici/lib/util/timers.js +9 -11
- package/node_modules/undici/lib/web/cache/cache.js +51 -63
- package/node_modules/undici/lib/web/cache/cachestorage.js +7 -13
- package/node_modules/undici/lib/web/cache/symbols.js +5 -0
- package/node_modules/undici/lib/web/cookies/index.js +18 -45
- package/node_modules/undici/lib/web/cookies/parse.js +149 -157
- package/node_modules/undici/lib/web/cookies/util.js +2 -4
- package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +9 -37
- package/node_modules/undici/lib/web/eventsource/eventsource.js +64 -108
- package/node_modules/undici/lib/web/eventsource/util.js +5 -28
- package/node_modules/undici/lib/web/fetch/body.js +148 -173
- package/node_modules/undici/lib/web/fetch/constants.js +6 -13
- package/node_modules/undici/lib/web/fetch/data-url.js +167 -19
- package/node_modules/undici/lib/web/fetch/dispatcher-weakref.js +46 -0
- package/node_modules/undici/lib/web/fetch/file.js +126 -0
- package/node_modules/undici/lib/web/fetch/formdata-parser.js +117 -229
- package/node_modules/undici/lib/web/fetch/formdata.js +65 -85
- package/node_modules/undici/lib/web/fetch/headers.js +108 -143
- package/node_modules/undici/lib/web/fetch/index.js +446 -627
- package/node_modules/undici/lib/web/fetch/request.js +115 -217
- package/node_modules/undici/lib/web/fetch/response.js +82 -110
- package/node_modules/undici/lib/web/fetch/symbols.js +9 -0
- package/node_modules/undici/lib/web/fetch/util.js +393 -291
- package/node_modules/undici/lib/web/fetch/webidl.js +695 -0
- package/node_modules/undici/lib/web/fileapi/encoding.js +290 -0
- package/node_modules/undici/lib/web/fileapi/filereader.js +344 -0
- package/node_modules/undici/lib/web/fileapi/progressevent.js +78 -0
- package/node_modules/undici/lib/web/fileapi/symbols.js +10 -0
- package/node_modules/undici/lib/web/fileapi/util.js +391 -0
- package/node_modules/undici/lib/web/websocket/connection.js +160 -139
- package/node_modules/undici/lib/web/websocket/constants.js +10 -70
- package/node_modules/undici/lib/web/websocket/events.js +30 -49
- package/node_modules/undici/lib/web/websocket/frame.js +20 -51
- package/node_modules/undici/lib/web/websocket/receiver.js +87 -83
- package/node_modules/undici/lib/web/websocket/sender.js +13 -18
- package/node_modules/undici/lib/web/websocket/symbols.js +12 -0
- package/node_modules/undici/lib/web/websocket/util.js +90 -115
- package/node_modules/undici/lib/web/websocket/websocket.js +171 -359
- package/node_modules/undici/package.json +57 -49
- package/node_modules/undici/scripts/strip-comments.js +1 -3
- package/node_modules/undici/types/agent.d.ts +13 -12
- package/node_modules/undici/types/api.d.ts +26 -26
- package/node_modules/undici/types/balanced-pool.d.ts +12 -13
- package/node_modules/undici/types/client.d.ts +39 -98
- package/node_modules/undici/types/connector.d.ts +2 -5
- package/node_modules/undici/types/cookies.d.ts +1 -3
- package/node_modules/undici/types/diagnostics-channel.d.ts +11 -20
- package/node_modules/undici/types/dispatcher.d.ts +139 -136
- package/node_modules/undici/types/env-http-proxy-agent.d.ts +3 -4
- package/node_modules/undici/types/errors.d.ts +54 -86
- package/node_modules/undici/types/eventsource.d.ts +4 -9
- package/node_modules/undici/types/fetch.d.ts +25 -51
- package/node_modules/undici/types/file.d.ts +39 -0
- package/node_modules/undici/types/filereader.d.ts +54 -0
- package/node_modules/undici/types/formdata.d.ts +7 -7
- package/node_modules/undici/types/global-dispatcher.d.ts +4 -4
- package/node_modules/undici/types/global-origin.d.ts +5 -5
- package/node_modules/undici/types/handlers.d.ts +9 -10
- package/node_modules/undici/types/header.d.ts +1 -162
- package/node_modules/undici/types/index.d.ts +47 -69
- package/node_modules/undici/types/interceptors.d.ts +12 -62
- package/node_modules/undici/types/mock-agent.d.ts +27 -46
- package/node_modules/undici/types/mock-client.d.ts +4 -6
- package/node_modules/undici/types/mock-errors.d.ts +3 -3
- package/node_modules/undici/types/mock-interceptor.d.ts +21 -26
- package/node_modules/undici/types/mock-pool.d.ts +4 -6
- package/node_modules/undici/types/patch.d.ts +4 -0
- package/node_modules/undici/types/pool-stats.d.ts +8 -8
- package/node_modules/undici/types/pool.d.ts +14 -14
- package/node_modules/undici/types/proxy-agent.d.ts +6 -13
- package/node_modules/undici/types/readable.d.ts +16 -19
- package/node_modules/undici/types/retry-agent.d.ts +1 -1
- package/node_modules/undici/types/retry-handler.d.ts +9 -18
- package/node_modules/undici/types/util.d.ts +3 -3
- package/node_modules/undici/types/webidl.d.ts +32 -156
- package/node_modules/undici/types/websocket.d.ts +10 -48
- package/node_modules/validate-npm-package-name/package.json +4 -4
- package/node_modules/which/package.json +4 -4
- package/node_modules/write-file-atomic/package.json +4 -4
- package/package.json +58 -60
- package/node_modules/@npmcli/arborist/lib/npm-extension.js +0 -237
- package/node_modules/@npmcli/arborist/lib/package-extensions.js +0 -236
- package/node_modules/@npmcli/arborist/lib/patch.js +0 -111
- package/node_modules/@npmcli/arborist/lib/patched-dependencies.js +0 -168
- package/node_modules/cacache/lib/util/cache-dir.js +0 -29
- package/node_modules/diff/CONTRIBUTING.md +0 -28
- package/node_modules/diff/LICENSE +0 -29
- package/node_modules/diff/README.md +0 -388
- package/node_modules/diff/dist/diff.js +0 -1782
- package/node_modules/diff/dist/diff.min.js +0 -1
- package/node_modules/diff/eslint.config.mjs +0 -182
- package/node_modules/diff/libcjs/convert/dmp.d.ts +0 -8
- package/node_modules/diff/libcjs/convert/dmp.d.ts.map +0 -1
- package/node_modules/diff/libcjs/convert/dmp.js +0 -24
- package/node_modules/diff/libcjs/convert/xml.d.ts +0 -6
- package/node_modules/diff/libcjs/convert/xml.d.ts.map +0 -1
- package/node_modules/diff/libcjs/convert/xml.js +0 -34
- package/node_modules/diff/libcjs/diff/array.d.ts +0 -19
- package/node_modules/diff/libcjs/diff/array.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/array.js +0 -40
- package/node_modules/diff/libcjs/diff/base.d.ts +0 -20
- package/node_modules/diff/libcjs/diff/base.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/base.js +0 -265
- package/node_modules/diff/libcjs/diff/character.d.ts +0 -19
- package/node_modules/diff/libcjs/diff/character.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/character.js +0 -31
- package/node_modules/diff/libcjs/diff/css.d.ts +0 -18
- package/node_modules/diff/libcjs/diff/css.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/css.js +0 -34
- package/node_modules/diff/libcjs/diff/json.d.ts +0 -24
- package/node_modules/diff/libcjs/diff/json.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/json.js +0 -105
- package/node_modules/diff/libcjs/diff/line.d.ts +0 -24
- package/node_modules/diff/libcjs/diff/line.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/line.js +0 -89
- package/node_modules/diff/libcjs/diff/sentence.d.ts +0 -21
- package/node_modules/diff/libcjs/diff/sentence.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/sentence.js +0 -67
- package/node_modules/diff/libcjs/diff/word.d.ts +0 -35
- package/node_modules/diff/libcjs/diff/word.d.ts.map +0 -1
- package/node_modules/diff/libcjs/diff/word.js +0 -312
- package/node_modules/diff/libcjs/index.d.ts +0 -20
- package/node_modules/diff/libcjs/index.d.ts.map +0 -1
- package/node_modules/diff/libcjs/index.js +0 -64
- package/node_modules/diff/libcjs/package.json +0 -1
- package/node_modules/diff/libcjs/patch/apply.d.ts +0 -62
- package/node_modules/diff/libcjs/patch/apply.d.ts.map +0 -1
- package/node_modules/diff/libcjs/patch/apply.js +0 -267
- package/node_modules/diff/libcjs/patch/create.d.ts +0 -122
- package/node_modules/diff/libcjs/patch/create.d.ts.map +0 -1
- package/node_modules/diff/libcjs/patch/create.js +0 -251
- package/node_modules/diff/libcjs/patch/line-endings.d.ts +0 -17
- package/node_modules/diff/libcjs/patch/line-endings.d.ts.map +0 -1
- package/node_modules/diff/libcjs/patch/line-endings.js +0 -61
- package/node_modules/diff/libcjs/patch/parse.d.ts +0 -8
- package/node_modules/diff/libcjs/patch/parse.d.ts.map +0 -1
- package/node_modules/diff/libcjs/patch/parse.js +0 -150
- package/node_modules/diff/libcjs/patch/reverse.d.ts +0 -9
- package/node_modules/diff/libcjs/patch/reverse.d.ts.map +0 -1
- package/node_modules/diff/libcjs/patch/reverse.js +0 -37
- package/node_modules/diff/libcjs/types.d.ts +0 -213
- package/node_modules/diff/libcjs/types.d.ts.map +0 -1
- package/node_modules/diff/libcjs/types.js +0 -2
- package/node_modules/diff/libcjs/util/array.d.ts +0 -3
- package/node_modules/diff/libcjs/util/array.d.ts.map +0 -1
- package/node_modules/diff/libcjs/util/array.js +0 -21
- package/node_modules/diff/libcjs/util/distance-iterator.d.ts +0 -2
- package/node_modules/diff/libcjs/util/distance-iterator.d.ts.map +0 -1
- package/node_modules/diff/libcjs/util/distance-iterator.js +0 -40
- package/node_modules/diff/libcjs/util/params.d.ts +0 -4
- package/node_modules/diff/libcjs/util/params.d.ts.map +0 -1
- package/node_modules/diff/libcjs/util/params.js +0 -17
- package/node_modules/diff/libcjs/util/string.d.ts +0 -30
- package/node_modules/diff/libcjs/util/string.d.ts.map +0 -1
- package/node_modules/diff/libcjs/util/string.js +0 -200
- package/node_modules/diff/libesm/convert/dmp.d.ts +0 -8
- package/node_modules/diff/libesm/convert/dmp.d.ts.map +0 -1
- package/node_modules/diff/libesm/convert/dmp.js +0 -21
- package/node_modules/diff/libesm/convert/xml.d.ts +0 -6
- package/node_modules/diff/libesm/convert/xml.d.ts.map +0 -1
- package/node_modules/diff/libesm/convert/xml.js +0 -31
- package/node_modules/diff/libesm/diff/array.d.ts +0 -19
- package/node_modules/diff/libesm/diff/array.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/array.js +0 -16
- package/node_modules/diff/libesm/diff/base.d.ts +0 -20
- package/node_modules/diff/libesm/diff/base.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/base.js +0 -253
- package/node_modules/diff/libesm/diff/character.d.ts +0 -19
- package/node_modules/diff/libesm/diff/character.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/character.js +0 -7
- package/node_modules/diff/libesm/diff/css.d.ts +0 -18
- package/node_modules/diff/libesm/diff/css.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/css.js +0 -10
- package/node_modules/diff/libesm/diff/json.d.ts +0 -24
- package/node_modules/diff/libesm/diff/json.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/json.js +0 -78
- package/node_modules/diff/libesm/diff/line.d.ts +0 -24
- package/node_modules/diff/libesm/diff/line.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/line.js +0 -65
- package/node_modules/diff/libesm/diff/sentence.d.ts +0 -21
- package/node_modules/diff/libesm/diff/sentence.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/sentence.js +0 -43
- package/node_modules/diff/libesm/diff/word.d.ts +0 -35
- package/node_modules/diff/libesm/diff/word.d.ts.map +0 -1
- package/node_modules/diff/libesm/diff/word.js +0 -281
- package/node_modules/diff/libesm/index.d.ts +0 -20
- package/node_modules/diff/libesm/index.d.ts.map +0 -1
- package/node_modules/diff/libesm/index.js +0 -30
- package/node_modules/diff/libesm/package.json +0 -1
- package/node_modules/diff/libesm/patch/apply.d.ts +0 -62
- package/node_modules/diff/libesm/patch/apply.d.ts.map +0 -1
- package/node_modules/diff/libesm/patch/apply.js +0 -257
- package/node_modules/diff/libesm/patch/create.d.ts +0 -122
- package/node_modules/diff/libesm/patch/create.d.ts.map +0 -1
- package/node_modules/diff/libesm/patch/create.js +0 -228
- package/node_modules/diff/libesm/patch/line-endings.d.ts +0 -17
- package/node_modules/diff/libesm/patch/line-endings.d.ts.map +0 -1
- package/node_modules/diff/libesm/patch/line-endings.js +0 -44
- package/node_modules/diff/libesm/patch/parse.d.ts +0 -8
- package/node_modules/diff/libesm/patch/parse.d.ts.map +0 -1
- package/node_modules/diff/libesm/patch/parse.js +0 -147
- package/node_modules/diff/libesm/patch/reverse.d.ts +0 -9
- package/node_modules/diff/libesm/patch/reverse.d.ts.map +0 -1
- package/node_modules/diff/libesm/patch/reverse.js +0 -23
- package/node_modules/diff/libesm/types.d.ts +0 -213
- package/node_modules/diff/libesm/types.d.ts.map +0 -1
- package/node_modules/diff/libesm/types.js +0 -1
- package/node_modules/diff/libesm/util/array.d.ts +0 -3
- package/node_modules/diff/libesm/util/array.d.ts.map +0 -1
- package/node_modules/diff/libesm/util/array.js +0 -17
- package/node_modules/diff/libesm/util/distance-iterator.d.ts +0 -2
- package/node_modules/diff/libesm/util/distance-iterator.d.ts.map +0 -1
- package/node_modules/diff/libesm/util/distance-iterator.js +0 -37
- package/node_modules/diff/libesm/util/params.d.ts +0 -4
- package/node_modules/diff/libesm/util/params.d.ts.map +0 -1
- package/node_modules/diff/libesm/util/params.js +0 -14
- package/node_modules/diff/libesm/util/string.d.ts +0 -30
- package/node_modules/diff/libesm/util/string.d.ts.map +0 -1
- package/node_modules/diff/libesm/util/string.js +0 -184
- package/node_modules/diff/package.json +0 -130
- package/node_modules/diff/release-notes.md +0 -432
- package/node_modules/node-gyp/commitlint.config.mjs +0 -3
- package/node_modules/node-gyp/gyp/commitlint.config.js +0 -6
- package/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake_test.py +0 -105
- package/node_modules/node-gyp/zizmor.yml +0 -5
- package/node_modules/proxy-agent-negotiate/dist/index.d.ts +0 -14
- package/node_modules/proxy-agent-negotiate/dist/index.d.ts.map +0 -1
- package/node_modules/proxy-agent-negotiate/dist/index.js +0 -35
- package/node_modules/proxy-agent-negotiate/dist/index.js.map +0 -1
- package/node_modules/proxy-agent-negotiate/package.json +0 -47
- package/node_modules/undici/docs/docs/api/CacheStore.md +0 -360
- package/node_modules/undici/docs/docs/api/ClientStats.md +0 -93
- package/node_modules/undici/docs/docs/api/GlobalInstallation.md +0 -121
- package/node_modules/undici/docs/docs/api/H2CClient.md +0 -385
- package/node_modules/undici/docs/docs/api/Interceptors.md +0 -419
- package/node_modules/undici/docs/docs/api/MockCallHistory.md +0 -371
- package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +0 -206
- package/node_modules/undici/docs/docs/api/RoundRobinPool.md +0 -239
- package/node_modules/undici/docs/docs/api/SnapshotAgent.md +0 -361
- package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +0 -256
- package/node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md +0 -233
- package/node_modules/undici/docs/docs/getting-started.md +0 -281
- package/node_modules/undici/docs/docs/site.json +0 -125
- package/node_modules/undici/docs/docs/type-map.json +0 -79
- package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +0 -110
- package/node_modules/undici/types/dispatcher1-wrapper.d.ts +0 -7
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/core/socks5-client.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/core/socks5-utils.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/encoding/index.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/llhttp/constants.d.ts +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/llhttp/utils.d.ts +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/mock/snapshot-utils.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/date.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/util/stats.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/subresource-integrity/Readme.md +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/lib/web/subresource-integrity/subresource-integrity.js +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/cache-interceptor.d.ts +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/client-stats.d.ts +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/mock-call-history.d.ts +0 -0
- /package/node_modules/{undici → @mytools/fst-platform/node_modules/undici}/types/utility.d.ts +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {FlowError} from '@mytools/sdk';
|
|
2
|
+
import {builtinCommands,isCommandName} from '@mytools/fst-plugin/contracts';
|
|
3
|
+
import {isBuiltin} from 'node:module';
|
|
4
|
+
|
|
5
|
+
const dangerousFields=new Set(['__proto__','constructor','prototype']);
|
|
6
|
+
const shortcutFields=new Set(['action','command','plugin','input']);
|
|
7
|
+
|
|
8
|
+
function validPluginId(value){
|
|
9
|
+
if(typeof value!=='string'||!value.length||value.length>214||value!==value.toLowerCase()||isBuiltin(value)||['node_modules','favicon.ico'].includes(value))return false;
|
|
10
|
+
const parts=/^(?:@([^/]+)\/)?([^/]+)$/.exec(value);
|
|
11
|
+
if(!parts||/^[._-]/.test(value)||parts[2].startsWith('.'))return false;
|
|
12
|
+
return (!parts[1]||/^[a-z0-9_.~'!()*-]+$/.test(parts[1]))&&/^[a-z0-9_.-]+$/.test(parts[2]);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function invalid(location,message){
|
|
16
|
+
throw new FlowError(message,{code:'VALIDATION',details:{path:location}});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function plainObject(value){
|
|
20
|
+
return value!==null&&typeof value==='object'&&!Array.isArray(value)&&[Object.prototype,null].includes(Object.getPrototypeOf(value));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function entries(value,location){
|
|
24
|
+
if(!plainObject(value))invalid(location,`${location} 必须为普通 JSON 对象`);
|
|
25
|
+
return Reflect.ownKeys(value).map(key=>{
|
|
26
|
+
if(typeof key!=='string'||dangerousFields.has(key))invalid(location,`${location} 包含危险或非 JSON 字段`);
|
|
27
|
+
const field=Object.getOwnPropertyDescriptor(value,key);
|
|
28
|
+
if(!field.enumerable||!Object.hasOwn(field,'value'))invalid(`${location}.${key}`,`${location}.${key} 必须为普通 JSON 字段`);
|
|
29
|
+
return [key,field.value];
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function cloneJson(value,location,ancestors=new Set()){
|
|
34
|
+
if(value===null||typeof value==='string'||typeof value==='boolean')return value;
|
|
35
|
+
if(typeof value==='number'&&Number.isFinite(value))return value;
|
|
36
|
+
if(typeof value!=='object')invalid(location,`${location} 必须为可序列化的 JSON 值`);
|
|
37
|
+
if(ancestors.has(value))invalid(location,`${location} 不能包含循环引用`);
|
|
38
|
+
ancestors.add(value);
|
|
39
|
+
try{
|
|
40
|
+
if(Array.isArray(value)){
|
|
41
|
+
if(Object.getPrototypeOf(value)!==Array.prototype||Reflect.ownKeys(value).length!==value.length+1)invalid(location,`${location} 必须为普通且完整的 JSON 数组`);
|
|
42
|
+
const copy=[];
|
|
43
|
+
for(let index=0;index<value.length;index++){
|
|
44
|
+
const field=Object.getOwnPropertyDescriptor(value,String(index));
|
|
45
|
+
if(!field?.enumerable||!Object.hasOwn(field,'value'))invalid(`${location}[${index}]`,`${location} 必须为普通且完整的 JSON 数组`);
|
|
46
|
+
copy.push(cloneJson(field.value,`${location}[${index}]`,ancestors));
|
|
47
|
+
}
|
|
48
|
+
return copy;
|
|
49
|
+
}
|
|
50
|
+
return Object.fromEntries(entries(value,location).map(([key,nested])=>[key,cloneJson(nested,`${location}.${key}`,ancestors)]));
|
|
51
|
+
}finally{ancestors.delete(value);}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function validateShortcuts(shortcuts,{reservedNames=[]}={}){
|
|
55
|
+
if(!Array.isArray(reservedNames)||reservedNames.some(name=>typeof name!=='string'))invalid('reservedNames','保留名称必须为字符串数组');
|
|
56
|
+
const reserved=new Set([...builtinCommands.map(command=>command.name),...reservedNames].map(name=>name.normalize('NFC')));
|
|
57
|
+
const copy={};
|
|
58
|
+
for(const [name,shortcut] of entries(shortcuts,'shortcuts')){
|
|
59
|
+
const location=`shortcuts.${name}`;
|
|
60
|
+
// 明确拒绝未规范化名称,避免两个视觉相同的入口指向不同能力。
|
|
61
|
+
if(name!==name.normalize('NFC'))invalid(location,`快捷名称必须使用 NFC 规范形式:${name}`);
|
|
62
|
+
if(!isCommandName(name))invalid(location,`快捷名称无效:/${name}`);
|
|
63
|
+
if(reserved.has(name))invalid(location,`快捷名称与现有命令冲突:/${name}`);
|
|
64
|
+
reserved.add(name);
|
|
65
|
+
const fields=entries(shortcut,location);
|
|
66
|
+
if(fields.some(([key])=>!shortcutFields.has(key)))invalid(location,`快捷项 ${name} 包含未声明字段`);
|
|
67
|
+
const hasAction=Object.hasOwn(shortcut,'action'),hasCommand=Object.hasOwn(shortcut,'command');
|
|
68
|
+
if(hasAction===hasCommand)invalid(location,`快捷项 ${name} 必须声明 action 或 command 之一`);
|
|
69
|
+
const field=hasAction?'action':'command',target=shortcut[field];
|
|
70
|
+
if(hasAction){
|
|
71
|
+
const separator=typeof target==='string'?target.lastIndexOf(':'):-1;
|
|
72
|
+
if(separator<=0||separator===target.length-1||/[\s\p{C}]/u.test(target))invalid(`${location}.action`,`快捷项 ${name} 的 action 必须为稳定动作 ID`);
|
|
73
|
+
}else if(!isCommandName(target))invalid(`${location}.command`,`快捷项 ${name} 的 command 名称无效`);
|
|
74
|
+
copy[name]={[field]:target};
|
|
75
|
+
if(Object.hasOwn(shortcut,'plugin')){
|
|
76
|
+
if(hasAction)invalid(`${location}.plugin`,`动作快捷项 ${name} 不能声明 plugin`);
|
|
77
|
+
if(!validPluginId(shortcut.plugin))invalid(`${location}.plugin`,`快捷项 ${name} 的 plugin 必须为合法插件包 ID`);
|
|
78
|
+
copy[name].plugin=shortcut.plugin;
|
|
79
|
+
}
|
|
80
|
+
if(Object.hasOwn(shortcut,'input')){
|
|
81
|
+
if(!plainObject(shortcut.input))invalid(`${location}.input`,`快捷项 ${name} 的 input 必须为普通 JSON 对象`);
|
|
82
|
+
copy[name].input=cloneJson(shortcut.input,`${location}.input`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return copy;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function bindShortcutCommands(shortcuts,{commands=[],previous={}}={}){
|
|
89
|
+
const copy=validateShortcuts(shortcuts);
|
|
90
|
+
const old=validateShortcuts(previous),unbound=new Set(Object.values(old).filter(shortcut=>shortcut.command&&shortcut.plugin===undefined).map(shortcut=>shortcut.command));
|
|
91
|
+
for(const [name,shortcut] of Object.entries(copy)){
|
|
92
|
+
// 已有未绑定项即使改参数或重命名也需明确选择目标,不能被整组保存顺带启用。
|
|
93
|
+
if(!Object.hasOwn(shortcut,'command')||Object.hasOwn(shortcut,'plugin'))continue;
|
|
94
|
+
if(old[name]?.command===shortcut.command||unbound.has(shortcut.command))continue;
|
|
95
|
+
const command=commands.find(command=>command.name===shortcut.command);
|
|
96
|
+
if(command?.plugin!==undefined)shortcut.plugin=command.plugin;
|
|
97
|
+
}
|
|
98
|
+
return validateShortcuts(copy);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function describeShortcuts(shortcuts,{actions=[],commands=[]}={}){
|
|
102
|
+
const actionIndex=new Map(actions.map(action=>[action.id,action]));
|
|
103
|
+
return Object.entries(validateShortcuts(shortcuts)).map(([name,shortcut])=>{
|
|
104
|
+
const field=Object.hasOwn(shortcut,'action')?'action':'command';
|
|
105
|
+
const id=shortcut[field];
|
|
106
|
+
let definition;
|
|
107
|
+
if(field==='action')definition=actionIndex.get(id);
|
|
108
|
+
else if(shortcut.plugin!==undefined)definition=commands.find(command=>command.name===id&&command.plugin===shortcut.plugin);
|
|
109
|
+
const descriptions=field==='action'?[definition?.title,definition?.description]:[definition?.description];
|
|
110
|
+
const target={[field]:id};
|
|
111
|
+
if(shortcut.plugin!==undefined)target.plugin=shortcut.plugin;
|
|
112
|
+
const entry={name,target,input:shortcut.input??{},available:Boolean(definition),description:descriptions.find(value=>typeof value==='string'&&value.trim())??id};
|
|
113
|
+
if(!definition){
|
|
114
|
+
if(field==='command'&&shortcut.plugin===undefined)entry.reason='尚未绑定目标插件,请重新选择目标';
|
|
115
|
+
else entry.reason=`${field==='action'?'动作':'命令'}不可用或尚未安装:${shortcut.plugin?`${shortcut.plugin} → `:''}${id}`;
|
|
116
|
+
}
|
|
117
|
+
return entry;
|
|
118
|
+
});
|
|
119
|
+
}
|
|
@@ -71,16 +71,18 @@ export class WorkflowStore {
|
|
|
71
71
|
const files=await readdir(this.root);
|
|
72
72
|
return Promise.all(files.filter(f=>f.endsWith('.yaml')).sort().map(f=>this.get(f.slice(0,-5))));
|
|
73
73
|
}
|
|
74
|
-
async remove(id){
|
|
74
|
+
async remove(id,{backup=true}={}){
|
|
75
|
+
if(typeof backup!=='boolean')throw new FlowError('backup 必须是布尔值',{code:'VALIDATION'});
|
|
75
76
|
await this.get(id);
|
|
76
77
|
const refers=steps=>steps.some(step=>step.workflow&&this.childId(step.workflow)===id||step.branch&&(refers(step.branch.then)||refers(step.branch.else??[]))||step.parallel&&refers(step.parallel.steps));
|
|
77
78
|
const dependents=(await this.list()).filter(flow=>flow.id!==id&&refers(flow.steps));
|
|
78
79
|
if(dependents.length)throw new FlowError(`工作流仍被引用:${dependents.map(flow=>flow.title??flow.id).join('、')}`);
|
|
80
|
+
if(!backup){await unlink(this.file(id));return null;}
|
|
79
81
|
const directory=path.join(path.dirname(this.root),'.flow','deleted-workflows');
|
|
80
82
|
await mkdir(directory,{recursive:true});
|
|
81
|
-
const
|
|
83
|
+
const backupFile=path.join(directory,`${id}-${randomUUID()}.yaml`);
|
|
82
84
|
// 同项目内原子移动,备份保留完整原文;复制回原文件名即可恢复。
|
|
83
|
-
await rename(this.file(id),
|
|
85
|
+
await rename(this.file(id),backupFile);return backupFile;
|
|
84
86
|
}
|
|
85
87
|
childId(reference) {
|
|
86
88
|
if(typeof reference!=='string' || !/^(\.\/)?[A-Za-z0-9][A-Za-z0-9_-]*\.yaml$/.test(reference)) throw new FlowError(`子流程必须位于工作流目录内:${reference}`,{code:'VALIDATION'});
|
|
@@ -78,7 +78,7 @@ export async function packApplication(app,{entries,target,outDir='dist',includeW
|
|
|
78
78
|
for(const w of closure.workflows)await writeFile(path.join(workflowDir,`${w.id}.yaml`),YAML.stringify(w));
|
|
79
79
|
const config={};
|
|
80
80
|
for(const p of plugins)if(p.defaultConfig)config[p.id]=p.defaultConfig;
|
|
81
|
-
await writeFile(path.join(directory,'flow.project.json'),JSON.stringify({readOnly,plugins:plugins.map(p=>`./app/node_modules/${p.id}`),config,entries,environments:overrides,network:snapshot.project.network,logs:snapshot.project.logs},null,2));
|
|
81
|
+
await writeFile(path.join(directory,'flow.project.json'),JSON.stringify({readOnly,plugins:plugins.map(p=>`./app/node_modules/${p.id}`),config,entries,environments:overrides,network:snapshot.project.network,logs:snapshot.project.logs,commandPresets:snapshot.project.commandPresets,shortcuts:snapshot.project.shortcuts},null,2));
|
|
82
82
|
const bundleId=randomUUID();
|
|
83
83
|
await writeFile(path.join(directory,'bundle.json'),JSON.stringify({format:2,id:bundleId,editable:!readOnly}));
|
|
84
84
|
await writeFile(path.join(directory,'package.json'),JSON.stringify({private:true,type:'module'},null,2));
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@mytools/sdk": "0.1.0",
|
|
12
|
-
"@npmcli/arborist": "
|
|
12
|
+
"@npmcli/arborist": "9.9.2",
|
|
13
13
|
"archiver": "8.0.0",
|
|
14
|
-
"make-fetch-happen": "
|
|
15
|
-
"npm-packlist": "
|
|
14
|
+
"make-fetch-happen": "15.0.6",
|
|
15
|
+
"npm-packlist": "10.0.4",
|
|
16
16
|
"tar": "7.5.22",
|
|
17
17
|
"yaml": "2.9.1",
|
|
18
18
|
"@mytools/fst-platform": "0.1.0",
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import {readFile,rename,unlink,writeFile} from 'node:fs/promises';
|
|
2
|
+
import {createHash,randomUUID} from 'node:crypto';
|
|
3
|
+
import {FlowError} from '@mytools/sdk';
|
|
4
|
+
|
|
5
|
+
export async function writeCachedFile(file,bytes){
|
|
6
|
+
const temporary=`${file}.${randomUUID()}.tmp`;
|
|
7
|
+
try{
|
|
8
|
+
await writeFile(temporary,bytes,{flag:'wx'});
|
|
9
|
+
try{await rename(temporary,file);}catch(error){
|
|
10
|
+
// Windows 上并发替换可能返回 EPERM;仅接受另一写入者已留下的完全相同内容。
|
|
11
|
+
if(process.platform!=='win32'||!['EPERM','EACCES','EBUSY'].includes(error.code))throw error;
|
|
12
|
+
let existing;try{existing=await readFile(file);}catch{throw error;}
|
|
13
|
+
if(!existing.equals(bytes))throw error;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
finally{await unlink(temporary).catch(error=>{if(error.code!=='ENOENT')throw error;});}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function readVerifiedCache(file,load,{sha256,message}){
|
|
20
|
+
let bytes,missing=false;
|
|
21
|
+
try{bytes=await readFile(file);}catch(error){if(error.code!=='ENOENT')throw error;missing=true;bytes=await load();}
|
|
22
|
+
if(createHash('sha256').update(bytes).digest('hex')!==sha256)throw new FlowError(message);
|
|
23
|
+
// 命中有效缓存不再截断重写;冷缓存校验后原子替换,读取者只见完整文件。
|
|
24
|
+
if(missing)await writeCachedFile(file,bytes);
|
|
25
|
+
return bytes;
|
|
26
|
+
}
|
|
@@ -4,6 +4,7 @@ import path from 'node:path';
|
|
|
4
4
|
import * as tar from 'tar';
|
|
5
5
|
import fetch from 'make-fetch-happen';
|
|
6
6
|
import { FlowError } from '@mytools/sdk';
|
|
7
|
+
import {readVerifiedCache,writeCachedFile} from './runtime-cache.js';
|
|
7
8
|
|
|
8
9
|
export const NODE_VERSION='24.15.0';
|
|
9
10
|
const hashes={
|
|
@@ -24,13 +25,11 @@ export async function copyRuntime({target,directory,cacheDir,runtimePath,include
|
|
|
24
25
|
if(runtimePath){
|
|
25
26
|
if(!win)throw new FlowError('自定义 runtimePath 首版只接受已验证的 Windows Node.js 文件');
|
|
26
27
|
bytes=await readFile(runtimePath);
|
|
28
|
+
if(digest(bytes)!==hashes[target])throw new FlowError('Node.js 运行时校验失败,请检查缓存或指定文件');
|
|
29
|
+
await writeCachedFile(cache,bytes);
|
|
27
30
|
}else{
|
|
28
|
-
|
|
29
|
-
bytes=await download(`https://nodejs.org/download/release/v${NODE_VERSION}/${file}`);
|
|
30
|
-
}
|
|
31
|
+
bytes=await readVerifiedCache(cache,()=>download(`https://nodejs.org/download/release/v${NODE_VERSION}/${file}`),{sha256:hashes[target],message:'Node.js 运行时校验失败,请检查缓存或指定文件'});
|
|
31
32
|
}
|
|
32
|
-
if(digest(bytes)!==hashes[target])throw new FlowError('Node.js 运行时校验失败,请检查缓存或指定文件');
|
|
33
|
-
await writeFile(cache,bytes);
|
|
34
33
|
if(win)await writeFile(path.join(directory,'runtime','node.exe'),bytes);
|
|
35
34
|
else{
|
|
36
35
|
const extraction=path.join(cacheDir,'linux-extracted');await mkdir(extraction,{recursive:true});
|
|
@@ -43,16 +42,13 @@ export async function copyRuntime({target,directory,cacheDir,runtimePath,include
|
|
|
43
42
|
try{license=await readFile(licenseCache);}catch{
|
|
44
43
|
try{if(process.versions.node!==NODE_VERSION)throw new Error('版本不同');license=await readFile(path.join(path.dirname(process.execPath),'LICENSE'));}
|
|
45
44
|
catch{license=await download(`https://raw.githubusercontent.com/nodejs/node/v${NODE_VERSION}/LICENSE`);}
|
|
46
|
-
await
|
|
45
|
+
await writeCachedFile(licenseCache,license);
|
|
47
46
|
}
|
|
48
47
|
await mkdir(path.join(directory,'licenses'),{recursive:true});await writeFile(path.join(directory,'licenses','NODE_LICENSE'),license);
|
|
49
48
|
if(includeNpm){
|
|
50
49
|
// npm 是平台无关的 JS,直接复用已固定校验的官方 Linux 分发中的完整 npm 目录。
|
|
51
50
|
const npmArchive=path.join(cacheDir,`node-v${NODE_VERSION}-linux-x64.tar.gz`);
|
|
52
|
-
|
|
53
|
-
try{npmBytes=await readFile(npmArchive);}catch{npmBytes=await download(`https://nodejs.org/download/release/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz`);}
|
|
54
|
-
if(digest(npmBytes)!==hashes['linux-x64-glibc'])throw new FlowError('npm 来源的 Node.js 归档校验失败');
|
|
55
|
-
await writeFile(npmArchive,npmBytes);
|
|
51
|
+
await readVerifiedCache(npmArchive,()=>download(`https://nodejs.org/download/release/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz`),{sha256:hashes['linux-x64-glibc'],message:'npm 来源的 Node.js 归档校验失败'});
|
|
56
52
|
const extraction=path.join(cacheDir,'npm-extracted');await mkdir(extraction,{recursive:true});
|
|
57
53
|
await tar.x({file:npmArchive,cwd:extraction,filter:name=>name.includes('/lib/node_modules/npm/')});
|
|
58
54
|
await cp(path.join(extraction,`node-v${NODE_VERSION}-linux-x64/lib/node_modules/npm`),path.join(directory,'runtime/node_modules/npm'),{recursive:true,dereference:true});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 mytools contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 轻量命令插件
|
|
2
|
+
|
|
3
|
+
官方包 `@mytools/commands` 将项目注册的系统命令生成标准工作流动作,动作标识为 `@mytools/commands:注册ID`。修改中文标题或脚本不会改变注册 ID。默认导出的插件没有动作,由 Fishtools 根据项目的 `commandPresets` 装配。
|
|
4
|
+
|
|
5
|
+
## 注册格式
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"greet": {
|
|
10
|
+
"title": "中文问候",
|
|
11
|
+
"script": "printf '%s\\n' \"$FST_INPUT_name\"",
|
|
12
|
+
"shell": "sh",
|
|
13
|
+
"timeout": 30000,
|
|
14
|
+
"parameters": {
|
|
15
|
+
"name": {"type": "string", "title": "姓名", "default": "朋友", "required": true}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`title` 与 `script` 必须填写;`shell` 省略或设为 `auto` 时,Windows 使用 PowerShell,Linux 使用 sh。也可显式选择 `powershell`、`pwsh`、`sh`、`bash`;目标机器须自行提供相应解释器和外部程序。脚本保留原始多行、引号、管道与重定向,并通过唯一临时文件交给解释器,避免长脚本超过系统命令行长度限制。PowerShell 文件使用 UTF-8 BOM 并固定 UTF-8 输出,最后命令失败时返回非零退出码。
|
|
22
|
+
|
|
23
|
+
`timeout` 为可选的整数毫秒,范围为 0 到 2147483647,默认沿用受管进程的 30000 毫秒;`0` 表示不限时。第一版用于非交互命令。
|
|
24
|
+
|
|
25
|
+
注册 ID 最多 80 字符,只能使用 ASCII 字母、数字、下划线、短横线,且以字母或数字开头。`parameters` 为字段对象;字段类型只接受 `string`、`number`、`boolean`,可选中文 `title`、同类型 `default` 和布尔 `required`。参数名以 ASCII 字母或下划线开头,后续可含字母、数字、下划线,最多 80 字符;不能仅以大小写区分,也不能使用原型保留名称。未知字段和不符合类型的默认值会被拒绝。
|
|
26
|
+
|
|
27
|
+
## 参数与权限
|
|
28
|
+
|
|
29
|
+
参数通过 `FST_INPUT_字段名` 环境变量传入;字符串原样保留,数值和布尔值转换为文本。Linux 脚本使用 `"$FST_INPUT_name"`,PowerShell 使用 `$env:FST_INPUT_name`,例如 `Write-Output $env:FST_INPUT_name`。请按所选 Shell 的规则引用环境变量。字段值不会拼接到脚本源码。
|
|
30
|
+
|
|
31
|
+
无参数动作输入为 `{}`。默认以普通用户权限执行。`requireRoot: true` 声明该动作在 Linux 需要 root,宿主执行前预检并显示原因与处理建议;Windows 使用普通用户声明。
|
|
32
|
+
|
|
33
|
+
## 输出与接口
|
|
34
|
+
|
|
35
|
+
动作复用宿主的代理规则、取消信号、受管进程与完整日志。返回固定字段 `exitCode`、`stdout`、`stderr`、`outputBytes`、`outputTruncated`。`stdout` 和 `stderr` 各保留最多 65536 字节的尾部,`outputBytes` 分别记录两条流的完整字节数,`outputTruncated` 表示尾部摘要是否截断。完整输出可在运行日志中查看。
|
|
36
|
+
|
|
37
|
+
临时脚本优先写入本次运行的 `outputDir`;未提供时使用系统临时目录。完成、失败、超时和取消后删除本次文件,保留同目录中的其他文件。PowerShell 文件执行使用本次进程的 `ExecutionPolicy Bypass`,沿用原先命令文本可执行的行为。
|
|
38
|
+
|
|
39
|
+
非零退出抛出 `EXECUTION_FAILED`,错误包含退出码和输出摘要;超时、取消及解释器缺失沿用宿主错误语义。
|
|
40
|
+
|
|
41
|
+
包公开导出 `COMMANDS_PLUGIN_ID`、自身目录 `commandsPluginRoot`、`validateCommandPresets(presets)` 和 `createCommandsPlugin(presets = {})`。校验函数返回独立副本;工厂生成标准插件定义,输入校验与默认值由宿主统一处理。
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import {fileURLToPath} from 'node:url';
|
|
3
|
+
import {createHash} from 'node:crypto';
|
|
4
|
+
import {definePlugin,FlowError} from '@mytools/sdk';
|
|
5
|
+
import {runShell} from '@mytools/fst-platform/shell';
|
|
6
|
+
|
|
7
|
+
export const COMMANDS_PLUGIN_ID='@mytools/commands';
|
|
8
|
+
export const commandsPluginRoot=path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
|
|
10
|
+
const reserved=new Set(['__proto__','constructor','prototype']);
|
|
11
|
+
const validObject=value=>value!==null&&typeof value==='object'&&!Array.isArray(value)&&[Object.prototype,null].includes(Object.getPrototypeOf(value));
|
|
12
|
+
const validText=value=>typeof value==='string'&&Boolean(value.trim())&&!value.includes('\u0000');
|
|
13
|
+
const invalid=(location,message)=>{throw new FlowError(`${location}:${message}`,{code:'VALIDATION',details:{path:location}});};
|
|
14
|
+
function fields(value,allowed,location){
|
|
15
|
+
if(!validObject(value))invalid(location,'必须为字段对象');
|
|
16
|
+
for(const key of Reflect.ownKeys(value))if(typeof key!=='string'||!allowed.includes(key))invalid(`${location}.${String(key)}`,'包含未知字段');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function validateCommandPresets(presets){
|
|
20
|
+
if(!validObject(presets))invalid('commandPresets','必须为命令注册对象');
|
|
21
|
+
for(const id of Reflect.ownKeys(presets)){
|
|
22
|
+
const location=`commandPresets.${String(id)}`;
|
|
23
|
+
if(typeof id!=='string'||!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,79}$/.test(id)||reserved.has(id))invalid(location,'ID 只能使用 ASCII 字母、数字、下划线和短横线,最多 80 字符,且不能为原型保留名称');
|
|
24
|
+
const preset=presets[id];
|
|
25
|
+
fields(preset,['title','script','shell','timeout','parameters','requireRoot'],location);
|
|
26
|
+
if(!validText(preset.title))invalid(`${location}.title`,'标题必须为非空字符串');
|
|
27
|
+
if(!validText(preset.script))invalid(`${location}.script`,'命令文本必须为非空字符串,且不能包含 NUL 字符');
|
|
28
|
+
if(preset.shell!==undefined&&!['auto','powershell','pwsh','sh','bash'].includes(preset.shell))invalid(`${location}.shell`,'Shell 必须为 auto、powershell、pwsh、sh 或 bash');
|
|
29
|
+
if(preset.timeout!==undefined&&(!Number.isSafeInteger(preset.timeout)||preset.timeout<0||preset.timeout>2147483647))invalid(`${location}.timeout`,'超时必须为 0 到 2147483647 的整数毫秒,0 表示不限时');
|
|
30
|
+
if(preset.requireRoot!==undefined&&typeof preset.requireRoot!=='boolean')invalid(`${location}.requireRoot`,'root 需求必须为布尔值');
|
|
31
|
+
if(preset.parameters===undefined)continue;
|
|
32
|
+
if(!validObject(preset.parameters))invalid(`${location}.parameters`,'参数必须为字段对象');
|
|
33
|
+
const names=new Set();
|
|
34
|
+
for(const name of Reflect.ownKeys(preset.parameters)){
|
|
35
|
+
const at=`${location}.parameters.${String(name)}`;
|
|
36
|
+
if(typeof name!=='string'||!/^[a-zA-Z_][a-zA-Z0-9_]{0,79}$/.test(name)||reserved.has(name)||Object.hasOwn(Object.prototype,name))invalid(at,'参数名只能使用 ASCII 字母、数字和下划线,不能以数字开头或使用原型保留名称');
|
|
37
|
+
const portable=name.toLowerCase();
|
|
38
|
+
if(names.has(portable))invalid(at,'参数名不能仅以大小写区分,以免 Windows 环境变量冲突');
|
|
39
|
+
names.add(portable);
|
|
40
|
+
const field=preset.parameters[name];
|
|
41
|
+
fields(field,['type','title','default','required'],at);
|
|
42
|
+
if(!['string','number','boolean'].includes(field.type))invalid(`${at}.type`,'参数类型必须为 string、number 或 boolean');
|
|
43
|
+
if(field.title!==undefined&&!validText(field.title))invalid(`${at}.title`,'参数标题必须为非空字符串');
|
|
44
|
+
if(field.required!==undefined&&typeof field.required!=='boolean')invalid(`${at}.required`,'必填声明必须为布尔值');
|
|
45
|
+
if(Object.hasOwn(field,'default')&&(typeof field.default!==field.type||field.type==='number'&&!Number.isFinite(field.default)||field.type==='string'&&field.default.includes('\u0000')))invalid(`${at}.default`,'默认值必须符合参数类型且可作为环境变量传递');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
try{return structuredClone(presets);}
|
|
49
|
+
catch(cause){throw new FlowError('命令注册项必须可复制和保存',{code:'VALIDATION',cause});}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function inputSchema(parameters){
|
|
53
|
+
const properties=Object.fromEntries(Object.entries(parameters).map(([name,{type,title,default:value}])=>[name,{
|
|
54
|
+
type,title:title??name,...(type==='string'?{pattern:'^[^\\u0000]*$'}:{}),
|
|
55
|
+
...(Object.hasOwn(parameters[name],'default')?{default:value}:{}),
|
|
56
|
+
}]));
|
|
57
|
+
return {type:'object',properties,required:Object.entries(parameters).filter(([,field])=>field.required).map(([name])=>name),additionalProperties:false};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const outputSchema={type:'object',properties:{
|
|
61
|
+
exitCode:{type:'integer',title:'退出码'},stdout:{type:'string',title:'标准输出摘要'},stderr:{type:'string',title:'标准错误摘要'},
|
|
62
|
+
outputBytes:{type:'object',title:'完整输出字节数',properties:{stdout:{type:'integer',minimum:0},stderr:{type:'integer',minimum:0}},required:['stdout','stderr'],additionalProperties:false},
|
|
63
|
+
outputTruncated:{type:'boolean',title:'摘要已截断'},
|
|
64
|
+
},required:['exitCode','stdout','stderr','outputBytes','outputTruncated'],additionalProperties:false};
|
|
65
|
+
|
|
66
|
+
export function createCommandsPlugin(presets={}){
|
|
67
|
+
const checked=validateCommandPresets(presets);
|
|
68
|
+
const actions=Object.fromEntries(Object.entries(checked).map(([id,preset])=>{
|
|
69
|
+
const parameters=preset.parameters??{};
|
|
70
|
+
return [id,{
|
|
71
|
+
title:preset.title,description:'执行已注册的非交互 Shell 命令,完整输出保存到运行日志。',
|
|
72
|
+
input:inputSchema(parameters),output:structuredClone(outputSchema),
|
|
73
|
+
...(preset.requireRoot?{requirements:{privilege:{linux:{level:'root',reason:`命令“${preset.title}”声明需要 Linux root 权限`,remediation:'请使用具备 root 权限的会话运行 Fishtools,或修改命令以使用普通用户权限。'}}}}:{}),
|
|
74
|
+
async run(input,ctx){
|
|
75
|
+
// 仅传递字段值;参数中的引号、换行和命令替换都不会进入脚本源码。
|
|
76
|
+
const env=Object.fromEntries(Object.keys(parameters).map(name=>[`FST_INPUT_${name}`,Object.hasOwn(input,name)?String(input[name]):'']));
|
|
77
|
+
const {exitCode,stdout,stderr,outputBytes,outputTruncated}=await runShell(preset.script,{
|
|
78
|
+
shell:preset.shell??'auto',runProcess:ctx.runProcess,temporaryDir:ctx.outputDir,
|
|
79
|
+
signal:ctx.signal,cwd:ctx.projectDir,env,outputMode:'stream',summaryBytes:65536,
|
|
80
|
+
...(preset.timeout!==undefined?{timeout:preset.timeout}:{}),
|
|
81
|
+
});
|
|
82
|
+
const output={exitCode,stdout,stderr,outputBytes,outputTruncated};
|
|
83
|
+
if(exitCode!==0)throw new FlowError(`命令“${preset.title}”执行失败(退出码 ${exitCode}):${(stderr||stdout||'没有输出').slice(-2000)}`,{code:'EXECUTION_FAILED',details:output});
|
|
84
|
+
return output;
|
|
85
|
+
},
|
|
86
|
+
}];
|
|
87
|
+
}));
|
|
88
|
+
// run 的函数文本不包含闭包中的脚本;摘要使定向更新能识别脚本、Shell 和超时变化。
|
|
89
|
+
const commandPresetDigest=createHash('sha256').update(JSON.stringify(checked)).digest('hex');
|
|
90
|
+
return definePlugin({id:COMMANDS_PLUGIN_ID,version:'0.1.0',commandPresetDigest,title:'轻量命令',description:'将项目中注册的系统命令作为稳定的工作流动作执行。',platforms:['win32','linux'],
|
|
91
|
+
requirements:{privilege:{linux:{level:'user'},win32:{level:'user'}}},actions});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export default createCommandsPlugin();
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mytools/commands",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./index.js",
|
|
8
|
+
"./package.json": "./package.json"
|
|
9
|
+
},
|
|
10
|
+
"files": ["index.js", "README.md", "LICENSE"],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"engines": {"node": "^22.22.2 || >=24.0.0"},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@mytools/sdk": "0.1.0",
|
|
15
|
+
"@mytools/fst-platform": "0.1.0"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 mytools contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 轻量命令插件
|
|
2
|
+
|
|
3
|
+
官方包 `@mytools/commands` 将项目注册的系统命令生成标准工作流动作,动作标识为 `@mytools/commands:注册ID`。修改中文标题或脚本不会改变注册 ID。默认导出的插件没有动作,由 Fishtools 根据项目的 `commandPresets` 装配。
|
|
4
|
+
|
|
5
|
+
## 注册格式
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"greet": {
|
|
10
|
+
"title": "中文问候",
|
|
11
|
+
"script": "printf '%s\\n' \"$FST_INPUT_name\"",
|
|
12
|
+
"shell": "sh",
|
|
13
|
+
"timeout": 30000,
|
|
14
|
+
"parameters": {
|
|
15
|
+
"name": {"type": "string", "title": "姓名", "default": "朋友", "required": true}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`title` 与 `script` 必须填写;`shell` 省略或设为 `auto` 时,Windows 使用 PowerShell,Linux 使用 sh。也可显式选择 `powershell`、`pwsh`、`sh`、`bash`;目标机器须自行提供相应解释器和外部程序。脚本保留原始多行、引号、管道与重定向,并通过唯一临时文件交给解释器,避免长脚本超过系统命令行长度限制。PowerShell 文件使用 UTF-8 BOM 并固定 UTF-8 输出,最后命令失败时返回非零退出码。
|
|
22
|
+
|
|
23
|
+
`timeout` 为可选的整数毫秒,范围为 0 到 2147483647,默认沿用受管进程的 30000 毫秒;`0` 表示不限时。第一版用于非交互命令。
|
|
24
|
+
|
|
25
|
+
注册 ID 最多 80 字符,只能使用 ASCII 字母、数字、下划线、短横线,且以字母或数字开头。`parameters` 为字段对象;字段类型只接受 `string`、`number`、`boolean`,可选中文 `title`、同类型 `default` 和布尔 `required`。参数名以 ASCII 字母或下划线开头,后续可含字母、数字、下划线,最多 80 字符;不能仅以大小写区分,也不能使用原型保留名称。未知字段和不符合类型的默认值会被拒绝。
|
|
26
|
+
|
|
27
|
+
## 参数与权限
|
|
28
|
+
|
|
29
|
+
参数通过 `FST_INPUT_字段名` 环境变量传入;字符串原样保留,数值和布尔值转换为文本。Linux 脚本使用 `"$FST_INPUT_name"`,PowerShell 使用 `$env:FST_INPUT_name`,例如 `Write-Output $env:FST_INPUT_name`。请按所选 Shell 的规则引用环境变量。字段值不会拼接到脚本源码。
|
|
30
|
+
|
|
31
|
+
无参数动作输入为 `{}`。默认以普通用户权限执行。`requireRoot: true` 声明该动作在 Linux 需要 root,宿主执行前预检并显示原因与处理建议;Windows 使用普通用户声明。
|
|
32
|
+
|
|
33
|
+
## 输出与接口
|
|
34
|
+
|
|
35
|
+
动作复用宿主的代理规则、取消信号、受管进程与完整日志。返回固定字段 `exitCode`、`stdout`、`stderr`、`outputBytes`、`outputTruncated`。`stdout` 和 `stderr` 各保留最多 65536 字节的尾部,`outputBytes` 分别记录两条流的完整字节数,`outputTruncated` 表示尾部摘要是否截断。完整输出可在运行日志中查看。
|
|
36
|
+
|
|
37
|
+
临时脚本优先写入本次运行的 `outputDir`;未提供时使用系统临时目录。完成、失败、超时和取消后删除本次文件,保留同目录中的其他文件。PowerShell 文件执行使用本次进程的 `ExecutionPolicy Bypass`,沿用原先命令文本可执行的行为。
|
|
38
|
+
|
|
39
|
+
非零退出抛出 `EXECUTION_FAILED`,错误包含退出码和输出摘要;超时、取消及解释器缺失沿用宿主错误语义。
|
|
40
|
+
|
|
41
|
+
包公开导出 `COMMANDS_PLUGIN_ID`、自身目录 `commandsPluginRoot`、`validateCommandPresets(presets)` 和 `createCommandsPlugin(presets = {})`。校验函数返回独立副本;工厂生成标准插件定义,输入校验与默认值由宿主统一处理。
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import {fileURLToPath} from 'node:url';
|
|
3
|
+
import {createHash} from 'node:crypto';
|
|
4
|
+
import {definePlugin,FlowError} from '@mytools/sdk';
|
|
5
|
+
import {runShell} from '@mytools/fst-platform/shell';
|
|
6
|
+
|
|
7
|
+
export const COMMANDS_PLUGIN_ID='@mytools/commands';
|
|
8
|
+
export const commandsPluginRoot=path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
|
|
10
|
+
const reserved=new Set(['__proto__','constructor','prototype']);
|
|
11
|
+
const validObject=value=>value!==null&&typeof value==='object'&&!Array.isArray(value)&&[Object.prototype,null].includes(Object.getPrototypeOf(value));
|
|
12
|
+
const validText=value=>typeof value==='string'&&Boolean(value.trim())&&!value.includes('\u0000');
|
|
13
|
+
const invalid=(location,message)=>{throw new FlowError(`${location}:${message}`,{code:'VALIDATION',details:{path:location}});};
|
|
14
|
+
function fields(value,allowed,location){
|
|
15
|
+
if(!validObject(value))invalid(location,'必须为字段对象');
|
|
16
|
+
for(const key of Reflect.ownKeys(value))if(typeof key!=='string'||!allowed.includes(key))invalid(`${location}.${String(key)}`,'包含未知字段');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function validateCommandPresets(presets){
|
|
20
|
+
if(!validObject(presets))invalid('commandPresets','必须为命令注册对象');
|
|
21
|
+
for(const id of Reflect.ownKeys(presets)){
|
|
22
|
+
const location=`commandPresets.${String(id)}`;
|
|
23
|
+
if(typeof id!=='string'||!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,79}$/.test(id)||reserved.has(id))invalid(location,'ID 只能使用 ASCII 字母、数字、下划线和短横线,最多 80 字符,且不能为原型保留名称');
|
|
24
|
+
const preset=presets[id];
|
|
25
|
+
fields(preset,['title','script','shell','timeout','parameters','requireRoot'],location);
|
|
26
|
+
if(!validText(preset.title))invalid(`${location}.title`,'标题必须为非空字符串');
|
|
27
|
+
if(!validText(preset.script))invalid(`${location}.script`,'命令文本必须为非空字符串,且不能包含 NUL 字符');
|
|
28
|
+
if(preset.shell!==undefined&&!['auto','powershell','pwsh','sh','bash'].includes(preset.shell))invalid(`${location}.shell`,'Shell 必须为 auto、powershell、pwsh、sh 或 bash');
|
|
29
|
+
if(preset.timeout!==undefined&&(!Number.isSafeInteger(preset.timeout)||preset.timeout<0||preset.timeout>2147483647))invalid(`${location}.timeout`,'超时必须为 0 到 2147483647 的整数毫秒,0 表示不限时');
|
|
30
|
+
if(preset.requireRoot!==undefined&&typeof preset.requireRoot!=='boolean')invalid(`${location}.requireRoot`,'root 需求必须为布尔值');
|
|
31
|
+
if(preset.parameters===undefined)continue;
|
|
32
|
+
if(!validObject(preset.parameters))invalid(`${location}.parameters`,'参数必须为字段对象');
|
|
33
|
+
const names=new Set();
|
|
34
|
+
for(const name of Reflect.ownKeys(preset.parameters)){
|
|
35
|
+
const at=`${location}.parameters.${String(name)}`;
|
|
36
|
+
if(typeof name!=='string'||!/^[a-zA-Z_][a-zA-Z0-9_]{0,79}$/.test(name)||reserved.has(name)||Object.hasOwn(Object.prototype,name))invalid(at,'参数名只能使用 ASCII 字母、数字和下划线,不能以数字开头或使用原型保留名称');
|
|
37
|
+
const portable=name.toLowerCase();
|
|
38
|
+
if(names.has(portable))invalid(at,'参数名不能仅以大小写区分,以免 Windows 环境变量冲突');
|
|
39
|
+
names.add(portable);
|
|
40
|
+
const field=preset.parameters[name];
|
|
41
|
+
fields(field,['type','title','default','required'],at);
|
|
42
|
+
if(!['string','number','boolean'].includes(field.type))invalid(`${at}.type`,'参数类型必须为 string、number 或 boolean');
|
|
43
|
+
if(field.title!==undefined&&!validText(field.title))invalid(`${at}.title`,'参数标题必须为非空字符串');
|
|
44
|
+
if(field.required!==undefined&&typeof field.required!=='boolean')invalid(`${at}.required`,'必填声明必须为布尔值');
|
|
45
|
+
if(Object.hasOwn(field,'default')&&(typeof field.default!==field.type||field.type==='number'&&!Number.isFinite(field.default)||field.type==='string'&&field.default.includes('\u0000')))invalid(`${at}.default`,'默认值必须符合参数类型且可作为环境变量传递');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
try{return structuredClone(presets);}
|
|
49
|
+
catch(cause){throw new FlowError('命令注册项必须可复制和保存',{code:'VALIDATION',cause});}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function inputSchema(parameters){
|
|
53
|
+
const properties=Object.fromEntries(Object.entries(parameters).map(([name,{type,title,default:value}])=>[name,{
|
|
54
|
+
type,title:title??name,...(type==='string'?{pattern:'^[^\\u0000]*$'}:{}),
|
|
55
|
+
...(Object.hasOwn(parameters[name],'default')?{default:value}:{}),
|
|
56
|
+
}]));
|
|
57
|
+
return {type:'object',properties,required:Object.entries(parameters).filter(([,field])=>field.required).map(([name])=>name),additionalProperties:false};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const outputSchema={type:'object',properties:{
|
|
61
|
+
exitCode:{type:'integer',title:'退出码'},stdout:{type:'string',title:'标准输出摘要'},stderr:{type:'string',title:'标准错误摘要'},
|
|
62
|
+
outputBytes:{type:'object',title:'完整输出字节数',properties:{stdout:{type:'integer',minimum:0},stderr:{type:'integer',minimum:0}},required:['stdout','stderr'],additionalProperties:false},
|
|
63
|
+
outputTruncated:{type:'boolean',title:'摘要已截断'},
|
|
64
|
+
},required:['exitCode','stdout','stderr','outputBytes','outputTruncated'],additionalProperties:false};
|
|
65
|
+
|
|
66
|
+
export function createCommandsPlugin(presets={}){
|
|
67
|
+
const checked=validateCommandPresets(presets);
|
|
68
|
+
const actions=Object.fromEntries(Object.entries(checked).map(([id,preset])=>{
|
|
69
|
+
const parameters=preset.parameters??{};
|
|
70
|
+
return [id,{
|
|
71
|
+
title:preset.title,description:'执行已注册的非交互 Shell 命令,完整输出保存到运行日志。',
|
|
72
|
+
input:inputSchema(parameters),output:structuredClone(outputSchema),
|
|
73
|
+
...(preset.requireRoot?{requirements:{privilege:{linux:{level:'root',reason:`命令“${preset.title}”声明需要 Linux root 权限`,remediation:'请使用具备 root 权限的会话运行 Fishtools,或修改命令以使用普通用户权限。'}}}}:{}),
|
|
74
|
+
async run(input,ctx){
|
|
75
|
+
// 仅传递字段值;参数中的引号、换行和命令替换都不会进入脚本源码。
|
|
76
|
+
const env=Object.fromEntries(Object.keys(parameters).map(name=>[`FST_INPUT_${name}`,Object.hasOwn(input,name)?String(input[name]):'']));
|
|
77
|
+
const {exitCode,stdout,stderr,outputBytes,outputTruncated}=await runShell(preset.script,{
|
|
78
|
+
shell:preset.shell??'auto',runProcess:ctx.runProcess,temporaryDir:ctx.outputDir,
|
|
79
|
+
signal:ctx.signal,cwd:ctx.projectDir,env,outputMode:'stream',summaryBytes:65536,
|
|
80
|
+
...(preset.timeout!==undefined?{timeout:preset.timeout}:{}),
|
|
81
|
+
});
|
|
82
|
+
const output={exitCode,stdout,stderr,outputBytes,outputTruncated};
|
|
83
|
+
if(exitCode!==0)throw new FlowError(`命令“${preset.title}”执行失败(退出码 ${exitCode}):${(stderr||stdout||'没有输出').slice(-2000)}`,{code:'EXECUTION_FAILED',details:output});
|
|
84
|
+
return output;
|
|
85
|
+
},
|
|
86
|
+
}];
|
|
87
|
+
}));
|
|
88
|
+
// run 的函数文本不包含闭包中的脚本;摘要使定向更新能识别脚本、Shell 和超时变化。
|
|
89
|
+
const commandPresetDigest=createHash('sha256').update(JSON.stringify(checked)).digest('hex');
|
|
90
|
+
return definePlugin({id:COMMANDS_PLUGIN_ID,version:'0.1.0',commandPresetDigest,title:'轻量命令',description:'将项目中注册的系统命令作为稳定的工作流动作执行。',platforms:['win32','linux'],
|
|
91
|
+
requirements:{privilege:{linux:{level:'user'},win32:{level:'user'}}},actions});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export default createCommandsPlugin();
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mytools/commands",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./index.js",
|
|
8
|
+
"./package.json": "./package.json"
|
|
9
|
+
},
|
|
10
|
+
"files": ["index.js", "README.md", "LICENSE"],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"engines": {"node": "^22.22.2 || >=24.0.0"},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@mytools/sdk": "0.1.0",
|
|
15
|
+
"@mytools/fst-platform": "0.1.0"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
组合各能力模块、协调运行与关闭、提供 CLI/Web 共用应用接口及导出声明快照。日志写入和缓存由 logs 负责;导出实现通过可选 pack 依赖加载。
|
|
8
8
|
|
|
9
|
-
内部依赖:`@mytools/sdk`、`@mytools/fst-platform`、`@mytools/fst-logs`、`@mytools/fst-workflow`、`@mytools/fst-plugin`、`@mytools/fst-workspace`、`@mytools/pack`。
|
|
9
|
+
内部依赖:`@mytools/sdk`、`@mytools/fst-platform`、`@mytools/fst-logs`、`@mytools/fst-workflow`、`@mytools/fst-plugin`、`@mytools/fst-workspace`、官方 `@mytools/commands`、`@mytools/pack`。
|
|
10
10
|
`@mytools/pack` 是可选 peer 依赖;普通发行包含它,只读发行省略它。既有 `/process`、`/bundle`、`/environments` 子入口保留兼容转发。
|
|
11
11
|
|
|
12
12
|
## 公开入口
|
|
@@ -25,6 +25,10 @@
|
|
|
25
25
|
|
|
26
26
|
## 维护与验证
|
|
27
27
|
|
|
28
|
+
`createApplication({projectDir,pluginRegistryDir})` 可让多个工作区读取同一插件库;CLI 默认接入用户级全局库,程序未传此选项时保留工作区模式。分发包始终使用自身工作区安装状态。`listPlugins()` 返回 scope/source 和待配置原因;`pluginDefinition(id)` 返回作者声明。`app.resultsDir` 是业务文件根,`app.outputDir` 保留为日志根;插件 `ctx.outputDir` 与 `ctx.logDir` 分别对应本次业务目录和日志目录。
|
|
29
|
+
|
|
30
|
+
`app.startShell(script,options)` 执行临时命令,`app.startAction(id,input,context)` 调用任意动作,两者均纳入运行记录与关闭等待。`startCommand(name,input,{expectedPlugin,...context})` 可固定命令提供者,启动时再次检查,防止参数填写期间被其他同名能力替换。`configureCommandPresets` 和 `configureShortcuts` 在备份、冲突检查与变更锁内保存项目设置;命令快捷项在用户明确设置时绑定提供者 ID,普通安装/卸载和未改变目标的整组保存不会重新绑定;已有未绑定项必须明确提供 plugin 或在界面重新选择目标。注册项变化通过定向宿主更新生效,导出快照保留所需定义与有效快捷项。
|
|
31
|
+
|
|
28
32
|
本模块负责上述职责的实现、文档与回归;跨模块接口调整需要同时检查生产者与消费者。具体维护人员尚未指定。
|
|
29
33
|
|
|
30
34
|
在仓库根目录执行:
|