@indigoai-us/hq-cli 5.314.0 → 5.316.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/CHANGELOG.md +4320 -1
- package/README.md +113 -0
- package/assets/bot-workers/setup/context/USER-GUIDE.md +404 -0
- package/assets/bot-workers/setup/context/quick-reference.md +199 -0
- package/assets/bot-workers/setup/skills/agents-and-team.md +167 -0
- package/assets/bot-workers/setup/skills/explain-hq.md +35 -0
- package/assets/bot-workers/setup/skills/first-company.md +74 -0
- package/assets/bot-workers/setup/skills/joining-a-team.md +125 -0
- package/assets/bot-workers/setup/skills/pricing.md +92 -0
- package/assets/bot-workers/setup/skills/standing-help.md +81 -0
- package/assets/bot-workers/setup/skills/your-business.md +281 -0
- package/assets/bot-workers/setup/worker.yaml +791 -0
- package/assets/lanes-hooks/hq-lanes-drain.json +15 -0
- package/assets/lanes-hooks/hq-lanes-drain.mjs +275 -0
- package/assets/lanes-hooks/hq-lanes-drain.sh +21 -0
- package/assets/lanes-reconcile/hq-lanes-reconcile.service +11 -0
- package/assets/lanes-reconcile/hq-lanes-reconcile.timer +12 -0
- package/assets/scaffold/.claude/hooks/validate-policy-frontmatter.sh +485 -0
- package/assets/scaffold/core/scripts/audit-log.sh +384 -0
- package/assets/scaffold/core/scripts/checkpoint-stop-gate.sh +281 -43
- package/assets/scaffold/core/scripts/clean-worktree-reconcile-handoff.sh +171 -0
- package/assets/scaffold/core/scripts/detect-stale-review-base.sh +199 -0
- package/assets/scaffold/core/scripts/eval-trigger.sh +193 -0
- package/assets/scaffold/core/scripts/git-pack-extension-check.sh +164 -0
- package/assets/scaffold/core/scripts/handoff-finalize.sh +688 -0
- package/assets/scaffold/core/scripts/handoff-open-steps.sh +81 -0
- package/assets/scaffold/core/scripts/handoff-post.sh +252 -0
- package/assets/scaffold/core/scripts/hook-lib.sh +345 -50
- package/assets/scaffold/core/scripts/hq-delegate-bundle.sh +307 -0
- package/assets/scaffold/core/scripts/hq-delegate-grant.sh +252 -0
- package/assets/scaffold/core/scripts/hq-delegate-pickup.sh +99 -0
- package/assets/scaffold/core/scripts/hq-delegate-publish.sh +91 -0
- package/assets/scaffold/core/scripts/hq-delegate-repo.sh +158 -0
- package/assets/scaffold/core/scripts/hq-delegate-resolve.sh +145 -0
- package/assets/scaffold/core/scripts/hq-delegate-secrets.sh +129 -0
- package/assets/scaffold/core/scripts/hq-delegate-send.sh +259 -0
- package/assets/scaffold/core/scripts/hq-delegate-transfer.sh +175 -0
- package/assets/scaffold/core/scripts/hq-delegate-verify.sh +238 -0
- package/assets/scaffold/core/scripts/hq-dm-bind.sh +585 -0
- package/assets/scaffold/core/scripts/hq-job-notify.sh +389 -0
- package/assets/scaffold/core/scripts/hq-job-probe.sh +835 -0
- package/assets/scaffold/core/scripts/hq-job-remediate.sh +359 -0
- package/assets/scaffold/core/scripts/hq-job-run.sh +1025 -0
- package/assets/scaffold/core/scripts/hq-pin.sh +118 -0
- package/assets/scaffold/core/scripts/hq-session.sh +184 -23
- package/assets/scaffold/core/scripts/jobs-schedule-parse.sh +310 -0
- package/assets/scaffold/core/scripts/jobs-validate.sh +451 -0
- package/assets/scaffold/core/scripts/knowledge-prefs.sh +55 -0
- package/assets/scaffold/core/scripts/lib/portable.sh +211 -0
- package/assets/scaffold/core/scripts/lib/secret-patterns.sh +58 -0
- package/assets/scaffold/core/scripts/lib/session-id.sh +3 -2
- package/assets/scaffold/core/scripts/lib/session-scope-capability.sh +1 -1
- package/assets/scaffold/core/scripts/lib/work-mesh-enqueue.sh +2 -1
- package/assets/scaffold/core/scripts/lib/work-mesh-live-hook.sh +378 -0
- package/assets/scaffold/core/scripts/lib/work-mesh-live-rebind.sh +141 -0
- package/assets/scaffold/core/scripts/migrate-policy-triggers.sh +378 -0
- package/assets/scaffold/core/scripts/ontology-audience-grant.sh +81 -0
- package/assets/scaffold/core/scripts/ontology-brief.mjs +93 -0
- package/assets/scaffold/core/scripts/ontology-candidate.sh +100 -0
- package/assets/scaffold/core/scripts/ontology-garden.mjs +238 -0
- package/assets/scaffold/core/scripts/ontology-source-worklist.sh +79 -0
- package/assets/scaffold/core/scripts/outpost-jobs-reconcile.sh +834 -0
- package/assets/scaffold/core/scripts/policy-age-report.sh +156 -0
- package/assets/scaffold/core/scripts/policy-retire.sh +199 -0
- package/assets/scaffold/core/scripts/qmd-reindex-after-sync.sh +10 -87
- package/assets/scaffold/core/scripts/qmd-reindex-bg.sh +40 -0
- package/assets/scaffold/core/scripts/read-policy-frontmatter.sh +32 -0
- package/assets/scaffold/core/scripts/rebuild-company-knowledge-index.sh +36 -3
- package/assets/scaffold/core/scripts/rebuild-projects-index.sh +99 -12
- package/assets/scaffold/core/scripts/refresh-vault-access.sh +188 -0
- package/assets/scaffold/core/scripts/register-project.sh +262 -0
- package/assets/scaffold/core/scripts/repo-run-registry.sh +408 -0
- package/assets/scaffold/core/scripts/resolve-company.sh +199 -0
- package/assets/scaffold/core/scripts/resume-thread-lock.sh +285 -0
- package/assets/scaffold/core/scripts/share-suggestion-state.sh +541 -0
- package/assets/scaffold/core/scripts/source-yaml-validate.sh +36 -0
- package/assets/scaffold/core/scripts/token-usage-report.sh +81 -20
- package/assets/scaffold/core/scripts/verify-story-deliverables.sh +148 -0
- package/assets/scaffold/core/scripts/work-mesh-live-bind-trusted.sh +152 -0
- package/assets/scaffold/core/scripts/work-mesh-live-rebind.sh +59 -0
- package/assets/scaffold/core/scripts/worktree-gc.sh +362 -0
- package/contracts/preflight/v1/fixtures.json +87 -0
- package/contracts/preflight/v1/schema.json +58 -0
- package/dist/bin/hq-auth-refresh.d.ts +2 -0
- package/dist/bin/hq-auth-refresh.js +12 -6
- package/dist/command-catalog.generated.d.ts +10798 -0
- package/dist/command-catalog.generated.js +13915 -0
- package/dist/command-registration-plan.d.ts +474 -0
- package/dist/command-registration-plan.js +136 -0
- package/dist/commands/__fixtures__/access-vault.d.ts +2 -0
- package/dist/commands/__fixtures__/access-vault.js +1 -1
- package/dist/commands/_patterns.d.ts +16 -0
- package/dist/commands/_patterns.js +20 -3
- package/dist/commands/access.d.ts +2 -1
- package/dist/commands/access.js +58 -49
- package/dist/commands/agent-enroll.d.ts +146 -0
- package/dist/commands/agent-enroll.js +401 -0
- package/dist/commands/agent-inbox.d.ts +9 -0
- package/dist/commands/agent-inbox.js +102 -0
- package/dist/commands/agent-kit.d.ts +87 -0
- package/dist/commands/agent-kit.js +480 -0
- package/dist/commands/agent-mcp.d.ts +24 -0
- package/dist/commands/agent-mcp.js +127 -0
- package/dist/commands/agent-probe.d.ts +77 -0
- package/dist/commands/agent-probe.js +335 -0
- package/dist/commands/agent.d.ts +13 -0
- package/dist/commands/agent.js +40 -0
- package/dist/commands/agents.d.ts +106 -4
- package/dist/commands/agents.js +924 -45
- package/dist/commands/auth.d.ts +1 -0
- package/dist/commands/auth.js +189 -19
- package/dist/commands/billing-sponsor.d.ts +83 -0
- package/dist/commands/billing-sponsor.js +344 -0
- package/dist/commands/billing.d.ts +3 -0
- package/dist/commands/billing.js +6 -1
- package/dist/commands/bot-companies.d.ts +40 -0
- package/dist/commands/bot-companies.js +64 -0
- package/dist/commands/bot-continuity.d.ts +28 -0
- package/dist/commands/bot-continuity.js +68 -0
- package/dist/commands/bot-jobs.d.ts +131 -0
- package/dist/commands/bot-jobs.js +474 -0
- package/dist/commands/bot.d.ts +278 -0
- package/dist/commands/bot.js +1982 -0
- package/dist/commands/channels.js +56 -1
- package/dist/commands/cloud-demote.js +3 -2
- package/dist/commands/cloud-provision.d.ts +14 -0
- package/dist/commands/cloud-provision.js +232 -58
- package/dist/commands/cloud-retire.d.ts +51 -0
- package/dist/commands/cloud-retire.js +154 -0
- package/dist/commands/cloud.d.ts +49 -15
- package/dist/commands/cloud.js +357 -122
- package/dist/commands/company-rename-flag.d.ts +4 -0
- package/dist/commands/company-rename-flag.js +7 -0
- package/dist/commands/company-rename.d.ts +4 -0
- package/dist/commands/company-rename.js +90 -0
- package/dist/commands/company-transfer.d.ts +4 -28
- package/dist/commands/company-transfer.js +5 -49
- package/dist/commands/company.js +68 -3
- package/dist/commands/core-audit-log-native.d.ts +9 -0
- package/dist/commands/core-audit-log-native.js +257 -0
- package/dist/commands/core-checkpoint-gate-setting.d.ts +59 -0
- package/dist/commands/core-checkpoint-gate-setting.js +163 -0
- package/dist/commands/core-checkpoint-stop-gate-native.d.ts +34 -0
- package/dist/commands/core-checkpoint-stop-gate-native.js +725 -0
- package/dist/commands/core-checkpoint.d.ts +19 -9
- package/dist/commands/core-checkpoint.js +301 -37
- package/dist/commands/core-command-catalog.d.ts +34 -0
- package/dist/commands/core-command-catalog.js +62 -0
- package/dist/commands/core-company-index-scope-flag.d.ts +3 -0
- package/dist/commands/core-company-index-scope-flag.js +6 -0
- package/dist/commands/core-delegate-w1b.d.ts +10 -0
- package/dist/commands/core-delegate-w1b.js +1219 -0
- package/dist/commands/core-delegate.d.ts +46 -0
- package/dist/commands/core-delegate.js +1040 -0
- package/dist/commands/core-detect-stale-review-base-native.d.ts +23 -0
- package/dist/commands/core-detect-stale-review-base-native.js +178 -0
- package/dist/commands/core-dm-bind-native.d.ts +32 -0
- package/dist/commands/core-dm-bind-native.js +668 -0
- package/dist/commands/core-eval-trigger-native.d.ts +4 -0
- package/dist/commands/core-eval-trigger-native.js +12 -0
- package/dist/commands/core-git-pack-extension-check-native.d.ts +22 -0
- package/dist/commands/core-git-pack-extension-check-native.js +190 -0
- package/dist/commands/core-handoff-fast.d.ts +18 -0
- package/dist/commands/core-handoff-fast.js +104 -0
- package/dist/commands/core-handoff-open-steps.d.ts +21 -0
- package/dist/commands/core-handoff-open-steps.js +264 -0
- package/dist/commands/core-handoff.d.ts +24 -0
- package/dist/commands/core-handoff.js +1144 -0
- package/dist/commands/core-hook-state-helpers-native.d.ts +11 -0
- package/dist/commands/core-hook-state-helpers-native.js +74 -0
- package/dist/commands/core-hq-session-native.d.ts +39 -0
- package/dist/commands/core-hq-session-native.js +579 -0
- package/dist/commands/core-job-native-utils.d.ts +6 -0
- package/dist/commands/core-job-native-utils.js +80 -0
- package/dist/commands/core-job-native.d.ts +5 -0
- package/dist/commands/core-job-native.js +16 -0
- package/dist/commands/core-job-notify-native.d.ts +36 -0
- package/dist/commands/core-job-notify-native.js +359 -0
- package/dist/commands/core-job-probe-native.d.ts +45 -0
- package/dist/commands/core-job-probe-native.js +564 -0
- package/dist/commands/core-job-remediate-native.d.ts +26 -0
- package/dist/commands/core-job-remediate-native.js +374 -0
- package/dist/commands/core-job-remote-launcher.d.ts +7 -0
- package/dist/commands/core-job-remote-launcher.js +51 -0
- package/dist/commands/core-job-run-native.d.ts +47 -0
- package/dist/commands/core-job-run-native.js +1215 -0
- package/dist/commands/core-jobs-native.d.ts +25 -0
- package/dist/commands/core-jobs-native.js +1339 -0
- package/dist/commands/core-knowledge-prefs.d.ts +11 -0
- package/dist/commands/core-knowledge-prefs.js +137 -0
- package/dist/commands/core-migrate-policy-triggers-native.d.ts +21 -0
- package/dist/commands/core-migrate-policy-triggers-native.js +374 -0
- package/dist/commands/core-native-handoff-flag.d.ts +4 -0
- package/dist/commands/core-native-handoff-flag.js +7 -0
- package/dist/commands/core-native-hook-helper-commands.d.ts +4 -0
- package/dist/commands/core-native-hook-helper-commands.js +56 -0
- package/dist/commands/core-native-hook-helpers-flag.d.ts +4 -0
- package/dist/commands/core-native-hook-helpers-flag.js +7 -0
- package/dist/commands/core-native-jobs-flag.d.ts +4 -0
- package/dist/commands/core-native-jobs-flag.js +7 -0
- package/dist/commands/core-native-policy-flag.d.ts +9 -0
- package/dist/commands/core-native-policy-flag.js +12 -0
- package/dist/commands/core-native-session-flag.d.ts +4 -0
- package/dist/commands/core-native-session-flag.js +7 -0
- package/dist/commands/core-native-utilities-flag.d.ts +4 -0
- package/dist/commands/core-native-utilities-flag.js +7 -0
- package/dist/commands/core-native-utilities.d.ts +29 -0
- package/dist/commands/core-native-utilities.js +54 -0
- package/dist/commands/core-native-worker-skills-flag.d.ts +4 -0
- package/dist/commands/core-native-worker-skills-flag.js +7 -0
- package/dist/commands/core-ontology-native.d.ts +17 -0
- package/dist/commands/core-ontology-native.js +916 -0
- package/dist/commands/core-ontology.d.ts +66 -0
- package/dist/commands/core-ontology.js +430 -0
- package/dist/commands/core-pin-native.d.ts +14 -0
- package/dist/commands/core-pin-native.js +236 -0
- package/dist/commands/core-policy-frontmatter.d.ts +8 -0
- package/dist/commands/core-policy-frontmatter.js +52 -0
- package/dist/commands/core-policy.d.ts +14 -0
- package/dist/commands/core-policy.js +1018 -0
- package/dist/commands/core-refresh-vault-access-native.d.ts +20 -0
- package/dist/commands/core-refresh-vault-access-native.js +229 -0
- package/dist/commands/core-register-project-native.d.ts +30 -0
- package/dist/commands/core-register-project-native.js +347 -0
- package/dist/commands/core-repo-run-registry-native.d.ts +19 -0
- package/dist/commands/core-repo-run-registry-native.js +357 -0
- package/dist/commands/core-resolve-company-command.d.ts +4 -0
- package/dist/commands/core-resolve-company-command.js +42 -0
- package/dist/commands/core-resolve-company-native.d.ts +28 -0
- package/dist/commands/core-resolve-company-native.js +408 -0
- package/dist/commands/core-share-suggestion-state-native.d.ts +18 -0
- package/dist/commands/core-share-suggestion-state-native.js +445 -0
- package/dist/commands/core-work-mesh-bind-trusted-native.d.ts +32 -0
- package/dist/commands/core-work-mesh-bind-trusted-native.js +190 -0
- package/dist/commands/core-work-mesh-live-rebind-native.d.ts +18 -0
- package/dist/commands/core-work-mesh-live-rebind-native.js +262 -0
- package/dist/commands/core-worker-lint-native.d.ts +4 -0
- package/dist/commands/core-worker-lint-native.js +160 -0
- package/dist/commands/core-worker-share-native.d.ts +4 -0
- package/dist/commands/core-worker-share-native.js +260 -0
- package/dist/commands/core-worker-skills-command.d.ts +8 -0
- package/dist/commands/core-worker-skills-command.js +33 -0
- package/dist/commands/core-worker-skills-runtime.d.ts +33 -0
- package/dist/commands/core-worker-skills-runtime.js +86 -0
- package/dist/commands/core.d.ts +4 -0
- package/dist/commands/core.js +282 -80
- package/dist/commands/crm.js +52 -3
- package/dist/commands/daemon.d.ts +63 -0
- package/dist/commands/daemon.js +877 -0
- package/dist/commands/db-provision.js +4 -4
- package/dist/commands/db-sql.js +7 -21
- package/dist/commands/deploy-comments.d.ts +3 -0
- package/dist/commands/deploy-comments.js +162 -0
- package/dist/commands/dm.d.ts +119 -12
- package/dist/commands/dm.js +388 -38
- package/dist/commands/doctor.d.ts +12 -0
- package/dist/commands/doctor.js +158 -12
- package/dist/commands/feedback.d.ts +6 -0
- package/dist/commands/feedback.js +86 -37
- package/dist/commands/files-browse.d.ts +32 -12
- package/dist/commands/files-browse.js +176 -60
- package/dist/commands/files.d.ts +17 -0
- package/dist/commands/files.js +300 -47
- package/dist/commands/group-grants.js +3 -2
- package/dist/commands/groups.js +6 -5
- package/dist/commands/index-cmd.d.ts +19 -1
- package/dist/commands/index-cmd.js +74 -7
- package/dist/commands/integrations-api.d.ts +15 -10
- package/dist/commands/integrations-api.js +27 -22
- package/dist/commands/integrations-connect.d.ts +51 -13
- package/dist/commands/integrations-connect.js +86 -71
- package/dist/commands/integrations-core.d.ts +6 -6
- package/dist/commands/integrations-core.js +25 -11
- package/dist/commands/integrations-import.d.ts +1 -1
- package/dist/commands/integrations-import.js +43 -24
- package/dist/commands/integrations-manage.js +20 -13
- package/dist/commands/integrations.d.ts +8 -0
- package/dist/commands/integrations.js +94 -7
- package/dist/commands/lanes-accounts.d.ts +28 -0
- package/dist/commands/lanes-accounts.js +595 -0
- package/dist/commands/lanes-autopilot.d.ts +11 -0
- package/dist/commands/lanes-autopilot.js +336 -0
- package/dist/commands/lanes-checks.d.ts +51 -0
- package/dist/commands/lanes-checks.js +941 -0
- package/dist/commands/lanes-hold.d.ts +43 -0
- package/dist/commands/lanes-hold.js +655 -0
- package/dist/commands/lanes-keep-alive-audit.d.ts +10 -0
- package/dist/commands/lanes-keep-alive-audit.js +19 -0
- package/dist/commands/lanes-kpis.d.ts +11 -0
- package/dist/commands/lanes-kpis.js +34 -0
- package/dist/commands/lanes-message.d.ts +9 -0
- package/dist/commands/lanes-message.js +946 -0
- package/dist/commands/lanes-move.d.ts +12 -0
- package/dist/commands/lanes-move.js +397 -0
- package/dist/commands/lanes-questions.d.ts +36 -0
- package/dist/commands/lanes-questions.js +1005 -0
- package/dist/commands/lanes-report.d.ts +11 -0
- package/dist/commands/lanes-report.js +333 -0
- package/dist/commands/lanes-resume.d.ts +6 -0
- package/dist/commands/lanes-resume.js +564 -0
- package/dist/commands/lanes-review.d.ts +10 -0
- package/dist/commands/lanes-review.js +56 -0
- package/dist/commands/lanes-shared.d.ts +449 -0
- package/dist/commands/lanes-shared.js +170 -0
- package/dist/commands/lanes-stories.d.ts +15 -0
- package/dist/commands/lanes-stories.js +347 -0
- package/dist/commands/lanes-watch.d.ts +7 -0
- package/dist/commands/lanes-watch.js +216 -0
- package/dist/commands/lanes.d.ts +149 -0
- package/dist/commands/lanes.js +9013 -0
- package/dist/commands/login.js +49 -6
- package/dist/commands/mcp-registration.d.ts +32 -25
- package/dist/commands/mcp-registration.js +256 -23
- package/dist/commands/mcp-status.js +1 -0
- package/dist/commands/meetings.js +55 -34
- package/dist/commands/members.js +5 -1
- package/dist/commands/mesh.d.ts +11 -0
- package/dist/commands/mesh.js +1086 -76
- package/dist/commands/monitor.d.ts +58 -0
- package/dist/commands/monitor.js +980 -0
- package/dist/commands/onboard-bot-membership.d.ts +32 -0
- package/dist/commands/onboard-bot-membership.js +40 -0
- package/dist/commands/onboard-create-identity.d.ts +26 -0
- package/dist/commands/onboard-create-identity.js +23 -0
- package/dist/commands/onboard-identity-guard.d.ts +1 -1
- package/dist/commands/onboard.js +24 -5
- package/dist/commands/outpost-pruner.d.ts +3 -0
- package/dist/commands/outpost-pruner.js +125 -0
- package/dist/commands/pack-install.js +3 -1
- package/dist/commands/packs.js +11 -1
- package/dist/commands/people.d.ts +4 -0
- package/dist/commands/people.js +37 -3
- package/dist/commands/personal-connector-settings-flag.d.ts +4 -0
- package/dist/commands/personal-connector-settings-flag.js +7 -0
- package/dist/commands/personal-targeted-push-flag.d.ts +4 -0
- package/dist/commands/personal-targeted-push-flag.js +7 -0
- package/dist/commands/personal-targeted-push-paths.d.ts +3 -0
- package/dist/commands/personal-targeted-push-paths.js +67 -0
- package/dist/commands/publish.d.ts +8 -1
- package/dist/commands/publish.js +17 -4
- package/dist/commands/reindex.js +56 -6
- package/dist/commands/report.d.ts +19 -0
- package/dist/commands/report.js +537 -0
- package/dist/commands/rescue.d.ts +4 -0
- package/dist/commands/rescue.js +27 -17
- package/dist/commands/run-feature-telemetry.d.ts +3 -0
- package/dist/commands/run-feature-telemetry.js +6 -0
- package/dist/commands/run.js +18 -4
- package/dist/commands/safe-extract.d.ts +11 -2
- package/dist/commands/safe-extract.js +36 -8
- package/dist/commands/secrets.d.ts +20 -2
- package/dist/commands/secrets.js +175 -71
- package/dist/commands/skill.d.ts +35 -4
- package/dist/commands/skill.js +357 -18
- package/dist/commands/staff/reset-test-account.d.ts +110 -0
- package/dist/commands/staff/reset-test-account.js +268 -0
- package/dist/commands/staff/test-account.d.ts +51 -0
- package/dist/commands/staff/test-account.js +196 -0
- package/dist/commands/sync-mode.d.ts +11 -0
- package/dist/commands/sync-mode.js +30 -0
- package/dist/commands/sync-narrow.js +36 -5
- package/dist/commands/team-sync.js +71 -10
- package/dist/commands/update.js +6 -0
- package/dist/commands/vault-retention-flag.d.ts +3 -0
- package/dist/commands/vault-retention-flag.js +9 -0
- package/dist/commands/vault-retention.d.ts +11 -0
- package/dist/commands/vault-retention.js +69 -0
- package/dist/commands/version.d.ts +10 -0
- package/dist/commands/version.js +11 -0
- package/dist/commands/whoami.d.ts +22 -0
- package/dist/commands/whoami.js +137 -4
- package/dist/commands/workers.d.ts +2 -14
- package/dist/commands/workers.js +7 -10
- package/dist/fast-core.d.ts +7 -7
- package/dist/fast-core.js +91 -24
- package/dist/fast-scaffold.d.ts +86 -0
- package/dist/fast-scaffold.js +381 -0
- package/dist/index.d.ts +3 -4
- package/dist/index.js +59 -9
- package/dist/lanes-drain-hook.d.ts +14 -0
- package/dist/lanes-drain-hook.js +203 -0
- package/dist/lazy-commands.d.ts +20 -44
- package/dist/lazy-commands.js +60 -58
- package/dist/lib/agent-kit/adopt-identity.d.ts +27 -0
- package/dist/lib/agent-kit/adopt-identity.js +60 -0
- package/dist/lib/agent-kit/attachment-download.d.ts +24 -0
- package/dist/lib/agent-kit/attachment-download.js +47 -0
- package/dist/lib/agent-kit/creds.d.ts +106 -0
- package/dist/lib/agent-kit/creds.js +163 -0
- package/dist/lib/agent-kit/fallback.d.ts +78 -0
- package/dist/lib/agent-kit/fallback.js +210 -0
- package/dist/lib/agent-kit/inbox-state.d.ts +83 -0
- package/dist/lib/agent-kit/inbox-state.js +159 -0
- package/dist/lib/agent-kit/kit-config.d.ts +56 -0
- package/dist/lib/agent-kit/kit-config.js +65 -0
- package/dist/lib/agent-kit/log.d.ts +16 -0
- package/dist/lib/agent-kit/log.js +46 -0
- package/dist/lib/agent-kit/mcp/attachments.d.ts +126 -0
- package/dist/lib/agent-kit/mcp/attachments.js +222 -0
- package/dist/lib/agent-kit/mcp/jsonrpc.d.ts +75 -0
- package/dist/lib/agent-kit/mcp/jsonrpc.js +164 -0
- package/dist/lib/agent-kit/mcp/tools.d.ts +64 -0
- package/dist/lib/agent-kit/mcp/tools.js +397 -0
- package/dist/lib/agent-kit/paths.d.ts +65 -0
- package/dist/lib/agent-kit/paths.js +118 -0
- package/dist/lib/agent-kit/private-file.d.ts +29 -0
- package/dist/lib/agent-kit/private-file.js +91 -0
- package/dist/lib/agent-kit/run/heartbeat.d.ts +72 -0
- package/dist/lib/agent-kit/run/heartbeat.js +128 -0
- package/dist/lib/agent-kit/run/inbox.d.ts +76 -0
- package/dist/lib/agent-kit/run/inbox.js +205 -0
- package/dist/lib/agent-kit/run/supervisor.d.ts +35 -0
- package/dist/lib/agent-kit/run/supervisor.js +85 -0
- package/dist/lib/agent-kit/run/sync.d.ts +33 -0
- package/dist/lib/agent-kit/run/sync.js +58 -0
- package/dist/lib/agent-kit/services.d.ts +31 -0
- package/dist/lib/agent-kit/services.js +55 -0
- package/dist/lib/agent-kit/skills.d.ts +18 -0
- package/dist/lib/agent-kit/skills.js +151 -0
- package/dist/lib/agent-kit/wake.d.ts +83 -0
- package/dist/lib/agent-kit/wake.js +243 -0
- package/dist/lib/agents/model-catalog.d.ts +62 -0
- package/dist/lib/agents/model-catalog.js +275 -0
- package/dist/lib/auth-login-provider-state.d.ts +8 -0
- package/dist/lib/auth-login-provider-state.js +63 -0
- package/dist/lib/aws-sdk-node-warning-output.d.ts +12 -0
- package/dist/lib/aws-sdk-node-warning-output.js +22 -0
- package/dist/lib/billing/free-month.d.ts +18 -0
- package/dist/lib/billing/free-month.js +31 -0
- package/dist/lib/billing/plan-limit-refusals.d.ts +69 -0
- package/dist/lib/billing/plan-limit-refusals.js +187 -0
- package/dist/lib/billing/plan-limit-upgrade-url.d.ts +11 -0
- package/dist/lib/billing/plan-limit-upgrade-url.js +66 -0
- package/dist/lib/billing/plan-lock.d.ts +143 -0
- package/dist/lib/billing/plan-lock.js +439 -0
- package/dist/lib/bot/api.d.ts +349 -0
- package/dist/lib/bot/api.js +316 -0
- package/dist/lib/bot/attachments.d.ts +45 -0
- package/dist/lib/bot/attachments.js +89 -0
- package/dist/lib/bot/cli-update.d.ts +138 -0
- package/dist/lib/bot/cli-update.js +278 -0
- package/dist/lib/bot/company-bind.d.ts +27 -0
- package/dist/lib/bot/company-bind.js +62 -0
- package/dist/lib/bot/config.d.ts +153 -0
- package/dist/lib/bot/config.js +233 -0
- package/dist/lib/bot/continuity-download.d.ts +28 -0
- package/dist/lib/bot/continuity-download.js +75 -0
- package/dist/lib/bot/continuity-install.d.ts +14 -0
- package/dist/lib/bot/continuity-install.js +101 -0
- package/dist/lib/bot/continuity.d.ts +67 -0
- package/dist/lib/bot/continuity.js +301 -0
- package/dist/lib/bot/creds.d.ts +24 -0
- package/dist/lib/bot/creds.js +51 -0
- package/dist/lib/bot/daemon.d.ts +173 -0
- package/dist/lib/bot/daemon.js +552 -0
- package/dist/lib/bot/inbox-poll-backoff-flag.d.ts +24 -0
- package/dist/lib/bot/inbox-poll-backoff-flag.js +135 -0
- package/dist/lib/bot/inbox-state.d.ts +18 -0
- package/dist/lib/bot/inbox-state.js +51 -0
- package/dist/lib/bot/index.d.ts +23 -0
- package/dist/lib/bot/index.js +23 -0
- package/dist/lib/bot/inflight.d.ts +119 -0
- package/dist/lib/bot/inflight.js +83 -0
- package/dist/lib/bot/job-completions.d.ts +89 -0
- package/dist/lib/bot/job-completions.js +132 -0
- package/dist/lib/bot/job-quiet-flag.d.ts +4 -0
- package/dist/lib/bot/job-quiet-flag.js +14 -0
- package/dist/lib/bot/job-run.d.ts +114 -0
- package/dist/lib/bot/job-run.js +266 -0
- package/dist/lib/bot/local-config.d.ts +61 -0
- package/dist/lib/bot/local-config.js +145 -0
- package/dist/lib/bot/local-jobs.d.ts +89 -0
- package/dist/lib/bot/local-jobs.js +459 -0
- package/dist/lib/bot/local-name.d.ts +54 -0
- package/dist/lib/bot/local-name.js +114 -0
- package/dist/lib/bot/log.d.ts +13 -0
- package/dist/lib/bot/log.js +59 -0
- package/dist/lib/bot/owner-context.d.ts +79 -0
- package/dist/lib/bot/owner-context.js +175 -0
- package/dist/lib/bot/paths.d.ts +76 -0
- package/dist/lib/bot/paths.js +131 -0
- package/dist/lib/bot/progress.d.ts +132 -0
- package/dist/lib/bot/progress.js +289 -0
- package/dist/lib/bot/promote.d.ts +16 -0
- package/dist/lib/bot/promote.js +106 -0
- package/dist/lib/bot/promotion-hold.d.ts +24 -0
- package/dist/lib/bot/promotion-hold.js +103 -0
- package/dist/lib/bot/promotion-receipt.d.ts +9 -0
- package/dist/lib/bot/promotion-receipt.js +56 -0
- package/dist/lib/bot/promotion-upload.d.ts +16 -0
- package/dist/lib/bot/promotion-upload.js +80 -0
- package/dist/lib/bot/prompt.d.ts +136 -0
- package/dist/lib/bot/prompt.js +433 -0
- package/dist/lib/bot/room-policy.d.ts +63 -0
- package/dist/lib/bot/room-policy.js +91 -0
- package/dist/lib/bot/run.d.ts +219 -0
- package/dist/lib/bot/run.js +1881 -0
- package/dist/lib/bot/runnable.d.ts +51 -0
- package/dist/lib/bot/runnable.js +65 -0
- package/dist/lib/bot/runtime/claude.d.ts +50 -0
- package/dist/lib/bot/runtime/claude.js +170 -0
- package/dist/lib/bot/runtime/codex.d.ts +28 -0
- package/dist/lib/bot/runtime/codex.js +153 -0
- package/dist/lib/bot/runtime/grok-acp.d.ts +40 -0
- package/dist/lib/bot/runtime/grok-acp.js +265 -0
- package/dist/lib/bot/runtime/grok.d.ts +41 -0
- package/dist/lib/bot/runtime/grok.js +169 -0
- package/dist/lib/bot/runtime/index.d.ts +36 -0
- package/dist/lib/bot/runtime/index.js +417 -0
- package/dist/lib/bot/runtime/messages-stream.d.ts +56 -0
- package/dist/lib/bot/runtime/messages-stream.js +194 -0
- package/dist/lib/bot/runtime/sanitize.d.ts +18 -0
- package/dist/lib/bot/runtime/sanitize.js +28 -0
- package/dist/lib/bot/runtime/types.d.ts +159 -0
- package/dist/lib/bot/runtime/types.js +51 -0
- package/dist/lib/bot/runtime/windows.d.ts +10 -0
- package/dist/lib/bot/runtime/windows.js +53 -0
- package/dist/lib/bot/runtime-sign-in.d.ts +24 -0
- package/dist/lib/bot/runtime-sign-in.js +31 -0
- package/dist/lib/bot/scaffold.d.ts +38 -0
- package/dist/lib/bot/scaffold.js +94 -0
- package/dist/lib/bot/self-heal.d.ts +52 -0
- package/dist/lib/bot/self-heal.js +79 -0
- package/dist/lib/bot/self-process.d.ts +19 -0
- package/dist/lib/bot/self-process.js +35 -0
- package/dist/lib/bot/session.d.ts +19 -0
- package/dist/lib/bot/session.js +39 -0
- package/dist/lib/bot/setup-explain.d.ts +64 -0
- package/dist/lib/bot/setup-explain.js +141 -0
- package/dist/lib/bot/split.d.ts +32 -0
- package/dist/lib/bot/split.js +241 -0
- package/dist/lib/bot/status.d.ts +57 -0
- package/dist/lib/bot/status.js +66 -0
- package/dist/lib/bot/worker-source.d.ts +66 -0
- package/dist/lib/bot/worker-source.js +283 -0
- package/dist/lib/checkpoint-ontology/aliases.d.ts +17 -0
- package/dist/lib/checkpoint-ontology/aliases.js +44 -0
- package/dist/lib/checkpoint-ontology/apply.d.ts +110 -0
- package/dist/lib/checkpoint-ontology/apply.js +777 -0
- package/dist/lib/checkpoint-ontology/company-brief.d.ts +18 -0
- package/dist/lib/checkpoint-ontology/company-brief.js +337 -0
- package/dist/lib/checkpoint-ontology/company.d.ts +44 -0
- package/dist/lib/checkpoint-ontology/company.js +118 -0
- package/dist/lib/checkpoint-ontology/drop-aliases.d.ts +41 -0
- package/dist/lib/checkpoint-ontology/drop-aliases.js +76 -0
- package/dist/lib/checkpoint-ontology/entity-file.d.ts +109 -0
- package/dist/lib/checkpoint-ontology/entity-file.js +371 -0
- package/dist/lib/checkpoint-ontology/identity.d.ts +38 -0
- package/dist/lib/checkpoint-ontology/identity.js +95 -0
- package/dist/lib/checkpoint-ontology/merge-copies.d.ts +199 -0
- package/dist/lib/checkpoint-ontology/merge-copies.js +1086 -0
- package/dist/lib/checkpoint-ontology/multi-writer.d.ts +101 -0
- package/dist/lib/checkpoint-ontology/multi-writer.js +394 -0
- package/dist/lib/checkpoint-ontology/plan.d.ts +193 -0
- package/dist/lib/checkpoint-ontology/plan.js +504 -0
- package/dist/lib/checkpoint-ontology/queued-touches.d.ts +29 -0
- package/dist/lib/checkpoint-ontology/queued-touches.js +193 -0
- package/dist/lib/checkpoint-ontology/sync-client.d.ts +38 -0
- package/dist/lib/checkpoint-ontology/sync-client.js +84 -0
- package/dist/lib/checkpoint-ontology/tree.d.ts +55 -0
- package/dist/lib/checkpoint-ontology/tree.js +198 -0
- package/dist/lib/company-errors-sdk-warning-flag.d.ts +5 -0
- package/dist/lib/company-errors-sdk-warning-flag.js +8 -0
- package/dist/lib/company-skill-wrapper.d.ts +1 -0
- package/dist/lib/company-skill-wrapper.js +121 -29
- package/dist/lib/core-utils/codex-skill-bridge.d.ts +2 -1
- package/dist/lib/core-utils/common.d.ts +0 -1
- package/dist/lib/core-utils/common.js +0 -9
- package/dist/lib/core-utils/hook-timeout-debug-context-flag.d.ts +20 -0
- package/dist/lib/core-utils/hook-timeout-debug-context-flag.js +81 -0
- package/dist/lib/core-utils/jq-json-serializer.d.ts +5 -0
- package/dist/lib/core-utils/jq-json-serializer.js +10 -0
- package/dist/lib/core-utils/qmd-reindex-after-sync.d.ts +14 -1
- package/dist/lib/core-utils/qmd-reindex-after-sync.js +101 -17
- package/dist/lib/core-utils/secret-patterns.d.ts +43 -0
- package/dist/lib/core-utils/secret-patterns.js +34 -0
- package/dist/lib/core-utils/sentry-report.d.ts +114 -0
- package/dist/lib/core-utils/sentry-report.js +1055 -0
- package/dist/lib/core-utils/soft-timeout.js +1 -1
- package/dist/lib/core-utils/timeout-guard-native.d.ts +7 -0
- package/dist/lib/core-utils/timeout-guard-native.js +40 -0
- package/dist/lib/core-utils/timeout-guard.d.ts +3 -3
- package/dist/lib/core-utils/timeout-guard.js +28 -13
- package/dist/lib/core-utils/token-usage-report.js +17 -3
- package/dist/lib/core-utils/worktree-resume.d.ts +20 -0
- package/dist/lib/core-utils/worktree-resume.js +1198 -0
- package/dist/lib/daemon/catalog.d.ts +134 -0
- package/dist/lib/daemon/catalog.js +358 -0
- package/dist/lib/daemon/config.d.ts +35 -0
- package/dist/lib/daemon/config.js +108 -0
- package/dist/lib/daemon/flag.d.ts +25 -0
- package/dist/lib/daemon/flag.js +59 -0
- package/dist/lib/daemon/handoff.d.ts +56 -0
- package/dist/lib/daemon/handoff.js +161 -0
- package/dist/lib/daemon/hq-cloud.d.ts +79 -0
- package/dist/lib/daemon/hq-cloud.js +183 -0
- package/dist/lib/daemon/install.d.ts +85 -0
- package/dist/lib/daemon/install.js +320 -0
- package/dist/lib/daemon/legacy-sync-env.d.ts +10 -0
- package/dist/lib/daemon/legacy-sync-env.js +58 -0
- package/dist/lib/daemon/legacy.d.ts +45 -0
- package/dist/lib/daemon/legacy.js +133 -0
- package/dist/lib/daemon/lock.d.ts +47 -0
- package/dist/lib/daemon/lock.js +138 -0
- package/dist/lib/daemon/machine-type.d.ts +50 -0
- package/dist/lib/daemon/machine-type.js +159 -0
- package/dist/lib/daemon/migrate.d.ts +77 -0
- package/dist/lib/daemon/migrate.js +265 -0
- package/dist/lib/daemon/paths.d.ts +24 -0
- package/dist/lib/daemon/paths.js +43 -0
- package/dist/lib/daemon/protocol-tail.d.ts +33 -0
- package/dist/lib/daemon/protocol-tail.js +131 -0
- package/dist/lib/daemon/remote-control.d.ts +74 -0
- package/dist/lib/daemon/remote-control.js +153 -0
- package/dist/lib/daemon/requests.d.ts +28 -0
- package/dist/lib/daemon/requests.js +65 -0
- package/dist/lib/daemon/run.d.ts +79 -0
- package/dist/lib/daemon/run.js +755 -0
- package/dist/lib/daemon/succession.d.ts +118 -0
- package/dist/lib/daemon/succession.js +263 -0
- package/dist/lib/daemon/supervisor.d.ts +132 -0
- package/dist/lib/daemon/supervisor.js +836 -0
- package/dist/lib/daemon/sync-runner.d.ts +58 -0
- package/dist/lib/daemon/sync-runner.js +277 -0
- package/dist/lib/daemon/tools.d.ts +52 -0
- package/dist/lib/daemon/tools.js +95 -0
- package/dist/lib/daemon/updater.d.ts +57 -0
- package/dist/lib/daemon/updater.js +163 -0
- package/dist/lib/db/control-plane.js +6 -0
- package/dist/lib/db/local.d.ts +0 -5
- package/dist/lib/db/local.js +1 -1
- package/dist/lib/db/migrate.d.ts +0 -12
- package/dist/lib/db/migrate.js +5 -5
- package/dist/lib/db/remote-sql.d.ts +2 -2
- package/dist/lib/db/remote-sql.js +3 -3
- package/dist/lib/db/sql.d.ts +0 -10
- package/dist/lib/db/sql.js +4 -8
- package/dist/lib/deploy-api.d.ts +5 -0
- package/dist/lib/deploy-api.js +21 -0
- package/dist/lib/deploy-apps.d.ts +13 -0
- package/dist/lib/deploy-apps.js +29 -0
- package/dist/lib/doctor/__testing__/fake-hq-tree.d.ts +1 -1
- package/dist/lib/doctor/__testing__/fake-hq-tree.js +1 -1
- package/dist/lib/doctor/__testing__/run-doctor.d.ts +8 -0
- package/dist/lib/doctor/__testing__/run-doctor.js +52 -0
- package/dist/lib/doctor/checks/bots.d.ts +13 -0
- package/dist/lib/doctor/checks/bots.js +189 -0
- package/dist/lib/doctor/checks/claude-wiring.js +70 -1
- package/dist/lib/doctor/checks/codex-wiring.d.ts +0 -4
- package/dist/lib/doctor/checks/codex-wiring.js +3 -35
- package/dist/lib/doctor/checks/grok-wiring.js +1 -34
- package/dist/lib/doctor/checks/integrations.js +11 -0
- package/dist/lib/doctor/checks/runtime-health.d.ts +4 -17
- package/dist/lib/doctor/checks/runtime-health.js +20 -7
- package/dist/lib/doctor/checks/scaffold-cli-floor.d.ts +6 -0
- package/dist/lib/doctor/checks/scaffold-cli-floor.js +73 -0
- package/dist/lib/doctor/checks/sync-health.d.ts +21 -0
- package/dist/lib/doctor/checks/sync-health.js +72 -2
- package/dist/lib/doctor/checks/sync-runtime.d.ts +11 -0
- package/dist/lib/doctor/checks/sync-runtime.js +216 -0
- package/dist/lib/doctor/checks/work-context.js +20 -6
- package/dist/lib/doctor/client-health-flag-token.d.ts +15 -0
- package/dist/lib/doctor/client-health-flag-token.js +66 -0
- package/dist/lib/doctor/client-health-reason-codes-flag.d.ts +27 -0
- package/dist/lib/doctor/client-health-reason-codes-flag.js +106 -0
- package/dist/lib/doctor/compat.d.ts +0 -16
- package/dist/lib/doctor/compat.js +4 -3
- package/dist/lib/doctor/deep/effects.js +1 -3
- package/dist/lib/doctor/deep/executor.d.ts +4 -10
- package/dist/lib/doctor/deep/executor.js +1 -1
- package/dist/lib/doctor/deep/parity.d.ts +2 -29
- package/dist/lib/doctor/deep/parity.js +7 -7
- package/dist/lib/doctor/deep/sandbox.d.ts +7 -25
- package/dist/lib/doctor/deep/sandbox.js +5 -7
- package/dist/lib/doctor/fix/apply.d.ts +79 -8
- package/dist/lib/doctor/fix/apply.js +292 -80
- package/dist/lib/doctor/fix/json-output.d.ts +28 -0
- package/dist/lib/doctor/fix/json-output.js +33 -0
- package/dist/lib/doctor/fix/refresh-sync-outcome.d.ts +12 -0
- package/dist/lib/doctor/fix/refresh-sync-outcome.js +25 -0
- package/dist/lib/doctor/fix/remediation.d.ts +14 -6
- package/dist/lib/doctor/fix/remediation.js +49 -9
- package/dist/lib/doctor/fixtures/schema.js +1 -3
- package/dist/lib/doctor/json-output.d.ts +17 -1
- package/dist/lib/doctor/json-output.js +7 -2
- package/dist/lib/doctor/platform.d.ts +0 -26
- package/dist/lib/doctor/platform.js +5 -5
- package/dist/lib/doctor/registry.d.ts +14 -0
- package/dist/lib/doctor/registry.js +71 -0
- package/dist/lib/doctor/report.js +1 -1
- package/dist/lib/doctor/shared.d.ts +8 -0
- package/dist/lib/doctor/shared.js +38 -0
- package/dist/lib/doctor/stray-gate-entries.d.ts +35 -0
- package/dist/lib/doctor/stray-gate-entries.js +83 -0
- package/dist/lib/doctor/types.d.ts +5 -0
- package/dist/lib/doctor/types.js +20 -0
- package/dist/lib/first-sync-next-step.d.ts +34 -0
- package/dist/lib/first-sync-next-step.js +179 -0
- package/dist/lib/flag-registry-endpoint.d.ts +5 -0
- package/dist/lib/flag-registry-endpoint.js +9 -0
- package/dist/lib/flag-registry-worker-source.generated.d.ts +2 -0
- package/dist/lib/flag-registry-worker-source.generated.js +3 -0
- package/dist/lib/flag-registry-worker.js +12 -1
- package/dist/lib/flag-registry.d.ts +26 -6
- package/dist/lib/flag-registry.js +133 -16
- package/dist/lib/flag-snapshot-file.d.ts +20 -0
- package/dist/lib/flag-snapshot-file.js +91 -0
- package/dist/lib/heartbeat-identity.d.ts +30 -0
- package/dist/lib/heartbeat-identity.js +76 -0
- package/dist/lib/index-render/companies.d.ts +4 -1
- package/dist/lib/index-render/companies.js +66 -3
- package/dist/lib/index-render/company-knowledge.js +80 -17
- package/dist/lib/index-render/index.d.ts +1 -0
- package/dist/lib/index-render/index.js +2 -1
- package/dist/lib/index-render/projects.js +82 -5
- package/dist/lib/index-render/shared.d.ts +13 -1
- package/dist/lib/index-render/shared.js +41 -2
- package/dist/lib/lanes/account-home.d.ts +8 -0
- package/dist/lib/lanes/account-home.js +10 -0
- package/dist/lib/lanes/accounts.d.ts +117 -0
- package/dist/lib/lanes/accounts.js +366 -0
- package/dist/lib/lanes/admission-host.d.ts +22 -0
- package/dist/lib/lanes/admission-host.js +37 -0
- package/dist/lib/lanes/admission.d.ts +26 -0
- package/dist/lib/lanes/admission.js +210 -0
- package/dist/lib/lanes/approval-gate.d.ts +8 -0
- package/dist/lib/lanes/approval-gate.js +90 -0
- package/dist/lib/lanes/autopilot-metrics.d.ts +99 -0
- package/dist/lib/lanes/autopilot-metrics.js +301 -0
- package/dist/lib/lanes/autopilot-registry.d.ts +62 -0
- package/dist/lib/lanes/autopilot-registry.js +192 -0
- package/dist/lib/lanes/autopilot.d.ts +137 -0
- package/dist/lib/lanes/autopilot.js +1291 -0
- package/dist/lib/lanes/blocker-freshness.d.ts +31 -0
- package/dist/lib/lanes/blocker-freshness.js +168 -0
- package/dist/lib/lanes/checked-company-path.d.ts +3 -0
- package/dist/lib/lanes/checked-company-path.js +39 -0
- package/dist/lib/lanes/claude-balance.d.ts +97 -0
- package/dist/lib/lanes/claude-balance.js +319 -0
- package/dist/lib/lanes/compaction.d.ts +110 -0
- package/dist/lib/lanes/compaction.js +293 -0
- package/dist/lib/lanes/config.d.ts +94 -0
- package/dist/lib/lanes/config.js +606 -0
- package/dist/lib/lanes/constants.d.ts +3 -0
- package/dist/lib/lanes/constants.js +3 -0
- package/dist/lib/lanes/delivery-core.d.ts +15 -0
- package/dist/lib/lanes/delivery-core.js +21 -0
- package/dist/lib/lanes/delivery.d.ts +180 -0
- package/dist/lib/lanes/delivery.js +443 -0
- package/dist/lib/lanes/disk-guard.d.ts +65 -0
- package/dist/lib/lanes/disk-guard.js +172 -0
- package/dist/lib/lanes/dropbox.d.ts +129 -0
- package/dist/lib/lanes/dropbox.js +601 -0
- package/dist/lib/lanes/effort.d.ts +51 -0
- package/dist/lib/lanes/effort.js +113 -0
- package/dist/lib/lanes/envelope-repair-dispatch.d.ts +26 -0
- package/dist/lib/lanes/envelope-repair-dispatch.js +74 -0
- package/dist/lib/lanes/errors.d.ts +39 -0
- package/dist/lib/lanes/errors.js +72 -0
- package/dist/lib/lanes/flag-keys.d.ts +25 -0
- package/dist/lib/lanes/flag-keys.js +25 -0
- package/dist/lib/lanes/grants.d.ts +30 -0
- package/dist/lib/lanes/grants.js +171 -0
- package/dist/lib/lanes/hire-grant-dispatch.d.ts +29 -0
- package/dist/lib/lanes/hire-grant-dispatch.js +315 -0
- package/dist/lib/lanes/hooks-install.d.ts +82 -0
- package/dist/lib/lanes/hooks-install.js +555 -0
- package/dist/lib/lanes/host-capacity.d.ts +69 -0
- package/dist/lib/lanes/host-capacity.js +254 -0
- package/dist/lib/lanes/hq-root.d.ts +19 -0
- package/dist/lib/lanes/hq-root.js +28 -0
- package/dist/lib/lanes/index.d.ts +76 -0
- package/dist/lib/lanes/index.js +42 -0
- package/dist/lib/lanes/keep-alive-audit.d.ts +47 -0
- package/dist/lib/lanes/keep-alive-audit.js +370 -0
- package/dist/lib/lanes/keep-alive.d.ts +68 -0
- package/dist/lib/lanes/keep-alive.js +343 -0
- package/dist/lib/lanes/kr-freshness.d.ts +76 -0
- package/dist/lib/lanes/kr-freshness.js +413 -0
- package/dist/lib/lanes/lane-company.d.ts +10 -0
- package/dist/lib/lanes/lane-company.js +41 -0
- package/dist/lib/lanes/liveness.d.ts +108 -0
- package/dist/lib/lanes/liveness.js +396 -0
- package/dist/lib/lanes/machine-identity.d.ts +34 -0
- package/dist/lib/lanes/machine-identity.js +92 -0
- package/dist/lib/lanes/manager-status-gate.d.ts +17 -0
- package/dist/lib/lanes/manager-status-gate.js +133 -0
- package/dist/lib/lanes/merge-command.d.ts +15 -0
- package/dist/lib/lanes/merge-command.js +629 -0
- package/dist/lib/lanes/mesh-events.d.ts +127 -0
- package/dist/lib/lanes/mesh-events.js +564 -0
- package/dist/lib/lanes/message-replay.d.ts +21 -0
- package/dist/lib/lanes/message-replay.js +122 -0
- package/dist/lib/lanes/models.d.ts +86 -0
- package/dist/lib/lanes/models.js +234 -0
- package/dist/lib/lanes/monitor.d.ts +48 -0
- package/dist/lib/lanes/monitor.js +428 -0
- package/dist/lib/lanes/move-account.d.ts +56 -0
- package/dist/lib/lanes/move-account.js +193 -0
- package/dist/lib/lanes/orphans.d.ts +25 -0
- package/dist/lib/lanes/orphans.js +102 -0
- package/dist/lib/lanes/outpost-dispatch.d.ts +156 -0
- package/dist/lib/lanes/outpost-dispatch.js +293 -0
- package/dist/lib/lanes/outpost-hire-cache.d.ts +22 -0
- package/dist/lib/lanes/outpost-hire-cache.js +153 -0
- package/dist/lib/lanes/outpost-identity.d.ts +33 -0
- package/dist/lib/lanes/outpost-identity.js +59 -0
- package/dist/lib/lanes/outpost-profile-repin.d.ts +17 -0
- package/dist/lib/lanes/outpost-profile-repin.js +84 -0
- package/dist/lib/lanes/outpost-pruner-install.d.ts +37 -0
- package/dist/lib/lanes/outpost-pruner-install.js +238 -0
- package/dist/lib/lanes/outpost-registry-worker-approval.d.ts +18 -0
- package/dist/lib/lanes/outpost-registry-worker-approval.js +109 -0
- package/dist/lib/lanes/outpost-snapshot-memo.d.ts +6 -0
- package/dist/lib/lanes/outpost-snapshot-memo.js +14 -0
- package/dist/lib/lanes/outpost-worktree-pruner-flag.d.ts +19 -0
- package/dist/lib/lanes/outpost-worktree-pruner-flag.js +86 -0
- package/dist/lib/lanes/outpost-worktree-pruner.d.ts +62 -0
- package/dist/lib/lanes/outpost-worktree-pruner.js +1201 -0
- package/dist/lib/lanes/profile.d.ts +69 -0
- package/dist/lib/lanes/profile.js +552 -0
- package/dist/lib/lanes/provider-rejection.d.ts +86 -0
- package/dist/lib/lanes/provider-rejection.js +286 -0
- package/dist/lib/lanes/questions.d.ts +90 -0
- package/dist/lib/lanes/questions.js +384 -0
- package/dist/lib/lanes/quota.d.ts +134 -0
- package/dist/lib/lanes/quota.js +471 -0
- package/dist/lib/lanes/reconcile-install.d.ts +90 -0
- package/dist/lib/lanes/reconcile-install.js +257 -0
- package/dist/lib/lanes/reconcile.d.ts +161 -0
- package/dist/lib/lanes/reconcile.js +3343 -0
- package/dist/lib/lanes/registry-flag.d.ts +35 -0
- package/dist/lib/lanes/registry-flag.js +164 -0
- package/dist/lib/lanes/registry-persona.d.ts +20 -0
- package/dist/lib/lanes/registry-persona.js +329 -0
- package/dist/lib/lanes/registry.d.ts +122 -0
- package/dist/lib/lanes/registry.js +570 -0
- package/dist/lib/lanes/reviews.d.ts +38 -0
- package/dist/lib/lanes/reviews.js +395 -0
- package/dist/lib/lanes/runaway-tool-guard.d.ts +38 -0
- package/dist/lib/lanes/runaway-tool-guard.js +284 -0
- package/dist/lib/lanes/session-relink.d.ts +25 -0
- package/dist/lib/lanes/session-relink.js +216 -0
- package/dist/lib/lanes/spawn.d.ts +355 -0
- package/dist/lib/lanes/spawn.js +2668 -0
- package/dist/lib/lanes/ssm-command-context.d.ts +12 -0
- package/dist/lib/lanes/ssm-command-context.js +52 -0
- package/dist/lib/lanes/store.d.ts +91 -0
- package/dist/lib/lanes/store.js +1822 -0
- package/dist/lib/lanes/stories.d.ts +23 -0
- package/dist/lib/lanes/stories.js +92 -0
- package/dist/lib/lanes/story-ledger.d.ts +80 -0
- package/dist/lib/lanes/story-ledger.js +815 -0
- package/dist/lib/lanes/story-switch.d.ts +21 -0
- package/dist/lib/lanes/story-switch.js +75 -0
- package/dist/lib/lanes/text-scan.d.ts +11 -0
- package/dist/lib/lanes/text-scan.js +103 -0
- package/dist/lib/lanes/throttle.d.ts +116 -0
- package/dist/lib/lanes/throttle.js +437 -0
- package/dist/lib/lanes/timestamp.d.ts +3 -0
- package/dist/lib/lanes/timestamp.js +26 -0
- package/dist/lib/lanes/tracker-checks.d.ts +77 -0
- package/dist/lib/lanes/tracker-checks.js +134 -0
- package/dist/lib/lanes/tracker-report-state.d.ts +10 -0
- package/dist/lib/lanes/tracker-report-state.js +124 -0
- package/dist/lib/lanes/tracker-report.d.ts +203 -0
- package/dist/lib/lanes/tracker-report.js +522 -0
- package/dist/lib/lanes/tracker-store.d.ts +18 -0
- package/dist/lib/lanes/tracker-store.js +106 -0
- package/dist/lib/lanes/types.d.ts +1030 -0
- package/dist/lib/lanes/types.js +418 -0
- package/dist/lib/lanes/wait.d.ts +39 -0
- package/dist/lib/lanes/wait.js +159 -0
- package/dist/lib/lanes/watch.d.ts +39 -0
- package/dist/lib/lanes/watch.js +249 -0
- package/dist/lib/lanes/watcher-main.d.ts +11 -0
- package/dist/lib/lanes/watcher-main.js +108 -0
- package/dist/lib/lanes/watcher.d.ts +287 -0
- package/dist/lib/lanes/watcher.js +1972 -0
- package/dist/lib/mesh/api.d.ts +103 -10
- package/dist/lib/mesh/api.js +334 -64
- package/dist/lib/mesh/client.d.ts +3 -2
- package/dist/lib/mesh/client.js +26 -7
- package/dist/lib/mesh/denial-codes.d.ts +5 -0
- package/dist/lib/mesh/denial-codes.js +14 -0
- package/dist/lib/mesh/live/backfill-held.d.ts +67 -16
- package/dist/lib/mesh/live/backfill-held.js +415 -61
- package/dist/lib/mesh/live/backoff.d.ts +2 -2
- package/dist/lib/mesh/live/backoff.js +16 -3
- package/dist/lib/mesh/live/daemon/board-refresh.d.ts +7 -1
- package/dist/lib/mesh/live/daemon/board-refresh.js +78 -30
- package/dist/lib/mesh/live/daemon/config.d.ts +36 -0
- package/dist/lib/mesh/live/daemon/config.js +120 -0
- package/dist/lib/mesh/live/daemon/credentials.d.ts +64 -10
- package/dist/lib/mesh/live/daemon/credentials.js +270 -20
- package/dist/lib/mesh/live/daemon/doctor.d.ts +53 -0
- package/dist/lib/mesh/live/daemon/doctor.js +190 -6
- package/dist/lib/mesh/live/daemon/index.d.ts +13 -10
- package/dist/lib/mesh/live/daemon/index.js +7 -6
- package/dist/lib/mesh/live/daemon/install.d.ts +255 -1
- package/dist/lib/mesh/live/daemon/install.js +811 -13
- package/dist/lib/mesh/live/daemon/legacy-listen.d.ts +43 -0
- package/dist/lib/mesh/live/daemon/legacy-listen.js +89 -0
- package/dist/lib/mesh/live/daemon/live-cache.d.ts +26 -0
- package/dist/lib/mesh/live/daemon/live-cache.js +116 -0
- package/dist/lib/mesh/live/daemon/mqtt-events.d.ts +7 -0
- package/dist/lib/mesh/live/daemon/mqtt-events.js +2 -0
- package/dist/lib/mesh/live/daemon/mqtt-events.test-d.d.ts +2 -0
- package/dist/lib/mesh/live/daemon/mqtt-events.test-d.js +10 -0
- package/dist/lib/mesh/live/daemon/paths.d.ts +2 -0
- package/dist/lib/mesh/live/daemon/paths.js +2 -0
- package/dist/lib/mesh/live/daemon/presence.d.ts +24 -5
- package/dist/lib/mesh/live/daemon/presence.js +79 -10
- package/dist/lib/mesh/live/daemon/run.d.ts +48 -2
- package/dist/lib/mesh/live/daemon/run.js +485 -33
- package/dist/lib/mesh/live/daemon/state.d.ts +19 -2
- package/dist/lib/mesh/live/daemon/state.js +34 -2
- package/dist/lib/mesh/live/daemon/transcript-watch.d.ts +45 -9
- package/dist/lib/mesh/live/daemon/transcript-watch.js +227 -31
- package/dist/lib/mesh/live/daemon/version-drift.d.ts +5 -0
- package/dist/lib/mesh/live/daemon/version-drift.js +47 -0
- package/dist/lib/mesh/live/daemon/work-subscribe.d.ts +32 -0
- package/dist/lib/mesh/live/daemon/work-subscribe.js +262 -0
- package/dist/lib/mesh/live/emit-client.d.ts +8 -0
- package/dist/lib/mesh/live/emit-client.js +23 -8
- package/dist/lib/mesh/live/emit-evidence.d.ts +19 -0
- package/dist/lib/mesh/live/emit-evidence.js +20 -2
- package/dist/lib/mesh/live/emit.d.ts +9 -0
- package/dist/lib/mesh/live/emit.js +28 -2
- package/dist/lib/mesh/live/enqueue.d.ts +5 -0
- package/dist/lib/mesh/live/enqueue.js +19 -0
- package/dist/lib/mesh/live/flush.d.ts +17 -5
- package/dist/lib/mesh/live/flush.js +391 -38
- package/dist/lib/mesh/live/format-spool-line.d.ts +5 -2
- package/dist/lib/mesh/live/format-spool-line.js +10 -0
- package/dist/lib/mesh/live/paths.d.ts +2 -0
- package/dist/lib/mesh/live/paths.js +4 -0
- package/dist/lib/mesh/live/report-summary.d.ts +45 -0
- package/dist/lib/mesh/live/report-summary.js +234 -0
- package/dist/lib/mesh/live/session-event.schema.json +24 -1
- package/dist/lib/mesh/live/session-events-client.d.ts +2 -0
- package/dist/lib/mesh/live/session-events-client.js +26 -0
- package/dist/lib/mesh/live/session-seq.d.ts +4 -0
- package/dist/lib/mesh/live/session-seq.js +33 -0
- package/dist/lib/mesh/live/spool.d.ts +19 -0
- package/dist/lib/mesh/live/spool.js +269 -3
- package/dist/lib/mesh/live/validate-session-event.d.ts +1 -1
- package/dist/lib/mesh/live/validate-session-event.js +1 -1
- package/dist/lib/mesh/project-board.d.ts +65 -0
- package/dist/lib/mesh/project-board.js +181 -0
- package/dist/lib/mesh/story-status.d.ts +22 -0
- package/dist/lib/mesh/story-status.js +49 -0
- package/dist/lib/monitor.d.ts +149 -0
- package/dist/lib/monitor.js +519 -0
- package/dist/lib/node-binary.d.ts +50 -0
- package/dist/lib/node-binary.js +133 -0
- package/dist/lib/notify-recipient.d.ts +7 -0
- package/dist/lib/notify-recipient.js +11 -0
- package/dist/lib/onboarding/checkpoint.d.ts +13 -0
- package/dist/lib/onboarding/checkpoint.js +44 -0
- package/dist/lib/onboarding/cli/onboard.d.ts +53 -0
- package/dist/lib/onboarding/cli/onboard.js +135 -0
- package/dist/lib/onboarding/cli/prompts.d.ts +28 -0
- package/dist/lib/onboarding/cli/prompts.js +83 -0
- package/dist/lib/onboarding/errors.d.ts +34 -0
- package/dist/lib/onboarding/errors.js +59 -0
- package/dist/lib/onboarding/index.d.ts +13 -0
- package/dist/lib/onboarding/index.js +13 -0
- package/dist/lib/onboarding/orchestrator.d.ts +47 -0
- package/dist/lib/onboarding/orchestrator.js +569 -0
- package/dist/lib/onboarding/types.d.ts +79 -0
- package/dist/lib/onboarding/types.js +8 -0
- package/dist/lib/plan-limit-nag.d.ts +102 -6
- package/dist/lib/plan-limit-nag.js +348 -43
- package/dist/lib/policy-validator.d.ts +7 -0
- package/dist/lib/policy-validator.js +187 -0
- package/dist/lib/process-flag-company-context.d.ts +8 -0
- package/dist/lib/process-flag-company-context.js +67 -0
- package/dist/lib/report-publish.d.ts +175 -0
- package/dist/lib/report-publish.js +421 -0
- package/dist/lib/report-run.d.ts +62 -0
- package/dist/lib/report-run.js +123 -0
- package/dist/lib/report-snapshot.d.ts +12 -0
- package/dist/lib/report-snapshot.js +135 -0
- package/dist/lib/report-templates.d.ts +9 -0
- package/dist/lib/report-templates.js +21 -0
- package/dist/lib/scaffold-cli-floor.d.ts +8 -0
- package/dist/lib/scaffold-cli-floor.js +50 -0
- package/dist/lib/scan-packages/index.d.ts +2 -0
- package/dist/lib/scan-packages/index.js +168 -6
- package/dist/lib/search-index/background.d.ts +8 -1
- package/dist/lib/search-index/background.js +55 -200
- package/dist/lib/search-index/collection-path-repair-flag.d.ts +4 -0
- package/dist/lib/search-index/collection-path-repair-flag.js +7 -0
- package/dist/lib/search-index/embed-lock.d.ts +34 -0
- package/dist/lib/search-index/embed-lock.js +295 -0
- package/dist/lib/search-index/index.d.ts +12 -0
- package/dist/lib/search-index/index.js +153 -7
- package/dist/lib/search-index/load-gate.d.ts +57 -0
- package/dist/lib/search-index/load-gate.js +270 -0
- package/dist/lib/search-index/max-doc-bytes.d.ts +219 -0
- package/dist/lib/search-index/max-doc-bytes.js +463 -0
- package/dist/lib/search-index/qmd-exit-diagnostics.d.ts +5 -0
- package/dist/lib/search-index/qmd-exit-diagnostics.js +40 -0
- package/dist/lib/search-index/reindex-single-flight-flag.d.ts +5 -0
- package/dist/lib/search-index/reindex-single-flight-flag.js +8 -0
- package/dist/lib/service-manager/index.d.ts +42 -0
- package/dist/lib/service-manager/index.js +105 -0
- package/dist/lib/service-manager/launchd.d.ts +81 -0
- package/dist/lib/service-manager/launchd.js +212 -0
- package/dist/lib/service-manager/systemd.d.ts +19 -0
- package/dist/lib/service-manager/systemd.js +72 -0
- package/dist/lib/service-manager/types.d.ts +34 -0
- package/dist/lib/service-manager/types.js +26 -0
- package/dist/lib/test-utils/isolated-flag-company-context.d.ts +3 -0
- package/dist/lib/test-utils/isolated-flag-company-context.js +18 -0
- package/dist/lib/work-context/bind-best.d.ts +66 -0
- package/dist/lib/work-context/bind-best.js +344 -0
- package/dist/lib/work-context/bind-calling-session.d.ts +26 -0
- package/dist/lib/work-context/bind-calling-session.js +63 -0
- package/dist/lib/work-context/company-rebind.d.ts +23 -0
- package/dist/lib/work-context/company-rebind.js +59 -0
- package/dist/lib/work-context/company.d.ts +22 -20
- package/dist/lib/work-context/company.js +124 -40
- package/dist/lib/work-context/config.d.ts +58 -11
- package/dist/lib/work-context/config.js +334 -83
- package/dist/lib/work-context/contract.d.ts +13 -0
- package/dist/lib/work-context/contract.schema.json +3 -1
- package/dist/lib/work-context/default-company.d.ts +43 -0
- package/dist/lib/work-context/default-company.js +83 -0
- package/dist/lib/work-context/outbox-quarantine-status-flag.d.ts +4 -0
- package/dist/lib/work-context/outbox-quarantine-status-flag.js +7 -0
- package/dist/lib/work-context/outbox.d.ts +27 -5
- package/dist/lib/work-context/outbox.js +135 -6
- package/dist/lib/work-context/prd-sync.d.ts +56 -0
- package/dist/lib/work-context/prd-sync.js +197 -0
- package/dist/lib/work-context/preflight-contract.d.ts +28 -0
- package/dist/lib/work-context/preflight-contract.js +85 -0
- package/dist/lib/work-context/prompt-rebind.d.ts +25 -0
- package/dist/lib/work-context/prompt-rebind.js +85 -0
- package/dist/lib/work-context/reconcile.d.ts +15 -0
- package/dist/lib/work-context/reconcile.js +405 -29
- package/dist/lib/work-context/state.d.ts +93 -10
- package/dist/lib/work-context/state.js +342 -29
- package/dist/lib/work-context/windows-acl.d.ts +123 -0
- package/dist/lib/work-context/windows-acl.js +425 -0
- package/dist/lib/workers-registry/index.js +62 -8
- package/dist/lib/workers-registry/read.d.ts +15 -0
- package/dist/lib/workers-registry/read.js +17 -0
- package/dist/main.d.ts +32 -0
- package/dist/main.js +273 -73
- package/dist/native-fast-route.d.ts +7 -0
- package/dist/native-fast-route.js +45 -0
- package/dist/node-network-compat-core.d.ts +12 -0
- package/dist/node-network-compat-core.js +41 -0
- package/dist/node-network-compat-fast.d.ts +7 -0
- package/dist/node-network-compat-fast.js +23 -0
- package/dist/node-network-compat.d.ts +2 -30
- package/dist/node-network-compat.js +4 -51
- package/dist/node-preflight.d.ts +7 -1
- package/dist/node-preflight.js +5 -5
- package/dist/register-all.d.ts +4 -29
- package/dist/register-all.js +4 -233
- package/dist/run/discover-schemas.d.ts +2 -1
- package/dist/run/env-graph-guard.d.ts +2 -2
- package/dist/run/env-graph-guard.js +5 -2
- package/dist/run/hq-plugin.d.ts +4 -0
- package/dist/run/hq-plugin.js +36 -8
- package/dist/secrets-env-fast-path.d.ts +5 -0
- package/dist/secrets-env-fast-path.js +16 -0
- package/dist/secrets-env-fast-route.d.ts +18 -0
- package/dist/secrets-env-fast-route.js +54 -0
- package/dist/sentry-before-send.js +80 -0
- package/dist/sentry.d.ts +16 -4
- package/dist/sentry.js +179 -18
- package/dist/startup-registration.d.ts +26 -2
- package/dist/startup-registration.js +116 -15
- package/dist/utils/checkpoint-stamp-write-error.d.ts +28 -0
- package/dist/utils/checkpoint-stamp-write-error.js +99 -0
- package/dist/utils/cli-network-lifecycle.d.ts +4 -0
- package/dist/utils/cli-network-lifecycle.js +11 -0
- package/dist/utils/cli-telemetry.d.ts +75 -1
- package/dist/utils/cli-telemetry.js +433 -7
- package/dist/utils/client-health.d.ts +0 -4
- package/dist/utils/client-health.js +2 -2
- package/dist/utils/cognito-refresh-sentry.d.ts +3 -0
- package/dist/utils/cognito-refresh-sentry.js +49 -0
- package/dist/utils/cognito-session.d.ts +71 -0
- package/dist/utils/cognito-session.js +481 -27
- package/dist/utils/console-origin.d.ts +9 -0
- package/dist/utils/console-origin.js +28 -0
- package/dist/utils/contribution-table.d.ts +1 -1
- package/dist/utils/core-eval-trigger.d.ts +4 -0
- package/dist/utils/core-eval-trigger.js +88 -0
- package/dist/utils/environmental-error.d.ts +18 -0
- package/dist/utils/environmental-error.js +240 -7
- package/dist/utils/exclusive-lock.d.ts +32 -0
- package/dist/utils/exclusive-lock.js +75 -0
- package/dist/utils/expected-cli-error.d.ts +2 -0
- package/dist/utils/expected-cli-error.js +4 -0
- package/dist/utils/fast-stream-errors.d.ts +12 -0
- package/dist/utils/fast-stream-errors.js +18 -0
- package/dist/utils/feedback-diagnostics.d.ts +2 -1
- package/dist/utils/feedback-log-bundle.d.ts +51 -26
- package/dist/utils/feedback-log-bundle.js +211 -31
- package/dist/utils/feedback-logs.d.ts +18 -47
- package/dist/utils/feedback-logs.js +50 -21
- package/dist/utils/feedback-screenshots.d.ts +0 -1
- package/dist/utils/feedback-screenshots.js +1 -1
- package/dist/utils/files-browse-acl.d.ts +5 -0
- package/dist/utils/files-browse-acl.js +11 -0
- package/dist/utils/hq-core-yaml.d.ts +10 -0
- package/dist/utils/hq-core-yaml.js +40 -0
- package/dist/utils/hq-root-resolver.d.ts +13 -0
- package/dist/utils/hq-root-resolver.js +103 -0
- package/dist/utils/hq-roots.d.ts +25 -2
- package/dist/utils/hq-roots.js +67 -7
- package/dist/utils/incomplete-install-error.d.ts +87 -19
- package/dist/utils/incomplete-install-error.js +319 -68
- package/dist/utils/install-tree-torn.d.ts +260 -24
- package/dist/utils/install-tree-torn.js +998 -51
- package/dist/utils/large-file-guard.d.ts +0 -10
- package/dist/utils/large-file-guard.js +1 -1
- package/dist/utils/local-files-overview.d.ts +4 -8
- package/dist/utils/local-files-overview.js +48 -7
- package/dist/utils/login-provider.d.ts +7 -0
- package/dist/utils/login-provider.js +34 -0
- package/dist/utils/pack-contributions.d.ts +2 -14
- package/dist/utils/pack-contributions.js +7 -44
- package/dist/utils/package-root-diagnostics.d.ts +1 -1
- package/dist/utils/people.d.ts +7 -11
- package/dist/utils/people.js +5 -20
- package/dist/utils/plan-gate-error.d.ts +52 -10
- package/dist/utils/plan-gate-error.js +364 -41
- package/dist/utils/qmd-model-download-error.d.ts +0 -8
- package/dist/utils/qmd-model-download-error.js +1 -1
- package/dist/utils/qmd-query-document-error.d.ts +0 -6
- package/dist/utils/qmd-query-document-error.js +1 -1
- package/dist/utils/redact-error-text.d.ts +0 -2
- package/dist/utils/redact-error-text.js +3 -2
- package/dist/utils/redact-url.d.ts +14 -0
- package/dist/utils/redact-url.js +218 -0
- package/dist/utils/run-bundled-script.d.ts +6 -0
- package/dist/utils/run-bundled-script.js +117 -4
- package/dist/utils/sandbox-runner-client.d.ts +2 -1
- package/dist/utils/scaffold-fast-import-guard.d.ts +2 -0
- package/dist/utils/scaffold-fast-import-guard.js +40 -0
- package/dist/utils/scaffold-packlist-guard.d.ts +7 -0
- package/dist/utils/scaffold-packlist-guard.js +23 -0
- package/dist/utils/scaffold-sibling-references.d.ts +22 -0
- package/dist/utils/scaffold-sibling-references.js +156 -0
- package/dist/utils/secret-load-availability.d.ts +8 -0
- package/dist/utils/secret-load-availability.js +54 -0
- package/dist/utils/secrets-cache.d.ts +7 -3
- package/dist/utils/secrets-cache.js +162 -14
- package/dist/utils/self-update.d.ts +34 -1
- package/dist/utils/self-update.js +660 -42
- package/dist/utils/sentry-fingerprint.d.ts +23 -1
- package/dist/utils/sentry-fingerprint.js +223 -31
- package/dist/utils/staged-install.d.ts +34 -0
- package/dist/utils/staged-install.js +346 -0
- package/dist/utils/staged-npm-install.d.ts +16 -0
- package/dist/utils/staged-npm-install.js +264 -0
- package/dist/utils/sync-log-sources.d.ts +15 -0
- package/dist/utils/sync-log-sources.js +36 -0
- package/dist/utils/table-width.d.ts +7 -0
- package/dist/utils/table-width.js +15 -0
- package/dist/utils/team-upgrade.d.ts +1 -1
- package/dist/utils/team-upgrade.js +4 -3
- package/dist/utils/update-command-supervisor.cjs +247 -0
- package/dist/utils/upload-author.d.ts +15 -0
- package/dist/utils/upload-author.js +39 -0
- package/dist/utils/vault-api.d.ts +21 -1
- package/dist/utils/vault-api.js +251 -84
- package/dist/utils/version-check.d.ts +11 -1
- package/dist/utils/version-check.js +32 -3
- package/dist/utils/version-gate.d.ts +101 -17
- package/dist/utils/version-gate.js +645 -70
- package/dist/utils/version-report.d.ts +27 -0
- package/dist/utils/version-report.js +105 -0
- package/dist/utils/windows-spawn.d.ts +6 -0
- package/dist/utils/windows-spawn.js +37 -0
- package/dist/version-request.d.ts +14 -0
- package/dist/version-request.js +36 -0
- package/package.json +20 -8
- package/scripts/mesh-daemon-if-stale.mjs +20 -0
- package/templates/reports/blank.md +3 -0
- package/templates/reports/daily-digest.md +11 -0
- package/templates/runbooks/update-report.md +21 -0
- package/dist/commands/scaffold-fast.d.ts +0 -41
- package/dist/commands/scaffold-fast.js +0 -57
- package/dist/lib/work-context/index.d.ts +0 -25
- package/dist/lib/work-context/index.js +0 -21
|
@@ -28,25 +28,33 @@
|
|
|
28
28
|
* to silence both check + gate).
|
|
29
29
|
*/
|
|
30
30
|
import { spawnSync } from "node:child_process";
|
|
31
|
+
import { createHash } from "node:crypto";
|
|
31
32
|
import { buildSpawnPlan, quoteForWindowsShell } from "./windows-spawn.js";
|
|
32
|
-
import { accessSync, closeSync, constants as fsConstants, existsSync, mkdtempSync, openSync, readdirSync, readFileSync, rmSync, } from "node:fs";
|
|
33
|
+
import { accessSync, closeSync, constants as fsConstants, copyFileSync, existsSync, mkdirSync, mkdtempSync, openSync, readdirSync, realpathSync, readFileSync, rmSync, } from "node:fs";
|
|
33
34
|
import os from "node:os";
|
|
34
35
|
import path from "node:path";
|
|
35
36
|
import { fileURLToPath } from "node:url";
|
|
36
37
|
import chalk from "chalk";
|
|
37
38
|
import semver from "semver";
|
|
38
39
|
import { CLI_NAME, CLI_VERSION } from "../cli-version.js";
|
|
40
|
+
import { Sentry } from "../sentry.js";
|
|
41
|
+
import { isCliTelemetryDisabled } from "./cli-telemetry.js";
|
|
39
42
|
import { DEFAULT_VAULT_API_URL } from "./cognito-session.js";
|
|
40
43
|
import { acquireUpdateLock, } from "./update-lock.js";
|
|
41
44
|
const CLIENT_ID = "hq-cli";
|
|
42
45
|
const ENDPOINT_PATH = "/v1/client-version/check";
|
|
43
46
|
const FETCH_TIMEOUT_MS = 3_000;
|
|
44
47
|
const LATEST_PACKAGE_SPEC = `${CLI_NAME}@latest`;
|
|
48
|
+
let currentVersionGatePhase = "unknown";
|
|
49
|
+
/** The last closed version-gate phase observed in this process. */
|
|
50
|
+
export function getVersionGatePhase() {
|
|
51
|
+
return currentVersionGatePhase;
|
|
52
|
+
}
|
|
45
53
|
function isOptedOut() {
|
|
46
54
|
return process.env.HQ_NO_UPDATE_CHECK === "1";
|
|
47
55
|
}
|
|
48
|
-
function
|
|
49
|
-
let dir =
|
|
56
|
+
function findCliPackageRoot(startDir) {
|
|
57
|
+
let dir = startDir;
|
|
50
58
|
while (true) {
|
|
51
59
|
try {
|
|
52
60
|
const pkg = JSON.parse(readFileSync(path.join(dir, "package.json"), "utf-8"));
|
|
@@ -62,6 +70,105 @@ function findRunningPackageRoot() {
|
|
|
62
70
|
dir = parent;
|
|
63
71
|
}
|
|
64
72
|
}
|
|
73
|
+
function findRunningPackageRoot() {
|
|
74
|
+
return findCliPackageRoot(path.dirname(fileURLToPath(import.meta.url)));
|
|
75
|
+
}
|
|
76
|
+
/** Resolve an on-PATH executable back to the installed hq-cli package it loads. */
|
|
77
|
+
function findPackageRootForExecutable(bin) {
|
|
78
|
+
try {
|
|
79
|
+
const packageRoot = findCliPackageRoot(path.dirname(realpathSync(bin)));
|
|
80
|
+
if (packageRoot)
|
|
81
|
+
return packageRoot;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// A missing or inaccessible executable may still be recoverable from the
|
|
85
|
+
// configured pnpm global layout below.
|
|
86
|
+
}
|
|
87
|
+
// pnpm emits shell/.cmd shims into its global bin directory. realpathSync()
|
|
88
|
+
// resolves symlinks, but a generated shim is a regular file, so walking up
|
|
89
|
+
// from its real path never reaches the package it invokes. Look up only the
|
|
90
|
+
// hq-cli package under the matching PNPM_HOME/global layout instead.
|
|
91
|
+
const binDir = path.dirname(bin);
|
|
92
|
+
const configuredHome = process.env.PNPM_HOME;
|
|
93
|
+
const inferredHome = path.basename(binDir).toLowerCase() === "bin"
|
|
94
|
+
? path.dirname(binDir)
|
|
95
|
+
: binDir;
|
|
96
|
+
const candidateHomes = [configuredHome, inferredHome].filter((home, index, homes) => Boolean(home) && homes.findIndex((candidate) => candidate === home) === index);
|
|
97
|
+
const home = candidateHomes.find((candidate) => samePath(binDir, candidate) ||
|
|
98
|
+
samePath(binDir, path.join(candidate, "bin")));
|
|
99
|
+
if (!home)
|
|
100
|
+
return null;
|
|
101
|
+
const globalRoot = path.join(home, "global");
|
|
102
|
+
let storeVersions;
|
|
103
|
+
try {
|
|
104
|
+
storeVersions = readdirSync(globalRoot);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const packageSegments = CLI_NAME.split("/");
|
|
110
|
+
for (const storeVersion of storeVersions) {
|
|
111
|
+
const storeRoot = path.join(globalRoot, storeVersion);
|
|
112
|
+
const packageRoots = [
|
|
113
|
+
path.join(storeRoot, "node_modules", ...packageSegments),
|
|
114
|
+
];
|
|
115
|
+
// pnpm v11 adds a hash between its global store version and node_modules.
|
|
116
|
+
// Its documented `vN` global layout is recognized unconditionally below.
|
|
117
|
+
if (/^v\d+$/.test(storeVersion)) {
|
|
118
|
+
try {
|
|
119
|
+
for (const hash of readdirSync(storeRoot)) {
|
|
120
|
+
packageRoots.push(path.join(storeRoot, hash, "node_modules", ...packageSegments));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// A missing or unreadable version directory is simply not a candidate.
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
for (const candidate of packageRoots) {
|
|
128
|
+
const packageRoot = findCliPackageRoot(candidate);
|
|
129
|
+
if (packageRoot &&
|
|
130
|
+
samePath(packageRoot, candidate) &&
|
|
131
|
+
isPnpmManagedPackageDir(packageRoot, true)) {
|
|
132
|
+
return packageRoot;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
function samePath(left, right) {
|
|
139
|
+
const canonical = (value) => {
|
|
140
|
+
try {
|
|
141
|
+
return realpathSync(value);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return path.resolve(value);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
const a = canonical(left);
|
|
148
|
+
const b = canonical(right);
|
|
149
|
+
return process.platform === "win32"
|
|
150
|
+
? a.toLowerCase() === b.toLowerCase()
|
|
151
|
+
: a === b;
|
|
152
|
+
}
|
|
153
|
+
function globalInstallManagerForPath(bin, packageRoot) {
|
|
154
|
+
if (isPnpmManagedPackageDir(packageRoot, true)) {
|
|
155
|
+
return "pnpm";
|
|
156
|
+
}
|
|
157
|
+
if (isBunManagedPackageDir(packageRoot))
|
|
158
|
+
return "bun";
|
|
159
|
+
const prefix = npmPrefixFromPackageDir(packageRoot);
|
|
160
|
+
if (!prefix)
|
|
161
|
+
return null;
|
|
162
|
+
const normalizedRoot = packageRoot.replace(/\\/g, "/");
|
|
163
|
+
const normalizedPrefix = prefix.replace(/\\/g, "/").replace(/\/$/, "");
|
|
164
|
+
// POSIX global npm packages live under <prefix>/lib/node_modules. On
|
|
165
|
+
// Windows npm puts hq.cmd directly in <prefix>, so also verify the bin's
|
|
166
|
+
// directory against the prefix-derived shim location there.
|
|
167
|
+
const posixGlobal = normalizedRoot.includes("/lib/node_modules/");
|
|
168
|
+
const windowsGlobal = process.platform === "win32" &&
|
|
169
|
+
samePath(path.dirname(bin), normalizedPrefix);
|
|
170
|
+
return posixGlobal || windowsGlobal ? "npm" : null;
|
|
171
|
+
}
|
|
65
172
|
export function npmPrefixFromPackageDir(pkgDir) {
|
|
66
173
|
const normalized = pkgDir.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
67
174
|
const segments = normalized.split("/");
|
|
@@ -93,8 +200,8 @@ function pnpmHomeGlobalRoot() {
|
|
|
93
200
|
* on PATH:
|
|
94
201
|
*
|
|
95
202
|
* $PNPM_HOME/hq <- shim on PATH
|
|
96
|
-
* $PNPM_HOME/global/5/node_modules/@indigoai-us/hq-cli
|
|
97
|
-
* $PNPM_HOME/global/
|
|
203
|
+
* pnpm through v10: $PNPM_HOME/global/5/node_modules/@indigoai-us/hq-cli
|
|
204
|
+
* pnpm v11+: $PNPM_HOME/global/v11/<hash>/node_modules/@indigoai-us/hq-cli
|
|
98
205
|
*
|
|
99
206
|
* Both the symlinked and the resolved (`.pnpm`) form are recognised, because
|
|
100
207
|
* whether `import.meta.url` reports the link or its target depends on how node
|
|
@@ -108,18 +215,26 @@ function pnpmHomeGlobalRoot() {
|
|
|
108
215
|
* i.e. the gate would re-fire and re-install globally on every subsequent run.
|
|
109
216
|
* Those layouts fall through to the ordinary npm-prefix/manual handling.
|
|
110
217
|
*/
|
|
111
|
-
export function isPnpmManagedPackageDir(pkgDir) {
|
|
218
|
+
export function isPnpmManagedPackageDir(pkgDir, acceptVersionPrefixedGlobalDir = true) {
|
|
112
219
|
const normalized = pkgDir.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
113
220
|
const segments = normalized.split("/").filter(Boolean);
|
|
114
|
-
// `global/<digits
|
|
115
|
-
//
|
|
221
|
+
// pnpm through v10 uses `global/<digits>`; pnpm v11+ uses
|
|
222
|
+
// `global/v<major>`. Recognize both documented layouts, and require a
|
|
223
|
+
// version segment so `global/next` or a `v11` directory elsewhere cannot be
|
|
224
|
+
// mistaken for a global install.
|
|
116
225
|
for (let i = 0; i < segments.length - 1; i += 1) {
|
|
117
|
-
if (segments[i]
|
|
226
|
+
if (segments[i] !== "global")
|
|
227
|
+
continue;
|
|
228
|
+
const globalDirVersion = segments[i + 1];
|
|
229
|
+
if (/^\d+$/.test(globalDirVersion))
|
|
118
230
|
return true;
|
|
231
|
+
if (acceptVersionPrefixedGlobalDir && /^v\d+$/.test(globalDirVersion)) {
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
119
234
|
}
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
//
|
|
235
|
+
// PNPM_HOME/global is pnpm's configured global root by construction, so
|
|
236
|
+
// keep this fallback in both flag states. The flag above gates only the new
|
|
237
|
+
// documented global/v<major> segment match outside that configured root.
|
|
123
238
|
const globalRoot = pnpmHomeGlobalRoot();
|
|
124
239
|
if (globalRoot) {
|
|
125
240
|
if (normalized === globalRoot || normalized.startsWith(`${globalRoot}/`)) {
|
|
@@ -246,7 +361,7 @@ export function resolveRunningInstall() {
|
|
|
246
361
|
const packageRoot = findRunningPackageRoot();
|
|
247
362
|
if (!packageRoot)
|
|
248
363
|
return { manager: "npm", prefix: null, packageRoot: null };
|
|
249
|
-
if (isPnpmManagedPackageDir(packageRoot)) {
|
|
364
|
+
if (isPnpmManagedPackageDir(packageRoot, true)) {
|
|
250
365
|
return { manager: "pnpm", prefix: null, packageRoot };
|
|
251
366
|
}
|
|
252
367
|
if (isBunManagedPackageDir(packageRoot)) {
|
|
@@ -278,9 +393,9 @@ export function resolveRunningPrefix() {
|
|
|
278
393
|
return resolveRunningInstall().prefix;
|
|
279
394
|
}
|
|
280
395
|
/**
|
|
281
|
-
* Whether the current process can write the npm global
|
|
282
|
-
* an `npm install -g --prefix <prefix>` could actually replace the
|
|
283
|
-
* CLI, or would fail with EACCES.
|
|
396
|
+
* Whether the current process can write the npm global install targets — i.e.
|
|
397
|
+
* whether an `npm install -g --prefix <prefix>` could actually replace the
|
|
398
|
+
* installed CLI, or would fail with EACCES.
|
|
284
399
|
*
|
|
285
400
|
* The path npm rewrites is the prefix's `bin` dir (`<prefix>/bin/hq` on unix
|
|
286
401
|
* globals — the `rename /usr/bin/hq` EACCES the agent boxes hit), so that is
|
|
@@ -309,17 +424,119 @@ export function isPrefixWritable(prefix, access = (target, mode) => accessSync(t
|
|
|
309
424
|
return false;
|
|
310
425
|
}
|
|
311
426
|
/**
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
*
|
|
316
|
-
*
|
|
427
|
+
* Check the directories an npm global update must mutate before spawning npm.
|
|
428
|
+
* Npm replaces the package under node_modules and writes executable links
|
|
429
|
+
* under prefix/bin. The package's parent must be writable because npm renames
|
|
430
|
+
* the old package there.
|
|
431
|
+
*
|
|
432
|
+
* When one of those directories has not been created yet, check its nearest
|
|
433
|
+
* existing ancestor: npm can create a child only if that ancestor is writable.
|
|
317
434
|
*/
|
|
318
|
-
export function
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
435
|
+
export function canWriteNpmInstall(prefix, packageRoot, access = (target, mode) => accessSync(target, mode)) {
|
|
436
|
+
let nodeModulesRoot = path.join(prefix, process.platform === "win32" ? "node_modules" : "lib/node_modules");
|
|
437
|
+
let cursor = path.resolve(packageRoot);
|
|
438
|
+
while (true) {
|
|
439
|
+
if (path.basename(cursor).toLowerCase() === "node_modules") {
|
|
440
|
+
nodeModulesRoot = cursor;
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
const parent = path.dirname(cursor);
|
|
444
|
+
if (parent === cursor)
|
|
445
|
+
break;
|
|
446
|
+
cursor = parent;
|
|
447
|
+
}
|
|
448
|
+
const mode = fsConstants.W_OK | fsConstants.X_OK;
|
|
449
|
+
// npm needs write access to the directories it replaces or links into. The
|
|
450
|
+
// prefix root itself need not be writable when those directories already
|
|
451
|
+
// exist; when one is missing, the nearest-existing-ancestor check below
|
|
452
|
+
// still verifies permission to create it.
|
|
453
|
+
const targets = [path.join(prefix, "bin"), nodeModulesRoot, path.dirname(packageRoot)];
|
|
454
|
+
return targets.every((target) => {
|
|
455
|
+
let candidate = path.resolve(target);
|
|
456
|
+
while (true) {
|
|
457
|
+
try {
|
|
458
|
+
access(candidate, mode);
|
|
459
|
+
return true;
|
|
460
|
+
}
|
|
461
|
+
catch (error) {
|
|
462
|
+
if (error?.code !== "ENOENT") {
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
const parent = path.dirname(candidate);
|
|
466
|
+
if (parent === candidate)
|
|
467
|
+
return false;
|
|
468
|
+
candidate = parent;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
const nonWritablePrefixNotices = new Set();
|
|
474
|
+
/** Claim the one local warning/report for this installed version and prefix. */
|
|
475
|
+
export function claimNonWritableNpmPrefixNotice(install, fromVersion, homeDir = os.homedir(), kind = "user") {
|
|
476
|
+
const installIdentity = path.resolve(install.packageRoot ?? install.prefix ?? `${install.manager}:unknown-install`);
|
|
477
|
+
const identity = createHash("sha256")
|
|
478
|
+
.update(`${installIdentity}\0${fromVersion}`)
|
|
479
|
+
.digest("hex");
|
|
480
|
+
const localKey = path.join(homeDir, ".hq", "self-update", "prefix-not-writable", `${kind}-${identity}`);
|
|
481
|
+
if (nonWritablePrefixNotices.has(localKey))
|
|
482
|
+
return false;
|
|
483
|
+
try {
|
|
484
|
+
mkdirSync(path.dirname(localKey), { recursive: true, mode: 0o700 });
|
|
485
|
+
const descriptor = openSync(localKey, "wx", 0o600);
|
|
486
|
+
closeSync(descriptor);
|
|
487
|
+
nonWritablePrefixNotices.add(localKey);
|
|
488
|
+
return true;
|
|
489
|
+
}
|
|
490
|
+
catch (error) {
|
|
491
|
+
if (error?.code === "EEXIST") {
|
|
492
|
+
nonWritablePrefixNotices.add(localKey);
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
495
|
+
// Preserve the warning/report for this process if the home directory is
|
|
496
|
+
// unavailable. The marker is normally durable across CLI invocations.
|
|
497
|
+
console.error(chalk.dim("hq: could not persist the self-update permission notice rate limit."));
|
|
498
|
+
nonWritablePrefixNotices.add(localKey);
|
|
499
|
+
return true;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
/** Emit one path-free warning event for a handled non-writable npm prefix. */
|
|
503
|
+
export function captureNonWritableNpmPrefixNotice(input) {
|
|
504
|
+
if (isCliTelemetryDisabled(input.env ?? process.env))
|
|
505
|
+
return Promise.resolve();
|
|
506
|
+
const claimed = claimNonWritableNpmPrefixNotice(input.install, input.fromVersion, input.homeDir, "report");
|
|
507
|
+
if (!claimed)
|
|
508
|
+
return Promise.resolve();
|
|
509
|
+
Sentry.captureMessage("Self-update deferred: npm prefix is not writable", {
|
|
510
|
+
level: "warning",
|
|
511
|
+
fingerprint: ["self-update", "npm-prefix-not-writable"],
|
|
512
|
+
tags: {
|
|
513
|
+
from_version: input.fromVersion,
|
|
514
|
+
target_version: input.targetVersion,
|
|
515
|
+
install_flavor: "npm",
|
|
516
|
+
error_class: "prefix_not_writable",
|
|
517
|
+
error_reason: "permission_denied",
|
|
518
|
+
},
|
|
519
|
+
});
|
|
520
|
+
return Sentry.flush(2_000).then((flushed) => {
|
|
521
|
+
if (!flushed) {
|
|
522
|
+
console.error(chalk.dim("hq: the self-update permission notice could not be sent to Sentry yet."));
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
/** One-line repair guidance for a global npm install the current user cannot write. */
|
|
527
|
+
export function nonWritablePrefixNote(prefix, platform = process.platform) {
|
|
528
|
+
const prefixArg = `'${prefix.replace(/'/g, "'\\''")}'`;
|
|
529
|
+
if (platform === "win32") {
|
|
530
|
+
const windowsPrefixArg = `"${prefix.replace(/"/g, '""')}"`;
|
|
531
|
+
return (`The npm global prefix ${prefix} is not writable by the current user, so hq-cli was not updated. ` +
|
|
532
|
+
`Open PowerShell as Administrator and run \`npm install -g --prefix ${windowsPrefixArg} ${CLI_NAME}@latest\`, ` +
|
|
533
|
+
`or set a user-owned prefix with \`npm config set prefix "$env:APPDATA\\npm"\` and run ` +
|
|
534
|
+
`\`npm install -g ${CLI_NAME}@latest\` from that PowerShell session.`);
|
|
535
|
+
}
|
|
536
|
+
return (`The npm global prefix ${prefix} is not writable by the current user, so hq-cli was not updated. ` +
|
|
537
|
+
`Run \`sudo npm install -g --prefix ${prefixArg} ${CLI_NAME}@latest\` to update this install, ` +
|
|
538
|
+
`or switch to a user-owned prefix with \`npm config set prefix ~/.npm-global\`, then run ` +
|
|
539
|
+
`\`npm install -g ${CLI_NAME}@latest\` after adding ~/.npm-global/bin to PATH.`);
|
|
323
540
|
}
|
|
324
541
|
/**
|
|
325
542
|
* Derive `PNPM_HOME` from a pnpm-managed install's own path. pnpm resolves its
|
|
@@ -470,7 +687,7 @@ export function cleanStalePartialInstall(prefix, fs = nodeStaleInstallFs) {
|
|
|
470
687
|
* `null` on any failure (caller treats as "no gate"). Tight 3s timeout —
|
|
471
688
|
* a hung server must not delay CLI startup.
|
|
472
689
|
*/
|
|
473
|
-
async function fetchVersionDecision() {
|
|
690
|
+
async function fetchVersionDecision(timeoutMs = FETCH_TIMEOUT_MS) {
|
|
474
691
|
try {
|
|
475
692
|
const url = `${DEFAULT_VAULT_API_URL}${ENDPOINT_PATH}`;
|
|
476
693
|
const res = await fetch(url, {
|
|
@@ -484,7 +701,7 @@ async function fetchVersionDecision() {
|
|
|
484
701
|
currentVersion: CLI_VERSION,
|
|
485
702
|
platform: `${process.platform}-${process.arch}`,
|
|
486
703
|
}),
|
|
487
|
-
signal: AbortSignal.timeout(
|
|
704
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
488
705
|
});
|
|
489
706
|
if (!res.ok)
|
|
490
707
|
return null;
|
|
@@ -530,20 +747,185 @@ export { buildSpawnPlan, quoteForWindowsShell };
|
|
|
530
747
|
* protection silently disappearing.
|
|
531
748
|
*/
|
|
532
749
|
export function inOwnProcessGroup(options) {
|
|
533
|
-
return { ...options, detached: true };
|
|
750
|
+
return { ...options, detached: true, windowsHide: true };
|
|
534
751
|
}
|
|
535
752
|
/** Tail of captured installer stderr kept to explain a failure. */
|
|
536
753
|
const INSTALL_DETAIL_MAX_CHARS = 400;
|
|
754
|
+
const KNOWN_NPM_UPDATE_ERROR_CODES = new Set([
|
|
755
|
+
"E404",
|
|
756
|
+
"EACCES",
|
|
757
|
+
"EAI_AGAIN",
|
|
758
|
+
"ECONNREFUSED",
|
|
759
|
+
"ECONNRESET",
|
|
760
|
+
"ENOTFOUND",
|
|
761
|
+
"EPERM",
|
|
762
|
+
"ETARGET",
|
|
763
|
+
"ETIMEDOUT",
|
|
764
|
+
]);
|
|
765
|
+
function knownNpmUpdateErrorCode(stderr) {
|
|
766
|
+
const escape = String.fromCharCode(0x1b);
|
|
767
|
+
const plainStderr = stderr.replace(new RegExp(`${escape}\\[[0-9;]*m`, "g"), "");
|
|
768
|
+
const match = /^[ \t]*npm[ \t]+(?:ERR!|error)[ \t]+code[ \t]+([A-Z0-9_]{1,32})[ \t]*$/im.exec(plainStderr);
|
|
769
|
+
const code = match?.[1]?.toUpperCase();
|
|
770
|
+
return code && KNOWN_NPM_UPDATE_ERROR_CODES.has(code) ? code : undefined;
|
|
771
|
+
}
|
|
772
|
+
function readKnownNpmDiagnosticCode(filename) {
|
|
773
|
+
if (!existsSync(filename))
|
|
774
|
+
return undefined;
|
|
775
|
+
try {
|
|
776
|
+
const contents = readFileSync(filename, "utf-8").trim();
|
|
777
|
+
if (KNOWN_NPM_UPDATE_ERROR_CODES.has(contents))
|
|
778
|
+
return contents;
|
|
779
|
+
return knownNpmUpdateErrorCode(contents);
|
|
780
|
+
}
|
|
781
|
+
catch (error) {
|
|
782
|
+
const code = error &&
|
|
783
|
+
typeof error === "object" &&
|
|
784
|
+
"code" in error &&
|
|
785
|
+
typeof error.code === "string" &&
|
|
786
|
+
/^[A-Z0-9_]{1,32}$/.test(error.code)
|
|
787
|
+
? error.code
|
|
788
|
+
: error instanceof Error
|
|
789
|
+
? "Error"
|
|
790
|
+
: "UnknownError";
|
|
791
|
+
console.error(chalk.yellow(`Could not read update diagnostic output (${code}).`));
|
|
792
|
+
return undefined;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
/** Give a package-manager update ample time without letting it wedge every CLI call. */
|
|
796
|
+
const DEFAULT_UPDATE_TIMEOUT_MS = 30 * 60 * 1_000;
|
|
797
|
+
/** Node clamps longer timer delays to 1ms, so accepting them would invert the deadline. */
|
|
798
|
+
const MAX_UPDATE_TIMEOUT_MS = 2_147_483_647;
|
|
799
|
+
/** Let a well-behaved updater stop before force-killing the rest of its group. */
|
|
800
|
+
const UPDATE_TERMINATE_GRACE_MS = 1_000;
|
|
801
|
+
/** A successful group kill must still yield a close event so the supervisor reaps its child. */
|
|
802
|
+
const UPDATE_REAP_GRACE_MS = 1_000;
|
|
803
|
+
function updateTimeoutMs(env = process.env) {
|
|
804
|
+
const value = env.HQ_UPDATE_TIMEOUT_MS;
|
|
805
|
+
if (value === undefined || value.trim() === "")
|
|
806
|
+
return DEFAULT_UPDATE_TIMEOUT_MS;
|
|
807
|
+
const parsed = Number(value);
|
|
808
|
+
if (Number.isInteger(parsed) && parsed > 0 && parsed <= MAX_UPDATE_TIMEOUT_MS) {
|
|
809
|
+
return parsed;
|
|
810
|
+
}
|
|
811
|
+
// Falling back rather than clamping is deliberate: a clamp would silently
|
|
812
|
+
// substitute a materially different deadline. The warning tells operators
|
|
813
|
+
// their requested value was rejected before any update begins.
|
|
814
|
+
console.error(chalk.yellow(`⚠ Ignoring HQ_UPDATE_TIMEOUT_MS=${JSON.stringify(value)}: expected a positive integer no greater than ${MAX_UPDATE_TIMEOUT_MS}ms; using ${DEFAULT_UPDATE_TIMEOUT_MS}ms.`));
|
|
815
|
+
return DEFAULT_UPDATE_TIMEOUT_MS;
|
|
816
|
+
}
|
|
817
|
+
/**
|
|
818
|
+
* The actual installer runs in a small asynchronous supervisor, rather than
|
|
819
|
+
* directly under `spawnSync`. `spawnSync({ timeout })` only signals its direct
|
|
820
|
+
* child. That is unsafe here because the installer deliberately runs in its
|
|
821
|
+
* own process group: the leader can exit while its descendants keep the global
|
|
822
|
+
* store and registry connection alive. The CommonJS file is copied next to the
|
|
823
|
+
* compiled module for production and is directly runnable from source tests.
|
|
824
|
+
*/
|
|
825
|
+
const UPDATE_COMMAND_SUPERVISOR = fileURLToPath(new URL("./update-command-supervisor.cjs", import.meta.url));
|
|
826
|
+
/** Set while a self-update runs the installer through a copy of the supervisor. */
|
|
827
|
+
let detachedSupervisor = null;
|
|
828
|
+
/** The supervisor script the next install runs under. */
|
|
829
|
+
export function updateSupervisorPath() {
|
|
830
|
+
return detachedSupervisor ?? UPDATE_COMMAND_SUPERVISOR;
|
|
831
|
+
}
|
|
832
|
+
/**
|
|
833
|
+
* Copies the supervisor to a temp dir and runs installs through the copy until
|
|
834
|
+
* disposed. The in-place self-update moves the whole hq-cli package aside
|
|
835
|
+
* before it starts the installer, and the supervisor ships inside that package
|
|
836
|
+
* (5.290.0-5.292.0 failed every npm global self-update with MODULE_NOT_FOUND).
|
|
837
|
+
* The script needs only Node builtins, so the copy runs on its own. Returns
|
|
838
|
+
* null when the copy cannot be made; the caller then keeps the bundled path.
|
|
839
|
+
*/
|
|
840
|
+
export function detachUpdateSupervisor() {
|
|
841
|
+
if (detachedSupervisor)
|
|
842
|
+
return null;
|
|
843
|
+
let dir;
|
|
844
|
+
try {
|
|
845
|
+
dir = mkdtempSync(path.join(os.tmpdir(), "hq-cli-update-supervisor-"));
|
|
846
|
+
const copy = path.join(dir, "update-command-supervisor.cjs");
|
|
847
|
+
copyFileSync(UPDATE_COMMAND_SUPERVISOR, copy);
|
|
848
|
+
detachedSupervisor = copy;
|
|
849
|
+
const tempDir = dir;
|
|
850
|
+
return {
|
|
851
|
+
path: copy,
|
|
852
|
+
dispose: () => {
|
|
853
|
+
if (detachedSupervisor === copy)
|
|
854
|
+
detachedSupervisor = null;
|
|
855
|
+
try {
|
|
856
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
857
|
+
}
|
|
858
|
+
catch (error) {
|
|
859
|
+
const failureClass = error &&
|
|
860
|
+
typeof error === "object" &&
|
|
861
|
+
"code" in error &&
|
|
862
|
+
typeof error.code === "string" &&
|
|
863
|
+
/^[A-Z0-9_]{1,32}$/.test(error.code)
|
|
864
|
+
? error.code
|
|
865
|
+
: error instanceof Error
|
|
866
|
+
? "Error"
|
|
867
|
+
: "UnknownError";
|
|
868
|
+
console.error(chalk.yellow(`Could not remove update supervisor temp dir (${failureClass}).`));
|
|
869
|
+
}
|
|
870
|
+
},
|
|
871
|
+
};
|
|
872
|
+
}
|
|
873
|
+
catch (error) {
|
|
874
|
+
const failureClass = error &&
|
|
875
|
+
typeof error === "object" &&
|
|
876
|
+
"code" in error &&
|
|
877
|
+
typeof error.code === "string" &&
|
|
878
|
+
/^[A-Z0-9_]{1,32}$/.test(error.code)
|
|
879
|
+
? error.code
|
|
880
|
+
: error instanceof Error
|
|
881
|
+
? "Error"
|
|
882
|
+
: "UnknownError";
|
|
883
|
+
console.error(chalk.yellow(`Could not copy update supervisor (${failureClass}).`));
|
|
884
|
+
if (dir)
|
|
885
|
+
rmSync(dir, { recursive: true, force: true });
|
|
886
|
+
return null;
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
function readSupervisorSpawnError(errorMarker) {
|
|
890
|
+
try {
|
|
891
|
+
const value = JSON.parse(readFileSync(errorMarker, "utf-8"));
|
|
892
|
+
const code = typeof value.code === "string" ? value.code : undefined;
|
|
893
|
+
const detail = typeof value.detail === "string" ? value.detail : undefined;
|
|
894
|
+
return code === undefined && detail === undefined ? undefined : { code, detail };
|
|
895
|
+
}
|
|
896
|
+
catch {
|
|
897
|
+
return undefined;
|
|
898
|
+
}
|
|
899
|
+
}
|
|
537
900
|
export function openInstallOutput(verbose, isTty = process.stdout.isTTY === true && process.stderr.isTTY === true) {
|
|
538
901
|
if (verbose && isTty) {
|
|
902
|
+
const dir = mkdtempSync(path.join(os.tmpdir(), "hq-cli-install-"));
|
|
903
|
+
const timeoutMarker = path.join(dir, "timed-out");
|
|
904
|
+
const errorMarker = path.join(dir, "spawn-error.json");
|
|
905
|
+
const diagnosticMarker = path.join(dir, "npm-error-code");
|
|
539
906
|
return {
|
|
540
907
|
stdio: ["ignore", "inherit", "inherit"],
|
|
541
908
|
stderrTail: () => "",
|
|
542
|
-
|
|
909
|
+
diagnosticCode: () => readKnownNpmDiagnosticCode(diagnosticMarker),
|
|
910
|
+
diagnosticMarker,
|
|
911
|
+
timeoutMarker,
|
|
912
|
+
errorMarker,
|
|
913
|
+
timedOut: () => existsSync(timeoutMarker),
|
|
914
|
+
spawnError: () => readSupervisorSpawnError(errorMarker),
|
|
915
|
+
dispose: () => {
|
|
916
|
+
try {
|
|
917
|
+
rmSync(dir, { recursive: true, force: true });
|
|
918
|
+
}
|
|
919
|
+
catch {
|
|
920
|
+
// Best-effort cleanup of the supervisor's timeout marker.
|
|
921
|
+
}
|
|
922
|
+
},
|
|
543
923
|
};
|
|
544
924
|
}
|
|
545
925
|
const dir = mkdtempSync(path.join(os.tmpdir(), "hq-cli-install-"));
|
|
546
926
|
const errPath = path.join(dir, "stderr.log");
|
|
927
|
+
const timeoutPath = path.join(dir, "timed-out");
|
|
928
|
+
const errorPath = path.join(dir, "spawn-error.json");
|
|
547
929
|
const out = openSync(path.join(dir, "stdout.log"), "a");
|
|
548
930
|
const err = openSync(errPath, "a");
|
|
549
931
|
return {
|
|
@@ -556,6 +938,11 @@ export function openInstallOutput(verbose, isTty = process.stdout.isTTY === true
|
|
|
556
938
|
return "";
|
|
557
939
|
}
|
|
558
940
|
},
|
|
941
|
+
diagnosticCode: () => readKnownNpmDiagnosticCode(errPath),
|
|
942
|
+
timeoutMarker: timeoutPath,
|
|
943
|
+
errorMarker: errorPath,
|
|
944
|
+
timedOut: () => existsSync(timeoutPath),
|
|
945
|
+
spawnError: () => readSupervisorSpawnError(errorPath),
|
|
559
946
|
dispose: () => {
|
|
560
947
|
for (const fd of [out, err]) {
|
|
561
948
|
try {
|
|
@@ -574,13 +961,29 @@ export function openInstallOutput(verbose, isTty = process.stdout.isTTY === true
|
|
|
574
961
|
},
|
|
575
962
|
};
|
|
576
963
|
}
|
|
577
|
-
export function
|
|
578
|
-
const output = openInstallOutput(true);
|
|
964
|
+
export function runSupervisedUpdateCommand(cmd, args, output, env) {
|
|
579
965
|
try {
|
|
580
966
|
const plan = buildSpawnPlan(cmd, args);
|
|
581
|
-
const
|
|
967
|
+
const timeoutMs = updateTimeoutMs(env);
|
|
968
|
+
// The outer sync spawn waits only for our supervisor. The supervisor owns
|
|
969
|
+
// the wall-clock deadline, sends TERM to the updater's whole process group,
|
|
970
|
+
// waits briefly, sends KILL to survivors, and waits for its direct child so
|
|
971
|
+
// the completed result leaves no zombie behind.
|
|
972
|
+
const result = spawnSync(process.execPath, [
|
|
973
|
+
updateSupervisorPath(),
|
|
974
|
+
JSON.stringify({
|
|
975
|
+
cmd: plan.cmd,
|
|
976
|
+
args: plan.args,
|
|
977
|
+
shell: plan.shell,
|
|
978
|
+
timeoutMs,
|
|
979
|
+
graceMs: UPDATE_TERMINATE_GRACE_MS,
|
|
980
|
+
reapMs: UPDATE_REAP_GRACE_MS,
|
|
981
|
+
timeoutMarker: output.timeoutMarker,
|
|
982
|
+
errorMarker: output.errorMarker,
|
|
983
|
+
diagnosticMarker: output.diagnosticMarker,
|
|
984
|
+
}),
|
|
985
|
+
], inOwnProcessGroup({
|
|
582
986
|
stdio: output.stdio,
|
|
583
|
-
shell: plan.shell,
|
|
584
987
|
...(env ? { env } : {}),
|
|
585
988
|
}));
|
|
586
989
|
// spawnSync reports a missing executable via `error`, not a throw.
|
|
@@ -588,12 +991,34 @@ export function runUpdateCommand(cmd, args, env) {
|
|
|
588
991
|
const code = result.error.code;
|
|
589
992
|
return { ok: false, code, detail: result.error.message };
|
|
590
993
|
}
|
|
994
|
+
if (output.timedOut()) {
|
|
995
|
+
const command = [cmd, ...args].join(" ");
|
|
996
|
+
const supervisorError = output.spawnError();
|
|
997
|
+
const detail = [
|
|
998
|
+
`timed out after ${timeoutMs}ms: ${command}`,
|
|
999
|
+
supervisorError?.detail,
|
|
1000
|
+
]
|
|
1001
|
+
.filter(Boolean)
|
|
1002
|
+
.join("; ");
|
|
1003
|
+
console.error(chalk.red(`✗ Update ${detail}.`));
|
|
1004
|
+
return { ok: false, code: "ETIMEDOUT", detail };
|
|
1005
|
+
}
|
|
1006
|
+
const spawnedError = output.spawnError();
|
|
1007
|
+
if (spawnedError) {
|
|
1008
|
+
return {
|
|
1009
|
+
ok: false,
|
|
1010
|
+
code: spawnedError.code,
|
|
1011
|
+
detail: spawnedError.detail ?? "failed to start updater",
|
|
1012
|
+
};
|
|
1013
|
+
}
|
|
591
1014
|
if (result.status !== 0) {
|
|
592
1015
|
// When output went to a file rather than the user's terminal, its tail is
|
|
593
1016
|
// the only explanation anyone will ever see for this failure.
|
|
594
1017
|
const captured = output.stderrTail();
|
|
595
1018
|
return {
|
|
596
1019
|
ok: false,
|
|
1020
|
+
diagnosticCode: output.diagnosticCode(),
|
|
1021
|
+
failureKind: "package_manager_exit",
|
|
597
1022
|
detail: captured || `exit ${result.status ?? "signal"}`,
|
|
598
1023
|
};
|
|
599
1024
|
}
|
|
@@ -606,6 +1031,12 @@ export function runUpdateCommand(cmd, args, env) {
|
|
|
606
1031
|
detail: err instanceof Error ? err.message : String(err),
|
|
607
1032
|
};
|
|
608
1033
|
}
|
|
1034
|
+
}
|
|
1035
|
+
export function runUpdateCommand(cmd, args, env) {
|
|
1036
|
+
const output = openInstallOutput(true);
|
|
1037
|
+
try {
|
|
1038
|
+
return runSupervisedUpdateCommand(cmd, args, output, env);
|
|
1039
|
+
}
|
|
609
1040
|
finally {
|
|
610
1041
|
output.dispose();
|
|
611
1042
|
}
|
|
@@ -656,7 +1087,9 @@ function manualUpdateCommand(install, decision) {
|
|
|
656
1087
|
* remains for callers that pass no handler.
|
|
657
1088
|
*/
|
|
658
1089
|
function nudgeUpdateRecommended(decision, install = resolveRunningInstall()) {
|
|
659
|
-
|
|
1090
|
+
if (!isNewerVersion(decision.latestVersion, CLI_VERSION))
|
|
1091
|
+
return;
|
|
1092
|
+
const msg = chalk.yellow(`⚠ A new version of hq-cli is available: ${decision.latestVersion} (current: ${CLI_VERSION}).`);
|
|
660
1093
|
console.error(msg);
|
|
661
1094
|
// A local copy is not updated by any global command. Printing the server's
|
|
662
1095
|
// npm-shaped one would send the user to install a second copy that this
|
|
@@ -707,6 +1140,44 @@ export function resolveHqOnPath() {
|
|
|
707
1140
|
return null;
|
|
708
1141
|
}
|
|
709
1142
|
}
|
|
1143
|
+
/**
|
|
1144
|
+
* Pull the CLI version out of `hq --version` / `hq version` output.
|
|
1145
|
+
*
|
|
1146
|
+
* Compare CLI to CLI. Never take the first version-shaped token: 5.119.13–
|
|
1147
|
+
* 5.121.0 printed `HQ <core>` above `CLI <cli>`, and scraping the HQ line
|
|
1148
|
+
* made a successful install look like a PATH shadow.
|
|
1149
|
+
*
|
|
1150
|
+
* Accepts:
|
|
1151
|
+
* - bare semver (historical `--version`, and `--version` again after this fix)
|
|
1152
|
+
* - labelled `CLI x.y.z` (those 5.119.13–5.121.0 builds)
|
|
1153
|
+
* - JSON `{ "cli": "x.y.z", ... }` from `--json`
|
|
1154
|
+
*/
|
|
1155
|
+
export function parseReportedCliVersion(stdout) {
|
|
1156
|
+
const text = stdout.trim();
|
|
1157
|
+
if (!text)
|
|
1158
|
+
return null;
|
|
1159
|
+
if (text.startsWith("{")) {
|
|
1160
|
+
try {
|
|
1161
|
+
const parsed = JSON.parse(text);
|
|
1162
|
+
if (typeof parsed.cli === "string" && parsed.cli.trim()) {
|
|
1163
|
+
return parsed.cli.trim();
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
catch {
|
|
1167
|
+
// Fall through to labelled / bare parsers.
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
const labelled = /^[ \t]*CLI[ \t]+(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)/m.exec(text);
|
|
1171
|
+
if (labelled)
|
|
1172
|
+
return labelled[1];
|
|
1173
|
+
const lines = text
|
|
1174
|
+
.split(/\r?\n/)
|
|
1175
|
+
.map((line) => line.trim())
|
|
1176
|
+
.filter(Boolean);
|
|
1177
|
+
if (lines.length === 1)
|
|
1178
|
+
return lines[0];
|
|
1179
|
+
return null;
|
|
1180
|
+
}
|
|
710
1181
|
/** `<bin> --version` output (trimmed), or null on any failure/timeout. */
|
|
711
1182
|
export function probeCliVersion(bin) {
|
|
712
1183
|
try {
|
|
@@ -716,8 +1187,7 @@ export function probeCliVersion(bin) {
|
|
|
716
1187
|
});
|
|
717
1188
|
if (result.error || result.status !== 0)
|
|
718
1189
|
return null;
|
|
719
|
-
|
|
720
|
-
return out || null;
|
|
1190
|
+
return parseReportedCliVersion(result.stdout ?? "");
|
|
721
1191
|
}
|
|
722
1192
|
catch {
|
|
723
1193
|
return null;
|
|
@@ -732,9 +1202,10 @@ export function probeCliVersion(bin) {
|
|
|
732
1202
|
* pnpm-global shim at `~/Library/pnpm/bin/hq` shadowing the npm bin dir),
|
|
733
1203
|
* every updater on the box probes the ghost's version, sees it stale, installs
|
|
734
1204
|
* into the npm prefix, reports success, and repeats forever — the production
|
|
735
|
-
* updater-war this fix exists for. Detect
|
|
736
|
-
*
|
|
737
|
-
* same prefix can change
|
|
1205
|
+
* updater-war this fix exists for. Detect a stale PATH result here, identify a
|
|
1206
|
+
* distinct package managed by a supported global manager before calling it a
|
|
1207
|
+
* shadow, and never retry: no number of retries into the same prefix can change
|
|
1208
|
+
* what PATH resolves.
|
|
738
1209
|
*
|
|
739
1210
|
* Advisory only — resolution failure warns once and continues; nothing in
|
|
740
1211
|
* here may crash or block the CLI.
|
|
@@ -754,12 +1225,6 @@ export function checkUpdateConvergence(targetVersion, deps = {}) {
|
|
|
754
1225
|
}
|
|
755
1226
|
if (reported === targetVersion)
|
|
756
1227
|
return true; // converged — the normal case
|
|
757
|
-
console.error(chalk.yellow(`⚠ hq updated to ${targetVersion} but PATH still resolves ${bin} at version ${reported} — ` +
|
|
758
|
-
`a second install is shadowing the managed one. Remove it (e.g. \`pnpm remove -g ${CLI_NAME}\`) ` +
|
|
759
|
-
"or the updater will loop forever."));
|
|
760
|
-
// The warning above fires for ANY mismatch — something other than the copy
|
|
761
|
-
// we just wrote is winning PATH resolution, which is worth saying either
|
|
762
|
-
// way. But only a STALE result disproves convergence.
|
|
763
1228
|
//
|
|
764
1229
|
// The install runs `@latest`, not `@<targetVersion>`, so it can legitimately
|
|
765
1230
|
// land a version NEWER than the `latestVersion` the gate was handed: the npm
|
|
@@ -774,6 +1239,36 @@ export function checkUpdateConvergence(targetVersion, deps = {}) {
|
|
|
774
1239
|
semver.gte(reportedSemver, targetSemver)) {
|
|
775
1240
|
return true;
|
|
776
1241
|
}
|
|
1242
|
+
const runningInstall = (deps.currentInstall ?? resolveRunningInstall)();
|
|
1243
|
+
const packageRoot = (deps.packageRootForBin ?? findPackageRootForExecutable)(bin);
|
|
1244
|
+
const manager = packageRoot &&
|
|
1245
|
+
runningInstall.packageRoot &&
|
|
1246
|
+
!samePath(packageRoot, runningInstall.packageRoot)
|
|
1247
|
+
? globalInstallManagerForPath(bin, packageRoot)
|
|
1248
|
+
: null;
|
|
1249
|
+
let detail;
|
|
1250
|
+
if (manager) {
|
|
1251
|
+
const removeCommand = manager === "pnpm"
|
|
1252
|
+
? `pnpm remove -g ${CLI_NAME}`
|
|
1253
|
+
: manager === "bun"
|
|
1254
|
+
? `bun remove -g ${CLI_NAME}`
|
|
1255
|
+
: `npm uninstall -g ${CLI_NAME}`;
|
|
1256
|
+
let realPath = bin;
|
|
1257
|
+
try {
|
|
1258
|
+
realPath = realpathSync(bin);
|
|
1259
|
+
}
|
|
1260
|
+
catch {
|
|
1261
|
+
// Keep the shell-resolved path when a platform shim is not canonicalizable.
|
|
1262
|
+
}
|
|
1263
|
+
detail =
|
|
1264
|
+
`PATH resolves ${realPath} at version ${reported} (manager: ${manager}); ` +
|
|
1265
|
+
`that second hq-cli install is shadowing the managed one. Remove it with \`${removeCommand}\`.`;
|
|
1266
|
+
}
|
|
1267
|
+
else {
|
|
1268
|
+
detail =
|
|
1269
|
+
`PATH resolves ${bin} at version ${reported}, but no second managed hq-cli install was confirmed.`;
|
|
1270
|
+
}
|
|
1271
|
+
console.error(chalk.yellow(`⚠ hq updated to ${targetVersion} but did not converge: ${detail}`));
|
|
777
1272
|
return false;
|
|
778
1273
|
}
|
|
779
1274
|
catch {
|
|
@@ -796,9 +1291,13 @@ export function checkUpdateConvergence(targetVersion, deps = {}) {
|
|
|
796
1291
|
* Exit codes:
|
|
797
1292
|
* 0 — update succeeded; user must rerun their command
|
|
798
1293
|
* 75 — update failed (EX_TEMPFAIL; common for sudo/EACCES on system npm)
|
|
1294
|
+
*
|
|
1295
|
+
* A timed-out updater is the exception: it has been forcibly reaped, so the
|
|
1296
|
+
* gate returns and lets the user's command run on the current version.
|
|
799
1297
|
*/
|
|
800
1298
|
function enforceUpdateRequired(decision, deps = {}) {
|
|
801
|
-
|
|
1299
|
+
currentVersionGatePhase = "preflight";
|
|
1300
|
+
const banner = chalk.red.bold(`✗ hq-cli ${CLI_VERSION} is below the minimum required version (${decision.minVersion}).`);
|
|
802
1301
|
console.error(banner);
|
|
803
1302
|
if (decision.message)
|
|
804
1303
|
console.error(chalk.dim(` ${decision.message}`));
|
|
@@ -824,8 +1323,8 @@ function enforceUpdateRequired(decision, deps = {}) {
|
|
|
824
1323
|
// stale dist-tag, a bad cache, a misconfigured pin), reinstalling it on every
|
|
825
1324
|
// invocation and announcing success each time is strictly worse than saying
|
|
826
1325
|
// so once.
|
|
827
|
-
if (!isNewerVersion(decision.latestVersion,
|
|
828
|
-
console.error(chalk.red(` Refusing to update: the offered version ${decision.latestVersion} is not newer than the
|
|
1326
|
+
if (!isNewerVersion(decision.latestVersion, CLI_VERSION)) {
|
|
1327
|
+
console.error(chalk.red(` Refusing to update: the offered version ${decision.latestVersion} is not newer than the running ${CLI_VERSION}.`));
|
|
829
1328
|
console.error(chalk.dim(" This is a server-side or registry problem, not a local one — reinstalling would loop without ever converging."));
|
|
830
1329
|
process.exit(75);
|
|
831
1330
|
}
|
|
@@ -848,17 +1347,30 @@ function enforceUpdateRequired(decision, deps = {}) {
|
|
|
848
1347
|
console.error(chalk.dim(" Another hq updater is already installing (update lock held); continuing on the current version."));
|
|
849
1348
|
return;
|
|
850
1349
|
}
|
|
851
|
-
|
|
1350
|
+
currentVersionGatePhase = "lock_acquired";
|
|
1351
|
+
let attempt;
|
|
852
1352
|
try {
|
|
853
|
-
|
|
1353
|
+
attempt = attemptRequiredUpdate(decision, deps, install);
|
|
854
1354
|
}
|
|
855
|
-
|
|
856
|
-
// `process.exit` skips `finally` blocks, so the exit itself lives OUTSIDE
|
|
857
|
-
// the lock scope; this `finally` releases on the normal path and on any
|
|
858
|
-
// unexpected throw from the install attempt.
|
|
1355
|
+
catch (error) {
|
|
859
1356
|
lock.release();
|
|
1357
|
+
throw error;
|
|
860
1358
|
}
|
|
861
|
-
|
|
1359
|
+
if (attempt instanceof Promise) {
|
|
1360
|
+
return attempt.then((exitCode) => {
|
|
1361
|
+
lock.release();
|
|
1362
|
+
if (exitCode !== "continue")
|
|
1363
|
+
process.exit(exitCode);
|
|
1364
|
+
}, (error) => {
|
|
1365
|
+
lock.release();
|
|
1366
|
+
throw error;
|
|
1367
|
+
});
|
|
1368
|
+
}
|
|
1369
|
+
// `process.exit` skips `finally`, so release explicitly before exiting.
|
|
1370
|
+
lock.release();
|
|
1371
|
+
if (attempt === "continue")
|
|
1372
|
+
return;
|
|
1373
|
+
process.exit(attempt);
|
|
862
1374
|
}
|
|
863
1375
|
/**
|
|
864
1376
|
* The install attempt itself (npm/pnpm/bun routing, stale-partial cleanup,
|
|
@@ -870,6 +1382,7 @@ function attemptRequiredUpdate(decision, deps, install) {
|
|
|
870
1382
|
const command = decision.updateCommand;
|
|
871
1383
|
const isManagedOutsideNpm = install.manager !== "npm";
|
|
872
1384
|
const prefix = install.prefix;
|
|
1385
|
+
const stagedNpmPrefix = Boolean(!isManagedOutsideNpm && prefix && /\s/.test(prefix));
|
|
873
1386
|
const runner = deps.runner ?? runUpdateCommand;
|
|
874
1387
|
// Resolve the concrete install argv once so the sudo fallback below can re-run
|
|
875
1388
|
// the EXACT same command under elevation.
|
|
@@ -899,6 +1412,8 @@ function attemptRequiredUpdate(decision, deps, install) {
|
|
|
899
1412
|
// npm/bun and when PNPM_HOME is already set.
|
|
900
1413
|
const updateEnv = pnpmUpdateEnv(install);
|
|
901
1414
|
let result;
|
|
1415
|
+
let noticeFlush = null;
|
|
1416
|
+
currentVersionGatePhase = "installer_running";
|
|
902
1417
|
if (isManagedOutsideNpm) {
|
|
903
1418
|
console.error(chalk.dim(` Detected a ${install.manager}-managed global install; updating with ${install.manager}`));
|
|
904
1419
|
console.error(chalk.dim(` Running: ${primaryCmd} ${primaryArgs.join(" ")}`));
|
|
@@ -906,8 +1421,20 @@ function attemptRequiredUpdate(decision, deps, install) {
|
|
|
906
1421
|
}
|
|
907
1422
|
else if (prefix) {
|
|
908
1423
|
console.error(chalk.dim(` Installing into npm prefix: ${prefix}`));
|
|
909
|
-
|
|
910
|
-
|
|
1424
|
+
if (stagedNpmPrefix) {
|
|
1425
|
+
console.error(chalk.dim(" Building in a space-free temporary prefix before activation."));
|
|
1426
|
+
const installStaged = deps.installNpmPackageStaged;
|
|
1427
|
+
if (!installStaged) {
|
|
1428
|
+
result = { ok: false, detail: "staged npm installer was not loaded" };
|
|
1429
|
+
}
|
|
1430
|
+
else {
|
|
1431
|
+
result = installStaged(prefix, LATEST_PACKAGE_SPEC, runner);
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
else {
|
|
1435
|
+
console.error(chalk.dim(` Running: npm ${primaryArgs.join(" ")}`));
|
|
1436
|
+
result = performUpdateCommand("npm", primaryArgs, runner);
|
|
1437
|
+
}
|
|
911
1438
|
}
|
|
912
1439
|
else {
|
|
913
1440
|
console.error(chalk.dim(` Running: ${command}`));
|
|
@@ -923,7 +1450,7 @@ function attemptRequiredUpdate(decision, deps, install) {
|
|
|
923
1450
|
// artifacts and retry the install ONCE. Guarded on `cleaned.length > 0` so a
|
|
924
1451
|
// plain EACCES on an otherwise-healthy prefix falls straight through to the
|
|
925
1452
|
// sudo retry below without a redundant reinstall attempt.
|
|
926
|
-
if (!result.ok && prefix) {
|
|
1453
|
+
if (!result.ok && result.code !== "ETIMEDOUT" && prefix && !stagedNpmPrefix) {
|
|
927
1454
|
const cleaner = deps.cleanStale ?? cleanStalePartialInstall;
|
|
928
1455
|
const cleaned = cleaner(prefix);
|
|
929
1456
|
if (cleaned.length > 0) {
|
|
@@ -943,20 +1470,37 @@ function attemptRequiredUpdate(decision, deps, install) {
|
|
|
943
1470
|
// Never for pnpm or Bun: elevation changes the package manager's global home,
|
|
944
1471
|
// leaving the user's shim untouched while reporting success. A failed
|
|
945
1472
|
// non-npm update must surface instead.
|
|
946
|
-
|
|
1473
|
+
const platform = deps.platform ?? process.platform;
|
|
1474
|
+
if (platform !== "win32" &&
|
|
1475
|
+
!result.ok &&
|
|
1476
|
+
result.code !== "ETIMEDOUT" &&
|
|
1477
|
+
primaryCmd &&
|
|
1478
|
+
!isManagedOutsideNpm &&
|
|
1479
|
+
!stagedNpmPrefix) {
|
|
947
1480
|
console.error(chalk.dim(` Update failed unprivileged; retrying with: sudo -n ${primaryCmd} ${primaryArgs.join(" ")}`));
|
|
948
1481
|
const sudoResult = performUpdateCommand("sudo", ["-n", primaryCmd, ...primaryArgs], runner);
|
|
949
1482
|
if (sudoResult.ok)
|
|
950
1483
|
result = sudoResult;
|
|
951
1484
|
}
|
|
952
1485
|
if (!result.ok) {
|
|
1486
|
+
currentVersionGatePhase = "failed";
|
|
953
1487
|
console.error(chalk.red(`✗ Update failed${result.detail ? `: ${result.detail}` : ""}.`));
|
|
954
|
-
//
|
|
955
|
-
//
|
|
956
|
-
//
|
|
957
|
-
|
|
958
|
-
|
|
1488
|
+
// If the npm prefix is still unwritable after the unprivileged and sudo
|
|
1489
|
+
// attempts, explain the permission wall plainly instead of leaving exit 75
|
|
1490
|
+
// as a generic failure. Only applies to npm-managed installs.
|
|
1491
|
+
const npmPrefixNotWritable = !isManagedOutsideNpm &&
|
|
1492
|
+
prefix &&
|
|
1493
|
+
install.packageRoot &&
|
|
1494
|
+
!(deps.canWriteNpmInstall ?? ((resolved) => canWriteNpmInstall(resolved.prefix, resolved.packageRoot)))(install);
|
|
1495
|
+
if (npmPrefixNotWritable) {
|
|
959
1496
|
console.error(chalk.yellow(` ${nonWritablePrefixNote(prefix)}`));
|
|
1497
|
+
noticeFlush = captureNonWritableNpmPrefixNotice({
|
|
1498
|
+
fromVersion: CLI_VERSION,
|
|
1499
|
+
targetVersion: decision.latestVersion,
|
|
1500
|
+
install,
|
|
1501
|
+
env: process.env,
|
|
1502
|
+
homeDir: deps.homeDir,
|
|
1503
|
+
});
|
|
960
1504
|
}
|
|
961
1505
|
// The package manager itself is missing from this environment — the usual
|
|
962
1506
|
// cause is a minimal-PATH parent (launchd, cron, a bare systemd unit) that
|
|
@@ -973,25 +1517,37 @@ function attemptRequiredUpdate(decision, deps, install) {
|
|
|
973
1517
|
if (isManagedOutsideNpm && result.code === "ENOENT" && command) {
|
|
974
1518
|
console.error(chalk.dim(` (hq-pro suggests \`${command}\` — that is for npm-managed installs; use it only if you have switched this install to npm.)`));
|
|
975
1519
|
}
|
|
976
|
-
|
|
1520
|
+
// The self-update is allowed to fail, but a deadline expiry must not turn
|
|
1521
|
+
// into a second, indefinite denial of the user's command. The supervisor
|
|
1522
|
+
// either reaped the group or recorded why the OS denied that signal; in
|
|
1523
|
+
// neither case did an update land. Continue on the current CLI rather than
|
|
1524
|
+
// pretending it did or aborting the command that caused the gate to run.
|
|
1525
|
+
if (result.code === "ETIMEDOUT") {
|
|
1526
|
+
console.error(chalk.dim(" Continuing on the current hq-cli version."));
|
|
1527
|
+
return "continue";
|
|
1528
|
+
}
|
|
1529
|
+
return noticeFlush ? noticeFlush.then(() => 75) : 75;
|
|
977
1530
|
}
|
|
978
1531
|
// Read-your-writes: a "successful" install into the npm prefix does not
|
|
979
1532
|
// prove the user's PATH resolves it. Verify BEFORE announcing, so a ghost
|
|
980
1533
|
// install shadowing the copy we just wrote is reported as the failed update
|
|
981
1534
|
// it is rather than as a success the caller will keep retrying — see
|
|
982
1535
|
// checkUpdateConvergence.
|
|
1536
|
+
currentVersionGatePhase = "verifying";
|
|
983
1537
|
const converged = (deps.checkConvergence ?? checkUpdateConvergence)(decision.latestVersion);
|
|
984
1538
|
if (converged === false) {
|
|
1539
|
+
currentVersionGatePhase = "failed";
|
|
985
1540
|
console.error(chalk.red(`✗ Update did not take effect: \`hq\` on PATH still resolves a different build than ${decision.latestVersion}.`));
|
|
986
1541
|
return 75;
|
|
987
1542
|
}
|
|
1543
|
+
currentVersionGatePhase = "complete";
|
|
988
1544
|
console.error(chalk.green(`✓ Updated to hq-cli ${decision.latestVersion}. Rerun your command.`));
|
|
989
1545
|
return 0;
|
|
990
1546
|
}
|
|
991
|
-
export async function enforceVersionGate(onUpdateRecommended) {
|
|
1547
|
+
export async function enforceVersionGate(onUpdateRecommended, options = {}) {
|
|
992
1548
|
if (isOptedOut())
|
|
993
1549
|
return "continue";
|
|
994
|
-
const decision = await fetchVersionDecision();
|
|
1550
|
+
const decision = await fetchVersionDecision(options.timeoutMs);
|
|
995
1551
|
if (!decision)
|
|
996
1552
|
return "continue"; // best-effort: silent on any failure
|
|
997
1553
|
if (!decision.updateRequired && !decision.updateRecommended)
|
|
@@ -1000,9 +1556,18 @@ export async function enforceVersionGate(onUpdateRecommended) {
|
|
|
1000
1556
|
// neither downstream path repeats it.
|
|
1001
1557
|
const install = resolveRunningInstall();
|
|
1002
1558
|
if (decision.updateRequired) {
|
|
1559
|
+
// Load the staged installer only for the uncommon spaced npm-prefix path.
|
|
1560
|
+
// The version gate is imported during every CLI startup, including native
|
|
1561
|
+
// fast routes, so eagerly importing this filesystem-heavy module adds cost
|
|
1562
|
+
// to commands that never update.
|
|
1563
|
+
const installNpmPackageStaged = install.manager === "npm" && install.prefix && /\s/.test(install.prefix)
|
|
1564
|
+
? (await import("./staged-npm-install.js")).installNpmPackageStaged
|
|
1565
|
+
: undefined;
|
|
1003
1566
|
// Exits the process, EXCEPT when another updater holds the shared update
|
|
1004
1567
|
// lock — then it returns and the CLI continues on the current version.
|
|
1005
|
-
enforceUpdateRequired(decision, { resolveInstall: () => install });
|
|
1568
|
+
const requiredUpdate = enforceUpdateRequired(decision, { resolveInstall: () => install, installNpmPackageStaged });
|
|
1569
|
+
if (requiredUpdate)
|
|
1570
|
+
await requiredUpdate;
|
|
1006
1571
|
return "continue";
|
|
1007
1572
|
}
|
|
1008
1573
|
if (decision.updateRecommended) {
|
|
@@ -1023,11 +1588,18 @@ export async function enforceVersionGate(onUpdateRecommended) {
|
|
|
1023
1588
|
* force-upgraded.
|
|
1024
1589
|
*/
|
|
1025
1590
|
export function shouldSkipGate(argv) {
|
|
1026
|
-
return argv.some((a) => a === "--version" ||
|
|
1591
|
+
return argv.some((a) => a === "--version" ||
|
|
1592
|
+
a === "-V" ||
|
|
1593
|
+
a === "-v" ||
|
|
1594
|
+
a === "--help" ||
|
|
1595
|
+
a === "-h" ||
|
|
1596
|
+
a === "version");
|
|
1027
1597
|
}
|
|
1028
1598
|
export const __test__ = {
|
|
1029
1599
|
CLIENT_ID,
|
|
1600
|
+
getVersionGatePhase,
|
|
1030
1601
|
CONVERGENCE_TIMEOUT_MS,
|
|
1602
|
+
DEFAULT_UPDATE_TIMEOUT_MS,
|
|
1031
1603
|
ENDPOINT_PATH,
|
|
1032
1604
|
FETCH_TIMEOUT_MS,
|
|
1033
1605
|
checkUpdateConvergence,
|
|
@@ -1037,6 +1609,8 @@ export const __test__ = {
|
|
|
1037
1609
|
buildPnpmInstallArgv,
|
|
1038
1610
|
buildPrefixedInstallArgv,
|
|
1039
1611
|
buildSpawnPlan,
|
|
1612
|
+
canWriteNpmInstall,
|
|
1613
|
+
claimNonWritableNpmPrefixNotice,
|
|
1040
1614
|
cleanStalePartialInstall,
|
|
1041
1615
|
derivePnpmHome,
|
|
1042
1616
|
enforceUpdateRequired,
|
|
@@ -1058,5 +1632,6 @@ export const __test__ = {
|
|
|
1058
1632
|
resolveRunningInstall,
|
|
1059
1633
|
resolveRunningManager,
|
|
1060
1634
|
resolveRunningPrefix,
|
|
1635
|
+
updateTimeoutMs,
|
|
1061
1636
|
};
|
|
1062
1637
|
//# sourceMappingURL=version-gate.js.map
|