@intentic/sandbox-contract 1.248.0 → 1.249.0
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 +18 -15
- package/dist/chores/chores.d.ts.map +1 -1
- package/dist/chores/chores.js.map +1 -1
- package/dist/chores/digest.d.ts.map +1 -1
- package/dist/chores/digest.js.map +1 -1
- package/dist/chores/extension-update.d.ts.map +1 -1
- package/dist/chores/extension-update.js.map +1 -1
- package/dist/chores/fix-deps.d.ts.map +1 -1
- package/dist/chores/fix-deps.js.map +1 -1
- package/dist/chores/index.d.ts +2 -2
- package/dist/chores/index.d.ts.map +1 -1
- package/dist/chores/index.js +1 -1
- package/dist/chores/index.js.map +1 -1
- package/dist/chores/probes.d.ts.map +1 -1
- package/dist/chores/probes.js.map +1 -1
- package/dist/chores/prompt.d.ts.map +1 -1
- package/dist/chores/prompt.js.map +1 -1
- package/dist/chores/stack.d.ts.map +1 -1
- package/dist/chores/stack.js.map +1 -1
- package/dist/chores/verdict.d.ts +7 -1
- package/dist/chores/verdict.d.ts.map +1 -1
- package/dist/chores/verdict.js +8 -0
- package/dist/chores/verdict.js.map +1 -1
- package/dist/contracts/accounts.contract.d.ts.map +1 -1
- package/dist/contracts/accounts.contract.js.map +1 -1
- package/dist/contracts/activity.contract.d.ts +1 -0
- package/dist/contracts/activity.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.d.ts +12 -205
- package/dist/contracts/agent.contract.d.ts.map +1 -1
- package/dist/contracts/agent.contract.js +2 -1
- package/dist/contracts/agent.contract.js.map +1 -1
- package/dist/contracts/agents.contract.d.ts +228 -54
- package/dist/contracts/agents.contract.d.ts.map +1 -1
- package/dist/contracts/agents.contract.js +11 -2
- package/dist/contracts/agents.contract.js.map +1 -1
- package/dist/contracts/automations.contract.d.ts +35 -17
- package/dist/contracts/automations.contract.d.ts.map +1 -1
- package/dist/contracts/automations.contract.js +10 -1
- package/dist/contracts/automations.contract.js.map +1 -1
- package/dist/contracts/capabilities.contract.d.ts +0 -12
- package/dist/contracts/capabilities.contract.d.ts.map +1 -1
- package/dist/contracts/capabilities.contract.js +1 -1
- package/dist/contracts/capabilities.contract.js.map +1 -1
- package/dist/contracts/chores.contract.d.ts.map +1 -1
- package/dist/contracts/chores.contract.js.map +1 -1
- package/dist/contracts/ci.contract.d.ts +9 -0
- package/dist/contracts/ci.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.d.ts.map +1 -1
- package/dist/contracts/endpoints.contract.js.map +1 -1
- package/dist/contracts/exit.contract.d.ts.map +1 -1
- package/dist/contracts/exit.contract.js +1 -1
- package/dist/contracts/exit.contract.js.map +1 -1
- package/dist/contracts/extensions.contract.d.ts.map +1 -1
- package/dist/contracts/extensions.contract.js.map +1 -1
- package/dist/contracts/git.contract.d.ts +45 -6
- package/dist/contracts/git.contract.d.ts.map +1 -1
- package/dist/contracts/git.contract.js +9 -9
- package/dist/contracts/git.contract.js.map +1 -1
- package/dist/contracts/host.contract.d.ts +2 -0
- package/dist/contracts/host.contract.d.ts.map +1 -1
- package/dist/contracts/host.contract.js.map +1 -1
- package/dist/contracts/intentic.contract.js +1 -1
- package/dist/contracts/intentic.contract.js.map +1 -1
- package/dist/contracts/logs.contract.d.ts.map +1 -1
- package/dist/contracts/logs.contract.js.map +1 -1
- package/dist/contracts/loops.contract.d.ts.map +1 -1
- package/dist/contracts/loops.contract.js.map +1 -1
- package/dist/contracts/personas.contract.d.ts +1 -0
- package/dist/contracts/personas.contract.d.ts.map +1 -1
- package/dist/contracts/personas.contract.js +1 -1
- package/dist/contracts/personas.contract.js.map +1 -1
- package/dist/contracts/providers.contract.d.ts.map +1 -1
- package/dist/contracts/providers.contract.js.map +1 -1
- package/dist/contracts/runner.contract.d.ts +97 -171
- package/dist/contracts/runner.contract.d.ts.map +1 -1
- package/dist/contracts/runner.contract.js +2 -2
- package/dist/contracts/runner.contract.js.map +1 -1
- package/dist/contracts/safety.contract.d.ts.map +1 -1
- package/dist/contracts/safety.contract.js +1 -1
- package/dist/contracts/safety.contract.js.map +1 -1
- package/dist/contracts/secrets.contract.d.ts.map +1 -1
- package/dist/contracts/secrets.contract.js.map +1 -1
- package/dist/contracts/sessions.contract.d.ts +2 -41
- package/dist/contracts/sessions.contract.d.ts.map +1 -1
- package/dist/contracts/sessions.contract.js +1 -1
- package/dist/contracts/sessions.contract.js.map +1 -1
- package/dist/contracts/settings.contract.d.ts +8 -18
- package/dist/contracts/settings.contract.d.ts.map +1 -1
- package/dist/contracts/settings.contract.js.map +1 -1
- package/dist/contracts/share.contract.d.ts.map +1 -1
- package/dist/contracts/share.contract.js.map +1 -1
- package/dist/contracts/skills.contract.d.ts.map +1 -1
- package/dist/contracts/skills.contract.js.map +1 -1
- package/dist/contracts/system.contract.d.ts +49 -73
- package/dist/contracts/system.contract.d.ts.map +1 -1
- package/dist/contracts/system.contract.js +12 -2
- package/dist/contracts/system.contract.js.map +1 -1
- package/dist/contracts/usage.contract.d.ts.map +1 -1
- package/dist/contracts/usage.contract.js.map +1 -1
- package/dist/contracts/vpn.contract.d.ts.map +1 -1
- package/dist/contracts/vpn.contract.js +1 -1
- package/dist/contracts/vpn.contract.js.map +1 -1
- package/dist/contracts/webext.contract.d.ts.map +1 -1
- package/dist/contracts/webext.contract.js.map +1 -1
- package/dist/contracts/workflows.contract.d.ts +7 -6
- package/dist/contracts/workflows.contract.d.ts.map +1 -1
- package/dist/contracts/workflows.contract.js +12 -3
- package/dist/contracts/workflows.contract.js.map +1 -1
- package/dist/contracts/workspace.contract.d.ts.map +1 -1
- package/dist/contracts/workspace.contract.js.map +1 -1
- package/dist/events/agent-events.d.ts +1237 -0
- package/dist/events/agent-events.d.ts.map +1 -0
- package/dist/events/agent-events.js +226 -0
- package/dist/events/agent-events.js.map +1 -0
- package/dist/events/cards.d.ts +404 -0
- package/dist/events/cards.d.ts.map +1 -0
- package/dist/events/cards.js +179 -0
- package/dist/events/cards.js.map +1 -0
- package/dist/events/resume.d.ts +23 -0
- package/dist/events/resume.d.ts.map +1 -0
- package/dist/events/resume.js +31 -0
- package/dist/events/resume.js.map +1 -0
- package/dist/events/system-events.d.ts +615 -0
- package/dist/events/system-events.d.ts.map +1 -0
- package/dist/events/system-events.js +64 -0
- package/dist/events/system-events.js.map +1 -0
- package/dist/events/transcript.d.ts +1755 -0
- package/dist/events/transcript.d.ts.map +1 -0
- package/dist/events/transcript.js +205 -0
- package/dist/events/transcript.js.map +1 -0
- package/dist/ids/conversation-ids.d.ts +8 -0
- package/dist/ids/conversation-ids.d.ts.map +1 -0
- package/dist/{conversation-ids.js → ids/conversation-ids.js} +13 -0
- package/dist/ids/conversation-ids.js.map +1 -0
- package/dist/ids/hostnames.d.ts.map +1 -0
- package/dist/ids/hostnames.js.map +1 -0
- package/dist/ids/session-names.d.ts.map +1 -0
- package/dist/ids/session-names.js.map +1 -0
- package/dist/ids/share-paths.d.ts.map +1 -0
- package/dist/ids/share-paths.js.map +1 -0
- package/dist/{tunnel-ids.d.ts → ids/tunnel-ids.d.ts} +1 -0
- package/dist/ids/tunnel-ids.d.ts.map +1 -0
- package/dist/{tunnel-ids.js → ids/tunnel-ids.js} +1 -0
- package/dist/ids/tunnel-ids.js.map +1 -0
- package/dist/index.d.ts +423 -450
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -46
- package/dist/index.js.map +1 -1
- package/dist/{agent-catalog.d.ts → models/agent-catalog.d.ts} +2 -2
- package/dist/models/agent-catalog.d.ts.map +1 -0
- package/dist/models/agent-catalog.js.map +1 -0
- package/dist/models/agent-runtimes.d.ts.map +1 -0
- package/dist/models/agent-runtimes.js.map +1 -0
- package/dist/{fast-tier.d.ts → models/fast-tier.d.ts} +1 -1
- package/dist/models/fast-tier.d.ts.map +1 -0
- package/dist/models/fast-tier.js.map +1 -0
- package/dist/models/model-order.d.ts.map +1 -0
- package/dist/models/model-order.js.map +1 -0
- package/dist/{model-pins.d.ts → models/model-pins.d.ts} +1 -1
- package/dist/models/model-pins.d.ts.map +1 -0
- package/dist/models/model-pins.js.map +1 -0
- package/dist/{model-roles.d.ts → models/model-roles.d.ts} +0 -33
- package/dist/models/model-roles.d.ts.map +1 -0
- package/dist/{model-roles.js → models/model-roles.js} +0 -35
- package/dist/models/model-roles.js.map +1 -0
- package/dist/{plan-pools.d.ts → models/plan-pools.d.ts} +1 -1
- package/dist/models/plan-pools.d.ts.map +1 -0
- package/dist/models/plan-pools.js.map +1 -0
- package/dist/models/prompt-complexity.d.ts.map +1 -0
- package/dist/models/prompt-complexity.js.map +1 -0
- package/dist/models/provider-specs.d.ts.map +1 -0
- package/dist/models/provider-specs.js.map +1 -0
- package/dist/policy/approvals-execution.d.ts.map +1 -0
- package/dist/policy/approvals-execution.js.map +1 -0
- package/dist/{batch-runs.d.ts → policy/batch-runs.d.ts} +5 -1
- package/dist/policy/batch-runs.d.ts.map +1 -0
- package/dist/{batch-runs.js → policy/batch-runs.js} +10 -7
- package/dist/policy/batch-runs.js.map +1 -0
- package/dist/policy/capability-env.d.ts.map +1 -0
- package/dist/policy/capability-env.js.map +1 -0
- package/dist/policy/capability-secrets.d.ts.map +1 -0
- package/dist/policy/capability-secrets.js.map +1 -0
- package/dist/{card-status.d.ts → policy/card-status.d.ts} +2 -2
- package/dist/policy/card-status.d.ts.map +1 -0
- package/dist/{card-status.js → policy/card-status.js} +1 -5
- package/dist/policy/card-status.js.map +1 -0
- package/dist/{command-classes.d.ts → policy/command-classes.d.ts} +6 -2
- package/dist/policy/command-classes.d.ts.map +1 -0
- package/dist/{command-classes.js → policy/command-classes.js} +48 -11
- package/dist/policy/command-classes.js.map +1 -0
- package/dist/{command-run.d.ts → policy/command-run.d.ts} +1 -1
- package/dist/policy/command-run.d.ts.map +1 -0
- package/dist/policy/command-run.js.map +1 -0
- package/dist/policy/control-scopes.d.ts +16 -0
- package/dist/policy/control-scopes.d.ts.map +1 -0
- package/dist/policy/control-scopes.js +26 -0
- package/dist/policy/control-scopes.js.map +1 -0
- package/dist/policy/credential-material.d.ts.map +1 -0
- package/dist/policy/credential-material.js.map +1 -0
- package/dist/policy/needs-action.d.ts.map +1 -0
- package/dist/policy/needs-action.js.map +1 -0
- package/dist/policy/output-fields.d.ts.map +1 -0
- package/dist/policy/output-fields.js.map +1 -0
- package/dist/policy/overlay-lint.d.ts.map +1 -0
- package/dist/policy/overlay-lint.js.map +1 -0
- package/dist/policy/owner-ticket.d.ts.map +1 -0
- package/dist/{owner-ticket.js → policy/owner-ticket.js} +1 -1
- package/dist/policy/owner-ticket.js.map +1 -0
- package/dist/{safety-policy.d.ts → policy/safety-policy.d.ts} +6 -5
- package/dist/policy/safety-policy.d.ts.map +1 -0
- package/dist/{safety-policy.js → policy/safety-policy.js} +12 -12
- package/dist/policy/safety-policy.js.map +1 -0
- package/dist/policy/search-globs.d.ts.map +1 -0
- package/dist/policy/search-globs.js.map +1 -0
- package/dist/protocol/container-requirements.d.ts +20 -0
- package/dist/protocol/container-requirements.d.ts.map +1 -0
- package/dist/protocol/container-requirements.js +23 -0
- package/dist/protocol/container-requirements.js.map +1 -0
- package/dist/{host-protocol.d.ts → protocol/host-protocol.d.ts} +1 -0
- package/dist/protocol/host-protocol.d.ts.map +1 -0
- package/dist/{host-protocol.js → protocol/host-protocol.js} +1 -0
- package/dist/protocol/host-protocol.js.map +1 -0
- package/dist/protocol/ingress-contract.d.ts.map +1 -0
- package/dist/{ingress-contract.js → protocol/ingress-contract.js} +1 -1
- package/dist/protocol/ingress-contract.js.map +1 -0
- package/dist/protocol/ingress-protocol.d.ts.map +1 -0
- package/dist/protocol/ingress-protocol.js.map +1 -0
- package/dist/protocol/listener-protocol.d.ts.map +1 -0
- package/dist/{listener-protocol.js → protocol/listener-protocol.js} +1 -1
- package/dist/protocol/listener-protocol.js.map +1 -0
- package/dist/{peer-dial.d.ts → protocol/peer-dial.d.ts} +4 -1
- package/dist/protocol/peer-dial.d.ts.map +1 -0
- package/dist/{peer-dial.js → protocol/peer-dial.js} +51 -10
- package/dist/protocol/peer-dial.js.map +1 -0
- package/dist/protocol/peer-mcp-server.d.ts.map +1 -0
- package/dist/protocol/peer-mcp-server.js.map +1 -0
- package/dist/protocol/request-id.d.ts.map +1 -0
- package/dist/protocol/request-id.js.map +1 -0
- package/dist/protocol/routes.d.ts.map +1 -0
- package/dist/protocol/routes.js.map +1 -0
- package/dist/{runner-protocol.d.ts → protocol/runner-protocol.d.ts} +1 -0
- package/dist/protocol/runner-protocol.d.ts.map +1 -0
- package/dist/{runner-protocol.js → protocol/runner-protocol.js} +2 -1
- package/dist/protocol/runner-protocol.js.map +1 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/{terminal-protocol.d.ts → protocol/terminal-protocol.d.ts} +1 -3
- package/dist/protocol/terminal-protocol.d.ts.map +1 -0
- package/dist/protocol/terminal-protocol.js.map +1 -0
- package/dist/protocol/webext-links.d.ts.map +1 -0
- package/dist/protocol/webext-links.js.map +1 -0
- package/dist/{webext-protocol.d.ts → protocol/webext-protocol.d.ts} +1 -0
- package/dist/protocol/webext-protocol.d.ts.map +1 -0
- package/dist/{webext-protocol.js → protocol/webext-protocol.js} +1 -0
- package/dist/protocol/webext-protocol.js.map +1 -0
- package/dist/schemas/activity.d.ts +2 -0
- package/dist/schemas/activity.d.ts.map +1 -1
- package/dist/schemas/activity.js +4 -0
- package/dist/schemas/activity.js.map +1 -1
- package/dist/schemas/agent.d.ts +16 -4
- package/dist/schemas/agent.d.ts.map +1 -1
- package/dist/schemas/agent.js +21 -4
- package/dist/schemas/agent.js.map +1 -1
- package/dist/schemas/agents.d.ts +17 -4
- package/dist/schemas/agents.d.ts.map +1 -1
- package/dist/schemas/agents.js +15 -4
- package/dist/schemas/agents.js.map +1 -1
- package/dist/schemas/approvals.d.ts.map +1 -1
- package/dist/schemas/approvals.js.map +1 -1
- package/dist/schemas/automations.d.ts +54 -28
- package/dist/schemas/automations.d.ts.map +1 -1
- package/dist/schemas/automations.js +26 -8
- package/dist/schemas/automations.js.map +1 -1
- package/dist/schemas/capabilities.d.ts +0 -8
- package/dist/schemas/capabilities.d.ts.map +1 -1
- package/dist/schemas/capabilities.js +0 -4
- package/dist/schemas/capabilities.js.map +1 -1
- package/dist/schemas/ci.d.ts +10 -0
- package/dist/schemas/ci.d.ts.map +1 -1
- package/dist/schemas/ci.js +9 -1
- package/dist/schemas/ci.js.map +1 -1
- package/dist/schemas/codebase-health.d.ts.map +1 -1
- package/dist/schemas/codebase-health.js.map +1 -1
- package/dist/schemas/devices.d.ts +90 -0
- package/dist/schemas/devices.d.ts.map +1 -1
- package/dist/schemas/devices.js +10 -1
- package/dist/schemas/devices.js.map +1 -1
- package/dist/schemas/engines.d.ts.map +1 -1
- package/dist/schemas/engines.js.map +1 -1
- package/dist/schemas/environment.d.ts.map +1 -1
- package/dist/schemas/environment.js.map +1 -1
- package/dist/schemas/exit.d.ts.map +1 -1
- package/dist/schemas/exit.js.map +1 -1
- package/dist/schemas/extension-updates.d.ts.map +1 -1
- package/dist/schemas/extension-updates.js.map +1 -1
- package/dist/schemas/git-history.d.ts.map +1 -1
- package/dist/schemas/git-history.js.map +1 -1
- package/dist/schemas/git.d.ts +80 -16
- package/dist/schemas/git.d.ts.map +1 -1
- package/dist/schemas/git.js +37 -25
- package/dist/schemas/git.js.map +1 -1
- package/dist/schemas/history.d.ts.map +1 -1
- package/dist/schemas/history.js.map +1 -1
- package/dist/schemas/hosts.d.ts.map +1 -1
- package/dist/schemas/hosts.js.map +1 -1
- package/dist/schemas/inventory.d.ts.map +1 -1
- package/dist/schemas/inventory.js.map +1 -1
- package/dist/schemas/issues.d.ts +0 -1
- package/dist/schemas/issues.d.ts.map +1 -1
- package/dist/schemas/issues.js +0 -1
- package/dist/schemas/issues.js.map +1 -1
- package/dist/schemas/logs.d.ts.map +1 -1
- package/dist/schemas/logs.js.map +1 -1
- package/dist/schemas/loops.d.ts.map +1 -1
- package/dist/schemas/loops.js +1 -1
- package/dist/schemas/loops.js.map +1 -1
- package/dist/schemas/maintenance.d.ts.map +1 -1
- package/dist/schemas/maintenance.js.map +1 -1
- package/dist/schemas/marketplace.d.ts +0 -4
- package/dist/schemas/marketplace.d.ts.map +1 -1
- package/dist/schemas/panels.d.ts.map +1 -1
- package/dist/schemas/panels.js.map +1 -1
- package/dist/schemas/personas.d.ts +2 -1
- package/dist/schemas/personas.d.ts.map +1 -1
- package/dist/schemas/personas.js +6 -2
- package/dist/schemas/personas.js.map +1 -1
- package/dist/schemas/plan-limits.d.ts +2 -4
- package/dist/schemas/plan-limits.d.ts.map +1 -1
- package/dist/schemas/plan-limits.js +5 -8
- package/dist/schemas/plan-limits.js.map +1 -1
- package/dist/schemas/ports.d.ts.map +1 -1
- package/dist/schemas/ports.js.map +1 -1
- package/dist/schemas/provider-oauth.d.ts.map +1 -1
- package/dist/schemas/provider-oauth.js.map +1 -1
- package/dist/schemas/provider-subscriptions.d.ts +1 -1
- package/dist/schemas/provider-subscriptions.d.ts.map +1 -1
- package/dist/schemas/provider-subscriptions.js +1 -1
- package/dist/schemas/provider-subscriptions.js.map +1 -1
- package/dist/schemas/public.d.ts.map +1 -1
- package/dist/schemas/public.js.map +1 -1
- package/dist/schemas/push.d.ts.map +1 -1
- package/dist/schemas/push.js.map +1 -1
- package/dist/schemas/secrets.d.ts.map +1 -1
- package/dist/schemas/secrets.js.map +1 -1
- package/dist/schemas/settings.d.ts +6 -9
- package/dist/schemas/settings.d.ts.map +1 -1
- package/dist/schemas/settings.js +16 -5
- package/dist/schemas/settings.js.map +1 -1
- package/dist/schemas/share.d.ts.map +1 -1
- package/dist/schemas/share.js.map +1 -1
- package/dist/schemas/shared.d.ts +4 -0
- package/dist/schemas/shared.d.ts.map +1 -1
- package/dist/schemas/shared.js +3 -0
- package/dist/schemas/shared.js.map +1 -1
- package/dist/schemas/system.d.ts +6 -0
- package/dist/schemas/system.d.ts.map +1 -1
- package/dist/schemas/system.js +10 -0
- package/dist/schemas/system.js.map +1 -1
- package/dist/schemas/terminal.d.ts.map +1 -1
- package/dist/schemas/terminal.js.map +1 -1
- package/dist/schemas/usage.d.ts.map +1 -1
- package/dist/schemas/usage.js.map +1 -1
- package/dist/schemas/vpn.d.ts.map +1 -1
- package/dist/schemas/vpn.js.map +1 -1
- package/dist/schemas/webext.d.ts.map +1 -1
- package/dist/schemas/webext.js.map +1 -1
- package/dist/schemas/workflows.d.ts +66 -9
- package/dist/schemas/workflows.d.ts.map +1 -1
- package/dist/schemas/workflows.js +6 -5
- package/dist/schemas/workflows.js.map +1 -1
- package/dist/schemas/workspace-repos.d.ts.map +1 -1
- package/dist/schemas/workspace-repos.js.map +1 -1
- package/dist/schemas/workspace-search.d.ts.map +1 -1
- package/dist/schemas/workspace-search.js.map +1 -1
- package/dist/schemas/workspace-setup.d.ts.map +1 -1
- package/dist/schemas/workspace-setup.js.map +1 -1
- package/dist/schemas/workspace-tree.d.ts.map +1 -1
- package/dist/schemas/workspace-tree.js.map +1 -1
- package/dist/state/arrival.d.ts.map +1 -0
- package/dist/{arrival.js → state/arrival.js} +1 -1
- package/dist/state/arrival.js.map +1 -0
- package/dist/state/contract-lock.d.ts.map +1 -0
- package/dist/{contract-lock.js → state/contract-lock.js} +1 -1
- package/dist/state/contract-lock.js.map +1 -0
- package/dist/{definition.d.ts → state/definition.d.ts} +21 -17
- package/dist/state/definition.d.ts.map +1 -0
- package/dist/{definition.js → state/definition.js} +4 -4
- package/dist/state/definition.js.map +1 -0
- package/dist/state/history-state.d.ts.map +1 -0
- package/dist/{history-state.js → state/history-state.js} +1 -0
- package/dist/state/history-state.js.map +1 -0
- package/dist/state/runtime-state.d.ts.map +1 -0
- package/dist/state/runtime-state.js.map +1 -0
- package/dist/state/starter.d.ts.map +1 -0
- package/dist/state/starter.js.map +1 -0
- package/dist/state/state-portability.d.ts.map +1 -0
- package/dist/state/state-portability.js.map +1 -0
- package/dist/state/versions.d.ts.map +1 -0
- package/dist/state/versions.js.map +1 -0
- package/dist/{workspace-state.d.ts → state/workspace-state.d.ts} +8 -0
- package/dist/state/workspace-state.d.ts.map +1 -0
- package/dist/{workspace-state.js → state/workspace-state.js} +25 -0
- package/dist/state/workspace-state.js.map +1 -0
- package/dist/{documents.d.ts → text/documents.d.ts} +1 -1
- package/dist/text/documents.d.ts.map +1 -0
- package/dist/{documents.js → text/documents.js} +1 -1
- package/dist/text/documents.js.map +1 -0
- package/dist/text/embed.d.ts.map +1 -0
- package/dist/text/embed.js.map +1 -0
- package/dist/text/mentions.d.ts.map +1 -0
- package/dist/text/mentions.js.map +1 -0
- package/dist/text/model-answer.d.ts +3 -0
- package/dist/text/model-answer.d.ts.map +1 -0
- package/dist/text/model-answer.js +3 -0
- package/dist/text/model-answer.js.map +1 -0
- package/dist/text/path-refs.d.ts.map +1 -0
- package/dist/text/path-refs.js.map +1 -0
- package/dist/{shell-regions.d.ts → text/shell-regions.d.ts} +1 -1
- package/dist/text/shell-regions.d.ts.map +1 -0
- package/dist/text/shell-regions.js.map +1 -0
- package/dist/text/title.d.ts.map +1 -0
- package/dist/text/title.js.map +1 -0
- package/dist/{transcript-fold.d.ts → text/transcript-fold.d.ts} +2 -1
- package/dist/text/transcript-fold.d.ts.map +1 -0
- package/dist/{transcript-fold.js → text/transcript-fold.js} +2 -16
- package/dist/text/transcript-fold.js.map +1 -0
- package/dist/text/whisper.d.ts +3 -0
- package/dist/text/whisper.d.ts.map +1 -0
- package/dist/text/whisper.js +11 -0
- package/dist/text/whisper.js.map +1 -0
- package/dist/{workflow-faults.d.ts → text/workflow-faults.d.ts} +1 -1
- package/dist/text/workflow-faults.d.ts.map +1 -0
- package/dist/{workflow-faults.js → text/workflow-faults.js} +1 -1
- package/dist/text/workflow-faults.js.map +1 -0
- package/package.json +70 -70
- package/src/chores/chores.test.ts +4 -10
- package/src/chores/chores.ts +148 -392
- package/src/chores/digest.ts +8 -28
- package/src/chores/extension-update.ts +3 -8
- package/src/chores/fix-deps.ts +4 -18
- package/src/chores/index.ts +2 -2
- package/src/chores/probes.test.ts +7 -43
- package/src/chores/probes.ts +62 -167
- package/src/chores/prompt.ts +10 -34
- package/src/chores/stack.test.ts +6 -45
- package/src/chores/stack.ts +27 -118
- package/src/chores/verdict.test.ts +101 -80
- package/src/chores/verdict.ts +54 -99
- package/src/contracts/accounts.contract.ts +4 -19
- package/src/contracts/agent.contract.ts +7 -22
- package/src/contracts/agents.contract.ts +25 -71
- package/src/contracts/automations.contract.ts +14 -30
- package/src/contracts/capabilities.contract.ts +8 -35
- package/src/contracts/chores.contract.ts +4 -15
- package/src/contracts/endpoints.contract.ts +5 -22
- package/src/contracts/exit.contract.ts +7 -30
- package/src/contracts/extensions.contract.ts +8 -30
- package/src/contracts/git.contract.ts +25 -49
- package/src/contracts/host.contract.ts +9 -44
- package/src/contracts/intentic.contract.ts +1 -1
- package/src/contracts/logs.contract.ts +3 -13
- package/src/contracts/loops.contract.ts +9 -40
- package/src/contracts/personas.contract.ts +10 -35
- package/src/contracts/providers.contract.ts +4 -17
- package/src/contracts/runner.contract.ts +12 -39
- package/src/contracts/safety.contract.ts +5 -14
- package/src/contracts/secrets.contract.ts +4 -22
- package/src/contracts/sessions.contract.ts +1 -1
- package/src/contracts/settings.contract.ts +4 -10
- package/src/contracts/share.contract.ts +3 -9
- package/src/contracts/skills.contract.ts +4 -15
- package/src/contracts/system.contract.ts +26 -52
- package/src/contracts/usage.contract.ts +7 -21
- package/src/contracts/vpn.contract.ts +9 -16
- package/src/contracts/webext.contract.ts +9 -25
- package/src/contracts/workflows.contract.ts +34 -58
- package/src/contracts/workspace.contract.ts +19 -50
- package/src/events/agent-events.ts +345 -0
- package/src/events/cards.ts +286 -0
- package/src/{events.test.ts → events/resume.test.ts} +4 -19
- package/src/events/resume.ts +60 -0
- package/src/events/system-events.ts +139 -0
- package/src/events/transcript.ts +320 -0
- package/src/{conversation-ids.test.ts → ids/conversation-ids.test.ts} +25 -13
- package/src/ids/conversation-ids.ts +178 -0
- package/src/ids/hostnames.ts +129 -0
- package/src/ids/session-names.ts +29 -0
- package/src/ids/share-paths.ts +43 -0
- package/src/{tunnel-ids.test.ts → ids/tunnel-ids.test.ts} +1 -14
- package/src/ids/tunnel-ids.ts +29 -0
- package/src/index.ts +71 -87
- package/src/{agent-catalog.test.ts → models/agent-catalog.test.ts} +19 -93
- package/src/models/agent-catalog.ts +174 -0
- package/src/models/agent-runtimes.ts +201 -0
- package/src/models/capability-ledger.test.ts +84 -0
- package/src/{fast-tier.test.ts → models/fast-tier.test.ts} +7 -18
- package/src/models/fast-tier.ts +36 -0
- package/src/{model-order.test.ts → models/model-order.test.ts} +19 -40
- package/src/models/model-order.ts +163 -0
- package/src/{model-pins.test.ts → models/model-pins.test.ts} +12 -46
- package/src/models/model-pins.ts +57 -0
- package/src/models/model-roles.test.ts +38 -0
- package/src/models/model-roles.ts +180 -0
- package/src/{plan-pools.test.ts → models/plan-pools.test.ts} +6 -11
- package/src/models/plan-pools.ts +65 -0
- package/src/{prompt-complexity.test.ts → models/prompt-complexity.test.ts} +8 -60
- package/src/models/prompt-complexity.ts +215 -0
- package/src/{provider-specs.test.ts → models/provider-specs.test.ts} +18 -47
- package/src/models/provider-specs.ts +272 -0
- package/src/policy/approvals-execution.ts +58 -0
- package/src/{batch-runs.test.ts → policy/batch-runs.test.ts} +4 -20
- package/src/policy/batch-runs.ts +137 -0
- package/src/policy/capability-secrets.ts +5 -0
- package/src/{card-status.ts → policy/card-status.ts} +11 -26
- package/src/{command-classes.test.ts → policy/command-classes.test.ts} +11 -118
- package/src/policy/command-classes.ts +395 -0
- package/src/policy/command-run.ts +65 -0
- package/src/policy/control-scopes.ts +38 -0
- package/src/{credential-material.test.ts → policy/credential-material.test.ts} +4 -26
- package/src/policy/credential-material.ts +91 -0
- package/src/policy/needs-action.ts +5 -0
- package/src/policy/output-fields.ts +86 -0
- package/src/policy/overlay-lint.ts +100 -0
- package/src/{owner-ticket.test.ts → policy/owner-ticket.test.ts} +1 -1
- package/src/{owner-ticket.ts → policy/owner-ticket.ts} +9 -31
- package/src/policy/safety-policy.test.ts +84 -0
- package/src/policy/safety-policy.ts +142 -0
- package/src/policy/search-globs.ts +60 -0
- package/src/protocol/container-requirements.test.ts +72 -0
- package/src/protocol/container-requirements.ts +58 -0
- package/src/protocol/host-protocol.ts +29 -0
- package/src/protocol/ingress-contract.ts +103 -0
- package/src/{ingress-protocol.test.ts → protocol/ingress-protocol.test.ts} +25 -90
- package/src/protocol/ingress-protocol.ts +441 -0
- package/src/protocol/listener-protocol.ts +75 -0
- package/src/{peer-dial.test.ts → protocol/peer-dial.test.ts} +52 -1
- package/src/protocol/peer-dial.ts +207 -0
- package/src/{peer-mcp-server.ts → protocol/peer-mcp-server.ts} +16 -41
- package/src/protocol/request-id.ts +5 -0
- package/src/{routes.test.ts → protocol/routes.test.ts} +14 -22
- package/src/protocol/routes.ts +159 -0
- package/src/protocol/runner-protocol.ts +197 -0
- package/src/protocol/terminal-protocol.ts +13 -0
- package/src/protocol/webext-links.ts +50 -0
- package/src/protocol/webext-protocol.ts +24 -0
- package/src/schemas/activity.ts +22 -30
- package/src/schemas/agent.ts +130 -238
- package/src/schemas/agents.ts +165 -483
- package/src/schemas/approvals.ts +23 -71
- package/src/schemas/automations.ts +142 -250
- package/src/schemas/capabilities.ts +127 -414
- package/src/schemas/ci.ts +56 -108
- package/src/schemas/codebase-health.ts +7 -11
- package/src/schemas/devices.ts +98 -321
- package/src/schemas/engines.ts +16 -44
- package/src/schemas/environment.ts +41 -91
- package/src/schemas/exit.ts +24 -81
- package/src/schemas/extension-updates.ts +42 -87
- package/src/schemas/git-history.ts +30 -84
- package/src/schemas/git.ts +141 -256
- package/src/schemas/history.ts +14 -40
- package/src/schemas/hosts.ts +9 -15
- package/src/schemas/inventory.ts +8 -10
- package/src/schemas/issues.ts +66 -134
- package/src/schemas/logs.ts +15 -34
- package/src/schemas/loops.ts +46 -163
- package/src/schemas/maintenance.ts +47 -172
- package/src/schemas/panels.ts +20 -45
- package/src/schemas/personas.ts +50 -200
- package/src/schemas/plan-limits.ts +58 -197
- package/src/schemas/ports.ts +14 -32
- package/src/schemas/provider-oauth.ts +23 -76
- package/src/schemas/provider-subscriptions.ts +4 -13
- package/src/schemas/public.ts +4 -15
- package/src/schemas/push.ts +8 -36
- package/src/schemas/secrets.ts +20 -64
- package/src/schemas/settings.ts +175 -600
- package/src/schemas/share.ts +14 -32
- package/src/schemas/shared.ts +14 -13
- package/src/schemas/system.ts +46 -78
- package/src/schemas/terminal.ts +41 -120
- package/src/schemas/usage.ts +44 -233
- package/src/schemas/version-seam.test.ts +9 -26
- package/src/schemas/vpn.ts +27 -64
- package/src/schemas/webext.ts +22 -53
- package/src/schemas/workflows.ts +57 -183
- package/src/schemas/workspace-repos.ts +12 -24
- package/src/schemas/workspace-search.ts +17 -35
- package/src/schemas/workspace-setup.ts +4 -11
- package/src/schemas/workspace-tree.ts +32 -91
- package/src/state/arrival.ts +109 -0
- package/src/state/contract-lock.test.ts +17 -0
- package/src/state/contract-lock.ts +49 -0
- package/src/state/definition.ts +143 -0
- package/src/state/history-state.ts +103 -0
- package/src/{runtime-state.test.ts → state/runtime-state.test.ts} +3 -10
- package/src/state/runtime-state.ts +62 -0
- package/src/state/starter.ts +5 -0
- package/src/state/state-portability.ts +27 -0
- package/src/state/versions.ts +26 -0
- package/src/{workspace-state.test.ts → state/workspace-state.test.ts} +65 -172
- package/src/state/workspace-state.ts +669 -0
- package/src/{documents.test.ts → text/documents.test.ts} +1 -1
- package/src/text/documents.ts +42 -0
- package/src/text/embed.ts +132 -0
- package/src/text/mentions.ts +21 -0
- package/src/text/model-answer.ts +9 -0
- package/src/text/path-refs.ts +39 -0
- package/src/text/shell-regions.ts +224 -0
- package/src/{title.test.ts → text/title.test.ts} +13 -32
- package/src/text/title.ts +202 -0
- package/src/{transcript-fold.test.ts → text/transcript-fold.test.ts} +5 -83
- package/src/{transcript-fold.ts → text/transcript-fold.ts} +65 -170
- package/src/text/whisper.test.ts +19 -0
- package/src/text/whisper.ts +17 -0
- package/src/{workflow-faults.test.ts → text/workflow-faults.test.ts} +6 -24
- package/src/{workflow-faults.ts → text/workflow-faults.ts} +20 -60
- package/dist/agent-catalog.d.ts.map +0 -1
- package/dist/agent-catalog.js.map +0 -1
- package/dist/agent-runtimes.d.ts.map +0 -1
- package/dist/agent-runtimes.js.map +0 -1
- package/dist/approvals-execution.d.ts.map +0 -1
- package/dist/approvals-execution.js.map +0 -1
- package/dist/arrival.d.ts.map +0 -1
- package/dist/arrival.js.map +0 -1
- package/dist/batch-runs.d.ts.map +0 -1
- package/dist/batch-runs.js.map +0 -1
- package/dist/capability-env.d.ts.map +0 -1
- package/dist/capability-env.js.map +0 -1
- package/dist/capability-secrets.d.ts.map +0 -1
- package/dist/capability-secrets.js.map +0 -1
- package/dist/card-status.d.ts.map +0 -1
- package/dist/card-status.js.map +0 -1
- package/dist/command-classes.d.ts.map +0 -1
- package/dist/command-classes.js.map +0 -1
- package/dist/command-run.d.ts.map +0 -1
- package/dist/command-run.js.map +0 -1
- package/dist/contract-lock.d.ts.map +0 -1
- package/dist/contract-lock.js.map +0 -1
- package/dist/conversation-ids.d.ts +0 -4
- package/dist/conversation-ids.d.ts.map +0 -1
- package/dist/conversation-ids.js.map +0 -1
- package/dist/credential-material.d.ts.map +0 -1
- package/dist/credential-material.js.map +0 -1
- package/dist/definition.d.ts.map +0 -1
- package/dist/definition.js.map +0 -1
- package/dist/documents.d.ts.map +0 -1
- package/dist/documents.js.map +0 -1
- package/dist/embed.d.ts.map +0 -1
- package/dist/embed.js.map +0 -1
- package/dist/events.d.ts +0 -4336
- package/dist/events.d.ts.map +0 -1
- package/dist/events.js +0 -725
- package/dist/events.js.map +0 -1
- package/dist/fast-tier.d.ts.map +0 -1
- package/dist/fast-tier.js.map +0 -1
- package/dist/history-state.d.ts.map +0 -1
- package/dist/history-state.js.map +0 -1
- package/dist/host-protocol.d.ts.map +0 -1
- package/dist/host-protocol.js.map +0 -1
- package/dist/hostnames.d.ts.map +0 -1
- package/dist/hostnames.js.map +0 -1
- package/dist/ingress-contract.d.ts.map +0 -1
- package/dist/ingress-contract.js.map +0 -1
- package/dist/ingress-protocol.d.ts.map +0 -1
- package/dist/ingress-protocol.js.map +0 -1
- package/dist/listener-protocol.d.ts.map +0 -1
- package/dist/listener-protocol.js.map +0 -1
- package/dist/mentions.d.ts.map +0 -1
- package/dist/mentions.js.map +0 -1
- package/dist/model-order.d.ts.map +0 -1
- package/dist/model-order.js.map +0 -1
- package/dist/model-pins.d.ts.map +0 -1
- package/dist/model-pins.js.map +0 -1
- package/dist/model-roles.d.ts.map +0 -1
- package/dist/model-roles.js.map +0 -1
- package/dist/needs-action.d.ts.map +0 -1
- package/dist/needs-action.js.map +0 -1
- package/dist/output-fields.d.ts.map +0 -1
- package/dist/output-fields.js.map +0 -1
- package/dist/overlay-lint.d.ts.map +0 -1
- package/dist/overlay-lint.js.map +0 -1
- package/dist/owner-ticket.d.ts.map +0 -1
- package/dist/owner-ticket.js.map +0 -1
- package/dist/path-refs.d.ts.map +0 -1
- package/dist/path-refs.js.map +0 -1
- package/dist/peer-dial.d.ts.map +0 -1
- package/dist/peer-dial.js.map +0 -1
- package/dist/peer-mcp-server.d.ts.map +0 -1
- package/dist/peer-mcp-server.js.map +0 -1
- package/dist/plan-pools.d.ts.map +0 -1
- package/dist/plan-pools.js.map +0 -1
- package/dist/prompt-complexity.d.ts.map +0 -1
- package/dist/prompt-complexity.js.map +0 -1
- package/dist/provider-specs.d.ts.map +0 -1
- package/dist/provider-specs.js.map +0 -1
- package/dist/request-id.d.ts.map +0 -1
- package/dist/request-id.js.map +0 -1
- package/dist/routes.d.ts.map +0 -1
- package/dist/routes.js.map +0 -1
- package/dist/runner-protocol.d.ts.map +0 -1
- package/dist/runner-protocol.js.map +0 -1
- package/dist/runtime-state.d.ts.map +0 -1
- package/dist/runtime-state.js.map +0 -1
- package/dist/safety-policy.d.ts.map +0 -1
- package/dist/safety-policy.js.map +0 -1
- package/dist/search-globs.d.ts.map +0 -1
- package/dist/search-globs.js.map +0 -1
- package/dist/session-names.d.ts.map +0 -1
- package/dist/session-names.js.map +0 -1
- package/dist/share-paths.d.ts.map +0 -1
- package/dist/share-paths.js.map +0 -1
- package/dist/shell-regions.d.ts.map +0 -1
- package/dist/shell-regions.js.map +0 -1
- package/dist/sse.d.ts.map +0 -1
- package/dist/sse.js.map +0 -1
- package/dist/starter.d.ts.map +0 -1
- package/dist/starter.js.map +0 -1
- package/dist/state-portability.d.ts.map +0 -1
- package/dist/state-portability.js.map +0 -1
- package/dist/terminal-protocol.d.ts.map +0 -1
- package/dist/terminal-protocol.js.map +0 -1
- package/dist/title.d.ts.map +0 -1
- package/dist/title.js.map +0 -1
- package/dist/transcript-fold.d.ts.map +0 -1
- package/dist/transcript-fold.js.map +0 -1
- package/dist/tunnel-ids.d.ts.map +0 -1
- package/dist/tunnel-ids.js.map +0 -1
- package/dist/versions.d.ts.map +0 -1
- package/dist/versions.js.map +0 -1
- package/dist/webext-links.d.ts.map +0 -1
- package/dist/webext-links.js.map +0 -1
- package/dist/webext-protocol.d.ts.map +0 -1
- package/dist/webext-protocol.js.map +0 -1
- package/dist/workflow-faults.d.ts.map +0 -1
- package/dist/workflow-faults.js.map +0 -1
- package/dist/workspace-state.d.ts.map +0 -1
- package/dist/workspace-state.js.map +0 -1
- package/src/agent-catalog.ts +0 -316
- package/src/agent-runtimes.ts +0 -419
- package/src/approvals-execution.ts +0 -96
- package/src/arrival.ts +0 -160
- package/src/batch-runs.ts +0 -188
- package/src/capability-ledger.test.ts +0 -140
- package/src/capability-secrets.ts +0 -20
- package/src/command-classes.ts +0 -617
- package/src/command-run.ts +0 -78
- package/src/contract-lock.test.ts +0 -23
- package/src/contract-lock.ts +0 -66
- package/src/conversation-ids.ts +0 -207
- package/src/credential-material.ts +0 -181
- package/src/definition.ts +0 -207
- package/src/documents.ts +0 -67
- package/src/embed.ts +0 -164
- package/src/events.ts +0 -1870
- package/src/fast-tier.ts +0 -72
- package/src/history-state.ts +0 -174
- package/src/host-protocol.ts +0 -36
- package/src/hostnames.ts +0 -180
- package/src/ingress-contract.ts +0 -157
- package/src/ingress-protocol.ts +0 -625
- package/src/listener-protocol.ts +0 -96
- package/src/mentions.ts +0 -25
- package/src/model-order.ts +0 -262
- package/src/model-pins.ts +0 -132
- package/src/model-roles.test.ts +0 -52
- package/src/model-roles.ts +0 -320
- package/src/needs-action.ts +0 -14
- package/src/output-fields.ts +0 -111
- package/src/overlay-lint.ts +0 -116
- package/src/path-refs.ts +0 -59
- package/src/peer-dial.ts +0 -163
- package/src/plan-pools.ts +0 -92
- package/src/prompt-complexity.ts +0 -334
- package/src/provider-specs.ts +0 -432
- package/src/request-id.ts +0 -41
- package/src/routes.ts +0 -219
- package/src/runner-protocol.ts +0 -239
- package/src/runtime-state.ts +0 -140
- package/src/safety-policy.test.ts +0 -88
- package/src/safety-policy.ts +0 -258
- package/src/search-globs.ts +0 -76
- package/src/session-names.ts +0 -44
- package/src/share-paths.ts +0 -68
- package/src/shell-regions.ts +0 -289
- package/src/starter.ts +0 -13
- package/src/state-portability.ts +0 -56
- package/src/terminal-protocol.ts +0 -16
- package/src/title.ts +0 -267
- package/src/tunnel-ids.ts +0 -57
- package/src/versions.ts +0 -48
- package/src/webext-links.ts +0 -90
- package/src/webext-protocol.ts +0 -27
- package/src/workspace-state.ts +0 -1090
- /package/dist/{hostnames.d.ts → ids/hostnames.d.ts} +0 -0
- /package/dist/{hostnames.js → ids/hostnames.js} +0 -0
- /package/dist/{session-names.d.ts → ids/session-names.d.ts} +0 -0
- /package/dist/{session-names.js → ids/session-names.js} +0 -0
- /package/dist/{share-paths.d.ts → ids/share-paths.d.ts} +0 -0
- /package/dist/{share-paths.js → ids/share-paths.js} +0 -0
- /package/dist/{agent-catalog.js → models/agent-catalog.js} +0 -0
- /package/dist/{agent-runtimes.d.ts → models/agent-runtimes.d.ts} +0 -0
- /package/dist/{agent-runtimes.js → models/agent-runtimes.js} +0 -0
- /package/dist/{fast-tier.js → models/fast-tier.js} +0 -0
- /package/dist/{model-order.d.ts → models/model-order.d.ts} +0 -0
- /package/dist/{model-order.js → models/model-order.js} +0 -0
- /package/dist/{model-pins.js → models/model-pins.js} +0 -0
- /package/dist/{plan-pools.js → models/plan-pools.js} +0 -0
- /package/dist/{prompt-complexity.d.ts → models/prompt-complexity.d.ts} +0 -0
- /package/dist/{prompt-complexity.js → models/prompt-complexity.js} +0 -0
- /package/dist/{provider-specs.d.ts → models/provider-specs.d.ts} +0 -0
- /package/dist/{provider-specs.js → models/provider-specs.js} +0 -0
- /package/dist/{approvals-execution.d.ts → policy/approvals-execution.d.ts} +0 -0
- /package/dist/{approvals-execution.js → policy/approvals-execution.js} +0 -0
- /package/dist/{capability-env.d.ts → policy/capability-env.d.ts} +0 -0
- /package/dist/{capability-env.js → policy/capability-env.js} +0 -0
- /package/dist/{capability-secrets.d.ts → policy/capability-secrets.d.ts} +0 -0
- /package/dist/{capability-secrets.js → policy/capability-secrets.js} +0 -0
- /package/dist/{command-run.js → policy/command-run.js} +0 -0
- /package/dist/{credential-material.d.ts → policy/credential-material.d.ts} +0 -0
- /package/dist/{credential-material.js → policy/credential-material.js} +0 -0
- /package/dist/{needs-action.d.ts → policy/needs-action.d.ts} +0 -0
- /package/dist/{needs-action.js → policy/needs-action.js} +0 -0
- /package/dist/{output-fields.d.ts → policy/output-fields.d.ts} +0 -0
- /package/dist/{output-fields.js → policy/output-fields.js} +0 -0
- /package/dist/{overlay-lint.d.ts → policy/overlay-lint.d.ts} +0 -0
- /package/dist/{overlay-lint.js → policy/overlay-lint.js} +0 -0
- /package/dist/{owner-ticket.d.ts → policy/owner-ticket.d.ts} +0 -0
- /package/dist/{search-globs.d.ts → policy/search-globs.d.ts} +0 -0
- /package/dist/{search-globs.js → policy/search-globs.js} +0 -0
- /package/dist/{ingress-contract.d.ts → protocol/ingress-contract.d.ts} +0 -0
- /package/dist/{ingress-protocol.d.ts → protocol/ingress-protocol.d.ts} +0 -0
- /package/dist/{ingress-protocol.js → protocol/ingress-protocol.js} +0 -0
- /package/dist/{listener-protocol.d.ts → protocol/listener-protocol.d.ts} +0 -0
- /package/dist/{peer-mcp-server.d.ts → protocol/peer-mcp-server.d.ts} +0 -0
- /package/dist/{peer-mcp-server.js → protocol/peer-mcp-server.js} +0 -0
- /package/dist/{request-id.d.ts → protocol/request-id.d.ts} +0 -0
- /package/dist/{request-id.js → protocol/request-id.js} +0 -0
- /package/dist/{routes.d.ts → protocol/routes.d.ts} +0 -0
- /package/dist/{routes.js → protocol/routes.js} +0 -0
- /package/dist/{sse.d.ts → protocol/sse.d.ts} +0 -0
- /package/dist/{sse.js → protocol/sse.js} +0 -0
- /package/dist/{terminal-protocol.js → protocol/terminal-protocol.js} +0 -0
- /package/dist/{webext-links.d.ts → protocol/webext-links.d.ts} +0 -0
- /package/dist/{webext-links.js → protocol/webext-links.js} +0 -0
- /package/dist/{arrival.d.ts → state/arrival.d.ts} +0 -0
- /package/dist/{contract-lock.d.ts → state/contract-lock.d.ts} +0 -0
- /package/dist/{history-state.d.ts → state/history-state.d.ts} +0 -0
- /package/dist/{runtime-state.d.ts → state/runtime-state.d.ts} +0 -0
- /package/dist/{runtime-state.js → state/runtime-state.js} +0 -0
- /package/dist/{starter.d.ts → state/starter.d.ts} +0 -0
- /package/dist/{starter.js → state/starter.js} +0 -0
- /package/dist/{state-portability.d.ts → state/state-portability.d.ts} +0 -0
- /package/dist/{state-portability.js → state/state-portability.js} +0 -0
- /package/dist/{versions.d.ts → state/versions.d.ts} +0 -0
- /package/dist/{versions.js → state/versions.js} +0 -0
- /package/dist/{embed.d.ts → text/embed.d.ts} +0 -0
- /package/dist/{embed.js → text/embed.js} +0 -0
- /package/dist/{mentions.d.ts → text/mentions.d.ts} +0 -0
- /package/dist/{mentions.js → text/mentions.js} +0 -0
- /package/dist/{path-refs.d.ts → text/path-refs.d.ts} +0 -0
- /package/dist/{path-refs.js → text/path-refs.js} +0 -0
- /package/dist/{shell-regions.js → text/shell-regions.js} +0 -0
- /package/dist/{title.d.ts → text/title.d.ts} +0 -0
- /package/dist/{title.js → text/title.js} +0 -0
- /package/src/{hostnames.test.ts → ids/hostnames.test.ts} +0 -0
- /package/src/{share-paths.test.ts → ids/share-paths.test.ts} +0 -0
- /package/src/{capability-env.ts → policy/capability-env.ts} +0 -0
- /package/src/{overlay-lint.test.ts → policy/overlay-lint.test.ts} +0 -0
- /package/src/{search-globs.test.ts → policy/search-globs.test.ts} +0 -0
- /package/src/{ingress-contract.test.ts → protocol/ingress-contract.test.ts} +0 -0
- /package/src/{peer-mcp-server.test.ts → protocol/peer-mcp-server.test.ts} +0 -0
- /package/src/{sse.ts → protocol/sse.ts} +0 -0
- /package/src/{versions.test.ts → state/versions.test.ts} +0 -0
- /package/src/{embed.test.ts → text/embed.test.ts} +0 -0
- /package/src/{mentions.test.ts → text/mentions.test.ts} +0 -0
- /package/src/{path-refs.test.ts → text/path-refs.test.ts} +0 -0
package/src/chores/stack.test.ts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import { describe, expect, test } from "vitest";
|
|
2
2
|
import { componentStem, frameworksOf, IDIOM_RULES, idiomRule, UI_FRAMEWORKS, usesTailwind } from "./stack.js";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* Most of what is below guards a failure that CANNOT be seen by reading the table: a pattern is interpolated into
|
|
7
|
-
* a shell command that runs on someone else's machine at three in the morning, so a stray quote is not a typo
|
|
8
|
-
* anyone reviews: it is a probe that dies in a workspace nobody is watching, with a shell error for a reason. */
|
|
4
|
+
// Guards shell-safety of interpolated patterns (checked unattended on a remote machine) and the stem normalizer below
|
|
5
|
+
// the table.
|
|
9
6
|
|
|
10
7
|
describe(`the patterns are safe to interpolate`, () => {
|
|
11
|
-
// The scan wraps every pattern and glob in shell single quotes. One apostrophe inside ends the quoting and
|
|
12
|
-
// hands the remainder of the regex to sh, which is how a pattern becomes a command.
|
|
13
8
|
test(`no pattern or glob contains an apostrophe`, () => {
|
|
14
9
|
for (const rule of IDIOM_RULES) {
|
|
15
10
|
expect(rule.pattern, rule.id).not.toContain(`'`);
|
|
@@ -19,26 +14,18 @@ describe(`the patterns are safe to interpolate`, () => {
|
|
|
19
14
|
}
|
|
20
15
|
});
|
|
21
16
|
|
|
22
|
-
// Not the dialect ripgrep will use, but it catches the unbalanced bracket and the stray backslash, which is
|
|
23
|
-
// what actually goes wrong when someone adds a rule.
|
|
24
17
|
test(`every pattern parses as a regex`, () => {
|
|
25
18
|
for (const rule of IDIOM_RULES) {
|
|
26
19
|
expect(() => new RegExp(rule.pattern), rule.id).not.toThrow();
|
|
27
20
|
}
|
|
28
21
|
});
|
|
29
22
|
|
|
30
|
-
/* Rust's regex crate has no lookaround, and getting it means ripgrep's -P, which is a compile-time option on
|
|
31
|
-
* the box the sweep happens to run on. A rule that seems to need one is asking a question about the FILE
|
|
32
|
-
* rather than about a line, which is what `absent` is. */
|
|
33
23
|
test(`no pattern uses a lookaround`, () => {
|
|
34
24
|
for (const rule of IDIOM_RULES) {
|
|
35
25
|
expect(rule.pattern, rule.id).not.toMatch(/\(\?<?[=!]/);
|
|
36
26
|
}
|
|
37
27
|
});
|
|
38
28
|
|
|
39
|
-
/* An absent rule's population is every file its globs match, so a glob that is merely broad on a normal rule
|
|
40
|
-
* is catastrophic on this one: `*.ts` would name every TypeScript file in the repository as legacy code. A
|
|
41
|
-
* component extension is safe because every file wearing it is the thing the migration is about. */
|
|
42
29
|
test(`an absent rule is scoped to a component file type, never to a whole language`, () => {
|
|
43
30
|
for (const rule of IDIOM_RULES.filter((candidate) => candidate.absent !== undefined)) {
|
|
44
31
|
for (const glob of rule.globs) {
|
|
@@ -58,8 +45,6 @@ describe(`the patterns are safe to interpolate`, () => {
|
|
|
58
45
|
}
|
|
59
46
|
});
|
|
60
47
|
|
|
61
|
-
// The chore names the replacement in its prompt; a rule without one would wake an agent, tell it what to stop
|
|
62
|
-
// doing and leave it to guess a destination.
|
|
63
48
|
test(`every rule names what replaced it`, () => {
|
|
64
49
|
for (const rule of IDIOM_RULES) {
|
|
65
50
|
expect(rule.replacement.length, rule.id).toBeGreaterThan(3);
|
|
@@ -72,12 +57,8 @@ describe(`the patterns are safe to interpolate`, () => {
|
|
|
72
57
|
});
|
|
73
58
|
});
|
|
74
59
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
* are lines from real files rather than invented ones.
|
|
78
|
-
*
|
|
79
|
-
* Only the rule whose names are ordinary words is covered here. `@NgModule(` and `ReactDOM.render(` cannot be
|
|
80
|
-
* mistaken for anything, and a test that restated them would be asserting that a literal is itself. */
|
|
60
|
+
// Only rule names built from ordinary words are tested against real lines; `@NgModule(` and `ReactDOM.render(` can't be
|
|
61
|
+
// mistaken for anything else.
|
|
81
62
|
describe(`the Vue 2 teardown hooks`, () => {
|
|
82
63
|
const hits = (line: string): boolean => new RegExp(idiomRule(`vue-2-lifecycle`)?.pattern ?? `(?:)`).test(line);
|
|
83
64
|
|
|
@@ -86,13 +67,9 @@ describe(`the Vue 2 teardown hooks`, () => {
|
|
|
86
67
|
expect(hits(` beforeDestroy() {`)).toBe(true);
|
|
87
68
|
expect(hits(` destroyed: function () {`)).toBe(true);
|
|
88
69
|
expect(hits(` destroyed: async () => {`)).toBe(true);
|
|
89
|
-
// The name is Vue's alone, so it is the finding whatever it is assigned.
|
|
90
70
|
expect(hits(` beforeDestroy: this.teardown,`)).toBe(true);
|
|
91
71
|
});
|
|
92
72
|
|
|
93
|
-
/* The finding this rule really produced, against a module that deletes idle machines. Every line below is a
|
|
94
|
-
* fact about a tally, and a chore that reads them as a lifecycle hook sends its reader at a file with no
|
|
95
|
-
* component in it. */
|
|
96
73
|
test(`a field named after the word is not a hook`, () => {
|
|
97
74
|
expect(hits(`): Promise<{ warned: number; destroyed: number; dropped: number }> => {`)).toBe(false);
|
|
98
75
|
expect(hits(` const tally = { warned: 0, destroyed: 0, dropped: 0 };`)).toBe(false);
|
|
@@ -101,8 +78,6 @@ describe(`the Vue 2 teardown hooks`, () => {
|
|
|
101
78
|
expect(hits(`type IdleVerdict = "kept" | "warned" | "destroyed" | "dropped";`)).toBe(false);
|
|
102
79
|
});
|
|
103
80
|
|
|
104
|
-
// The other half of the same guard: the pattern above is only ever asked about a component file, so a backend
|
|
105
|
-
// module is not eligible for this finding whatever it happens to name a variable.
|
|
106
81
|
test(`the sweep asks the question of components only`, () => {
|
|
107
82
|
expect(idiomRule(`vue-2-lifecycle`)?.globs).toEqual([`*.vue`]);
|
|
108
83
|
});
|
|
@@ -115,8 +90,6 @@ describe(`recognising the stack`, () => {
|
|
|
115
90
|
expect(frameworksOf([`pino`, `zod`])).toEqual([]);
|
|
116
91
|
});
|
|
117
92
|
|
|
118
|
-
// A near-miss must not read as a hit: plenty of packages are named after the framework they plug into, and
|
|
119
|
-
// `@vueuse/core` in a repo with no Vue is a dependency somebody left behind rather than a Vue application.
|
|
120
93
|
test(`a package merely named after a framework is not that framework`, () => {
|
|
121
94
|
expect(frameworksOf([`@vueuse/core`, `react-hook-form`, `eslint-plugin-vue`])).toEqual([]);
|
|
122
95
|
});
|
|
@@ -127,8 +100,8 @@ describe(`recognising the stack`, () => {
|
|
|
127
100
|
});
|
|
128
101
|
});
|
|
129
102
|
|
|
130
|
-
|
|
131
|
-
|
|
103
|
+
// The stem normalizer is the component-overlap chore's only evidence; each case is a family that must form, or must
|
|
104
|
+
// not.
|
|
132
105
|
describe(`the name two components share`, () => {
|
|
133
106
|
test(`framework and qualifier noise falls away`, () => {
|
|
134
107
|
expect(componentStem(`src/components/Button.vue`)).toBe(`button`);
|
|
@@ -138,15 +111,10 @@ describe(`the name two components share`, () => {
|
|
|
138
111
|
expect(componentStem(`src/UserCard.tsx`)).toBe(`usercard`);
|
|
139
112
|
});
|
|
140
113
|
|
|
141
|
-
// Every barrel file in the repository is called this. A family of forty is a fact about the convention, not
|
|
142
|
-
// about duplication, and it would be the largest finding in every repo that has one.
|
|
143
114
|
test(`index files never form a family`, () => {
|
|
144
115
|
expect(componentStem(`src/components/Button/index.tsx`)).toBeUndefined();
|
|
145
116
|
});
|
|
146
117
|
|
|
147
|
-
/* The same argument, for the names the framework hands out rather than the author. A monorepo has one root
|
|
148
|
-
* per app and a Next App Router has one `page` per route, so these families form by construction: the thirty
|
|
149
|
-
* `page.tsx` of a thirty-route app would sort above every real finding the chore has. */
|
|
150
118
|
test(`framework entry names never form a family`, () => {
|
|
151
119
|
expect(componentStem(`apps/web/src/App.vue`)).toBeUndefined();
|
|
152
120
|
expect(componentStem(`apps/desktop/src/App.vue`)).toBeUndefined();
|
|
@@ -155,25 +123,18 @@ describe(`the name two components share`, () => {
|
|
|
155
123
|
expect(componentStem(`app/settings/not-found.tsx`)).toBeUndefined();
|
|
156
124
|
});
|
|
157
125
|
|
|
158
|
-
// …and only on the whole name. A component that merely BEGINS with one is the author's own and keeps its
|
|
159
|
-
// stem, or the guard above would swallow half the components in a repo that prefixes them.
|
|
160
126
|
test(`a component that only starts with a framework name is kept`, () => {
|
|
161
127
|
expect(componentStem(`src/shell/AppShell.vue`)).toBe(`appshell`);
|
|
162
128
|
expect(componentStem(`src/ErrorBoundary.tsx`)).toBe(`errorboundary`);
|
|
163
129
|
expect(componentStem(`src/PageHeader.vue`)).toBe(`pageheader`);
|
|
164
130
|
});
|
|
165
131
|
|
|
166
|
-
/* The trap in stripping a trailing number. `H1` and `H2` are different components and reduce to the same
|
|
167
|
-
* single letter, so the stem is only accepted when what survives is still long enough to mean something:
|
|
168
|
-
* otherwise the untouched name is kept and the two stay apart. */
|
|
169
132
|
test(`short names keep their digits rather than collapsing together`, () => {
|
|
170
133
|
expect(componentStem(`src/type/H1.tsx`)).toBe(`h1`);
|
|
171
134
|
expect(componentStem(`src/type/H2.tsx`)).toBe(`h2`);
|
|
172
135
|
expect(componentStem(`src/type/H1.tsx`)).not.toBe(componentStem(`src/type/H2.tsx`));
|
|
173
136
|
});
|
|
174
137
|
|
|
175
|
-
// Same guard on the prefix side: `Theme` begins with `the`, and stripping it would leave `me` and put Theme
|
|
176
|
-
// in a family with anything else that reduced to it.
|
|
177
138
|
test(`a word that merely starts with a qualifier is left alone`, () => {
|
|
178
139
|
expect(componentStem(`src/Theme.tsx`)).toBe(`theme`);
|
|
179
140
|
expect(componentStem(`src/TheHeader.vue`)).toBe(`header`);
|
package/src/chores/stack.ts
CHANGED
|
@@ -1,45 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* grows a copy: the probe would hard-code patterns the chore has to describe in words, or the chore would restate
|
|
7
|
-
* globs the probe already walked. Both copies would then be free to disagree about what a component is.
|
|
8
|
-
*
|
|
9
|
-
* NOTHING HERE IS A VERDICT. A framework is a set of dependency names, an idiom is a regex and the name of what
|
|
10
|
-
* replaced it. Which of those amount to work worth doing is the chore book's judgement, made in chores.ts against
|
|
11
|
-
* the same three rules everything else there obeys.
|
|
12
|
-
*
|
|
13
|
-
* THE PATTERNS ARE RIPGREP'S DIALECT, and they carry two constraints that are not obvious from reading them:
|
|
14
|
-
*
|
|
15
|
-
* No literal apostrophe, ever. The scan command wraps each pattern in shell single quotes, so a `'` inside one
|
|
16
|
-
* would end the quoting and hand the rest of the regex to the shell. Match quotes as `[\x22\x27]` instead,
|
|
17
|
-
* Rust's regex crate reads those escapes, and the shell never sees a quote character at all. stack.test.ts
|
|
18
|
-
* enforces this, because the failure is a probe that dies at three in the morning in someone else's workspace
|
|
19
|
-
* rather than anything a reader would notice here.
|
|
20
|
-
*
|
|
21
|
-
* No lookaround. Rust's regex crate has none, and reaching for ripgrep's PCRE2 mode to get it would make the
|
|
22
|
-
* sweep depend on how the box's ripgrep was compiled. A rule that seems to need it is usually asking a question
|
|
23
|
-
* about the FILE rather than about a line, see `absent` below, which is what that question actually is. */
|
|
1
|
+
// Table of UI frameworks and idiom-migration rules that probes.ts sweeps and chores.ts turns into findings; kept apart
|
|
2
|
+
// so neither duplicates the other's patterns.
|
|
3
|
+
// Patterns are Rust-regex via ripgrep: no literal apostrophe (match quotes as `[\x22\x27]`; the scan shell-quotes each
|
|
4
|
+
// pattern) and no lookaround (use `absent` for a file-level question instead).
|
|
5
|
+
// A pattern names a framework or idiom only; whether it is worth fixing is chores.ts's judgement.
|
|
24
6
|
|
|
25
7
|
export interface UiFramework {
|
|
26
8
|
readonly id: string;
|
|
27
9
|
readonly label: string;
|
|
28
|
-
//
|
|
10
|
+
// Dependency names that mean this repo is built with it; any one match is enough.
|
|
29
11
|
readonly packages: readonly string[];
|
|
30
12
|
}
|
|
31
13
|
|
|
32
|
-
|
|
33
|
-
* with a npm package": a framework earns a row here by having idiom rules underneath it, and a table entry with
|
|
34
|
-
* no rules would let a chore announce it recognised Svelte and then have nothing to report. */
|
|
14
|
+
// The three frameworks with idiom rules defined below; a table entry with no rules gives a chore nothing to report.
|
|
35
15
|
export const UI_FRAMEWORKS: readonly UiFramework[] = [
|
|
36
16
|
{ id: `react`, label: `React`, packages: [`react`] },
|
|
37
17
|
{ id: `vue`, label: `Vue`, packages: [`vue`] },
|
|
38
18
|
{ id: `angular`, label: `Angular`, packages: [`@angular/core`] },
|
|
39
19
|
];
|
|
40
20
|
|
|
41
|
-
//
|
|
42
|
-
// styling system that any of the three can be wearing, and it gates exactly one chore.
|
|
21
|
+
// Not a UI framework: a styling system any of the three above can use; gates exactly one chore.
|
|
43
22
|
export const TAILWIND_PACKAGES: readonly string[] = [`tailwindcss`];
|
|
44
23
|
|
|
45
24
|
export const frameworksOf = (deps: readonly string[]): UiFramework[] =>
|
|
@@ -47,11 +26,7 @@ export const frameworksOf = (deps: readonly string[]): UiFramework[] =>
|
|
|
47
26
|
|
|
48
27
|
export const usesTailwind = (deps: readonly string[]): boolean => TAILWIND_PACKAGES.some((name) => deps.includes(name));
|
|
49
28
|
|
|
50
|
-
|
|
51
|
-
* does honour .gitignore, and relying on that is how a repo whose build output is not ignored gets its own
|
|
52
|
-
* minified bundle reported back to it as a thousand hard-coded colours. Tests, specs and stories are excluded for
|
|
53
|
-
* a different reason: they are component-shaped files that are not components, and counting them would put a
|
|
54
|
-
* fixture at the top of every finding. */
|
|
29
|
+
// Dirs a UI scan must skip, spelled out rather than relying on .gitignore; also excludes test/spec/story files.
|
|
55
30
|
export const SCAN_IGNORES: readonly string[] = [
|
|
56
31
|
`!**/node_modules/**`,
|
|
57
32
|
`!**/dist/**`,
|
|
@@ -64,58 +39,30 @@ export const SCAN_IGNORES: readonly string[] = [
|
|
|
64
39
|
`!**/*.{test,spec,stories}.*`,
|
|
65
40
|
];
|
|
66
41
|
|
|
67
|
-
//
|
|
68
|
-
// probe's command is a fixed string, so it asks for all of them and a Vue-only repo simply has no `.tsx` files.
|
|
42
|
+
// Component file extensions across all three frameworks; the sweep is one fixed command for every repo.
|
|
69
43
|
export const COMPONENT_GLOBS: readonly string[] = [`*.vue`, `*.tsx`, `*.jsx`, `*.component.ts`];
|
|
70
44
|
|
|
71
|
-
// Where a Tailwind class can appear
|
|
72
|
-
// in a component, an Angular template and a plain .html page both style with the same utilities.
|
|
45
|
+
// Where a Tailwind class can appear; wider than COMPONENT_GLOBS since plain markup like .html carries classes too.
|
|
73
46
|
export const MARKUP_GLOBS: readonly string[] = [`*.vue`, `*.tsx`, `*.jsx`, `*.html`, `*.svelte`, `*.astro`];
|
|
74
47
|
|
|
75
|
-
|
|
76
|
-
* Tailwind working as designed, and a chore that counted them would be objecting to the feature rather than to
|
|
77
|
-
* anything wrong. What this matches is the two arbitrary values that route around a decision the theme already
|
|
78
|
-
* made: a colour that is not in the palette, and a pixel size that is not on the spacing or type scale.
|
|
79
|
-
*
|
|
80
|
-
* The leading `-` is required. It anchors the match to a utility prefix (`bg-`, `text-`, `w-`), so a bare
|
|
81
|
-
* `[...]` in ordinary prose or an array index cannot be mistaken for a class. */
|
|
48
|
+
// Matches only bypass values: a raw color or px size; leading `-` anchors to a utility prefix, not prose text.
|
|
82
49
|
export const BYPASS_PATTERN = `-\\[(#[0-9a-fA-F]{3,8}|(rgb|hsl)a?\\(|[0-9]+(\\.[0-9]+)?px)`;
|
|
83
50
|
|
|
84
51
|
export interface IdiomRule {
|
|
85
52
|
readonly id: string;
|
|
86
|
-
// Which framework's migration this belongs to
|
|
53
|
+
// Which framework's migration this belongs to.
|
|
87
54
|
readonly framework: string;
|
|
88
|
-
//
|
|
55
|
+
// Named the way a person reading it would say it, not a code term.
|
|
89
56
|
readonly label: string;
|
|
90
|
-
//
|
|
91
|
-
// "you still use NgModule" and nothing else will pick a destination, and it may not pick this one.
|
|
57
|
+
// The destination the agent should move to, not merely what it is leaving.
|
|
92
58
|
readonly replacement: string;
|
|
93
59
|
readonly pattern: string;
|
|
94
60
|
readonly globs: readonly string[];
|
|
95
|
-
|
|
96
|
-
* old one precisely because the new one does not appear in it anywhere. The sweep spells this
|
|
97
|
-
* `--files-without-match`.
|
|
98
|
-
*
|
|
99
|
-
* This exists because the alternative got it wrong in a way that is worth remembering. "A Vue file not using
|
|
100
|
-
* <script setup>" was first written as a lookahead over `<script`, which matches per LINE: a migrated
|
|
101
|
-
* component with a second plain `<script>` block for defineOptions, or one that merely mentions `<script` in
|
|
102
|
-
* a comment, both read as un-migrated. It reported five files in an application whose 167 SFCs are every one
|
|
103
|
-
* of them migrated. The question was never "is there a line like this", it is "does this file contain the
|
|
104
|
-
* new idiom at all", which is one flag rather than a cleverer regex, and it costs no PCRE2.
|
|
105
|
-
*
|
|
106
|
-
* The globs carry more weight on an absent rule than on a normal one, and narrowly is the only safe way to
|
|
107
|
-
* write them: the population is every file they match, so `*.ts` on an absent rule reports the entire
|
|
108
|
-
* repository. Keep them to the file type the migration is actually about. */
|
|
61
|
+
// Marks a rule as absence-based: the file is on the old idiom because `pattern` (the new one) never appears.
|
|
109
62
|
readonly absent?: true;
|
|
110
63
|
}
|
|
111
64
|
|
|
112
|
-
|
|
113
|
-
* documentation now steers people away from, and every one of them still works, which is exactly why they
|
|
114
|
-
* accumulate, and why no editor and no linter will bring them up unprompted.
|
|
115
|
-
*
|
|
116
|
-
* High confidence over coverage. Each pattern is one a reader can check by eye against a file, and the ones that
|
|
117
|
-
* would need real parsing to get right are left out rather than approximated: a rule that is wrong a third of the
|
|
118
|
-
* time trains people to stop reading the row it appears in. */
|
|
65
|
+
// Idioms still functional but steered away from by their frameworks; patterns favor precision over coverage.
|
|
119
66
|
export const IDIOM_RULES: readonly IdiomRule[] = [
|
|
120
67
|
{
|
|
121
68
|
id: `react-class-component`,
|
|
@@ -136,8 +83,7 @@ export const IDIOM_RULES: readonly IdiomRule[] = [
|
|
|
136
83
|
{
|
|
137
84
|
id: `react-unsafe-lifecycle`,
|
|
138
85
|
framework: `react`,
|
|
139
|
-
// Named
|
|
140
|
-
// recognise "UNSAFE_componentWillMount" as describing their own file.
|
|
86
|
+
// Named for what it is, not the UNSAFE_ prefix a reader may not recognize.
|
|
141
87
|
label: `the pre-16.3 lifecycle methods`,
|
|
142
88
|
replacement: `effects, or the UNSAFE_ prefixed names if the behaviour is genuinely wanted`,
|
|
143
89
|
pattern: `\\bcomponentWill(Mount|ReceiveProps|Update)\\b`,
|
|
@@ -156,9 +102,7 @@ export const IDIOM_RULES: readonly IdiomRule[] = [
|
|
|
156
102
|
framework: `vue`,
|
|
157
103
|
label: `the Options API`,
|
|
158
104
|
replacement: `<script setup> with the Composition API`,
|
|
159
|
-
//
|
|
160
|
-
// the old one. A file with no script block at all is swept up too, and that is the honest reading: it has
|
|
161
|
-
// not been migrated because there was nothing there to migrate.
|
|
105
|
+
// New idiom, inverted via `absent`: no `<script setup>` (or no script at all) reads as unmigrated.
|
|
162
106
|
pattern: `<script[^>]*\\bsetup\\b`,
|
|
163
107
|
globs: [`*.vue`],
|
|
164
108
|
absent: true,
|
|
@@ -168,17 +112,7 @@ export const IDIOM_RULES: readonly IdiomRule[] = [
|
|
|
168
112
|
framework: `vue`,
|
|
169
113
|
label: `the Vue 2 teardown hooks`,
|
|
170
114
|
replacement: `beforeUnmount and unmounted`,
|
|
171
|
-
|
|
172
|
-
* presence is the finding. `destroyed` is ordinary English, and asking only for a `(` or a `:` after it
|
|
173
|
-
* matched `{ warned: number; destroyed: number }` in a backend module that reaps idle machines: the chore
|
|
174
|
-
* told its reader to migrate a Node file to beforeUnmount, which is the kind of row that teaches people to
|
|
175
|
-
* stop reading the rest. So the ambiguous half has to be a FUNCTION in an options object, the only shape a
|
|
176
|
-
* hook is ever written in, and a field or a type named after the word is no longer evidence of anything.
|
|
177
|
-
*
|
|
178
|
-
* The globs are the second half of the same guard, and `*.ts` was the reason a backend file was eligible at
|
|
179
|
-
* all. A teardown hook is a component's, so this reads components. What that gives up is a Vue 2 mixin
|
|
180
|
-
* living in a plain `.js` file, and it is the right trade: `vue-global-api` still catches such a file when
|
|
181
|
-
* it constructs anything, and an idiom found nowhere costs less than one found in the wrong repository. */
|
|
115
|
+
// .vue only: hook belongs to a component. `destroyed` counts only as a function, not a field or type.
|
|
182
116
|
pattern: `\\bbeforeDestroy\\s*[(:]|\\bdestroyed\\s*(\\(\\s*\\)\\s*\\{|:\\s*(async\\s+)?(function|\\(\\s*\\)\\s*=>))`,
|
|
183
117
|
globs: [`*.vue`],
|
|
184
118
|
},
|
|
@@ -218,50 +152,25 @@ export const IDIOM_RULES: readonly IdiomRule[] = [
|
|
|
218
152
|
|
|
219
153
|
export const idiomRule = (id: string): IdiomRule | undefined => IDIOM_RULES.find((rule) => rule.id === id);
|
|
220
154
|
|
|
221
|
-
|
|
222
|
-
* prints; jscpd prints whatever it was handed, which for a `.` scan is the same path behind a `./`. Normalising
|
|
223
|
-
* here rather than at each comparison keeps the component-overlap chore from quietly matching nothing because one
|
|
224
|
-
* side had two extra characters. */
|
|
155
|
+
// Strips a leading `./`: ripgrep prints repo-relative paths, jscpd's `.` scan prints the same path with `./` prepended.
|
|
225
156
|
export const normalizePath = (path: string): string => path.replace(/^\.\//, ``);
|
|
226
157
|
|
|
227
|
-
// Below this a stem
|
|
228
|
-
// would both reduce to `h` and read as one family of heading components that are not duplicates of anything.
|
|
158
|
+
// Below this a stem lost its meaning in stripping; `H1`/`H2` would both reduce to `h`.
|
|
229
159
|
const MIN_STEM = 3;
|
|
230
160
|
|
|
231
161
|
const QUALIFIER_PREFIX = /^(base|the)/;
|
|
232
162
|
const QUALIFIER_SUFFIX = /(v[0-9]+|new|old|legacy|copy|component|[0-9]+)$/;
|
|
233
163
|
|
|
234
|
-
|
|
235
|
-
*
|
|
236
|
-
* A repository gets one of these per app (`app`, `main`, `root`) or one per route directory (Next's App Router
|
|
237
|
-
* mandates `page`, `layout`, `loading`, `error`, `not-found`, `template`, `default`) BY CONSTRUCTION, so two files
|
|
238
|
-
* sharing one is a fact about the framework and not about duplication. A monorepo with two front-ends has two
|
|
239
|
-
* `App.vue`; a thirty-route Next app has thirty `page.tsx`, which sorts to the top of the families list and becomes
|
|
240
|
-
* the loudest thing the chore says while being entirely false.
|
|
241
|
-
*
|
|
242
|
-
* Same argument as `index` below, and the same disposal. Matched against the whole base name rather than as a
|
|
243
|
-
* prefix, so `AppShell.vue` and `ErrorBoundary.tsx` are ordinary components and keep their own stems: the only
|
|
244
|
-
* files dropped are the ones that could not have been built twice in the first place. */
|
|
164
|
+
// Names the framework mandates per app or route; sharing one is never evidence of duplication.
|
|
245
165
|
const FRAMEWORK_NAMES = new Set([`index`, `app`, `main`, `root`, `page`, `layout`, `loading`, `error`, `template`, `default`, `notfound`]);
|
|
246
166
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
*
|
|
250
|
-
* This is a normaliser, not a similarity score, and that is the point: it answers a question the reader can check
|
|
251
|
-
* by eye. `BaseButton.vue` and `ButtonV2.tsx` both reduce to `button`, so a panel claiming they are the same
|
|
252
|
-
* component is making a claim anyone can agree or disagree with in a second. A fuzzy distance would be right more
|
|
253
|
-
* often and checkable never, and an unarguable finding is one nobody can improve.
|
|
254
|
-
*
|
|
255
|
-
* `index` is dropped rather than normalised, along with the rest of the framework's own vocabulary
|
|
256
|
-
* (FRAMEWORK_NAMES). Every barrel file in the repository is called it, and a family of forty index files is a
|
|
257
|
-
* finding about the naming convention rather than about any duplication. */
|
|
167
|
+
// Normalizes a file name to a comparison key, not a similarity score, so a match is one a reader can check by eye;
|
|
168
|
+
// framework names and `index` are dropped since barrels and route files share them by convention.
|
|
258
169
|
export const componentStem = (path: string): string | undefined => {
|
|
259
170
|
const file = normalizePath(path).split(`/`).pop() ?? ``;
|
|
260
|
-
// `.component.ts`
|
|
261
|
-
// without a table, since a component's name is never the part after a dot.
|
|
171
|
+
// First-dot split handles both `.component.ts` and `.vue` suffixes; a component's name never follows a dot.
|
|
262
172
|
const base = (file.split(`.`)[0] ?? ``).toLowerCase().replace(/[^a-z0-9]/g, ``);
|
|
263
|
-
//
|
|
264
|
-
// qualifier rule has had a chance to turn it into something else.
|
|
173
|
+
// Framework names are dropped before qualifier stripping runs, on their own terms.
|
|
265
174
|
if (base === `` || FRAMEWORK_NAMES.has(base)) {
|
|
266
175
|
return undefined;
|
|
267
176
|
}
|