@hassangameryt/freeflow 0.3.0 → 0.5.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/.claude-plugin/marketplace.json +4 -4
- package/.claude-plugin/plugin.json +6 -2
- package/.codex-plugin/plugin.json +9 -9
- package/README.md +190 -127
- package/assets/feedback-loop.png +0 -0
- package/assets/freeflow_workflow_map.png +0 -0
- package/assets/workflow.png +0 -0
- package/{skills → capabilities}/output-router/SKILL.md +21 -17
- package/{skills → capabilities}/output-router/references/safety-policy.md +1 -1
- package/capabilities/output-router/references/setup.md +110 -0
- package/command-surface.json +62 -7
- package/hooks/freeflow-runtime-context.mjs +572 -154
- package/hooks/hooks.json +26 -1
- package/hooks/tests/check-runtime-context-hook.sh +375 -0
- package/package.json +24 -24
- package/pi-extension/dist/index.js +264 -80
- package/pi-extension/dist/integrations/mcp-config.js +29 -0
- package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
- package/pi-extension/dist/output-router/native-safety-net.js +216 -0
- package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
- package/pi-extension/dist/output-router/renderers.js +1023 -0
- package/pi-extension/dist/output-router/router-tools.js +554 -0
- package/pi-extension/dist/output-router/schemas.js +383 -0
- package/pi-extension/dist/output-router/status.js +744 -0
- package/pi-extension/dist/output-router/utils.js +502 -0
- package/pi-extension/dist/runtime/runtime-context.js +798 -0
- package/pi-extension/dist/settings/settings-tui.js +314 -0
- package/pi-extension/dist/settings/settings-ui.js +1487 -0
- package/pi-extension/freeflow/index.js +1 -0
- package/pi-extension/src/index.ts +230 -56
- package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
- package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +8 -12
- package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
- package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
- package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
- package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
- package/pi-extension/src/output-router/status.ts +791 -0
- package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
- package/pi-extension/src/runtime/runtime-context.ts +895 -0
- package/pi-extension/src/settings/settings-tui.ts +408 -0
- package/pi-extension/src/settings/settings-ui.ts +1730 -0
- package/pi-extension/tests/integration/pi-extension.test.js +4020 -0
- package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
- package/pi-extension/tests/output-router/search.test.js +722 -0
- package/pi-extension/tests/settings/settings-tui.test.js +243 -0
- package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
- package/router/dist/benchmarks/benchmark-harness.js +62 -62
- package/router/dist/benchmarks/benchmarks.d.ts +80 -73
- package/router/dist/benchmarks/benchmarks.js +860 -761
- package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
- package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
- package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
- package/router/dist/benchmarks/command-benchmarks.js +616 -571
- package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
- package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
- package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
- package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
- package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
- package/router/dist/benchmarks/context-saving-baseline.js +405 -374
- package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
- package/router/dist/benchmarks/index-benchmarks.js +761 -661
- package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
- package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
- package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
- package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
- package/router/dist/config/config.d.ts +62 -55
- package/router/dist/config/config.js +552 -373
- package/router/dist/config/router-contract.d.ts +2 -2
- package/router/dist/config/router-contract.js +38 -38
- package/router/dist/config/schema.d.ts +19 -10
- package/router/dist/config/schema.js +586 -538
- package/router/dist/config/types.d.ts +413 -361
- package/router/dist/config/types.js +19 -8
- package/router/dist/evidence/bounded-evidence.d.ts +26 -26
- package/router/dist/evidence/bounded-evidence.js +265 -252
- package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
- package/router/dist/evidence/evidence-range-selector.js +192 -191
- package/router/dist/evidence/evidence-search.d.ts +18 -16
- package/router/dist/evidence/evidence-search.js +401 -377
- package/router/dist/evidence/evidence.d.ts +17 -17
- package/router/dist/evidence/evidence.js +163 -159
- package/router/dist/evidence/failure-contracts.d.ts +25 -15
- package/router/dist/evidence/failure-contracts.js +132 -126
- package/router/dist/evidence/line-ranges.d.ts +17 -15
- package/router/dist/evidence/line-ranges.js +18 -18
- package/router/dist/experiments/local-index.d.ts +47 -41
- package/router/dist/experiments/local-index.js +477 -458
- package/router/dist/local/local-traversal.d.ts +18 -0
- package/router/dist/local/local-traversal.js +334 -0
- package/router/dist/processing/engine.d.ts +94 -70
- package/router/dist/processing/engine.js +462 -364
- package/router/dist/processing/reducers.d.ts +208 -194
- package/router/dist/processing/reducers.js +1434 -1256
- package/router/dist/processing/renderers.d.ts +24 -18
- package/router/dist/processing/renderers.js +161 -152
- package/router/dist/processing/scripts.d.ts +80 -67
- package/router/dist/processing/scripts.js +343 -290
- package/router/dist/repo/repo-traversal.d.ts +9 -9
- package/router/dist/repo/repo-traversal.js +205 -202
- package/router/dist/routing/observed-reducers.d.ts +25 -19
- package/router/dist/routing/observed-reducers.js +559 -545
- package/router/dist/routing/observed-routing.d.ts +23 -14
- package/router/dist/routing/observed-routing.js +319 -318
- package/router/dist/routing/parsers.d.ts +10 -10
- package/router/dist/routing/parsers.js +454 -406
- package/router/dist/routing/run-filters.d.ts +45 -41
- package/router/dist/routing/run-filters.js +215 -207
- package/router/dist/routing/run-reducers.d.ts +45 -26
- package/router/dist/routing/run-reducers.js +102 -90
- package/router/dist/sandbox/adapter-roots.d.ts +34 -26
- package/router/dist/sandbox/adapter-roots.js +43 -41
- package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
- package/router/dist/sandbox/eryx-python-adapter.js +659 -588
- package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
- package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
- package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
- package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
- package/router/dist/sandbox/script-sandbox.d.ts +105 -84
- package/router/dist/sandbox/script-sandbox.js +294 -260
- package/router/dist/setup/script-transform-adapters.d.ts +23 -19
- package/router/dist/setup/script-transform-adapters.js +223 -204
- package/router/dist/tools/batch.d.ts +27 -16
- package/router/dist/tools/batch.js +493 -416
- package/router/dist/tools/run.d.ts +47 -35
- package/router/dist/tools/run.js +1172 -1087
- package/router/dist/tools/search.d.ts +53 -31
- package/router/dist/tools/search.js +1224 -1065
- package/router/dist/transform/engine.d.ts +121 -96
- package/router/dist/transform/engine.js +1853 -1736
- package/router/dist/vault/vault-index.d.ts +97 -78
- package/router/dist/vault/vault-index.js +347 -342
- package/router/dist/vault/vault.d.ts +109 -74
- package/router/dist/vault/vault.js +528 -533
- package/runtime/interaction-contract.md +16 -0
- package/skills/bypass/SKILL.md +52 -38
- package/skills/commit-work/SKILL.md +54 -46
- package/skills/commit-work/references/staging-decisions.md +46 -24
- package/skills/decision-gate/SKILL.md +48 -0
- package/skills/design-for-depth/SKILL.md +75 -59
- package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
- package/skills/design-for-depth/references/interface-design-loop.md +156 -0
- package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
- package/skills/diagnose-failure/SKILL.md +65 -60
- package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
- package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
- package/skills/discuss/SKILL.md +121 -0
- package/skills/discuss/references/checkpoints.md +66 -0
- package/skills/evaluate-skill/SKILL.md +62 -53
- package/skills/evaluate-skill/references/definition-schema.md +345 -0
- package/skills/evaluate-skill/references/evaluation-design.md +86 -0
- package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
- package/skills/evaluate-skill/references/review-and-revision.md +51 -0
- package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
- package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
- package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
- package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
- package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
- package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
- package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
- package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
- package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
- package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
- package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
- package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
- package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
- package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
- package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
- package/skills/execute-work/SKILL.md +99 -0
- package/skills/execute-work/references/code-practices.md +78 -0
- package/skills/execute-work/references/execution-loop.md +77 -0
- package/skills/finish-branch/SKILL.md +117 -0
- package/skills/finish-branch/references/integration-options.md +80 -0
- package/skills/handoff/SKILL.md +65 -39
- package/skills/handoff/references/templates.md +104 -27
- package/skills/launch-work/SKILL.md +116 -0
- package/skills/launch-work/references/launch-readiness.md +85 -0
- package/skills/migration-work/SKILL.md +115 -0
- package/skills/migration-work/references/migration-lifecycle.md +82 -0
- package/skills/mode-contract/SKILL.md +72 -52
- package/skills/release-work/SKILL.md +118 -0
- package/skills/release-work/references/release-evidence.md +78 -0
- package/skills/review-artifact/SKILL.md +77 -69
- package/skills/review-artifact/references/reviewer-prompt.md +133 -42
- package/skills/review-work/SKILL.md +82 -57
- package/skills/review-work/references/reviewer-prompt.md +97 -60
- package/skills/review-work/references/security-risk-lens.md +67 -0
- package/skills/setup-freeflow/SKILL.md +54 -68
- package/skills/setup-freeflow/references/activation-contract.md +84 -69
- package/skills/setup-freeflow/references/host-setup.md +50 -17
- package/skills/simplify-code/SKILL.md +80 -0
- package/skills/simplify-code/references/simplification-patterns.md +70 -0
- package/skills/tdd/SKILL.md +96 -0
- package/skills/tdd/references/test-design.md +96 -0
- package/skills/track-work/SKILL.md +84 -0
- package/skills/track-work/references/working-record-schema.md +378 -0
- package/skills/verify-work/SKILL.md +59 -38
- package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
- package/skills/verify-work/references/integration-evidence.md +51 -0
- package/skills/verify-work/references/performance-evidence.md +57 -0
- package/skills/workflow/SKILL.md +53 -59
- package/skills/workflow/references/domain-skill-composition.md +57 -0
- package/skills/workflow/references/workflow-loop.md +92 -0
- package/skills/write-plan/SKILL.md +85 -58
- package/skills/write-plan/references/plan-shapes.md +132 -46
- package/skills/write-skill/SKILL.md +82 -51
- package/skills/write-skill/references/activation-boundaries.md +62 -0
- package/skills/write-skill/references/agent-first-instructions.md +87 -0
- package/skills/write-skill/references/progressive-disclosure.md +63 -0
- package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
- package/skills/write-skill/scripts/skill-author.mjs +104 -0
- package/skills/write-spec/SKILL.md +65 -54
- package/skills/write-spec/references/artifact-standards.md +60 -41
- package/skills/write-spec/references/decision-records.md +77 -0
- package/skills/write-spec/references/spec-shapes.md +119 -60
- package/evals/README.md +0 -32
- package/evals/fixtures/copy-conventions.md +0 -31
- package/evals/fixtures/output-router/README.md +0 -12
- package/evals/fixtures/output-router/failed-command-output.txt +0 -9
- package/evals/fixtures/output-router/large-router-manual.md +0 -63
- package/evals/fixtures/output-router/native-large-output.txt +0 -40
- package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
- package/evals/fixtures/output-router/verification-output.txt +0 -8
- package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
- package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
- package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
- package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
- package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
- package/evals/fixtures/tiny-commit-app/README.md +0 -3
- package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
- package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
- package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
- package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
- package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
- package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
- package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
- package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
- package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
- package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
- package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
- package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
- package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
- package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
- package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
- package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
- package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
- package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
- package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
- package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
- package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
- package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
- package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
- package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
- package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
- package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
- package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
- package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
- package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
- package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
- package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
- package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
- package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
- package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
- package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
- package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
- package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
- package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
- package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
- package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
- package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
- package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
- package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
- package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
- package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
- package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
- package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
- package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
- package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
- package/evals/fixtures/tiny-handoff-app/README.md +0 -5
- package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
- package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
- package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
- package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
- package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
- package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
- package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
- package/evals/fixtures/tiny-plan-app/README.md +0 -5
- package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
- package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
- package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
- package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
- package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
- package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
- package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
- package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
- package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
- package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
- package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
- package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
- package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
- package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
- package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
- package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
- package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
- package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
- package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
- package/evals/fixtures/tiny-review-request-app/README.md +0 -3
- package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
- package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
- package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
- package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
- package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
- package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
- package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
- package/evals/fixtures/tiny-review-work-app/README.md +0 -5
- package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
- package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
- package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
- package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
- package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
- package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
- package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
- package/evals/fixtures/tiny-saas-app/README.md +0 -16
- package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
- package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
- package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
- package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
- package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
- package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
- package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
- package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
- package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
- package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
- package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
- package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
- package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
- package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
- package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
- package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
- package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
- package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
- package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
- package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
- package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
- package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
- package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
- package/evals/fixtures/tiny-team-app/README.md +0 -5
- package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
- package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
- package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
- package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
- package/evals/fixtures/tiny-verify-app/README.md +0 -5
- package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
- package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
- package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
- package/evals/prompts/aon-001.txt +0 -2
- package/evals/prompts/byp-001.txt +0 -2
- package/evals/prompts/byp-002.txt +0 -2
- package/evals/prompts/cap-001.txt +0 -3
- package/evals/prompts/cap-002.txt +0 -3
- package/evals/prompts/cmd-001.txt +0 -3
- package/evals/prompts/cmd-002.txt +0 -3
- package/evals/prompts/cmd-003.txt +0 -6
- package/evals/prompts/cmd-004.txt +0 -5
- package/evals/prompts/cmd-005.txt +0 -5
- package/evals/prompts/cmd-006.txt +0 -5
- package/evals/prompts/cmd-007.txt +0 -5
- package/evals/prompts/cmd-008.txt +0 -5
- package/evals/prompts/cmd-009.txt +0 -8
- package/evals/prompts/cmd-010.txt +0 -5
- package/evals/prompts/cmd-011.txt +0 -5
- package/evals/prompts/cmd-012.txt +0 -5
- package/evals/prompts/cmd-013.txt +0 -5
- package/evals/prompts/cmd-014.txt +0 -7
- package/evals/prompts/cmd-015.txt +0 -7
- package/evals/prompts/cmd-016.txt +0 -5
- package/evals/prompts/cmt-001.txt +0 -1
- package/evals/prompts/cmt-002.txt +0 -1
- package/evals/prompts/cmt-003.txt +0 -1
- package/evals/prompts/cmt-004.txt +0 -1
- package/evals/prompts/cmt-005.txt +0 -1
- package/evals/prompts/dfd-001.txt +0 -3
- package/evals/prompts/dia-001.txt +0 -3
- package/evals/prompts/dia-002.txt +0 -3
- package/evals/prompts/dia-003.txt +0 -3
- package/evals/prompts/dis-001.txt +0 -5
- package/evals/prompts/dis-002.txt +0 -5
- package/evals/prompts/esk-001.txt +0 -5
- package/evals/prompts/esk-002.txt +0 -5
- package/evals/prompts/esk-003.txt +0 -5
- package/evals/prompts/grc-001.txt +0 -3
- package/evals/prompts/hof-001.txt +0 -3
- package/evals/prompts/hof-002.txt +0 -1
- package/evals/prompts/hof-003.txt +0 -1
- package/evals/prompts/hof-004.txt +0 -1
- package/evals/prompts/hof-005.txt +0 -1
- package/evals/prompts/ivg-001.txt +0 -1
- package/evals/prompts/ivg-002.txt +0 -11
- package/evals/prompts/ivg-003.txt +0 -1
- package/evals/prompts/ivg-004.txt +0 -1
- package/evals/prompts/mode-001.txt +0 -3
- package/evals/prompts/mode-002.txt +0 -1
- package/evals/prompts/mode-003.txt +0 -3
- package/evals/prompts/mode-004.txt +0 -3
- package/evals/prompts/mode-005.txt +0 -3
- package/evals/prompts/mode-006.txt +0 -3
- package/evals/prompts/mode-007.txt +0 -3
- package/evals/prompts/otr-001.txt +0 -3
- package/evals/prompts/otr-002.txt +0 -3
- package/evals/prompts/rar-001.txt +0 -5
- package/evals/prompts/rar-002.txt +0 -3
- package/evals/prompts/rar-003.txt +0 -6
- package/evals/prompts/rar-004.txt +0 -15
- package/evals/prompts/rar-005.txt +0 -10
- package/evals/prompts/rbr-001.txt +0 -3
- package/evals/prompts/rbr-002.txt +0 -3
- package/evals/prompts/rbr-003.txt +0 -7
- package/evals/prompts/rev-001.txt +0 -3
- package/evals/prompts/rev-002.txt +0 -5
- package/evals/prompts/rev-003.txt +0 -6
- package/evals/prompts/rev-004.txt +0 -1
- package/evals/prompts/rev-005.txt +0 -15
- package/evals/prompts/rev-006.txt +0 -5
- package/evals/prompts/stp-001.txt +0 -1
- package/evals/prompts/stp-002.txt +0 -1
- package/evals/prompts/stp-003.txt +0 -1
- package/evals/prompts/stp-004.txt +0 -1
- package/evals/prompts/stp-005.txt +0 -1
- package/evals/prompts/stp-006.txt +0 -1
- package/evals/prompts/stp-007.txt +0 -1
- package/evals/prompts/stp-008.txt +0 -1
- package/evals/prompts/stp-009.txt +0 -1
- package/evals/prompts/stp-010.txt +0 -1
- package/evals/prompts/stp-011.txt +0 -1
- package/evals/prompts/vfy-003.txt +0 -1
- package/evals/prompts/wpl-001.txt +0 -3
- package/evals/prompts/wpl-002.txt +0 -5
- package/evals/prompts/wpl-003.txt +0 -3
- package/evals/prompts/wpl-004.txt +0 -5
- package/evals/prompts/wpl-005.txt +0 -1
- package/evals/prompts/wrc-001.txt +0 -10
- package/evals/prompts/wrc-002.txt +0 -3
- package/evals/prompts/wsk-001.txt +0 -6
- package/evals/prompts/wsp-001.txt +0 -5
- package/evals/prompts/wsp-002.txt +0 -15
- package/evals/prompts/wsp-003.txt +0 -3
- package/evals/prompts/wsp-004.txt +0 -15
- package/evals/prompts/wsp-005.txt +0 -5
- package/evals/prompts/wsp-006.txt +0 -12
- package/evals/prompts/wsp-007.txt +0 -9
- package/evals/prompts/wsp-008.txt +0 -13
- package/evals/prompts/xpl-001.txt +0 -1
- package/evals/prompts/xpl-002.txt +0 -3
- package/evals/prompts/xpl-003.txt +0 -3
- package/evals/prompts/xpl-004.txt +0 -3
- package/evals/prompts/xpl-005.txt +0 -5
- package/evals/prompts/xpl-006.txt +0 -3
- package/evals/registries/adversarial-evals.json +0 -39
- package/evals/registries/fixture-evals.json +0 -2513
- package/evals/registries/handoff-evals.json +0 -74
- package/evals/registries/legacy-evals.json +0 -147
- package/evals/registries/skill-evidence.json +0 -193
- package/evals/registries/verify-work-evals.json +0 -46
- package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
- package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
- package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
- package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
- package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
- package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
- package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
- package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
- package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
- package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
- package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
- package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
- package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
- package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
- package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
- package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
- package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
- package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
- package/evals/reports/by-skill/bypass-1-report.md +0 -124
- package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
- package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
- package/evals/reports/by-skill/commit-work-1-report.md +0 -165
- package/evals/reports/by-skill/commit-work-2-report.md +0 -109
- package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
- package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
- package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
- package/evals/reports/by-skill/discover-1-report.md +0 -118
- package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
- package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
- package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
- package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
- package/evals/reports/by-skill/grill-context-1-report.md +0 -103
- package/evals/reports/by-skill/handoff-1-report.md +0 -123
- package/evals/reports/by-skill/handoff-2-report.md +0 -105
- package/evals/reports/by-skill/handoff-3-report.md +0 -100
- package/evals/reports/by-skill/handoff-7-report.md +0 -77
- package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
- package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
- package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
- package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
- package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
- package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
- package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
- package/evals/reports/by-skill/output-router-1-report.md +0 -76
- package/evals/reports/by-skill/output-router-2-report.md +0 -65
- package/evals/reports/by-skill/research-1-report.md +0 -144
- package/evals/reports/by-skill/research-brief-1-report.md +0 -94
- package/evals/reports/by-skill/research-brief-2-report.md +0 -75
- package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
- package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
- package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
- package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
- package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
- package/evals/reports/by-skill/review-work-1-report.md +0 -85
- package/evals/reports/by-skill/review-work-2-report.md +0 -87
- package/evals/reports/by-skill/review-work-3-report.md +0 -104
- package/evals/reports/by-skill/review-work-4-report.md +0 -108
- package/evals/reports/by-skill/review-work-5-report.md +0 -73
- package/evals/reports/by-skill/review-work-6-report.md +0 -66
- package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
- package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
- package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
- package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
- package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
- package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
- package/evals/reports/by-skill/verify-work-1-report.md +0 -111
- package/evals/reports/by-skill/verify-work-2-report.md +0 -120
- package/evals/reports/by-skill/workflow-1-report.md +0 -65
- package/evals/reports/by-skill/write-plan-1-report.md +0 -123
- package/evals/reports/by-skill/write-plan-2-report.md +0 -98
- package/evals/reports/by-skill/write-plan-3-report.md +0 -110
- package/evals/reports/by-skill/write-spec-1-report.md +0 -88
- package/evals/reports/by-skill/write-spec-2-report.md +0 -89
- package/evals/reports/by-skill/write-spec-3-report.md +0 -90
- package/evals/reports/by-skill/write-spec-4-report.md +0 -167
- package/evals/reports/harness/claude-harness-1-report.md +0 -103
- package/evals/reports/harness/eval-harness-1-report.md +0 -91
- package/evals/reports/iterations/iteration-1-report.md +0 -71
- package/evals/reports/iterations/iteration-2-report.md +0 -78
- package/evals/reports/iterations/iteration-3-report.md +0 -118
- package/evals/reports/iterations/iteration-4-report.md +0 -131
- package/evals/reports/iterations/iteration-5-report.md +0 -149
- package/evals/reports/iterations/iteration-6-report.md +0 -136
- package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
- package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
- package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
- package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
- package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
- package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
- package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
- package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
- package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
- package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
- package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
- package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
- package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
- package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
- package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
- package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
- package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
- package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
- package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
- package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
- package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
- package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
- package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
- package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
- package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
- package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
- package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
- package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
- package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
- package/evals/runbooks/adversarial-eval-runbook.md +0 -28
- package/evals/runbooks/fixture-eval-runbook.md +0 -137
- package/evals/runbooks/handoff-eval-runbook.md +0 -22
- package/evals/runbooks/verify-work-eval-runbook.md +0 -27
- package/evals/scripts/audit-command-surface.sh +0 -160
- package/evals/scripts/check-activation-contract.sh +0 -121
- package/evals/scripts/check-runtime-context-hook.sh +0 -183
- package/evals/scripts/grade-fixture-eval.sh +0 -446
- package/evals/scripts/run-claude-fixture-eval.sh +0 -26
- package/evals/scripts/run-codex-fixture-eval.sh +0 -26
- package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
- package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
- package/evals/scripts/run-fixture-eval.sh +0 -464
- package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
- package/evals/scripts/run-output-router-transform-eval.js +0 -115
- package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
- package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
- package/evals/scripts/skill-evidence.sh +0 -316
- package/evals/scripts/validate-release-metadata.sh +0 -486
- package/evals/suites/v0.1-acceptance-suite.md +0 -131
- package/pi-extension/dist/host-producer-identification.js +0 -186
- package/pi-extension/dist/mcp-config.js +0 -30
- package/pi-extension/dist/native-safety-net.js +0 -209
- package/pi-extension/dist/observed-tool-routing.js +0 -114
- package/pi-extension/dist/renderers.js +0 -835
- package/pi-extension/dist/router-tools.js +0 -438
- package/pi-extension/dist/runtime-context.js +0 -288
- package/pi-extension/dist/schemas.js +0 -254
- package/pi-extension/dist/status.js +0 -449
- package/pi-extension/dist/utils.js +0 -467
- package/pi-extension/src/runtime-context.ts +0 -347
- package/pi-extension/src/status.ts +0 -505
- package/plugin-docs/README.md +0 -40
- package/plugin-docs/adr/0001-three-modes.md +0 -27
- package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
- package/plugin-docs/adr/0003-release-boundary.md +0 -21
- package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
- package/plugin-docs/adr/README.md +0 -10
- package/plugin-docs/architecture.md +0 -89
- package/plugin-docs/output-router.md +0 -396
- package/plugin-docs/release-evidence.md +0 -77
- package/plugin-docs/skills.md +0 -44
- package/plugin-docs/workflow.md +0 -57
- package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
- package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
- package/skills/discover/CHECKPOINTS.md +0 -74
- package/skills/discover/SKILL.md +0 -173
- package/skills/evaluate-skill/references/eval-patterns.md +0 -41
- package/skills/evaluate-skill/references/grading-priority.md +0 -33
- package/skills/execute-plan/SKILL.md +0 -133
- package/skills/execute-plan/references/execution-map.md +0 -122
- package/skills/interview-gate/SKILL.md +0 -90
- package/skills/setup-freeflow/references/output-router-setup.md +0 -102
- package/skills/workflow/references/workflow-map.md +0 -104
- /package/pi-extension/src/{mcp-config.ts → integrations/mcp-config.ts} +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
import crypto from "node:crypto";
|
|
3
4
|
import fs from "node:fs";
|
|
4
5
|
import path from "node:path";
|
|
5
6
|
import process from "node:process";
|
|
@@ -8,6 +9,9 @@ import { fileURLToPath } from "node:url";
|
|
|
8
9
|
const SCRIPT_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
9
10
|
const PLUGIN_ROOT = path.resolve(SCRIPT_DIR, "..");
|
|
10
11
|
const VALID_MODES = new Set(["conversation", "workflow", "strict-workflow"]);
|
|
12
|
+
const SESSION_STATE_VERSION = 1;
|
|
13
|
+
const SESSION_STATE_MAX_AGE_MS = 90 * 24 * 60 * 60 * 1000;
|
|
14
|
+
const CLEAR_TRANSFER_MAX_AGE_MS = 60 * 1000;
|
|
11
15
|
|
|
12
16
|
function readStdinJson() {
|
|
13
17
|
const raw = fs.readFileSync(0, "utf8").trim();
|
|
@@ -46,226 +50,634 @@ function findWorkspaceRoot(cwd) {
|
|
|
46
50
|
}
|
|
47
51
|
}
|
|
48
52
|
|
|
49
|
-
function loadRuntimeContext() {
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
path.join(PLUGIN_ROOT, "
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
const outputRouterSkill = readText(path.join(PLUGIN_ROOT, "skills", "output-router", "SKILL.md"));
|
|
53
|
+
function loadRuntimeContext(options = {}) {
|
|
54
|
+
const includeInteractionContract = options.interactionContract === true;
|
|
55
|
+
const includeSkills = options.skills === true;
|
|
56
|
+
const interactionContract = includeInteractionContract
|
|
57
|
+
? readText(path.join(PLUGIN_ROOT, "runtime", "interaction-contract.md"))
|
|
58
|
+
: null;
|
|
59
|
+
const workflowSkill = includeSkills ? readText(path.join(PLUGIN_ROOT, "skills", "workflow", "SKILL.md")) : null;
|
|
57
60
|
|
|
58
|
-
if (
|
|
61
|
+
if ((includeInteractionContract && !interactionContract) || (includeSkills && !workflowSkill)) {
|
|
59
62
|
throw new Error("Freeflow runtime context files are missing.");
|
|
60
63
|
}
|
|
61
64
|
|
|
62
|
-
return {
|
|
65
|
+
return { interactionContract, workflowSkill };
|
|
63
66
|
}
|
|
64
67
|
|
|
65
68
|
function readConfig(root) {
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
const repository = readConfigLayer(path.join(root, ".freeflow", "config.json"), isValidSetupConfig);
|
|
70
|
+
const local = readConfigLayer(path.join(root, ".freeflow", "local.json"), isValidLocalConfig);
|
|
71
|
+
const localValid = !local.exists || local.valid;
|
|
72
|
+
const configured = repository.valid && localValid;
|
|
73
|
+
const core = resolveCoreConfig(repository.valid ? repository.parsed : {}, local.valid ? local.parsed : {});
|
|
74
|
+
const enabled = configured && core.config.enabled;
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
exists: repository.exists,
|
|
78
|
+
valid: configured,
|
|
79
|
+
configured,
|
|
80
|
+
repositoryValid: repository.valid,
|
|
81
|
+
localExists: local.exists,
|
|
82
|
+
localValid,
|
|
83
|
+
error: !repository.valid ? repository.error : local.error,
|
|
84
|
+
enabled,
|
|
85
|
+
interactionContractEnabled: enabled && core.config.interactionContract,
|
|
86
|
+
skillsEnabled: enabled && core.config.skills.enabled,
|
|
87
|
+
defaultMode: core.config.defaultMode,
|
|
88
|
+
sources: core.sources,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function readConfigLayer(filePath, validate) {
|
|
93
|
+
if (!fs.existsSync(filePath)) {
|
|
94
|
+
return { path: filePath, exists: false, valid: false, parsed: {}, error: null };
|
|
70
95
|
}
|
|
71
96
|
|
|
72
97
|
try {
|
|
73
|
-
const parsed = JSON.parse(
|
|
74
|
-
const
|
|
75
|
-
return {
|
|
76
|
-
|
|
77
|
-
|
|
98
|
+
const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
99
|
+
const error = validate(parsed);
|
|
100
|
+
return {
|
|
101
|
+
path: filePath,
|
|
102
|
+
exists: true,
|
|
103
|
+
valid: error === null,
|
|
104
|
+
parsed: error === null ? parsed : {},
|
|
105
|
+
error,
|
|
106
|
+
};
|
|
107
|
+
} catch (error) {
|
|
108
|
+
return {
|
|
109
|
+
path: filePath,
|
|
110
|
+
exists: true,
|
|
111
|
+
valid: false,
|
|
112
|
+
parsed: {},
|
|
113
|
+
error: error instanceof Error ? error.message : String(error),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function isRecord(value) {
|
|
119
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function validateCoreConfigFields(value) {
|
|
123
|
+
if (Object.hasOwn(value, "defaultMode") && !VALID_MODES.has(value.defaultMode)) {
|
|
124
|
+
return "defaultMode must be conversation, workflow, or strict-workflow";
|
|
125
|
+
}
|
|
126
|
+
if (Object.hasOwn(value, "enabled") && typeof value.enabled !== "boolean") {
|
|
127
|
+
return "enabled must be a boolean";
|
|
128
|
+
}
|
|
129
|
+
if (Object.hasOwn(value, "interactionContract") && typeof value.interactionContract !== "boolean") {
|
|
130
|
+
return "interactionContract must be a boolean";
|
|
131
|
+
}
|
|
132
|
+
if (Object.hasOwn(value, "skills")) {
|
|
133
|
+
if (!isRecord(value.skills)) {
|
|
134
|
+
return "skills must be an object";
|
|
135
|
+
}
|
|
136
|
+
if (Object.hasOwn(value.skills, "enabled") && typeof value.skills.enabled !== "boolean") {
|
|
137
|
+
return "skills.enabled must be a boolean";
|
|
138
|
+
}
|
|
78
139
|
}
|
|
140
|
+
return null;
|
|
79
141
|
}
|
|
80
142
|
|
|
81
143
|
function isValidSetupConfig(value) {
|
|
82
|
-
if (!
|
|
83
|
-
return
|
|
144
|
+
if (!isRecord(value)) {
|
|
145
|
+
return "repository config must be a JSON object";
|
|
84
146
|
}
|
|
85
147
|
|
|
86
|
-
const allowedKeys = new Set([
|
|
148
|
+
const allowedKeys = new Set([
|
|
149
|
+
"enabled",
|
|
150
|
+
"defaultMode",
|
|
151
|
+
"interactionContract",
|
|
152
|
+
"skills",
|
|
153
|
+
"outputRouter",
|
|
154
|
+
"observedRouting",
|
|
155
|
+
"scriptTransform",
|
|
156
|
+
]);
|
|
87
157
|
if (!Object.keys(value).every((key) => allowedKeys.has(key))) {
|
|
88
|
-
return
|
|
158
|
+
return "repository config contains unsupported top-level keys";
|
|
89
159
|
}
|
|
90
160
|
|
|
91
|
-
|
|
92
|
-
|
|
161
|
+
const coreError = validateCoreConfigFields(value);
|
|
162
|
+
if (coreError) {
|
|
163
|
+
return coreError;
|
|
93
164
|
}
|
|
94
165
|
|
|
95
|
-
|
|
96
|
-
if (
|
|
97
|
-
return
|
|
166
|
+
for (const key of ["outputRouter", "observedRouting", "scriptTransform"]) {
|
|
167
|
+
if (Object.hasOwn(value, key) && !isRecord(value[key])) {
|
|
168
|
+
return `${key} must be an object`;
|
|
98
169
|
}
|
|
99
170
|
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
100
173
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
174
|
+
function isValidLocalConfig(value) {
|
|
175
|
+
if (!isRecord(value)) {
|
|
176
|
+
return "local config must be a JSON object";
|
|
105
177
|
}
|
|
106
178
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
179
|
+
const allowedKeys = new Set(["enabled", "defaultMode", "interactionContract", "skills", "processing"]);
|
|
180
|
+
if (!Object.keys(value).every((key) => allowedKeys.has(key))) {
|
|
181
|
+
return "local config contains unsupported top-level keys";
|
|
111
182
|
}
|
|
183
|
+
return validateCoreConfigFields(value);
|
|
184
|
+
}
|
|
112
185
|
|
|
113
|
-
|
|
186
|
+
function hasOwn(value, key) {
|
|
187
|
+
return Object.hasOwn(value, key);
|
|
114
188
|
}
|
|
115
189
|
|
|
116
|
-
function
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
190
|
+
function resolveLayeredValue(repository, local, key, fallback) {
|
|
191
|
+
if (hasOwn(local, key)) {
|
|
192
|
+
return { value: local[key], source: "local" };
|
|
193
|
+
}
|
|
194
|
+
if (hasOwn(repository, key)) {
|
|
195
|
+
return { value: repository[key], source: "repository" };
|
|
196
|
+
}
|
|
197
|
+
return { value: fallback, source: "builtin" };
|
|
198
|
+
}
|
|
121
199
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
200
|
+
function resolveCoreConfig(repository, local) {
|
|
201
|
+
const enabled = resolveLayeredValue(repository, local, "enabled", true);
|
|
202
|
+
const interactionContract = resolveLayeredValue(repository, local, "interactionContract", true);
|
|
203
|
+
const defaultMode = resolveLayeredValue(repository, local, "defaultMode", "workflow");
|
|
204
|
+
const repositorySkills = isRecord(repository.skills) ? repository.skills : {};
|
|
205
|
+
const localSkills = isRecord(local.skills) ? local.skills : {};
|
|
206
|
+
const skillsEnabled = resolveLayeredValue(repositorySkills, localSkills, "enabled", true);
|
|
207
|
+
|
|
208
|
+
return {
|
|
209
|
+
config: {
|
|
210
|
+
enabled: enabled.value,
|
|
211
|
+
interactionContract: interactionContract.value,
|
|
212
|
+
skills: { enabled: skillsEnabled.value },
|
|
213
|
+
defaultMode: defaultMode.value,
|
|
214
|
+
},
|
|
215
|
+
sources: {
|
|
216
|
+
enabled: enabled.source,
|
|
217
|
+
interactionContract: interactionContract.source,
|
|
218
|
+
skillsEnabled: skillsEnabled.source,
|
|
219
|
+
defaultMode: defaultMode.source,
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function hostName() {
|
|
225
|
+
return process.env.PLUGIN_DATA ? "codex" : "claude";
|
|
226
|
+
}
|
|
131
227
|
|
|
132
|
-
|
|
228
|
+
function pluginDataRoot() {
|
|
229
|
+
const configured = process.env.PLUGIN_DATA || process.env.CLAUDE_PLUGIN_DATA;
|
|
230
|
+
return configured ? path.resolve(configured) : null;
|
|
133
231
|
}
|
|
134
232
|
|
|
135
|
-
function
|
|
136
|
-
|
|
137
|
-
|
|
233
|
+
function sessionStatePath(sessionId) {
|
|
234
|
+
const dataRoot = pluginDataRoot();
|
|
235
|
+
if (!dataRoot || typeof sessionId !== "string" || sessionId.length === 0) {
|
|
236
|
+
return null;
|
|
138
237
|
}
|
|
139
|
-
|
|
140
|
-
|
|
238
|
+
|
|
239
|
+
const key = crypto.createHash("sha256").update(`${hostName()}\0${sessionId}`).digest("hex");
|
|
240
|
+
return path.join(dataRoot, "session-modes", hostName(), `${key}.json`);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function workspaceKey(root) {
|
|
244
|
+
return crypto.createHash("sha256").update(path.resolve(root)).digest("hex");
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function claudeProcessKey() {
|
|
248
|
+
const processId = process.env.CLAUDE_PID;
|
|
249
|
+
if (typeof processId !== "string" || processId.length === 0) {
|
|
250
|
+
return null;
|
|
141
251
|
}
|
|
142
|
-
return "
|
|
252
|
+
return crypto.createHash("sha256").update(processId).digest("hex");
|
|
143
253
|
}
|
|
144
254
|
|
|
145
|
-
function
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
255
|
+
function clearTransferPath(root) {
|
|
256
|
+
const dataRoot = pluginDataRoot();
|
|
257
|
+
const processKey = claudeProcessKey();
|
|
258
|
+
if (!dataRoot || hostName() !== "claude" || !processKey) {
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
return path.join(dataRoot, "session-modes", "claude-clear", `${workspaceKey(root)}-${processKey}.json`);
|
|
152
262
|
}
|
|
153
263
|
|
|
154
|
-
function
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
if (!setup.config.valid) {
|
|
167
|
-
issues.push("valid `.freeflow/config.json` is missing");
|
|
264
|
+
function writeJsonAtomic(filePath, value) {
|
|
265
|
+
const directory = path.dirname(filePath);
|
|
266
|
+
fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
267
|
+
const temporaryPath = `${filePath}.${process.pid}.${crypto.randomUUID()}.tmp`;
|
|
268
|
+
try {
|
|
269
|
+
fs.writeFileSync(temporaryPath, `${JSON.stringify(value)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
270
|
+
fs.renameSync(temporaryPath, filePath);
|
|
271
|
+
} catch (error) {
|
|
272
|
+
try {
|
|
273
|
+
fs.unlinkSync(temporaryPath);
|
|
274
|
+
} catch {
|
|
275
|
+
// Best-effort cleanup of a failed atomic write.
|
|
168
276
|
}
|
|
169
|
-
|
|
170
|
-
|
|
277
|
+
throw error;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function readSessionMode(sessionId) {
|
|
282
|
+
const filePath = sessionStatePath(sessionId);
|
|
283
|
+
if (!filePath) {
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
try {
|
|
288
|
+
const state = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
289
|
+
if (state.version !== SESSION_STATE_VERSION || !VALID_MODES.has(state.mode)) {
|
|
290
|
+
return null;
|
|
171
291
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
parts.push(`Repo default mode: ${modeStatus}.`);
|
|
183
|
-
parts.push(
|
|
184
|
-
"Required user-facing notice: in the next assistant reply, tell the user Freeflow is installed but this repo is not set up yet, and recommend `/setup-freeflow`. Do this even if the user's prompt is casual, such as a greeting."
|
|
185
|
-
);
|
|
186
|
-
parts.push(
|
|
187
|
-
"Before consequential work in this repo, use `/setup-freeflow` or ask whether to set up Freeflow for Codex, Claude, or both. Do not start implementation solely because the plugin is installed."
|
|
188
|
-
);
|
|
292
|
+
return state.mode;
|
|
293
|
+
} catch {
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function writeSessionMode(sessionId, mode) {
|
|
299
|
+
const filePath = sessionStatePath(sessionId);
|
|
300
|
+
if (!filePath) {
|
|
301
|
+
return false;
|
|
189
302
|
}
|
|
190
303
|
|
|
191
|
-
|
|
304
|
+
writeJsonAtomic(filePath, {
|
|
305
|
+
version: SESSION_STATE_VERSION,
|
|
306
|
+
mode,
|
|
307
|
+
updatedAt: new Date().toISOString(),
|
|
308
|
+
});
|
|
309
|
+
return true;
|
|
192
310
|
}
|
|
193
311
|
|
|
194
|
-
function
|
|
195
|
-
|
|
312
|
+
function clearSessionMode(sessionId) {
|
|
313
|
+
const filePath = sessionStatePath(sessionId);
|
|
314
|
+
if (!filePath) {
|
|
196
315
|
return false;
|
|
197
316
|
}
|
|
198
317
|
|
|
199
|
-
|
|
318
|
+
try {
|
|
319
|
+
fs.unlinkSync(filePath);
|
|
320
|
+
} catch (error) {
|
|
321
|
+
if (error?.code !== "ENOENT") {
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return true;
|
|
200
326
|
}
|
|
201
327
|
|
|
202
|
-
function
|
|
328
|
+
function stageClearTransfer(input) {
|
|
329
|
+
if (hostName() !== "claude" || input.reason !== "clear") {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
|
|
203
333
|
const root = findWorkspaceRoot(input.cwd || process.cwd());
|
|
204
|
-
const
|
|
334
|
+
const mode = readSessionMode(input.session_id);
|
|
335
|
+
const filePath = clearTransferPath(root);
|
|
336
|
+
if (!filePath) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
205
339
|
|
|
340
|
+
if (!mode) {
|
|
341
|
+
try {
|
|
342
|
+
fs.unlinkSync(filePath);
|
|
343
|
+
} catch (error) {
|
|
344
|
+
if (error?.code !== "ENOENT") {
|
|
345
|
+
throw error;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
writeJsonAtomic(filePath, {
|
|
352
|
+
version: SESSION_STATE_VERSION,
|
|
353
|
+
mode,
|
|
354
|
+
sourceSessionKey: crypto.createHash("sha256").update(String(input.session_id)).digest("hex"),
|
|
355
|
+
createdAt: new Date().toISOString(),
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function consumeClearTransfer(input, root) {
|
|
360
|
+
if (hostName() !== "claude" || input.source !== "clear") {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
const filePath = clearTransferPath(root);
|
|
365
|
+
if (!filePath) {
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
const claimedPath = `${filePath}.${process.pid}.${crypto.randomUUID()}.claimed`;
|
|
370
|
+
try {
|
|
371
|
+
fs.renameSync(filePath, claimedPath);
|
|
372
|
+
} catch (error) {
|
|
373
|
+
if (error?.code === "ENOENT") {
|
|
374
|
+
return null;
|
|
375
|
+
}
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
let state;
|
|
380
|
+
try {
|
|
381
|
+
state = JSON.parse(fs.readFileSync(claimedPath, "utf8"));
|
|
382
|
+
} catch {
|
|
383
|
+
return null;
|
|
384
|
+
} finally {
|
|
385
|
+
try {
|
|
386
|
+
fs.unlinkSync(claimedPath);
|
|
387
|
+
} catch {
|
|
388
|
+
// The atomic claim already prevents reuse; cleanup is best-effort.
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
if (!isRecord(state)) {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
const createdAt = Date.parse(state.createdAt);
|
|
396
|
+
if (
|
|
397
|
+
state.version !== SESSION_STATE_VERSION ||
|
|
398
|
+
!VALID_MODES.has(state.mode) ||
|
|
399
|
+
!Number.isFinite(createdAt) ||
|
|
400
|
+
Date.now() - createdAt > CLEAR_TRANSFER_MAX_AGE_MS ||
|
|
401
|
+
Date.now() < createdAt
|
|
402
|
+
) {
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return writeSessionMode(input.session_id, state.mode) ? state.mode : null;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
function cleanupExpiredSessionModes() {
|
|
410
|
+
const root = pluginDataRoot();
|
|
411
|
+
if (!root) {
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
const stateRoot = path.join(root, "session-modes");
|
|
416
|
+
const cutoff = Date.now() - SESSION_STATE_MAX_AGE_MS;
|
|
417
|
+
for (const host of ["claude", "codex", "claude-clear"]) {
|
|
418
|
+
const directory = path.join(stateRoot, host);
|
|
419
|
+
let entries = [];
|
|
420
|
+
try {
|
|
421
|
+
entries = fs.readdirSync(directory, { withFileTypes: true });
|
|
422
|
+
} catch {
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
for (const entry of entries) {
|
|
427
|
+
if (!entry.isFile() || !entry.name.endsWith(".json")) {
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
const filePath = path.join(directory, entry.name);
|
|
431
|
+
try {
|
|
432
|
+
if (fs.statSync(filePath).mtimeMs < cutoff) {
|
|
433
|
+
fs.unlinkSync(filePath);
|
|
434
|
+
}
|
|
435
|
+
} catch {
|
|
436
|
+
// Cleanup is best-effort and must not prevent runtime delivery.
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
function sourceLabel(source) {
|
|
443
|
+
if (source === "local") {
|
|
444
|
+
return "personal";
|
|
445
|
+
}
|
|
446
|
+
return source;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
function resolveRuntimeState(input) {
|
|
450
|
+
const root = findWorkspaceRoot(input.cwd || process.cwd());
|
|
451
|
+
const config = readConfig(root);
|
|
452
|
+
const restoredMode = config.valid && config.enabled ? consumeClearTransfer(input, root) : null;
|
|
453
|
+
const sessionMode = config.valid && config.enabled ? restoredMode || readSessionMode(input.session_id) : null;
|
|
454
|
+
const resolvedMode = sessionMode || config.defaultMode;
|
|
455
|
+
|
|
456
|
+
return {
|
|
457
|
+
root,
|
|
458
|
+
config,
|
|
459
|
+
sessionMode,
|
|
460
|
+
resolvedMode,
|
|
461
|
+
effectiveMode: config.enabled && config.skillsEnabled ? resolvedMode : null,
|
|
462
|
+
modeSource: sessionMode ? "session override" : "configured default",
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
function modeOverlayGuidance(mode) {
|
|
467
|
+
if (mode === "conversation") {
|
|
468
|
+
return [
|
|
469
|
+
"",
|
|
470
|
+
"## Conversation Mode Boundary",
|
|
471
|
+
"",
|
|
472
|
+
"Conversation mode is active and read-only.",
|
|
473
|
+
"",
|
|
474
|
+
"Do not call write, edit, or mutating tools. Do not create, delete, commit, push, or change repository, system, external, or durable state.",
|
|
475
|
+
"",
|
|
476
|
+
"A mutation request does not switch mode, and an execution skill does not override this boundary. Explain that conversation mode is read-only and ask the user to switch to workflow or strict-workflow.",
|
|
477
|
+
];
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
if (mode === "strict-workflow") {
|
|
481
|
+
return [
|
|
482
|
+
"",
|
|
483
|
+
"## Strict Workflow Overlay",
|
|
484
|
+
"",
|
|
485
|
+
"Strict Workflow is active. Use the adaptive Workflow, but increase decision, evidence, verification, and checkpoint pressure at high-risk or hard-to-reverse boundaries.",
|
|
486
|
+
"",
|
|
487
|
+
"For work affecting security, privacy, billing, data loss, migrations, public interfaces, compatibility, deployment, or architecture:",
|
|
488
|
+
"",
|
|
489
|
+
"- stop for any user-owned choice or source conflict;",
|
|
490
|
+
"- inspect the relevant risk surface before crossing the boundary;",
|
|
491
|
+
"- select only artifacts, checkpoints, and independent review that materially reduce risk;",
|
|
492
|
+
"- verify at the affected boundary before claiming success.",
|
|
493
|
+
"",
|
|
494
|
+
"Do not manufacture ceremony for low-risk, reversible work. Strict Workflow does not authorize mutation, bypass safety, or make every implementation detail a user decision.",
|
|
495
|
+
];
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
return [];
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
function stateLines(state, sessionChange = null) {
|
|
502
|
+
const { config } = state;
|
|
503
|
+
const lines = [`Configured default: \`${config.defaultMode}\` (${sourceLabel(config.sources.defaultMode)})`];
|
|
504
|
+
|
|
505
|
+
if (sessionChange === "cleared") {
|
|
506
|
+
lines.push("Session override: cleared");
|
|
507
|
+
} else if (state.sessionMode) {
|
|
508
|
+
lines.push(`Session override: \`${state.sessionMode}\``);
|
|
509
|
+
} else {
|
|
510
|
+
lines.push("Session override: none");
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
if (state.effectiveMode) {
|
|
514
|
+
lines.push(`Effective mode: \`${state.effectiveMode}\` (${state.modeSource}, active)`);
|
|
515
|
+
} else {
|
|
516
|
+
lines.push(`Resolved mode: \`${state.resolvedMode}\` (dormant because Skills are disabled)`);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
return lines;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
function capabilityLines(config) {
|
|
206
523
|
return [
|
|
524
|
+
`Interaction Contract: ${config.interactionContractEnabled ? "enabled" : "disabled"}`,
|
|
525
|
+
`Skills: ${config.skillsEnabled ? "enabled" : "disabled"}`,
|
|
526
|
+
];
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
function renderSessionStart(state) {
|
|
530
|
+
const { config } = state;
|
|
531
|
+
if (!config.valid) {
|
|
532
|
+
return "";
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
if (!config.enabled) {
|
|
536
|
+
return [
|
|
537
|
+
"# Freeflow Disabled",
|
|
538
|
+
"",
|
|
539
|
+
`Configured but inactive: \`enabled\` is false (${sourceLabel(config.sources.enabled)}).`,
|
|
540
|
+
"No Freeflow interaction, skill, or mode guidance is effective.",
|
|
541
|
+
].join("\n");
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
const { interactionContract, workflowSkill } = loadRuntimeContext({
|
|
545
|
+
interactionContract: config.interactionContractEnabled,
|
|
546
|
+
skills: config.skillsEnabled,
|
|
547
|
+
});
|
|
548
|
+
const context = [
|
|
207
549
|
"# Freeflow Runtime Context",
|
|
208
550
|
"",
|
|
209
|
-
"
|
|
210
|
-
"
|
|
211
|
-
"",
|
|
212
|
-
"## Repo Setup",
|
|
213
|
-
buildSetupStatus(root),
|
|
214
|
-
"",
|
|
215
|
-
"## Freeflow Runtime Priority",
|
|
216
|
-
"Mode Contract handles mode setting, mode interpretation, and mode mismatch before task routing when mode is at issue.",
|
|
217
|
-
"",
|
|
218
|
-
"Priority order for matched non-mode workflow skills:",
|
|
551
|
+
"Runtime delivery: confirmed for this lifecycle-hook invocation.",
|
|
552
|
+
"This context guides behavior only; user instructions, repository instructions, and host safety or approval policy retain precedence.",
|
|
219
553
|
"",
|
|
220
|
-
"
|
|
221
|
-
"2. Interview Gate stops silent decisions, user-owned decisions, source-truth conflicts, and question-to-action mistakes.",
|
|
222
|
-
"3. Discover handles context-building after no immediate stop condition remains. Use it before first repo/code exploration or design answers for consequential product/API/tool/runtime hypotheses.",
|
|
223
|
-
"4. Output Router chooses evidence transport after the workflow/interview/discover route is clear.",
|
|
554
|
+
"## Effective State",
|
|
224
555
|
"",
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
"
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
"
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
556
|
+
...stateLines(state),
|
|
557
|
+
...capabilityLines(config),
|
|
558
|
+
];
|
|
559
|
+
|
|
560
|
+
if (config.interactionContractEnabled) {
|
|
561
|
+
context.push("", interactionContract.trim());
|
|
562
|
+
}
|
|
563
|
+
if (config.skillsEnabled) {
|
|
564
|
+
context.push("", "# Freeflow Workflow Bootstrap", "", workflowSkill.trim());
|
|
565
|
+
}
|
|
566
|
+
if (state.effectiveMode) {
|
|
567
|
+
context.push(...modeOverlayGuidance(state.effectiveMode));
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
return context.join("\n");
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
function normalizePrompt(prompt) {
|
|
574
|
+
return prompt
|
|
575
|
+
.trim()
|
|
576
|
+
.replace(/[.!]+$/u, "")
|
|
577
|
+
.replace(/\s+/gu, " ");
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
function parseModeControl(prompt) {
|
|
581
|
+
if (typeof prompt !== "string" || prompt.length > 300 || /\?\s*$/u.test(prompt.trim())) {
|
|
582
|
+
return null;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
const normalized = normalizePrompt(prompt);
|
|
586
|
+
const nativeSet = normalized.match(
|
|
587
|
+
/^(?:\/freeflow mode|\$mode-contract|\/(?:freeflow:)?mode-contract) (conversation|workflow|strict-workflow)$/iu,
|
|
588
|
+
);
|
|
589
|
+
if (nativeSet) {
|
|
590
|
+
return { action: "set", mode: nativeSet[1].toLowerCase() };
|
|
591
|
+
}
|
|
592
|
+
if (/^(?:\/freeflow mode|\$mode-contract|\/(?:freeflow:)?mode-contract) reset$/iu.test(normalized)) {
|
|
593
|
+
return { action: "reset" };
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
const setPatterns = [
|
|
597
|
+
/^switch to (conversation|workflow|strict-workflow)(?: mode)?$/iu,
|
|
598
|
+
/^switch (?:this|the) session to (conversation|workflow|strict-workflow)(?: mode)?$/iu,
|
|
599
|
+
/^use (conversation|workflow|strict-workflow)(?: mode)? for (?:this|the) session$/iu,
|
|
600
|
+
/^(?:change|set) (?:the )?(?:current|active|session) mode to (conversation|workflow|strict-workflow)$/iu,
|
|
601
|
+
/^switch (?:the )?(?:current|active|session) mode to (conversation|workflow|strict-workflow)$/iu,
|
|
602
|
+
];
|
|
603
|
+
for (const pattern of setPatterns) {
|
|
604
|
+
const match = normalized.match(pattern);
|
|
605
|
+
if (match) {
|
|
606
|
+
return { action: "set", mode: match[1].toLowerCase() };
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
if (/^(?:reset|clear|remove) (?:the )?(?:current |active )?session mode(?: override)?$/iu.test(normalized)) {
|
|
611
|
+
return { action: "reset" };
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
return null;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
function renderPromptModeChange(state, sessionChange) {
|
|
618
|
+
const lines = [
|
|
619
|
+
"# Freeflow Mode Update",
|
|
239
620
|
"",
|
|
240
|
-
|
|
241
|
-
"```md",
|
|
242
|
-
discoverSkill.trim(),
|
|
243
|
-
"```",
|
|
621
|
+
...stateLines(state, sessionChange),
|
|
244
622
|
"",
|
|
245
|
-
"
|
|
246
|
-
"
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
623
|
+
"This user-operated session control changed host-managed state before this model request. It changes workflow behavior, not mutation authority, host permissions, or accepted scope.",
|
|
624
|
+
"Acknowledge the effective mode briefly. Do not claim that configured defaults changed.",
|
|
625
|
+
];
|
|
626
|
+
if (state.effectiveMode) {
|
|
627
|
+
lines.push(...modeOverlayGuidance(state.effectiveMode));
|
|
628
|
+
}
|
|
629
|
+
return lines.join("\n");
|
|
250
630
|
}
|
|
251
631
|
|
|
252
|
-
function
|
|
253
|
-
|
|
632
|
+
function handleUserPromptSubmit(input) {
|
|
633
|
+
const control = parseModeControl(input.prompt);
|
|
634
|
+
if (!control) {
|
|
635
|
+
return "";
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
const before = resolveRuntimeState(input);
|
|
639
|
+
if (!before.config.valid || !before.config.enabled) {
|
|
640
|
+
return "";
|
|
641
|
+
}
|
|
642
|
+
if (!before.config.skillsEnabled) {
|
|
643
|
+
return [
|
|
644
|
+
"# Freeflow Mode Update Unavailable",
|
|
645
|
+
"",
|
|
646
|
+
`Resolved mode remains \`${before.resolvedMode}\`, but no Freeflow mode is effective because Skills are disabled.`,
|
|
647
|
+
"Do not claim that the session mode changed.",
|
|
648
|
+
].join("\n");
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
if (control.action === "set") {
|
|
652
|
+
if (!writeSessionMode(input.session_id, control.mode)) {
|
|
653
|
+
return "Freeflow could not establish a session mode override because this host invocation supplied no writable plugin data or session identifier. Do not claim that the mode changed.";
|
|
654
|
+
}
|
|
655
|
+
const state = resolveRuntimeState(input);
|
|
656
|
+
return renderPromptModeChange(state, "set");
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
if (!clearSessionMode(input.session_id)) {
|
|
660
|
+
return "Freeflow could not clear the session mode override because this host invocation supplied no writable plugin data or session identifier. Do not claim that the mode changed.";
|
|
661
|
+
}
|
|
662
|
+
const state = resolveRuntimeState(input);
|
|
663
|
+
return renderPromptModeChange(state, "cleared");
|
|
254
664
|
}
|
|
255
665
|
|
|
256
|
-
function
|
|
257
|
-
if (
|
|
258
|
-
|
|
259
|
-
return;
|
|
666
|
+
function shouldHandle(eventName) {
|
|
667
|
+
if (process.env.FREEFLOW_DISABLE_RUNTIME_CONTEXT === "1") {
|
|
668
|
+
return false;
|
|
260
669
|
}
|
|
670
|
+
return eventName === "SessionStart" || eventName === "UserPromptSubmit" || eventName === "SessionEnd";
|
|
671
|
+
}
|
|
261
672
|
|
|
673
|
+
function emitAdditionalContext(eventName, additionalContext) {
|
|
262
674
|
process.stdout.write(
|
|
263
675
|
`${JSON.stringify({
|
|
264
676
|
hookSpecificOutput: {
|
|
265
677
|
hookEventName: eventName,
|
|
266
|
-
additionalContext
|
|
267
|
-
}
|
|
268
|
-
})}\n
|
|
678
|
+
additionalContext,
|
|
679
|
+
},
|
|
680
|
+
})}\n`,
|
|
269
681
|
);
|
|
270
682
|
}
|
|
271
683
|
|
|
@@ -273,15 +685,21 @@ function main() {
|
|
|
273
685
|
const { input, raw } = readStdinJson();
|
|
274
686
|
const eventName = process.argv[2] || input.hook_event_name || "";
|
|
275
687
|
|
|
276
|
-
if (!raw && !eventName) {
|
|
688
|
+
if ((!raw && !eventName) || !shouldHandle(eventName)) {
|
|
277
689
|
return;
|
|
278
690
|
}
|
|
279
691
|
|
|
280
|
-
|
|
692
|
+
cleanupExpiredSessionModes();
|
|
693
|
+
if (eventName === "SessionEnd") {
|
|
694
|
+
stageClearTransfer(input);
|
|
281
695
|
return;
|
|
282
696
|
}
|
|
283
|
-
|
|
284
|
-
|
|
697
|
+
const additionalContext =
|
|
698
|
+
eventName === "SessionStart" ? renderSessionStart(resolveRuntimeState(input)) : handleUserPromptSubmit(input);
|
|
699
|
+
if (!additionalContext.trim()) {
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
emitAdditionalContext(eventName, additionalContext);
|
|
285
703
|
}
|
|
286
704
|
|
|
287
705
|
try {
|