@fusengine/harness 0.1.90 → 0.1.91
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/dist/adapters/claude/index.d.mts +1 -1
- package/dist/adapters/claude/index.mjs +1 -1
- package/dist/adapters/cline/index.mjs +1 -1
- package/dist/adapters/codex/index.d.mts +2 -2
- package/dist/adapters/codex/index.mjs +3 -2
- package/dist/adapters/cursor/index.d.mts +15 -28
- package/dist/adapters/cursor/index.mjs +35 -46
- package/dist/adapters/gemini/index.mjs +1 -1
- package/dist/adapters/hermes/index.d.mts +1 -1
- package/dist/adapters/hermes/index.mjs +1 -1
- package/dist/adapters/kimi/index.d.mts +1 -1
- package/dist/adapters/kimi/index.mjs +1 -1
- package/dist/{claude-5bC8TDAz.mjs → claude-Ckv2_TgP.mjs} +3 -43
- package/dist/cli/bin.mjs +429 -16
- package/dist/cli/index.mjs +1 -1
- package/dist/command-string-CALMTnwN.mjs +42 -0
- package/dist/{evaluate-C1VSI5pb.mjs → evaluate-CMiIqHeH.mjs} +261 -13
- package/dist/{handle-CBaOcFZq.mjs → handle-C43gA-Pr.mjs} +701 -134
- package/dist/{hermes-kP6NUQlG.mjs → hermes-B9-p_3IF.mjs} +3 -2
- package/dist/{index-DBgnIZn9.d.mts → index-B8PG82su.d.mts} +1 -1
- package/dist/{index-D4C2-IIc.d.mts → index-SmKYkk2N.d.mts} +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/init/index.d.mts +1 -1
- package/dist/init/index.mjs +1 -1
- package/dist/{kimi-D6X7b8wF.mjs → kimi-G2wcSh5-.mjs} +3 -2
- package/dist/normalize-BjG6unTj.mjs +317 -0
- package/dist/policy/index.d.mts +1 -1
- package/dist/policy/index.mjs +2 -2
- package/dist/prompt/index.d.mts +1 -1
- package/dist/{run-CdIlUtjv.mjs → run-DkrzC0gb.mjs} +1 -1
- package/dist/{run-TAXNRSpD.mjs → run-GHAMqcOn.mjs} +26 -3
- package/dist/runtime/index.d.mts +27 -16
- package/dist/runtime/index.mjs +2 -2
- package/dist/{types-C0-igRKr.d.mts → types-Bh0jEF3_.d.mts} +2 -0
- package/dist/{validate-DZFtAbLP.mjs → validate-KjZ1X9tH.mjs} +1 -1
- package/package.json +3 -2
- package/src/adapters/claude/index.ts +92 -0
- package/src/adapters/cline/index.ts +36 -0
- package/src/adapters/codex/apply-patch.ts +94 -0
- package/src/adapters/codex/index.ts +84 -0
- package/src/adapters/codex/permission-mode.ts +16 -0
- package/src/adapters/cursor/context.ts +46 -0
- package/src/adapters/cursor/events.ts +38 -0
- package/src/adapters/cursor/index.ts +43 -0
- package/src/adapters/cursor/interfaces/types.ts +88 -0
- package/src/adapters/cursor/native-response.ts +158 -0
- package/src/adapters/cursor/normalize.ts +123 -0
- package/src/adapters/cursor/respond.ts +123 -0
- package/src/adapters/gemini/index.ts +36 -0
- package/src/adapters/hermes/index.ts +55 -0
- package/src/adapters/hermes/interfaces/types.ts +26 -0
- package/src/adapters/kimi/index.ts +96 -0
- package/src/adapters/kimi/interfaces/types.ts +55 -0
- package/src/cache/compact.ts +55 -0
- package/src/cache/index.ts +5 -0
- package/src/cache/io.ts +38 -0
- package/src/cache/mcp-response.ts +39 -0
- package/src/cache/mcp-store.ts +70 -0
- package/src/cache/store.ts +93 -0
- package/src/changelog/fetch.ts +79 -0
- package/src/cli/bin.ts +100 -0
- package/src/cli/cursor-event-scanner.ts +175 -0
- package/src/cli/cursor-stdin-reader.ts +65 -0
- package/src/cli/doctor.ts +96 -0
- package/src/cli/hook-io.ts +130 -0
- package/src/cli/hook-sound.ts +49 -0
- package/src/cli/index.ts +1 -0
- package/src/cli/json-primitive-scanner.ts +83 -0
- package/src/cli/run.ts +36 -0
- package/src/cli/scope.ts +31 -0
- package/src/codex-rules/build.ts +63 -0
- package/src/codex-rules/index.ts +8 -0
- package/src/codex-rules/mapping.ts +42 -0
- package/src/codex-rules/rules/absolute-paths.ts +52 -0
- package/src/codex-rules/rules/ask.ts +44 -0
- package/src/codex-rules/rules/chmod-ask.ts +57 -0
- package/src/codex-rules/rules/dd.ts +23 -0
- package/src/codex-rules/rules/diskutil.ts +33 -0
- package/src/codex-rules/rules/mkfs.ts +42 -0
- package/src/codex-rules/rules/privilege.ts +49 -0
- package/src/codex-rules/rules/remote-fetch.ts +31 -0
- package/src/codex-rules/rules/rm-variants.ts +58 -0
- package/src/codex-rules/rules/single-commands.ts +57 -0
- package/src/codex-rules/skip-list.ts +25 -0
- package/src/codex-rules/starlark.ts +46 -0
- package/src/codex-rules/types.ts +36 -0
- package/src/config/dotenv.ts +55 -0
- package/src/config/env.ts +10 -0
- package/src/config/home-dir.ts +36 -0
- package/src/config/index.ts +5 -0
- package/src/config/layout.ts +52 -0
- package/src/config/limits.ts +56 -0
- package/src/config/ttl.ts +30 -0
- package/src/detect/harness.ts +73 -0
- package/src/detect/index.ts +1 -0
- package/src/detect/interfaces/types.ts +18 -0
- package/src/freshness/agent-evidence-record.ts +95 -0
- package/src/freshness/agent-evidence.ts +95 -0
- package/src/freshness/codex-spawn-evidence.ts +91 -0
- package/src/freshness/doc-helpers.ts +90 -0
- package/src/freshness/evidence-harvest-io.ts +72 -0
- package/src/freshness/evidence-harvest.ts +61 -0
- package/src/freshness/explore-tools.ts +95 -0
- package/src/freshness/index.ts +2 -0
- package/src/freshness/query-framework.ts +73 -0
- package/src/freshness/ref-evidence.ts +49 -0
- package/src/freshness/ref-journal.ts +98 -0
- package/src/freshness/trivial-edit-counter.ts +30 -0
- package/src/index.ts +11 -0
- package/src/init/index.ts +2 -0
- package/src/init/run.ts +32 -0
- package/src/init/templates.ts +75 -0
- package/src/memory/gitignore.ts +14 -0
- package/src/memory/index.ts +3 -0
- package/src/memory/registry.ts +39 -0
- package/src/memory/session-roots.ts +99 -0
- package/src/memory/state.ts +58 -0
- package/src/policy/apex-authorization.ts +100 -0
- package/src/policy/apex-gates.ts +91 -0
- package/src/policy/apex-target-steps.ts +73 -0
- package/src/policy/apex-target.ts +49 -0
- package/src/policy/apex-task-context.ts +81 -0
- package/src/policy/apex.ts +94 -0
- package/src/policy/cartographer/build-tree.ts +69 -0
- package/src/policy/cartographer/describe.ts +53 -0
- package/src/policy/cartographer/entry.ts +38 -0
- package/src/policy/cartographer/frontmatter.ts +48 -0
- package/src/policy/cartographer/indicators.ts +34 -0
- package/src/policy/claude-md-context.ts +66 -0
- package/src/policy/conventions/index.ts +11 -0
- package/src/policy/conventions/interfaces.ts +71 -0
- package/src/policy/conventions/langs.ts +53 -0
- package/src/policy/conventions/query.ts +49 -0
- package/src/policy/conventions/react-hooks.ts +18 -0
- package/src/policy/conventions/store-or-query.ts +21 -0
- package/src/policy/conventions/stores.ts +56 -0
- package/src/policy/conventions/strip.ts +87 -0
- package/src/policy/conventions/verdict.ts +38 -0
- package/src/policy/creation-intent.ts +11 -0
- package/src/policy/deny-loop.ts +88 -0
- package/src/policy/design/allowed-write.ts +28 -0
- package/src/policy/design/content-checks.ts +45 -0
- package/src/policy/design/corpus-fs.ts +21 -0
- package/src/policy/design/corpus-resolve-cache.ts +49 -0
- package/src/policy/design/corpus-resolve.ts +99 -0
- package/src/policy/design/corpus.ts +92 -0
- package/src/policy/design/design-system-rules.ts +45 -0
- package/src/policy/design/flag.ts +30 -0
- package/src/policy/design/gates-pipeline.ts +105 -0
- package/src/policy/design/gates.ts +87 -0
- package/src/policy/design/screenshot-tools.ts +24 -0
- package/src/policy/design/skill-evidence.ts +34 -0
- package/src/policy/design/skill-gate.ts +81 -0
- package/src/policy/design/skill-triggers.ts +51 -0
- package/src/policy/design/state.ts +92 -0
- package/src/policy/design/template-urls.ts +54 -0
- package/src/policy/design/transitions.ts +68 -0
- package/src/policy/detect-claude-md-project-type.ts +32 -0
- package/src/policy/detect-framework.ts +99 -0
- package/src/policy/detect-primitive-checks.ts +100 -0
- package/src/policy/detect-primitive-lib.ts +55 -0
- package/src/policy/detect-project.ts +99 -0
- package/src/policy/edit-outcome.ts +53 -0
- package/src/policy/evaluate.ts +81 -0
- package/src/policy/expert-agents.ts +60 -0
- package/src/policy/file-size-scope.ts +32 -0
- package/src/policy/file-size.ts +99 -0
- package/src/policy/framework-solid-exclude.ts +52 -0
- package/src/policy/framework-solid-extended.ts +93 -0
- package/src/policy/framework-solid-gates-systems.ts +99 -0
- package/src/policy/framework-solid-gates.ts +98 -0
- package/src/policy/framework-solid.ts +88 -0
- package/src/policy/gemini-mcp-gate.ts +83 -0
- package/src/policy/git-gates.ts +40 -0
- package/src/policy/guards/bash-command-anchor.ts +40 -0
- package/src/policy/guards/bash-write-patterns.ts +140 -0
- package/src/policy/guards/bash-write-redirects.ts +201 -0
- package/src/policy/guards/bash-write-safe-paths.ts +62 -0
- package/src/policy/guards/bash-write.ts +76 -0
- package/src/policy/guards/context.ts +12 -0
- package/src/policy/guards/index.ts +61 -0
- package/src/policy/guards/install.ts +22 -0
- package/src/policy/guards/interface-separation-ext.ts +41 -0
- package/src/policy/guards/interface-separation.ts +100 -0
- package/src/policy/guards/protected-path.ts +100 -0
- package/src/policy/guards/security.ts +97 -0
- package/src/policy/index.ts +19 -0
- package/src/policy/interfaces/types.ts +46 -0
- package/src/policy/js-gate-route.ts +51 -0
- package/src/policy/lessons/lesson-gate.ts +0 -0
- package/src/policy/lessons/trigger-index.ts +84 -0
- package/src/policy/lessons/types.ts +31 -0
- package/src/policy/module-layout.ts +31 -0
- package/src/policy/nearest-manifest.ts +75 -0
- package/src/policy/never-approval.ts +95 -0
- package/src/policy/patterns.ts +80 -0
- package/src/policy/seo/validate.ts +51 -0
- package/src/policy/shadcn-project.ts +22 -0
- package/src/policy/shadcn-skill-gate.ts +97 -0
- package/src/policy/shell-read-refs.ts +96 -0
- package/src/policy/skill-path.ts +46 -0
- package/src/policy/skill-patterns/laravel.ts +40 -0
- package/src/policy/skill-patterns/nextjs.ts +29 -0
- package/src/policy/skill-patterns/react.ts +27 -0
- package/src/policy/skill-patterns/shadcn-subskills.ts +33 -0
- package/src/policy/skill-patterns/shadcn.ts +66 -0
- package/src/policy/skill-patterns/swift.ts +30 -0
- package/src/policy/skill-patterns/tailwind.ts +40 -0
- package/src/policy/skill-source.ts +52 -0
- package/src/policy/skill-trigger-patterns.ts +33 -0
- package/src/policy/skill-triggers.ts +108 -0
- package/src/policy/tailwind-skill-gate.ts +63 -0
- package/src/policy/trivial-edits.ts +52 -0
- package/src/policy/verbosity.ts +39 -0
- package/src/prompt/index.ts +1 -0
- package/src/prompt/types.ts +36 -0
- package/src/refs/discover.ts +69 -0
- package/src/refs/frontmatter.ts +24 -0
- package/src/refs/index.ts +4 -0
- package/src/refs/loader.ts +59 -0
- package/src/refs/ref-key.ts +41 -0
- package/src/refs/router.ts +63 -0
- package/src/refs/types.ts +25 -0
- package/src/runtime/activity.ts +99 -0
- package/src/runtime/apply-patch-gate.ts +41 -0
- package/src/runtime/burst-window.ts +21 -0
- package/src/runtime/codex-shell-tool.ts +37 -0
- package/src/runtime/command-string.ts +37 -0
- package/src/runtime/confirm/codex-confirm.ts +126 -0
- package/src/runtime/confirm/codex-prompt-origin.ts +16 -0
- package/src/runtime/confirm/confirm-code.ts +33 -0
- package/src/runtime/confirm/confirm-gate.ts +65 -0
- package/src/runtime/confirm/confirm-irreversible.ts +32 -0
- package/src/runtime/confirm/confirm-pending.ts +34 -0
- package/src/runtime/confirm/confirm-state.ts +56 -0
- package/src/runtime/confirm/confirm-subagent.ts +112 -0
- package/src/runtime/confirm/confirm-submit.ts +38 -0
- package/src/runtime/core-guards-active.ts +84 -0
- package/src/runtime/core-guards-wired.ts +47 -0
- package/src/runtime/deny-loop-store.ts +94 -0
- package/src/runtime/deny-notice.ts +52 -0
- package/src/runtime/design-cache-resolve.ts +51 -0
- package/src/runtime/design-content-gate.ts +95 -0
- package/src/runtime/design-files-gate.ts +114 -0
- package/src/runtime/design-helpers.ts +93 -0
- package/src/runtime/design-lifecycle.ts +39 -0
- package/src/runtime/design-read-credit.ts +28 -0
- package/src/runtime/design.ts +116 -0
- package/src/runtime/dev-context.ts +43 -0
- package/src/runtime/dry-patterns.ts +32 -0
- package/src/runtime/dry.ts +96 -0
- package/src/runtime/fragment-registry.ts +33 -0
- package/src/runtime/framework-skill-gate.ts +79 -0
- package/src/runtime/fs-cleanup.ts +71 -0
- package/src/runtime/gate-apex.ts +81 -0
- package/src/runtime/gate-helpers.ts +52 -0
- package/src/runtime/gate-input.ts +26 -0
- package/src/runtime/gate.ts +128 -0
- package/src/runtime/handle-post.ts +104 -0
- package/src/runtime/handle-pre.ts +137 -0
- package/src/runtime/handle-scope-async.ts +29 -0
- package/src/runtime/handle-types.ts +27 -0
- package/src/runtime/handle.ts +116 -0
- package/src/runtime/home-state.ts +55 -0
- package/src/runtime/index.ts +18 -0
- package/src/runtime/inform.ts +28 -0
- package/src/runtime/inject-budget-recap.ts +47 -0
- package/src/runtime/inject-budget.ts +81 -0
- package/src/runtime/inject-context.ts +85 -0
- package/src/runtime/inject-dedup-exclusive.ts +98 -0
- package/src/runtime/inject-dedup.ts +89 -0
- package/src/runtime/is-agent-tool.ts +19 -0
- package/src/runtime/lifecycle/agent-files.ts +49 -0
- package/src/runtime/lifecycle/agent-memory.ts +82 -0
- package/src/runtime/lifecycle/agent-transcript.ts +80 -0
- package/src/runtime/lifecycle/aipilot/analytics.ts +99 -0
- package/src/runtime/lifecycle/aipilot/apex-task-store.ts +61 -0
- package/src/runtime/lifecycle/aipilot/cache-base.ts +48 -0
- package/src/runtime/lifecycle/aipilot/cache-doc.ts +100 -0
- package/src/runtime/lifecycle/aipilot/cache-lessons.ts +58 -0
- package/src/runtime/lifecycle/aipilot/cache-test.ts +70 -0
- package/src/runtime/lifecycle/aipilot/curate-lessons.ts +64 -0
- package/src/runtime/lifecycle/aipilot/dispatch-aipilot.ts +100 -0
- package/src/runtime/lifecycle/aipilot/doc-cache-gate.ts +69 -0
- package/src/runtime/lifecycle/aipilot/inject-apex.ts +98 -0
- package/src/runtime/lifecycle/aipilot/inject-doc.ts +62 -0
- package/src/runtime/lifecycle/aipilot/inject-explore.ts +64 -0
- package/src/runtime/lifecycle/aipilot/inject-lessons.ts +61 -0
- package/src/runtime/lifecycle/aipilot/inject-test.ts +48 -0
- package/src/runtime/lifecycle/aipilot/lesson-archive.ts +60 -0
- package/src/runtime/lifecycle/aipilot/lesson-inject.ts +98 -0
- package/src/runtime/lifecycle/aipilot/lesson-parse.ts +74 -0
- package/src/runtime/lifecycle/aipilot/lessons.ts +72 -0
- package/src/runtime/lifecycle/aipilot/promote-global-lessons.ts +92 -0
- package/src/runtime/lifecycle/aipilot/solid-compliance.ts +69 -0
- package/src/runtime/lifecycle/aipilot/solid-notice.ts +47 -0
- package/src/runtime/lifecycle/aipilot/solid-transcript.ts +60 -0
- package/src/runtime/lifecycle/aipilot/source-scan.ts +56 -0
- package/src/runtime/lifecycle/aipilot/sync-task.ts +75 -0
- package/src/runtime/lifecycle/aipilot/transcript.ts +88 -0
- package/src/runtime/lifecycle/aipilot/types.ts +72 -0
- package/src/runtime/lifecycle/auto-document-reads.ts +73 -0
- package/src/runtime/lifecycle/cartographer/detect.ts +57 -0
- package/src/runtime/lifecycle/cartographer/ecosystem-map.ts +56 -0
- package/src/runtime/lifecycle/cartographer/fs-util.ts +64 -0
- package/src/runtime/lifecycle/cartographer/merge.ts +51 -0
- package/src/runtime/lifecycle/cartographer/project-map.ts +49 -0
- package/src/runtime/lifecycle/cartographer/scan-hooks.ts +48 -0
- package/src/runtime/lifecycle/cartographer/scan.ts +81 -0
- package/src/runtime/lifecycle/cartographer/session-start.ts +33 -0
- package/src/runtime/lifecycle/cartographer/track-enrichment.ts +45 -0
- package/src/runtime/lifecycle/cartographer/write-plugin-map.ts +43 -0
- package/src/runtime/lifecycle/cartographer/write-tree.ts +44 -0
- package/src/runtime/lifecycle/changelog-research.ts +43 -0
- package/src/runtime/lifecycle/check-file-size.ts +61 -0
- package/src/runtime/lifecycle/codex-resync/fingerprint.ts +63 -0
- package/src/runtime/lifecycle/codex-resync/lock.ts +46 -0
- package/src/runtime/lifecycle/codex-resync/managed-destination.ts +39 -0
- package/src/runtime/lifecycle/codex-resync/materialize-agents.ts +57 -0
- package/src/runtime/lifecycle/codex-resync/plugin-files.ts +65 -0
- package/src/runtime/lifecycle/codex-resync/plugin-roots.ts +62 -0
- package/src/runtime/lifecycle/codex-resync/resync.ts +45 -0
- package/src/runtime/lifecycle/codex-resync/symlink-commands.ts +25 -0
- package/src/runtime/lifecycle/dispatch.ts +109 -0
- package/src/runtime/lifecycle/failure-lesson.ts +51 -0
- package/src/runtime/lifecycle/index.ts +34 -0
- package/src/runtime/lifecycle/inject-rules.ts +50 -0
- package/src/runtime/lifecycle/instructions-loaded.ts +22 -0
- package/src/runtime/lifecycle/kimi-rules-native.ts +44 -0
- package/src/runtime/lifecycle/lessons/dispatch.ts +88 -0
- package/src/runtime/lifecycle/lessons/reminder.ts +89 -0
- package/src/runtime/lifecycle/lessons/state.ts +23 -0
- package/src/runtime/lifecycle/memory/agent-lesson.ts +35 -0
- package/src/runtime/lifecycle/memory/capture-error.ts +41 -0
- package/src/runtime/lifecycle/memory/client.ts +65 -0
- package/src/runtime/lifecycle/memory/dispatch.ts +42 -0
- package/src/runtime/lifecycle/memory/recall.ts +30 -0
- package/src/runtime/lifecycle/memory/salience.ts +31 -0
- package/src/runtime/lifecycle/memory/state.ts +49 -0
- package/src/runtime/lifecycle/memory/track-ops.ts +15 -0
- package/src/runtime/lifecycle/post-compact.ts +38 -0
- package/src/runtime/lifecycle/post-edit-ts.ts +49 -0
- package/src/runtime/lifecycle/post-tracking.ts +40 -0
- package/src/runtime/lifecycle/pre-compact.ts +38 -0
- package/src/runtime/lifecycle/rules-root.ts +83 -0
- package/src/runtime/lifecycle/security/check-skill.ts +63 -0
- package/src/runtime/lifecycle/security/scan-patterns.ts +53 -0
- package/src/runtime/lifecycle/security/scan.ts +76 -0
- package/src/runtime/lifecycle/security/skill-state.ts +47 -0
- package/src/runtime/lifecycle/security/track-mcp.ts +29 -0
- package/src/runtime/lifecycle/security/track-skill-read.ts +31 -0
- package/src/runtime/lifecycle/seo/post-tool-use.ts +45 -0
- package/src/runtime/lifecycle/session-end.ts +17 -0
- package/src/runtime/lifecycle/session-start.ts +57 -0
- package/src/runtime/lifecycle/snapshot/board.ts +27 -0
- package/src/runtime/lifecycle/snapshot/format.ts +60 -0
- package/src/runtime/lifecycle/snapshot/git.ts +71 -0
- package/src/runtime/lifecycle/snapshot/index.ts +52 -0
- package/src/runtime/lifecycle/snapshot/version.ts +34 -0
- package/src/runtime/lifecycle/solid-detect.ts +56 -0
- package/src/runtime/lifecycle/stop-core.ts +35 -0
- package/src/runtime/lifecycle/subagent-cache.ts +61 -0
- package/src/runtime/lifecycle/task-completed.ts +94 -0
- package/src/runtime/lifecycle/teammate-idle-check.ts +63 -0
- package/src/runtime/lifecycle/teammate-idle.ts +28 -0
- package/src/runtime/lifecycle/tool-failure.ts +24 -0
- package/src/runtime/lifecycle/track-changes.ts +61 -0
- package/src/runtime/lifecycle/validate-solid.ts +70 -0
- package/src/runtime/lifecycle/validate-tailwind.ts +80 -0
- package/src/runtime/lifecycle-bridge.ts +74 -0
- package/src/runtime/mcp-key.ts +44 -0
- package/src/runtime/mcp-tool-name.ts +92 -0
- package/src/runtime/mcp.ts +91 -0
- package/src/runtime/modular.ts +77 -0
- package/src/runtime/normalize.ts +107 -0
- package/src/runtime/notices.ts +91 -0
- package/src/runtime/notification-sound.ts +49 -0
- package/src/runtime/notifications.ts +77 -0
- package/src/runtime/paths.ts +59 -0
- package/src/runtime/post-fanout.ts +41 -0
- package/src/runtime/post-outcome.ts +61 -0
- package/src/runtime/pre-allow.ts +97 -0
- package/src/runtime/precommit.ts +60 -0
- package/src/runtime/prompt-text.ts +38 -0
- package/src/runtime/receipt-capture.ts +34 -0
- package/src/runtime/record.ts +26 -0
- package/src/runtime/respond.ts +92 -0
- package/src/runtime/solid-file-size-gate.ts +58 -0
- package/src/runtime/solid-pre.ts +53 -0
- package/src/runtime/storage.ts +9 -0
- package/src/statusline/colors.ts +31 -0
- package/src/statusline/constants.ts +17 -0
- package/src/statusline/formatters.ts +54 -0
- package/src/statusline/index.ts +4 -0
- package/src/statusline/progress-bar.ts +46 -0
- package/src/tracking/codex-post-failure.ts +73 -0
- package/src/tracking/index.ts +2 -0
- package/src/tracking/integrity.ts +99 -0
- package/src/tracking/one-shot-dedup.ts +34 -0
- package/src/tracking/one-shot-failure.ts +42 -0
- package/src/tracking/one-shot-store.ts +95 -0
- package/src/tracking/one-shot.ts +93 -0
- package/src/tracking/receipts.ts +95 -0
- package/src/tracking/session-state.ts +94 -0
- package/src/tracking/store.ts +96 -0
- package/src/tracking/track-compact.ts +100 -0
- package/src/tracking/track-diff.ts +50 -0
- package/src/tracking/track-journal.ts +97 -0
- package/src/tracking/track-lock-sync.ts +83 -0
- package/src/tracking/track-lock.ts +67 -0
- package/src/util/compact-json.ts +23 -0
- package/src/util/index.ts +2 -0
- package/src/util/json-io.ts +47 -0
- package/src/util/project-root.ts +41 -0
- package/src/util/runtime-io.ts +85 -0
- package/src/util/semver.ts +30 -0
|
@@ -652,6 +652,257 @@ function securityGuard(ctx) {
|
|
|
652
652
|
};
|
|
653
653
|
}
|
|
654
654
|
//#endregion
|
|
655
|
+
//#region src/policy/guards/bash-write-redirects.ts
|
|
656
|
+
function closingParen(input, start) {
|
|
657
|
+
let depth = 1;
|
|
658
|
+
let quote = null;
|
|
659
|
+
for (let i = start; i < input.length; i++) {
|
|
660
|
+
const ch = input[i];
|
|
661
|
+
if (ch === "\\" && quote !== "'") {
|
|
662
|
+
i++;
|
|
663
|
+
continue;
|
|
664
|
+
}
|
|
665
|
+
if (quote) {
|
|
666
|
+
if (ch === quote) quote = null;
|
|
667
|
+
continue;
|
|
668
|
+
}
|
|
669
|
+
if (ch === "'" || ch === "\"") {
|
|
670
|
+
quote = ch;
|
|
671
|
+
continue;
|
|
672
|
+
}
|
|
673
|
+
if (ch === "(") {
|
|
674
|
+
depth++;
|
|
675
|
+
continue;
|
|
676
|
+
}
|
|
677
|
+
if (ch === ")" && --depth === 0) return i;
|
|
678
|
+
}
|
|
679
|
+
return input.length;
|
|
680
|
+
}
|
|
681
|
+
function closingBacktick(input, start) {
|
|
682
|
+
for (let i = start; i < input.length; i++) {
|
|
683
|
+
if (input[i] === "\\") {
|
|
684
|
+
i++;
|
|
685
|
+
continue;
|
|
686
|
+
}
|
|
687
|
+
if (input[i] === "`") return i;
|
|
688
|
+
}
|
|
689
|
+
return input.length;
|
|
690
|
+
}
|
|
691
|
+
function closingArithmetic(input, start) {
|
|
692
|
+
let depth = 1;
|
|
693
|
+
let quote = null;
|
|
694
|
+
for (let i = start; i < input.length; i++) {
|
|
695
|
+
const ch = input[i];
|
|
696
|
+
if (ch === "\\" && quote !== "'") {
|
|
697
|
+
i++;
|
|
698
|
+
continue;
|
|
699
|
+
}
|
|
700
|
+
if (quote) {
|
|
701
|
+
if (ch === quote) quote = null;
|
|
702
|
+
continue;
|
|
703
|
+
}
|
|
704
|
+
if (ch === "'" || ch === "\"") {
|
|
705
|
+
quote = ch;
|
|
706
|
+
continue;
|
|
707
|
+
}
|
|
708
|
+
if (ch === "(") {
|
|
709
|
+
depth++;
|
|
710
|
+
continue;
|
|
711
|
+
}
|
|
712
|
+
if (ch !== ")") continue;
|
|
713
|
+
if (depth === 1 && input[i + 1] === ")") return i + 1;
|
|
714
|
+
depth--;
|
|
715
|
+
}
|
|
716
|
+
return input.length;
|
|
717
|
+
}
|
|
718
|
+
function closingConditional(input, start) {
|
|
719
|
+
let quote = null;
|
|
720
|
+
for (let i = start; i < input.length - 1; i++) {
|
|
721
|
+
const ch = input[i];
|
|
722
|
+
if (ch === "\\" && quote !== "'") {
|
|
723
|
+
i++;
|
|
724
|
+
continue;
|
|
725
|
+
}
|
|
726
|
+
if (quote) {
|
|
727
|
+
if (ch === quote) quote = null;
|
|
728
|
+
continue;
|
|
729
|
+
}
|
|
730
|
+
if (ch === "'" || ch === "\"") {
|
|
731
|
+
quote = ch;
|
|
732
|
+
continue;
|
|
733
|
+
}
|
|
734
|
+
if (ch === "]" && input[i + 1] === "]") return i;
|
|
735
|
+
}
|
|
736
|
+
return input.length;
|
|
737
|
+
}
|
|
738
|
+
function commentStart(input, index, start) {
|
|
739
|
+
return input[index] === "#" && (index === start || /[\s;|&()]/.test(input[index - 1] ?? ""));
|
|
740
|
+
}
|
|
741
|
+
function commandPosition(input, index, start) {
|
|
742
|
+
const prefix = input.slice(start, index);
|
|
743
|
+
const segment = prefix.slice(Math.max(prefix.lastIndexOf(";"), prefix.lastIndexOf("|"), prefix.lastIndexOf("&"), prefix.lastIndexOf("\n")) + 1).trim();
|
|
744
|
+
return segment === "" || /^(?:if|elif|while|until|then|do|!)$/.test(segment);
|
|
745
|
+
}
|
|
746
|
+
function readTarget(input, start, end) {
|
|
747
|
+
let out = "";
|
|
748
|
+
let quote = null;
|
|
749
|
+
for (let i = start; i < end; i++) {
|
|
750
|
+
const ch = input[i] ?? "";
|
|
751
|
+
if (ch === "\\" && quote !== "'") {
|
|
752
|
+
if (i + 1 < end) out += input[++i] ?? "";
|
|
753
|
+
continue;
|
|
754
|
+
}
|
|
755
|
+
if (quote) {
|
|
756
|
+
if (ch === quote) quote = null;
|
|
757
|
+
else out += ch;
|
|
758
|
+
continue;
|
|
759
|
+
}
|
|
760
|
+
if (ch === "'" || ch === "\"") {
|
|
761
|
+
quote = ch;
|
|
762
|
+
continue;
|
|
763
|
+
}
|
|
764
|
+
if (/\s|[;&|<>]/.test(ch)) break;
|
|
765
|
+
out += ch;
|
|
766
|
+
}
|
|
767
|
+
return out;
|
|
768
|
+
}
|
|
769
|
+
function scanDoubleQuote(input, start, end, out) {
|
|
770
|
+
for (let i = start; i < end; i++) {
|
|
771
|
+
if (input[i] === "\\") {
|
|
772
|
+
i++;
|
|
773
|
+
continue;
|
|
774
|
+
}
|
|
775
|
+
if (input[i] === "\"") return i;
|
|
776
|
+
if (input[i] === "$" && input[i + 1] === "(" && input[i + 2] === "(") {
|
|
777
|
+
const close = closingArithmetic(input, i + 3);
|
|
778
|
+
scanExpansions(input, i + 3, close - 1, out);
|
|
779
|
+
i = close;
|
|
780
|
+
} else if (input[i] === "$" && input[i + 1] === "(") {
|
|
781
|
+
const close = closingParen(input, i + 2);
|
|
782
|
+
scanRange(input, i + 2, close, out);
|
|
783
|
+
i = close;
|
|
784
|
+
} else if (input[i] === "`") {
|
|
785
|
+
const close = closingBacktick(input, i + 1);
|
|
786
|
+
scanRange(input, i + 1, close, out);
|
|
787
|
+
i = close;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
return end;
|
|
791
|
+
}
|
|
792
|
+
function scanExpansions(input, start, end, out) {
|
|
793
|
+
for (let i = start; i < end; i++) {
|
|
794
|
+
if (input[i] === "\\") {
|
|
795
|
+
i++;
|
|
796
|
+
continue;
|
|
797
|
+
}
|
|
798
|
+
if (commentStart(input, i, start)) {
|
|
799
|
+
const newline = input.indexOf("\n", i + 1);
|
|
800
|
+
i = newline < 0 || newline >= end ? end : newline;
|
|
801
|
+
continue;
|
|
802
|
+
}
|
|
803
|
+
if (input[i] === "'") {
|
|
804
|
+
const close = input.indexOf("'", i + 1);
|
|
805
|
+
i = close < 0 || close >= end ? end : close;
|
|
806
|
+
continue;
|
|
807
|
+
}
|
|
808
|
+
if (input[i] === "\"") {
|
|
809
|
+
i = scanDoubleQuote(input, i + 1, end, out);
|
|
810
|
+
continue;
|
|
811
|
+
}
|
|
812
|
+
if (input[i] === "$" && input[i + 1] === "(" && input[i + 2] === "(") {
|
|
813
|
+
const close = closingArithmetic(input, i + 3);
|
|
814
|
+
scanExpansions(input, i + 3, close - 1, out);
|
|
815
|
+
i = close;
|
|
816
|
+
} else if (input[i] === "$" && input[i + 1] === "(") {
|
|
817
|
+
const close = closingParen(input, i + 2);
|
|
818
|
+
scanRange(input, i + 2, close, out);
|
|
819
|
+
i = close;
|
|
820
|
+
} else if (input[i] === "`") {
|
|
821
|
+
const close = closingBacktick(input, i + 1);
|
|
822
|
+
scanRange(input, i + 1, close, out);
|
|
823
|
+
i = close;
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
function scanRange(input, start, end, out) {
|
|
828
|
+
for (let i = start; i < end; i++) {
|
|
829
|
+
const ch = input[i];
|
|
830
|
+
if (ch === "\\") {
|
|
831
|
+
i++;
|
|
832
|
+
continue;
|
|
833
|
+
}
|
|
834
|
+
if (commentStart(input, i, start)) {
|
|
835
|
+
const newline = input.indexOf("\n", i + 1);
|
|
836
|
+
i = newline < 0 || newline >= end ? end : newline;
|
|
837
|
+
continue;
|
|
838
|
+
}
|
|
839
|
+
if (ch === "'") {
|
|
840
|
+
const close = input.indexOf("'", i + 1);
|
|
841
|
+
i = close < 0 || close >= end ? end : close;
|
|
842
|
+
continue;
|
|
843
|
+
}
|
|
844
|
+
if (ch === "\"") {
|
|
845
|
+
i = scanDoubleQuote(input, i + 1, end, out);
|
|
846
|
+
continue;
|
|
847
|
+
}
|
|
848
|
+
if (ch === "[" && input[i + 1] === "[" && commandPosition(input, i, start)) {
|
|
849
|
+
const close = closingConditional(input, i + 2);
|
|
850
|
+
scanExpansions(input, i + 2, close, out);
|
|
851
|
+
i = close + 1;
|
|
852
|
+
continue;
|
|
853
|
+
}
|
|
854
|
+
if (ch === "(" && input[i + 1] === "(" && commandPosition(input, i, start)) {
|
|
855
|
+
const close = closingArithmetic(input, i + 2);
|
|
856
|
+
scanExpansions(input, i + 2, close - 1, out);
|
|
857
|
+
i = close;
|
|
858
|
+
continue;
|
|
859
|
+
}
|
|
860
|
+
if (ch === "$" && input[i + 1] === "(" && input[i + 2] === "(") {
|
|
861
|
+
const close = closingArithmetic(input, i + 3);
|
|
862
|
+
scanExpansions(input, i + 3, close - 1, out);
|
|
863
|
+
i = close;
|
|
864
|
+
continue;
|
|
865
|
+
}
|
|
866
|
+
if (ch === "$" && input[i + 1] === "(") {
|
|
867
|
+
const close = closingParen(input, i + 2);
|
|
868
|
+
scanRange(input, i + 2, close, out);
|
|
869
|
+
i = close;
|
|
870
|
+
continue;
|
|
871
|
+
}
|
|
872
|
+
if (ch === "`") {
|
|
873
|
+
const close = closingBacktick(input, i + 1);
|
|
874
|
+
scanRange(input, i + 1, close, out);
|
|
875
|
+
i = close;
|
|
876
|
+
continue;
|
|
877
|
+
}
|
|
878
|
+
if (ch !== ">") continue;
|
|
879
|
+
if (input[i + 1] === "(") continue;
|
|
880
|
+
if (input[i - 1] === "&") {
|
|
881
|
+
if (input[i + 1] === ">") i++;
|
|
882
|
+
continue;
|
|
883
|
+
}
|
|
884
|
+
let opStart = i;
|
|
885
|
+
while (opStart > start && /\d/.test(input[opStart - 1] ?? "")) opStart--;
|
|
886
|
+
if (input[opStart - 1] === "&") opStart--;
|
|
887
|
+
let cursor = i + (input[i + 1] === ">" || input[i + 1] === "|" ? 2 : 1);
|
|
888
|
+
const operator = input.slice(opStart, cursor);
|
|
889
|
+
while (/\s/.test(input[cursor] ?? "")) cursor++;
|
|
890
|
+
if (input[cursor] === "&") continue;
|
|
891
|
+
const target = readTarget(input, cursor, end);
|
|
892
|
+
if (target) out.push({
|
|
893
|
+
start: opStart,
|
|
894
|
+
operator,
|
|
895
|
+
target
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
/** Return active output redirects, excluding quoted/escaped `>` characters. */
|
|
900
|
+
function shellOutputRedirects(command) {
|
|
901
|
+
const out = [];
|
|
902
|
+
scanRange(command, 0, command.length, out);
|
|
903
|
+
return out;
|
|
904
|
+
}
|
|
905
|
+
//#endregion
|
|
655
906
|
//#region src/policy/guards/protected-path.ts
|
|
656
907
|
/**
|
|
657
908
|
* Path fragments that mark a location as internal/generated state.
|
|
@@ -709,7 +960,7 @@ function extractWriteTargets(cmd) {
|
|
|
709
960
|
const v = unquote((t ?? "").trim());
|
|
710
961
|
if (v && v !== "/dev/null") out.push(v);
|
|
711
962
|
};
|
|
712
|
-
for (const
|
|
963
|
+
for (const redirect of shellOutputRedirects(cmd)) push(redirect.target);
|
|
713
964
|
for (const m of cmd.matchAll(/\btee\b(?:\s+-\S+)*\s+('[^']+'|"[^"]+"|\S+)/g)) push(m[1]);
|
|
714
965
|
for (const m of cmd.matchAll(/\bdd\b[^|;&]*\bof=('[^']+'|"[^"]+"|\S+)/g)) push(m[1]);
|
|
715
966
|
for (const seg of cmd.split(/[;&|]+/)) {
|
|
@@ -755,15 +1006,10 @@ function resolvePath(raw) {
|
|
|
755
1006
|
const stripped = raw.trim().replace(/^['"]|['"]$/g, "");
|
|
756
1007
|
return normalize((stripped === "~" || stripped.startsWith("~/") ? homedir() + stripped.slice(1) : stripped).replace(/\$HOME/g, homedir()));
|
|
757
1008
|
}
|
|
758
|
-
/** Extract the file path after a `>`/`>>` redirect (parity extract_redirect_target). */
|
|
759
|
-
function extractRedirectTarget(cmd) {
|
|
760
|
-
const m = cmd.match(/>>\s*(\S+)|(?<![0-9&])>\s*(\S+)/);
|
|
761
|
-
return m ? resolvePath(m[1] ?? m[2] ?? "") : null;
|
|
762
|
-
}
|
|
763
1009
|
/** True when a `>`/`>>` redirect targets a harness-owned safe path (parity is_safe_write_path). */
|
|
764
1010
|
function isSafeWritePath(cmd) {
|
|
765
|
-
const
|
|
766
|
-
return
|
|
1011
|
+
const targets = shellOutputRedirects(cmd).map((redirect) => resolvePath(redirect.target)).filter((target) => target !== "/dev/null");
|
|
1012
|
+
return targets.length > 0 && targets.every((target) => SAFE_WRITE_PATHS.some((safe) => target === safe || target.startsWith(safe + "/")));
|
|
767
1013
|
}
|
|
768
1014
|
/** Extract the file argument of `tee`/`dd of=` (parity extract_command_target). */
|
|
769
1015
|
function extractCommandTarget(cmd) {
|
|
@@ -976,9 +1222,10 @@ function blockCodeWrite(reason) {
|
|
|
976
1222
|
actions: ["Use the Write/Edit tool instead"]
|
|
977
1223
|
};
|
|
978
1224
|
}
|
|
979
|
-
function askFileWrite(reason) {
|
|
1225
|
+
function askFileWrite(reason, ruleId = "bash-write:file-write") {
|
|
980
1226
|
return {
|
|
981
1227
|
kind: "ask",
|
|
1228
|
+
ruleId,
|
|
982
1229
|
title: "Bash file write",
|
|
983
1230
|
reason,
|
|
984
1231
|
actions: ["Use the Write/Edit tool instead"]
|
|
@@ -1002,20 +1249,21 @@ function bashWriteGuard(ctx) {
|
|
|
1002
1249
|
if (ctx.tool !== "Bash" || !ctx.command) return null;
|
|
1003
1250
|
const cmd = ctx.command;
|
|
1004
1251
|
const stripped = cmd.trim();
|
|
1252
|
+
const redirects = shellOutputRedirects(cmd).filter((redirect) => redirect.target !== "/dev/null");
|
|
1005
1253
|
const mutator = CODE_MUTATORS.find((m) => m.re.test(cmd));
|
|
1006
1254
|
if (mutator) return blockCodeWrite(`${mutator.desc} — Use Edit/Write tools instead`);
|
|
1007
1255
|
if (CODE_COMMAND_WRITE.test(cmd)) return blockCodeWrite("tee/dd into a code file — Use Edit/Write tools instead");
|
|
1008
1256
|
if (PYTHON_C_ANCHOR.test(cmd) && PYTHON_WRITES.test(cmd)) return blockCodeWrite("Python inline script mutates files/spawns a process — Use Edit/Write tools instead");
|
|
1009
|
-
if (SAFE_PREFIXES.some((p) => stripped.startsWith(p)) &&
|
|
1257
|
+
if (SAFE_PREFIXES.some((p) => stripped.startsWith(p)) && redirects.length === 0) return null;
|
|
1010
1258
|
if (cmd.includes(".fuse-harness/cache/sessions")) return {
|
|
1011
1259
|
kind: "block",
|
|
1012
1260
|
title: "Session-state tampering",
|
|
1013
1261
|
reason: "Bash access to the harness session-state directory is a hook-bypass vector — the freshness/APEX enforcement reads it to decide block/allow.",
|
|
1014
1262
|
actions: ["Never read or write session state from the shell"]
|
|
1015
1263
|
};
|
|
1016
|
-
if (
|
|
1264
|
+
if (redirects.length > 0) {
|
|
1017
1265
|
if (isSafeWritePath(cmd)) return null;
|
|
1018
|
-
return
|
|
1266
|
+
return redirects.some((redirect) => /\.(?:ts|tsx|js|jsx|py|go|rb|rs|java|kt|php|swift|vue|svelte|astro|css|c|cpp|h)\b/.test(redirect.target)) ? blockCodeWrite("Bash redirect to code file — Use Write/Edit tools (enforces APEX + SOLID specs)") : askFileWrite("Shell redirect to file detected. Authorize?", "bash-write:file-redirect");
|
|
1019
1267
|
}
|
|
1020
1268
|
if (/\bnode\s+-e\b/.test(cmd) && NODE_WRITES.test(cmd)) return hasSafeWriteTarget(cmd) ? null : askFileWrite("Node.js write operation detected. Authorize?");
|
|
1021
1269
|
if (/\bruby\s+-e\b/.test(cmd) && RUBY_WRITES.test(cmd)) return askFileWrite("Ruby write operation detected. Authorize?");
|
|
@@ -1541,4 +1789,4 @@ function evaluate(ctx) {
|
|
|
1541
1789
|
};
|
|
1542
1790
|
}
|
|
1543
1791
|
//#endregion
|
|
1544
|
-
export {
|
|
1792
|
+
export { isRalphMode as $, moduleAwarePath as A, protectedPathGuard as B, isInterfacesPath as C, isVendorPath as D, isTypesPath as E, FILE_REDIRECT as F, computeEditResultLines as G, ASK_PATTERNS as H, SAFE_PREFIXES as I, GIT_ASK as J, isFileSizeScoped as K, SESSION_STATE_FRAGMENT as L, ASK_WRITERS as M, CODE_MUTATORS as N, langOfPath as O, CODE_REDIRECT as P, SYSTEM_INSTALL as Q, PROTECTED_FRAGMENTS as R, isHooksPath as S, isStoresPath as T, CRITICAL_PATTERNS as U, shellOutputRedirects as V, securityGuard as W, PROJECT_INSTALL as X, GIT_BLOCKED as Y, RALPH_SAFE as Z, rolloutVerdict as _, registerGuard as a, maskCommentsOnly as at, interfaceDeclLevel as b, GO_DECL_RE as c, detectProjectType as ct, PY_MODEL_RE as d, matchPatterns as et, RUST_DECL_RE as f, conventionsMode as g, interfaceSeparationGuard as h, clearUserGuards as i, maskCommentsAndStrings as it, bashWriteGuard as j, lexProfileOf as k, JAVA_DECL_RE as l, isApexCommand as lt, TS_DECL_RE as m, FAIL_CLOSED as n, nearestManifestDir as nt, runGuards as o, DEV_KEYWORDS as ot, SWIFT_PROTO_RE as p, resolveSolidRefFramework as q, GUARDS as r, projectCaps as rt, installGuard as s, detectModularArchitecture as st, evaluate as t, detectFramework as tt, PHP_DECL_RE as u, requiredArchSkill as ut, declaresExportedTypeAlias as v, isQueryPath as w, isComponentsPath as x, declaresInterface as y, PROTECTED_GIT_RE as z };
|