@hassangameryt/freeflow 0.7.3 → 0.9.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/.agents/plugins/marketplace.json +2 -2
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +3 -3
- package/.cursor-plugin/plugin.json +1 -1
- package/NOTICE +14 -0
- package/README.md +101 -159
- package/capabilities/cognitive-routing/SKILL.md +47 -210
- package/capabilities/cognitive-routing/references/coordinator.md +163 -0
- package/capabilities/cognitive-routing/references/worker.md +38 -0
- package/capabilities/compaction/SKILL.md +49 -0
- package/capabilities/compaction/references/summary-format.md +250 -0
- package/capabilities/messaging/SKILL.md +49 -0
- package/capabilities/task-memory/SKILL.md +87 -0
- package/command-surface.json +8 -52
- package/gemini-extension.json +1 -1
- package/hooks/claude/hooks.json +13 -3
- package/hooks/codex/hooks.json +2 -1
- package/hooks/shared/runtime-context.mjs +73 -83
- package/licenses/Apache-2.0.txt +55 -0
- package/package.json +42 -12
- package/pi-extension/README.md +41 -0
- package/pi-extension/dist/ask-user/ask.js +108 -0
- package/pi-extension/dist/ask-user/form.js +250 -0
- package/pi-extension/dist/ask-user/questions.js +66 -0
- package/pi-extension/dist/ask-user/tool.js +124 -0
- package/pi-extension/dist/cognitive-routing/assembler.js +417 -0
- package/pi-extension/dist/cognitive-routing/bootstrap.js +90 -0
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/config.js +8 -6
- package/pi-extension/dist/cognitive-routing/economics.js +45 -0
- package/pi-extension/dist/cognitive-routing/event-schema.js +388 -0
- package/pi-extension/dist/{session-sources/events.js → cognitive-routing/event-store.js} +107 -41
- package/pi-extension/dist/cognitive-routing/gate.js +256 -0
- package/pi-extension/dist/cognitive-routing/handlers.js +901 -0
- package/pi-extension/dist/cognitive-routing/handoffs.js +350 -0
- package/pi-extension/dist/cognitive-routing/model-control.js +476 -0
- package/pi-extension/dist/cognitive-routing/projection.js +520 -0
- package/pi-extension/dist/cognitive-routing/provenance.js +83 -0
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/render.js +15 -15
- package/pi-extension/dist/cognitive-routing/runtime.js +398 -0
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/schemas.js +47 -11
- package/pi-extension/dist/cognitive-routing/session.js +223 -0
- package/pi-extension/dist/{session-sources → cognitive-routing}/sources.js +126 -87
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/state.js +55 -386
- package/pi-extension/dist/cognitive-routing/status.js +81 -0
- package/pi-extension/dist/cognitive-routing/tools.js +74 -0
- package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/types.js +14 -11
- package/pi-extension/dist/compaction/carry.js +205 -0
- package/pi-extension/dist/compaction/config.js +24 -0
- package/pi-extension/dist/compaction/controller.js +494 -0
- package/pi-extension/dist/compaction/harness.js +93 -0
- package/pi-extension/dist/compaction/results.js +159 -0
- package/pi-extension/dist/compaction/thresholds.js +35 -0
- package/pi-extension/dist/compaction/tool.js +57 -0
- package/pi-extension/dist/host/branch.js +13 -0
- package/pi-extension/dist/host/canonical.js +12 -0
- package/pi-extension/dist/host/catalog.js +62 -0
- package/pi-extension/dist/host/config-validation.js +233 -0
- package/pi-extension/dist/host/config.js +361 -0
- package/pi-extension/dist/host/inbound.js +142 -0
- package/pi-extension/dist/host/projection-tags.js +60 -0
- package/pi-extension/dist/host/prompts.js +93 -0
- package/pi-extension/dist/{session-sources → host}/read-only-session.js +117 -1
- package/pi-extension/dist/{runtime → host}/request-history.js +125 -39
- package/pi-extension/dist/host/rows.js +25 -0
- package/pi-extension/dist/host/runtime-state.js +204 -0
- package/pi-extension/dist/host/section-keeper.js +85 -0
- package/pi-extension/dist/host/settings/freeflow-command.js +2323 -0
- package/pi-extension/dist/{settings/settings-tui.js → host/settings/settings-view.js} +205 -73
- package/pi-extension/dist/host/staging.js +28 -0
- package/pi-extension/dist/host/status.js +115 -0
- package/pi-extension/dist/index.js +1004 -188
- package/pi-extension/dist/messaging/config.js +27 -0
- package/pi-extension/dist/messaging/messaging.js +398 -0
- package/pi-extension/dist/messaging/registry.js +57 -0
- package/pi-extension/dist/messaging/render.js +90 -0
- package/pi-extension/dist/messaging/tools.js +109 -0
- package/pi-extension/dist/messaging/transport.js +101 -0
- package/pi-extension/dist/provider-support/cache/anchor.js +21 -0
- package/pi-extension/dist/provider-support/cache/anthropic.js +102 -0
- package/pi-extension/dist/provider-support/cache/health.js +73 -0
- package/pi-extension/dist/provider-support/cache/index.js +58 -0
- package/pi-extension/dist/provider-support/cache/keepalive.js +222 -0
- package/pi-extension/dist/provider-support/cache/monitor.js +17 -0
- package/pi-extension/dist/provider-support/cache/openai-responses.js +48 -0
- package/pi-extension/dist/provider-support/effort.js +13 -0
- package/pi-extension/dist/provider-support/index.js +44 -3
- package/pi-extension/dist/provider-support/{astra → openai}/adapter.js +46 -29
- package/pi-extension/dist/provider-support/{astra → openai}/history.js +10 -8
- package/pi-extension/dist/provider-support/{astra → openai}/index.js +8 -4
- package/pi-extension/dist/provider-support/{astra → openai}/session-state.js +29 -38
- package/pi-extension/dist/provider-support/routes.js +17 -0
- package/pi-extension/dist/task-memory/config.js +49 -0
- package/pi-extension/dist/task-memory/registry.js +119 -0
- package/pi-extension/dist/task-memory/render.js +107 -0
- package/pi-extension/dist/task-memory/runtime.js +994 -0
- package/pi-extension/dist/task-memory/tool.js +233 -0
- package/pi-extension/dist/tool-execution/apply-patch/grammar.js +23 -0
- package/pi-extension/dist/tool-execution/apply-patch/match.js +38 -0
- package/pi-extension/dist/tool-execution/apply-patch/parser.js +177 -0
- package/pi-extension/dist/tool-execution/apply-patch/plan.js +201 -0
- package/pi-extension/dist/tool-execution/apply-patch/tool.js +84 -0
- package/pi-extension/dist/tool-execution/background.js +430 -0
- package/pi-extension/dist/tool-execution/bash-guard.js +23 -0
- package/pi-extension/dist/tool-execution/config.js +33 -0
- package/pi-extension/dist/tool-execution/edit-messages.js +120 -0
- package/pi-extension/dist/tool-execution/file-state.js +138 -0
- package/pi-extension/dist/tool-execution/file-tracking.js +163 -0
- package/pi-extension/dist/tool-execution/guidance-notices.js +124 -0
- package/pi-extension/dist/tool-execution/prompt.js +54 -0
- package/pi-extension/dist/tool-execution/skill-reads.js +143 -0
- package/pi-extension/dist/tool-execution/tools.js +16 -0
- package/pi-extension/freeflow/README.md +9 -0
- package/runtime/prompts/cognitive-routing.md +4 -4
- package/runtime/prompts/core.md +29 -72
- package/runtime/prompts/interaction-contract.md +18 -8
- package/runtime/prompts/tool-execution.md +25 -0
- package/runtime/prompts/working-method.md +25 -0
- package/skills/deliver-work/SKILL.md +76 -0
- package/skills/deliver-work/references/branch-closeout.md +134 -0
- package/skills/deliver-work/references/commit.md +83 -0
- package/skills/deliver-work/references/launch.md +94 -0
- package/skills/deliver-work/references/release.md +85 -0
- package/skills/deliver-work/scripts/commit-state.mjs +139 -0
- package/skills/deliver-work/scripts/delivery-state.mjs +107 -0
- package/skills/deliver-work/scripts/lib/git-state.mjs +178 -0
- package/skills/deliver-work/scripts/push-route.mjs +122 -0
- package/skills/deliver-work/scripts/release-preflight.mjs +177 -0
- package/skills/discuss-work/SKILL.md +148 -0
- package/skills/{discuss → discuss-work}/references/discussion-continuity.md +13 -50
- package/skills/discuss-work/references/learning-action.md +36 -0
- package/skills/discuss-work/scripts/choices.mjs +101 -0
- package/skills/discuss-work/scripts/lib/choices.mjs +159 -0
- package/skills/evaluate-behavior/SKILL.md +107 -0
- package/skills/evaluate-behavior/references/authoring.md +381 -0
- package/skills/evaluate-behavior/references/coding-tasks.md +145 -0
- package/skills/evaluate-behavior/references/conversations-pipelines-judges.md +177 -0
- package/skills/evaluate-behavior/references/design-and-measurement.md +273 -0
- package/skills/evaluate-behavior/references/running-and-evidence.md +245 -0
- package/skills/evaluate-behavior/scripts/claude-guard.mjs +76 -0
- package/skills/evaluate-behavior/scripts/guard-rules.mjs +309 -0
- package/skills/evaluate-behavior/scripts/lib/agreement.mjs +90 -0
- package/skills/evaluate-behavior/scripts/lib/arms.mjs +55 -0
- package/skills/evaluate-behavior/scripts/lib/budget.mjs +87 -0
- package/skills/evaluate-behavior/scripts/lib/build-source.mjs +287 -0
- package/skills/evaluate-behavior/scripts/lib/clear.mjs +74 -0
- package/skills/evaluate-behavior/scripts/lib/container.mjs +395 -0
- package/skills/evaluate-behavior/scripts/lib/decision.mjs +418 -0
- package/skills/evaluate-behavior/scripts/lib/definitions.mjs +1072 -0
- package/skills/evaluate-behavior/scripts/lib/freeflow.mjs +103 -0
- package/skills/evaluate-behavior/scripts/lib/grade-command.mjs +591 -0
- package/skills/evaluate-behavior/scripts/lib/grade-comparison.mjs +90 -0
- package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-interaction.mjs +19 -18
- package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-support.mjs +32 -5
- package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/grade-workspace.mjs +28 -12
- package/skills/evaluate-behavior/scripts/lib/grade.mjs +101 -0
- package/skills/evaluate-behavior/scripts/lib/hooks.mjs +98 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/confinement.mjs +196 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/constraints.mjs +111 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/index.mjs +48 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/isolation.mjs +74 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/launch.mjs +123 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/model-call.mjs +73 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/recorder.mjs +178 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/session.mjs +494 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/claude-code/skills.mjs +81 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/index.mjs +31 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/names.mjs +3 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/pi/confinement.mjs +173 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/pi/host.mjs +148 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/pi/index.mjs +70 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/pi/isolation.mjs +81 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/pi/model-call.mjs +79 -0
- package/skills/evaluate-behavior/scripts/lib/hosts/pi/process.mjs +241 -0
- package/skills/{evaluate-skill/scripts/lib → evaluate-behavior/scripts/lib/hosts/pi}/rpc.mjs +144 -26
- package/skills/evaluate-behavior/scripts/lib/identity.mjs +82 -0
- package/skills/evaluate-behavior/scripts/lib/judge.mjs +688 -0
- package/skills/evaluate-behavior/scripts/lib/metrics.mjs +332 -0
- package/skills/evaluate-behavior/scripts/lib/model-call.mjs +17 -0
- package/skills/evaluate-behavior/scripts/lib/participants.mjs +616 -0
- package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/process.mjs +22 -0
- package/skills/evaluate-behavior/scripts/lib/queue.mjs +54 -0
- package/skills/evaluate-behavior/scripts/lib/reference.mjs +343 -0
- package/skills/evaluate-behavior/scripts/lib/reuse.mjs +277 -0
- package/skills/evaluate-behavior/scripts/lib/review.mjs +933 -0
- package/skills/evaluate-behavior/scripts/lib/runner.mjs +732 -0
- package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/sandbox.mjs +121 -14
- package/skills/evaluate-behavior/scripts/lib/scan-shell.mjs +457 -0
- package/skills/evaluate-behavior/scripts/lib/scan.mjs +479 -0
- package/skills/evaluate-behavior/scripts/lib/seal.mjs +91 -0
- package/skills/evaluate-behavior/scripts/lib/shell.mjs +560 -0
- package/skills/evaluate-behavior/scripts/lib/source-override.mjs +64 -0
- package/skills/evaluate-behavior/scripts/lib/subject-file.mjs +88 -0
- package/skills/{evaluate-skill/scripts/lib/pi.mjs → evaluate-behavior/scripts/lib/subject.mjs} +239 -262
- package/skills/evaluate-behavior/scripts/lib/task-copy.mjs +124 -0
- package/skills/evaluate-behavior/scripts/lib/trials.mjs +524 -0
- package/skills/evaluate-behavior/scripts/lib/validity.mjs +68 -0
- package/skills/evaluate-behavior/scripts/lib/view-html.mjs +454 -0
- package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/view.mjs +218 -11
- package/skills/evaluate-behavior/scripts/pi-command-tool.mjs +159 -0
- package/skills/evaluate-behavior/scripts/pi-container-route.mjs +23 -0
- package/skills/evaluate-behavior/scripts/pi-guard.mjs +77 -0
- package/skills/evaluate-behavior/scripts/pi-login-refresh.mjs +31 -0
- package/skills/evaluate-behavior/scripts/skill-eval.mjs +586 -0
- package/skills/execute-work/SKILL.md +96 -72
- package/skills/execute-work/references/code-practices.md +27 -49
- package/skills/execute-work/references/design.md +271 -0
- package/skills/execute-work/references/diagnose.md +117 -0
- package/skills/execute-work/references/migration.md +108 -0
- package/skills/execute-work/references/simplify.md +65 -0
- package/skills/execute-work/scripts/self-review.mjs +422 -0
- package/skills/execute-work/scripts/touch-map.mjs +290 -0
- package/skills/review-work/SKILL.md +94 -64
- package/skills/review-work/references/adjudication.md +94 -0
- package/skills/review-work/references/artifact.md +198 -0
- package/skills/review-work/references/evals-and-judges.md +66 -0
- package/skills/review-work/references/work.md +177 -0
- package/skills/review-work/scripts/check-brief.mjs +128 -0
- package/skills/review-work/scripts/review-packet.mjs +233 -0
- package/skills/setup-freeflow/SKILL.md +69 -16
- package/skills/track-work/SKILL.md +135 -151
- package/skills/track-work/references/handoff.md +190 -0
- package/skills/track-work/references/projects.md +51 -0
- package/skills/track-work/references/working-record-format.md +201 -344
- package/skills/track-work/scripts/lib/document.mjs +79 -19
- package/skills/track-work/scripts/lib/format.mjs +18 -1
- package/skills/track-work/scripts/lib/recover.mjs +254 -0
- package/skills/track-work/scripts/lib/registry.mjs +656 -0
- package/skills/track-work/scripts/lib/search.mjs +40 -0
- package/skills/track-work/scripts/lib/store.mjs +53 -21
- package/skills/track-work/scripts/lib/transitions.mjs +79 -4
- package/skills/track-work/scripts/lib/views.mjs +50 -1
- package/skills/track-work/scripts/working-record.mjs +263 -22
- package/skills/verify-work/SKILL.md +64 -47
- package/skills/verify-work/references/feature-map.md +120 -0
- package/skills/verify-work/references/runtime-evidence.md +203 -0
- package/skills/verify-work/references/test-design.md +27 -6
- package/skills/verify-work/scripts/test-changes.mjs +246 -0
- package/skills/write-docs/SKILL.md +171 -0
- package/skills/write-docs/references/documentation-shapes.md +184 -0
- package/skills/write-docs/references/spec-and-plan-shapes.md +308 -0
- package/skills/write-docs/scripts/artifact-check.mjs +148 -0
- package/skills/write-docs/scripts/docs-check.mjs +229 -0
- package/skills/write-docs/scripts/plan-lint.mjs +123 -0
- package/skills/write-skill/SKILL.md +165 -165
- package/skills/write-skill/references/activation-and-wording.md +143 -0
- package/skills/write-skill/references/placement-and-dependencies.md +154 -0
- package/skills/write-skill/scripts/lib/compare.mjs +701 -0
- package/skills/write-skill/scripts/lib/similarity.mjs +56 -0
- package/skills/write-skill/scripts/lib/skill-author.mjs +197 -3
- package/skills/write-skill/scripts/skill-author.mjs +67 -8
- package/capabilities/context-virtualization/SKILL.md +0 -103
- package/capabilities/conversation-history/SKILL.md +0 -53
- package/hooks/tests/check-host-adapters.test.mjs +0 -82
- package/hooks/tests/check-runtime-context-hook.sh +0 -212
- package/pi-extension/dist/cognitive-routing-v2/projection.js +0 -330
- package/pi-extension/dist/cognitive-routing-v2/runtime.js +0 -2181
- package/pi-extension/dist/cognitive-routing-v2/tools.js +0 -60
- package/pi-extension/dist/context-virtualization/commands.js +0 -89
- package/pi-extension/dist/context-virtualization/projector.js +0 -42
- package/pi-extension/dist/context-virtualization/runtime.js +0 -378
- package/pi-extension/dist/context-virtualization/state.js +0 -57
- package/pi-extension/dist/context-virtualization/types.js +0 -10
- package/pi-extension/dist/conversation-history/passages.js +0 -66
- package/pi-extension/dist/conversation-history/ranking.js +0 -105
- package/pi-extension/dist/conversation-history/runtime.js +0 -226
- package/pi-extension/dist/conversation-history/search.js +0 -56
- package/pi-extension/dist/conversation-history/types.js +0 -1
- package/pi-extension/dist/freeflow-context/resolver.js +0 -120
- package/pi-extension/dist/freeflow-context/runtime.js +0 -80
- package/pi-extension/dist/freeflow-context/source-projector.js +0 -95
- package/pi-extension/dist/freeflow-context/tool.js +0 -314
- package/pi-extension/dist/freeflow-context/types.js +0 -12
- package/pi-extension/dist/freeflow-context/visibility.js +0 -28
- package/pi-extension/dist/integrations/mcp-config.js +0 -29
- package/pi-extension/dist/runtime/runtime-context.js +0 -754
- package/pi-extension/dist/runtime/runtime-identity.js +0 -5
- package/pi-extension/dist/session-sources/provenance.js +0 -32
- package/pi-extension/dist/settings/settings-ui.js +0 -1360
- package/pi-extension/dist/ui/text-component.js +0 -57
- package/pi-extension/src/cognitive-routing-v2/budget.ts +0 -42
- package/pi-extension/src/cognitive-routing-v2/config.ts +0 -173
- package/pi-extension/src/cognitive-routing-v2/projection.ts +0 -375
- package/pi-extension/src/cognitive-routing-v2/render.ts +0 -277
- package/pi-extension/src/cognitive-routing-v2/runtime.ts +0 -2241
- package/pi-extension/src/cognitive-routing-v2/schemas.ts +0 -180
- package/pi-extension/src/cognitive-routing-v2/state.ts +0 -839
- package/pi-extension/src/cognitive-routing-v2/tools.ts +0 -62
- package/pi-extension/src/cognitive-routing-v2/types.ts +0 -254
- package/pi-extension/src/context-virtualization/commands.ts +0 -111
- package/pi-extension/src/context-virtualization/projector.ts +0 -62
- package/pi-extension/src/context-virtualization/runtime.ts +0 -428
- package/pi-extension/src/context-virtualization/state.ts +0 -79
- package/pi-extension/src/context-virtualization/types.ts +0 -92
- package/pi-extension/src/conversation-history/passages.ts +0 -81
- package/pi-extension/src/conversation-history/ranking.ts +0 -155
- package/pi-extension/src/conversation-history/runtime.ts +0 -250
- package/pi-extension/src/conversation-history/search.ts +0 -79
- package/pi-extension/src/conversation-history/types.ts +0 -31
- package/pi-extension/src/freeflow-context/resolver.ts +0 -139
- package/pi-extension/src/freeflow-context/runtime.ts +0 -100
- package/pi-extension/src/freeflow-context/source-projector.ts +0 -106
- package/pi-extension/src/freeflow-context/tool.ts +0 -366
- package/pi-extension/src/freeflow-context/types.ts +0 -70
- package/pi-extension/src/freeflow-context/visibility.ts +0 -53
- package/pi-extension/src/index.ts +0 -390
- package/pi-extension/src/integrations/mcp-config.ts +0 -32
- package/pi-extension/src/provider-support/astra/adapter.ts +0 -108
- package/pi-extension/src/provider-support/astra/history.ts +0 -145
- package/pi-extension/src/provider-support/astra/index.ts +0 -12
- package/pi-extension/src/provider-support/astra/session-state.ts +0 -113
- package/pi-extension/src/provider-support/index.ts +0 -5
- package/pi-extension/src/runtime/request-history.ts +0 -243
- package/pi-extension/src/runtime/runtime-context.ts +0 -860
- package/pi-extension/src/runtime/runtime-identity.ts +0 -8
- package/pi-extension/src/session-sources/events.ts +0 -230
- package/pi-extension/src/session-sources/provenance.ts +0 -39
- package/pi-extension/src/session-sources/read-only-session.ts +0 -170
- package/pi-extension/src/session-sources/sources.ts +0 -334
- package/pi-extension/src/settings/settings-tui.ts +0 -501
- package/pi-extension/src/settings/settings-ui.ts +0 -1652
- package/pi-extension/src/ui/text-component.ts +0 -66
- package/pi-extension/tests/cache-reuse/history.test.js +0 -117
- package/pi-extension/tests/cache-reuse/native.test.js +0 -91
- package/pi-extension/tests/cache-reuse/settings.test.js +0 -211
- package/pi-extension/tests/cognitive-routing-v2/communication.test.js +0 -577
- package/pi-extension/tests/cognitive-routing-v2/compaction-input.test.js +0 -183
- package/pi-extension/tests/cognitive-routing-v2/delegation.test.js +0 -557
- package/pi-extension/tests/cognitive-routing-v2/native.test.js +0 -474
- package/pi-extension/tests/cognitive-routing-v2/performance.test.js +0 -87
- package/pi-extension/tests/cognitive-routing-v2/persistence.test.js +0 -300
- package/pi-extension/tests/cognitive-routing-v2/projection.test.js +0 -241
- package/pi-extension/tests/cognitive-routing-v2/recovery.test.js +0 -1034
- package/pi-extension/tests/cognitive-routing-v2/render.test.js +0 -244
- package/pi-extension/tests/cognitive-routing-v2/runtime.test.js +0 -423
- package/pi-extension/tests/cognitive-routing-v2/stabilization.test.js +0 -521
- package/pi-extension/tests/cognitive-routing-v2/state.test.js +0 -586
- package/pi-extension/tests/context-virtualization/extension.test.js +0 -775
- package/pi-extension/tests/context-virtualization/projector.test.js +0 -110
- package/pi-extension/tests/context-virtualization/runtime.test.js +0 -230
- package/pi-extension/tests/conversation-history/runtime.test.js +0 -98
- package/pi-extension/tests/conversation-history/search.test.js +0 -97
- package/pi-extension/tests/fixtures/pi-host.js +0 -4
- package/pi-extension/tests/fixtures/routing-native.js +0 -191
- package/pi-extension/tests/integration/mode-free-core.test.js +0 -220
- package/pi-extension/tests/integration/pi-extension.test.js +0 -1447
- package/pi-extension/tests/integration/prompt-architecture.test.js +0 -447
- package/pi-extension/tests/integration/unaffected-regressions.test.js +0 -478
- package/pi-extension/tests/provider-support/astra-boundaries.test.js +0 -75
- package/pi-extension/tests/provider-support/astra.test.js +0 -306
- package/pi-extension/tests/provider-support/cli.test.js +0 -92
- package/pi-extension/tests/provider-support/native.test.js +0 -183
- package/pi-extension/tests/settings/settings-tui.test.js +0 -243
- package/pi-extension/tsconfig.json +0 -16
- package/plugin.json +0 -33
- package/runtime/prompts/context-virtualization.md +0 -3
- package/runtime/prompts/conversation-history.md +0 -3
- package/skills/action-selection/SKILL.md +0 -100
- package/skills/action-selection/references/trajectory-stalls.md +0 -71
- package/skills/bypass/SKILL.md +0 -153
- package/skills/commit-work/SKILL.md +0 -145
- package/skills/commit-work/references/git-state-edges.md +0 -94
- package/skills/commit-work/references/simple-push.md +0 -92
- package/skills/commit-work/references/staging-decisions.md +0 -106
- package/skills/decision-gate/SKILL.md +0 -106
- package/skills/design-for-depth/SKILL.md +0 -117
- package/skills/design-for-depth/references/design-pressure-signals.md +0 -182
- package/skills/design-for-depth/references/implementation-decisions.md +0 -76
- package/skills/design-for-depth/references/interface-design-loop.md +0 -136
- package/skills/design-for-depth/references/module-and-dependency-design.md +0 -147
- package/skills/design-for-depth/references/software-design-philosophy.md +0 -202
- package/skills/design-for-depth/references/state-and-failure-boundaries.md +0 -136
- package/skills/diagnose-failure/SKILL.md +0 -125
- package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +0 -48
- package/skills/diagnose-failure/references/flaky-and-performance-diagnosis.md +0 -51
- package/skills/discuss/SKILL.md +0 -116
- package/skills/evaluate-skill/SKILL.md +0 -219
- package/skills/evaluate-skill/references/evaluation-definition-schema.md +0 -385
- package/skills/evaluate-skill/references/evaluation-design.md +0 -112
- package/skills/evaluate-skill/references/execution-and-evidence.md +0 -90
- package/skills/evaluate-skill/references/review-and-revision.md +0 -92
- package/skills/evaluate-skill/scripts/lib/definitions.mjs +0 -407
- package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +0 -60
- package/skills/evaluate-skill/scripts/lib/grade.mjs +0 -64
- package/skills/evaluate-skill/scripts/lib/runner.mjs +0 -368
- package/skills/evaluate-skill/scripts/pi-guard.mjs +0 -164
- package/skills/evaluate-skill/scripts/skill-eval.mjs +0 -102
- package/skills/execute-work/references/execute-work-edges.md +0 -68
- package/skills/finish-branch/SKILL.md +0 -117
- package/skills/finish-branch/references/integration-options.md +0 -80
- package/skills/handoff/SKILL.md +0 -82
- package/skills/handoff/references/handoff-templates.md +0 -150
- package/skills/launch-work/SKILL.md +0 -116
- package/skills/launch-work/references/launch-readiness.md +0 -85
- package/skills/migration-work/SKILL.md +0 -115
- package/skills/migration-work/references/migration-lifecycle.md +0 -82
- package/skills/release-work/SKILL.md +0 -118
- package/skills/release-work/references/release-evidence.md +0 -78
- package/skills/review-artifact/SKILL.md +0 -142
- package/skills/review-artifact/references/adjudicate-artifact-review.md +0 -101
- package/skills/review-artifact/references/independent-artifact-reviewer-contract.md +0 -159
- package/skills/review-work/references/adjudicate-work-review.md +0 -97
- package/skills/review-work/references/independent-work-reviewer-contract.md +0 -139
- package/skills/review-work/references/security-risk-lens.md +0 -69
- package/skills/setup-freeflow/references/activation-contract.md +0 -109
- package/skills/setup-freeflow/references/host-setup.md +0 -67
- package/skills/simplify-code/SKILL.md +0 -85
- package/skills/simplify-code/references/simplification-patterns.md +0 -70
- package/skills/verify-work/references/browser-runtime-evidence.md +0 -55
- package/skills/verify-work/references/integration-evidence.md +0 -47
- package/skills/verify-work/references/performance-evidence.md +0 -57
- package/skills/workflow/SKILL.md +0 -127
- package/skills/workflow/references/domain-skill-composition.md +0 -43
- package/skills/write-plan/SKILL.md +0 -92
- package/skills/write-plan/references/plan-shapes.md +0 -156
- package/skills/write-skill/references/activation-boundaries.md +0 -104
- package/skills/write-skill/references/agent-first-instructions.md +0 -121
- package/skills/write-skill/references/progressive-disclosure.md +0 -127
- package/skills/write-skill/references/skill-dependency-graphs.md +0 -190
- package/skills/write-spec/SKILL.md +0 -92
- package/skills/write-spec/references/artifact-standards.md +0 -86
- package/skills/write-spec/references/decision-records.md +0 -78
- package/skills/write-spec/references/spec-shapes.md +0 -143
- /package/pi-extension/dist/{cognitive-routing-v2 → cognitive-routing}/budget.js +0 -0
- /package/skills/{evaluate-skill → evaluate-behavior}/scripts/lib/evidence.mjs +0 -0
- /package/skills/{evaluate-skill → evaluate-behavior}/scripts/pi-observer.mjs +0 -0
|
@@ -1,368 +0,0 @@
|
|
|
1
|
-
import { mkdir, realpath } from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
|
|
4
|
-
import { loadDefinition, selectDefinition } from "./definitions.mjs";
|
|
5
|
-
import { createInvocationId, fileIdentity, writeJson, writeText } from "./evidence.mjs";
|
|
6
|
-
import { gradeDeterministic } from "./grade.mjs";
|
|
7
|
-
import { runBody, runDescription, VariantSetupError } from "./pi.mjs";
|
|
8
|
-
import { prepareFixture, prepareRuntime } from "./sandbox.mjs";
|
|
9
|
-
|
|
10
|
-
const VARIANTS = ["baseline", "candidate"];
|
|
11
|
-
const DESCRIPTION_TOOLS = new Set(["read"]);
|
|
12
|
-
const BODY_TOOLS = new Set(["read", "write", "edit"]);
|
|
13
|
-
// Native tools must be separated from extension tools before CLI tool selection is built.
|
|
14
|
-
const NATIVE_TOOLS = new Set(["read", "bash", "powershell", "edit", "write", "grep", "find", "ls"]);
|
|
15
|
-
const DEFAULT_RUNTIME = { host: "pi", session: false, extensions: [], environment: { literal: {}, inherit: [] } };
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* @param {string} definitionFile
|
|
19
|
-
* @param {any} selectors
|
|
20
|
-
* @param {{root?: string, signal?: AbortSignal}} options
|
|
21
|
-
*/
|
|
22
|
-
export async function runEvaluation(definitionFile, selectors = {}, { root = process.cwd(), signal } = {}) {
|
|
23
|
-
const definitionPath = await realpath(path.resolve(root, definitionFile));
|
|
24
|
-
const definition = await loadDefinition(definitionPath, { root });
|
|
25
|
-
const selection = selectDefinition(definition, selectors);
|
|
26
|
-
assertSupportedSelection(selection);
|
|
27
|
-
const invocationId = createInvocationId();
|
|
28
|
-
const runsDirectory = path.join(root, ".skill-eval", "runs");
|
|
29
|
-
const resultDirectory = path.join(runsDirectory, invocationId);
|
|
30
|
-
await mkdir(runsDirectory, { recursive: true });
|
|
31
|
-
await mkdir(resultDirectory);
|
|
32
|
-
await writeJson(path.join(resultDirectory, "invocation.json"), {
|
|
33
|
-
schema_version: 1,
|
|
34
|
-
id: invocationId,
|
|
35
|
-
definition: definitionPath,
|
|
36
|
-
selection: {
|
|
37
|
-
group: selectors.group ?? null,
|
|
38
|
-
variant: selectors.variant ?? null,
|
|
39
|
-
groups: selection.groups.map((entry) => ({
|
|
40
|
-
id: entry.group.id,
|
|
41
|
-
position: entry.position,
|
|
42
|
-
variants: entry.variants,
|
|
43
|
-
})),
|
|
44
|
-
},
|
|
45
|
-
startedAt: new Date().toISOString(),
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
const groups = [];
|
|
49
|
-
for (const selected of selection.groups) {
|
|
50
|
-
groups.push(await runGroup({ selected, root, resultDirectory, signal }));
|
|
51
|
-
}
|
|
52
|
-
const state = batchState(groups);
|
|
53
|
-
const summary = {
|
|
54
|
-
schema_version: 1,
|
|
55
|
-
id: invocationId,
|
|
56
|
-
state,
|
|
57
|
-
definitionKind: selection.definitionKind,
|
|
58
|
-
groups,
|
|
59
|
-
completedAt: new Date().toISOString(),
|
|
60
|
-
};
|
|
61
|
-
await writeJson(path.join(resultDirectory, "summary.json"), summary);
|
|
62
|
-
return { id: invocationId, path: resultDirectory, state, summary };
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function assertSupportedSelection(selection) {
|
|
66
|
-
for (const selected of selection.groups) {
|
|
67
|
-
const { group } = selected;
|
|
68
|
-
if (group.type !== "description" && group.type !== "body") {
|
|
69
|
-
throw new Error("skill-eval run currently supports description and body groups only");
|
|
70
|
-
}
|
|
71
|
-
if (group.expectations.some((expectation) => expectation.kind === "command")) {
|
|
72
|
-
throw new Error("command expectations are not supported");
|
|
73
|
-
}
|
|
74
|
-
const supportedTools = group.type === "body" ? BODY_TOOLS : DESCRIPTION_TOOLS;
|
|
75
|
-
const unsupportedNativeTools = group.tools.filter((tool) => NATIVE_TOOLS.has(tool) && !supportedTools.has(tool));
|
|
76
|
-
if (unsupportedNativeTools.length > 0) {
|
|
77
|
-
throw new Error(`${group.type} execution does not support native tools: ${unsupportedNativeTools.join(", ")}`);
|
|
78
|
-
}
|
|
79
|
-
const customTools = group.tools.filter((tool) => !NATIVE_TOOLS.has(tool) && !supportedTools.has(tool));
|
|
80
|
-
if (group.type === "description" && customTools.length > 0) {
|
|
81
|
-
throw new Error(`${group.type} execution does not support custom tools: ${customTools.join(", ")}`);
|
|
82
|
-
}
|
|
83
|
-
if (customTools.length > 0 && (group.runtime?.extensions?.length ?? 0) === 0) {
|
|
84
|
-
throw new Error(
|
|
85
|
-
`${group.type} execution requires declared extensions for custom tools: ${customTools.join(", ")}`,
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
async function runGroup({ selected, root, resultDirectory, signal }) {
|
|
92
|
-
const { group } = selected;
|
|
93
|
-
const groupDirectory = path.join(resultDirectory, "groups", group.id);
|
|
94
|
-
await mkdir(groupDirectory, { recursive: true });
|
|
95
|
-
await writeJson(path.join(groupDirectory, "definition.json"), group);
|
|
96
|
-
|
|
97
|
-
let fixture = null;
|
|
98
|
-
let runtime = null;
|
|
99
|
-
let resourceError = null;
|
|
100
|
-
if (!signal?.aborted) {
|
|
101
|
-
try {
|
|
102
|
-
fixture = await prepareFixture({ declaredPath: group.fixture, root, groupDirectory });
|
|
103
|
-
runtime = await prepareRuntime({
|
|
104
|
-
runtime: group.runtime ?? DEFAULT_RUNTIME,
|
|
105
|
-
root,
|
|
106
|
-
groupDirectory,
|
|
107
|
-
});
|
|
108
|
-
} catch (error) {
|
|
109
|
-
resourceError = error instanceof Error ? error.message : String(error);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const runs = {};
|
|
114
|
-
const runFiles = {};
|
|
115
|
-
for (const variant of VARIANTS) {
|
|
116
|
-
const variantDirectory = path.join(groupDirectory, variant);
|
|
117
|
-
await mkdir(variantDirectory, { recursive: true });
|
|
118
|
-
if (selected.variants[variant] === "not-selected") {
|
|
119
|
-
runs[variant] = notSelectedRun(group, variant);
|
|
120
|
-
} else if (signal?.aborted) {
|
|
121
|
-
runs[variant] = cancelledRun(group, variant);
|
|
122
|
-
} else if (resourceError === null) {
|
|
123
|
-
runs[variant] = await executeVariant({ group, variant, root, variantDirectory, fixture, runtime, signal });
|
|
124
|
-
} else {
|
|
125
|
-
runs[variant] = invalidRun(group, variant, resourceError);
|
|
126
|
-
}
|
|
127
|
-
const persisted = await persistRunOrFailure(variantDirectory, runs[variant]);
|
|
128
|
-
runs[variant] = persisted.run;
|
|
129
|
-
runFiles[variant] = persisted.file;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const evidence = {
|
|
133
|
-
baseline: await fileIdentity(runFiles.baseline),
|
|
134
|
-
candidate: await fileIdentity(runFiles.candidate),
|
|
135
|
-
};
|
|
136
|
-
const grade = await createGrade(group, runs, evidence);
|
|
137
|
-
const persistedGrade = await persistGrade(groupDirectory, grade);
|
|
138
|
-
const selectedRuns = VARIANTS.filter((variant) => selected.variants[variant] === "selected").map(
|
|
139
|
-
(variant) => runs[variant],
|
|
140
|
-
);
|
|
141
|
-
const selectedState = selectedGroupState(selectedRuns, persistedGrade.grade);
|
|
142
|
-
let groupState = selectedState;
|
|
143
|
-
if (selectedState !== "cancelled" && resourceError !== null) groupState = "invalid";
|
|
144
|
-
const groupResult = {
|
|
145
|
-
id: group.id,
|
|
146
|
-
position: selected.position,
|
|
147
|
-
state: groupState,
|
|
148
|
-
variants: Object.fromEntries(VARIANTS.map((variant) => [variant, runs[variant].state])),
|
|
149
|
-
grade: persistedGrade.grade.state,
|
|
150
|
-
artifacts: { grade: persistedGrade.artifact, group: "group.json" },
|
|
151
|
-
errors: persistedGrade.errors,
|
|
152
|
-
};
|
|
153
|
-
return persistGroupResult(groupDirectory, groupResult);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function batchState(groups) {
|
|
157
|
-
if (groups.some((group) => group.state === "cancelled")) return "cancelled";
|
|
158
|
-
if (groups.every((group) => group.state === "complete")) return "complete";
|
|
159
|
-
return "partially-complete";
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function selectedGroupState(runs, grade) {
|
|
163
|
-
if (runs.some((run) => run.state === "cancelled")) return "cancelled";
|
|
164
|
-
if (runs.every((run) => run.state === "complete") && grade.state !== "grade-error") return "complete";
|
|
165
|
-
return "partially-complete";
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
async function createGrade(group, runs, evidence) {
|
|
169
|
-
try {
|
|
170
|
-
return await gradeDeterministic(group, runs, evidence);
|
|
171
|
-
} catch (error) {
|
|
172
|
-
return gradeErrorReport(evidence, `deterministic grading failed: ${errorMessage(error)}`);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
async function persistGrade(groupDirectory, grade) {
|
|
177
|
-
const artifact = "deterministic-grade.json";
|
|
178
|
-
try {
|
|
179
|
-
await writeJson(path.join(groupDirectory, artifact), grade);
|
|
180
|
-
return { grade, artifact, errors: [] };
|
|
181
|
-
} catch (error) {
|
|
182
|
-
const reason = `failed to persist ${artifact}: ${errorMessage(error)}`;
|
|
183
|
-
const failed = gradeErrorReport(grade.evidence, reason, grade);
|
|
184
|
-
const fallback = "deterministic-grade-error.json";
|
|
185
|
-
await writeJson(path.join(groupDirectory, fallback), failed);
|
|
186
|
-
return {
|
|
187
|
-
grade: failed,
|
|
188
|
-
artifact: fallback,
|
|
189
|
-
errors: [{ kind: "persistence", artifact, message: reason }],
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
async function persistGroupResult(groupDirectory, groupResult) {
|
|
195
|
-
const artifact = "group.json";
|
|
196
|
-
try {
|
|
197
|
-
await writeJson(path.join(groupDirectory, artifact), groupResult);
|
|
198
|
-
return groupResult;
|
|
199
|
-
} catch (error) {
|
|
200
|
-
const message = `failed to persist ${artifact}: ${errorMessage(error)}`;
|
|
201
|
-
const fallback = "group-error.json";
|
|
202
|
-
const failed = {
|
|
203
|
-
...groupResult,
|
|
204
|
-
state: groupResult.state === "complete" ? "partially-complete" : groupResult.state,
|
|
205
|
-
artifacts: { ...groupResult.artifacts, group: fallback },
|
|
206
|
-
errors: [...groupResult.errors, { kind: "persistence", artifact, message }],
|
|
207
|
-
};
|
|
208
|
-
await writeJson(path.join(groupDirectory, fallback), failed);
|
|
209
|
-
return failed;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
function gradeErrorReport(evidence, reason, grade = null) {
|
|
214
|
-
return {
|
|
215
|
-
schema_version: 1,
|
|
216
|
-
state: "grade-error",
|
|
217
|
-
evidence,
|
|
218
|
-
checks: grade?.checks ?? [],
|
|
219
|
-
comparisons: grade?.comparisons ?? [],
|
|
220
|
-
errors: [...(grade?.errors ?? []), { id: null, reason }],
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function errorMessage(error) {
|
|
225
|
-
return error instanceof Error ? error.message : String(error);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
async function executeVariant({ group, variant, root, variantDirectory, fixture, runtime, signal }) {
|
|
229
|
-
try {
|
|
230
|
-
const run = group.type === "body" ? runBody : runDescription;
|
|
231
|
-
return await run({ group, variant, root, variantDirectory, fixture, runtime, signal });
|
|
232
|
-
} catch (error) {
|
|
233
|
-
if (error instanceof VariantSetupError) return invalidRun(group, variant, error.message);
|
|
234
|
-
return infrastructureFailedRun(group, variant, error);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
async function persistRunOrFailure(variantDirectory, run) {
|
|
239
|
-
try {
|
|
240
|
-
return { run, file: await persistRun(variantDirectory, run) };
|
|
241
|
-
} catch (error) {
|
|
242
|
-
const failed = persistenceFailedRun(run, error);
|
|
243
|
-
const runFile = path.join(variantDirectory, "run.json");
|
|
244
|
-
await writeJson(runFile, {
|
|
245
|
-
...failed,
|
|
246
|
-
transcript: failed.transcript ?? [],
|
|
247
|
-
artifacts: {
|
|
248
|
-
events: failed.process === undefined ? null : "events.jsonl",
|
|
249
|
-
final: null,
|
|
250
|
-
stderr: failed.process === undefined ? null : "stderr.log",
|
|
251
|
-
},
|
|
252
|
-
});
|
|
253
|
-
return { run: failed, file: runFile };
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
async function persistRun(variantDirectory, run) {
|
|
258
|
-
const transcript = run.transcript ?? [];
|
|
259
|
-
const response = run.response ?? "";
|
|
260
|
-
await writeJson(path.join(variantDirectory, "transcript.json"), transcript);
|
|
261
|
-
await writeText(path.join(variantDirectory, "final.md"), response === "" ? "" : `${response}\n`);
|
|
262
|
-
const runFile = path.join(variantDirectory, "run.json");
|
|
263
|
-
const hasProcessEvidence = run.process !== undefined;
|
|
264
|
-
const persisted = {
|
|
265
|
-
...run,
|
|
266
|
-
transcript: "transcript.json",
|
|
267
|
-
artifacts: {
|
|
268
|
-
events: hasProcessEvidence ? "events.jsonl" : null,
|
|
269
|
-
final: "final.md",
|
|
270
|
-
stderr: hasProcessEvidence ? "stderr.log" : null,
|
|
271
|
-
context: run.contextObservationArtifact ? "context-observations.jsonl" : null,
|
|
272
|
-
},
|
|
273
|
-
};
|
|
274
|
-
if (Array.isArray(run.turns)) persisted.turns = externalizeTurnTranscripts(run.turns);
|
|
275
|
-
await writeJson(runFile, persisted);
|
|
276
|
-
return runFile;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
function externalizeTurnTranscripts(turns) {
|
|
280
|
-
let offset = 0;
|
|
281
|
-
return turns.map((turn) => {
|
|
282
|
-
const length = Array.isArray(turn.transcript) ? turn.transcript.length : 0;
|
|
283
|
-
const transcript = { file: "transcript.json", start: offset, end: offset + length };
|
|
284
|
-
offset += length;
|
|
285
|
-
return { ...turn, transcript };
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
function notSelectedRun(group, variant) {
|
|
290
|
-
return {
|
|
291
|
-
schema_version: 1,
|
|
292
|
-
variant,
|
|
293
|
-
state: "not-selected",
|
|
294
|
-
evaluationType: group.type,
|
|
295
|
-
prompt: group.input.prompt ?? null,
|
|
296
|
-
prompts: group.input.turns ?? null,
|
|
297
|
-
activation: unavailableActivation(),
|
|
298
|
-
response: "",
|
|
299
|
-
transcript: [],
|
|
300
|
-
error: null,
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
function cancelledRun(group, variant) {
|
|
305
|
-
return {
|
|
306
|
-
schema_version: 1,
|
|
307
|
-
variant,
|
|
308
|
-
state: "cancelled",
|
|
309
|
-
evaluationType: group.type,
|
|
310
|
-
prompt: group.input.prompt ?? null,
|
|
311
|
-
prompts: group.input.turns ?? null,
|
|
312
|
-
activation: unavailableActivation(),
|
|
313
|
-
response: "",
|
|
314
|
-
transcript: [],
|
|
315
|
-
error: { kind: "cancellation", message: "Cancelled before subject execution" },
|
|
316
|
-
};
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
function invalidRun(group, variant, message) {
|
|
320
|
-
return {
|
|
321
|
-
schema_version: 1,
|
|
322
|
-
variant,
|
|
323
|
-
state: "invalid",
|
|
324
|
-
evaluationType: group.type,
|
|
325
|
-
prompt: group.input.prompt ?? null,
|
|
326
|
-
prompts: group.input.turns ?? null,
|
|
327
|
-
activation: unavailableActivation(),
|
|
328
|
-
response: "",
|
|
329
|
-
transcript: [],
|
|
330
|
-
error: { kind: "setup", message },
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
function persistenceFailedRun(run, error) {
|
|
335
|
-
return {
|
|
336
|
-
...run,
|
|
337
|
-
state: "infrastructure-failed",
|
|
338
|
-
error: {
|
|
339
|
-
kind: "persistence",
|
|
340
|
-
message: error instanceof Error ? error.message : String(error),
|
|
341
|
-
cause: run.error ?? null,
|
|
342
|
-
},
|
|
343
|
-
};
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
function infrastructureFailedRun(group, variant, error) {
|
|
347
|
-
return {
|
|
348
|
-
schema_version: 1,
|
|
349
|
-
variant,
|
|
350
|
-
state: "infrastructure-failed",
|
|
351
|
-
evaluationType: group.type,
|
|
352
|
-
prompt: group.input.prompt ?? null,
|
|
353
|
-
prompts: group.input.turns ?? null,
|
|
354
|
-
activation: unavailableActivation(),
|
|
355
|
-
response: "",
|
|
356
|
-
transcript: [],
|
|
357
|
-
error: { kind: "infrastructure", message: error instanceof Error ? error.message : String(error) },
|
|
358
|
-
};
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
function unavailableActivation() {
|
|
362
|
-
return {
|
|
363
|
-
targetRead: null,
|
|
364
|
-
firstReadTurn: null,
|
|
365
|
-
readTurns: [],
|
|
366
|
-
successfulReadPaths: [],
|
|
367
|
-
};
|
|
368
|
-
}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import { lstatSync, readFileSync, realpathSync } from "node:fs";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
|
|
5
|
-
const PATH_TOOLS = new Set(["read", "write", "edit"]);
|
|
6
|
-
|
|
7
|
-
function parseStringArray(value) {
|
|
8
|
-
try {
|
|
9
|
-
const parsed = JSON.parse(value ?? "[]");
|
|
10
|
-
return Array.isArray(parsed) && parsed.every((entry) => typeof entry === "string") ? parsed : [];
|
|
11
|
-
} catch {
|
|
12
|
-
return [];
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function isContained(root, target) {
|
|
17
|
-
const relative = path.relative(root, target);
|
|
18
|
-
return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function resolveWritablePath(cwd, requested) {
|
|
22
|
-
const absolute = path.resolve(cwd, requested);
|
|
23
|
-
/** @type {string[]} */
|
|
24
|
-
const missingSegments = [];
|
|
25
|
-
let candidate = absolute;
|
|
26
|
-
while (true) {
|
|
27
|
-
try {
|
|
28
|
-
return path.join(realpathSync(candidate), ...missingSegments);
|
|
29
|
-
} catch {
|
|
30
|
-
try {
|
|
31
|
-
lstatSync(candidate);
|
|
32
|
-
throw new Error(`Existing writable path cannot be resolved: ${requested}`);
|
|
33
|
-
} catch (error) {
|
|
34
|
-
if (error?.code !== "ENOENT" && error?.code !== "ENOTDIR") throw error;
|
|
35
|
-
}
|
|
36
|
-
const parent = path.dirname(candidate);
|
|
37
|
-
if (parent === candidate) throw new Error(`Cannot resolve writable path: ${requested}`);
|
|
38
|
-
missingSegments.unshift(path.basename(candidate));
|
|
39
|
-
candidate = parent;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function escapeXml(value) {
|
|
45
|
-
const entities = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" };
|
|
46
|
-
return value.replace(/[&<>"']/g, (character) => entities[character]);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function loadDeclaredContext(manifestPath) {
|
|
50
|
-
if (!manifestPath) return [];
|
|
51
|
-
let manifest;
|
|
52
|
-
try {
|
|
53
|
-
manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
54
|
-
} catch (error) {
|
|
55
|
-
throw new Error(
|
|
56
|
-
`Declared context manifest cannot be read: ${error instanceof Error ? error.message : String(error)}`,
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
if (manifest?.schema_version !== 1 || !Array.isArray(manifest.entries)) {
|
|
60
|
-
throw new Error("Declared context manifest must use schema_version 1 and contain entries");
|
|
61
|
-
}
|
|
62
|
-
for (const entry of manifest.entries) {
|
|
63
|
-
if (typeof entry?.declaredPath !== "string" || !Array.isArray(entry.files)) {
|
|
64
|
-
throw new Error("Declared context manifest entry is malformed");
|
|
65
|
-
}
|
|
66
|
-
for (const file of entry.files) {
|
|
67
|
-
if (
|
|
68
|
-
typeof file?.path !== "string" ||
|
|
69
|
-
typeof file.sha256 !== "string" ||
|
|
70
|
-
typeof file.content !== "string" ||
|
|
71
|
-
createHash("sha256").update(file.content).digest("hex") !== file.sha256
|
|
72
|
-
) {
|
|
73
|
-
throw new Error(`Declared context file is malformed or changed: ${file?.path ?? "unknown"}`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return manifest.entries;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function buildSubjectSystemPrompt(options, declaredContext) {
|
|
81
|
-
const tools = options.selectedTools ?? [];
|
|
82
|
-
const toolLines = tools.map((tool) => `- ${tool}: ${options.toolSnippets?.[tool] ?? "Declared evaluation tool"}`);
|
|
83
|
-
const lines = [
|
|
84
|
-
"You are an expert coding assistant operating inside pi, a coding agent harness.",
|
|
85
|
-
"Help the user with the task using only the tools and resources listed below.",
|
|
86
|
-
"",
|
|
87
|
-
"Available tools:",
|
|
88
|
-
...(toolLines.length > 0 ? toolLines : ["(none)"]),
|
|
89
|
-
"",
|
|
90
|
-
"Guidelines:",
|
|
91
|
-
"- Use read to load a skill's SKILL.md when the task matches its description.",
|
|
92
|
-
"- Resolve relative skill resources from the skill directory.",
|
|
93
|
-
"- Be concise in your response.",
|
|
94
|
-
];
|
|
95
|
-
const skills = (options.skills ?? []).filter((skill) => !skill.disableModelInvocation);
|
|
96
|
-
if (skills.length > 0) {
|
|
97
|
-
lines.push("", "<available_skills>");
|
|
98
|
-
for (const skill of skills) {
|
|
99
|
-
lines.push(
|
|
100
|
-
" <skill>",
|
|
101
|
-
` <name>${escapeXml(skill.name)}</name>`,
|
|
102
|
-
` <description>${escapeXml(skill.description)}</description>`,
|
|
103
|
-
` <location>${escapeXml(skill.filePath)}</location>`,
|
|
104
|
-
" </skill>",
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
lines.push("</available_skills>");
|
|
108
|
-
}
|
|
109
|
-
if (declaredContext.length > 0) {
|
|
110
|
-
lines.push("", "<declared_context>");
|
|
111
|
-
for (const entry of declaredContext) {
|
|
112
|
-
lines.push(` <context declared-path="${escapeXml(entry.declaredPath)}">`);
|
|
113
|
-
for (const file of entry.files) {
|
|
114
|
-
lines.push(` <file path="${escapeXml(file.path)}">\n${file.content}</file>`);
|
|
115
|
-
}
|
|
116
|
-
lines.push(" </context>");
|
|
117
|
-
}
|
|
118
|
-
lines.push("</declared_context>");
|
|
119
|
-
}
|
|
120
|
-
lines.push(`Current working directory: ${options.cwd}`);
|
|
121
|
-
return lines.join("\n");
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export default function registerSkillEvalGuard(pi) {
|
|
125
|
-
const allowedRoots = parseStringArray(process.env.SKILL_EVAL_ALLOWED_ROOTS).map((root) => realpathSync(root));
|
|
126
|
-
const writableRootValue = process.env.SKILL_EVAL_WRITABLE_ROOT;
|
|
127
|
-
if (!writableRootValue) throw new Error("SKILL_EVAL_WRITABLE_ROOT is required");
|
|
128
|
-
const writableRoot = realpathSync(writableRootValue);
|
|
129
|
-
const allowedTools = new Set(parseStringArray(process.env.SKILL_EVAL_ALLOWED_TOOLS));
|
|
130
|
-
const declaredContext = loadDeclaredContext(process.env.SKILL_EVAL_CONTEXT_MANIFEST);
|
|
131
|
-
|
|
132
|
-
pi.on("before_agent_start", (event) => ({
|
|
133
|
-
systemPrompt: buildSubjectSystemPrompt(event.systemPromptOptions, declaredContext),
|
|
134
|
-
}));
|
|
135
|
-
|
|
136
|
-
pi.on("tool_call", (event, ctx) => {
|
|
137
|
-
if (!allowedTools.has(event.toolName)) {
|
|
138
|
-
return { block: true, reason: `Tool is not declared for this evaluation: ${event.toolName}` };
|
|
139
|
-
}
|
|
140
|
-
if (!PATH_TOOLS.has(event.toolName)) return undefined;
|
|
141
|
-
if (typeof event.input?.path !== "string") {
|
|
142
|
-
return { block: true, reason: `${event.toolName} requires a path inside the evaluation environment` };
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const requested = event.input.path.startsWith("@") ? event.input.path.slice(1) : event.input.path;
|
|
146
|
-
let canonical;
|
|
147
|
-
try {
|
|
148
|
-
canonical =
|
|
149
|
-
event.toolName === "write"
|
|
150
|
-
? resolveWritablePath(ctx.cwd, requested)
|
|
151
|
-
: realpathSync(path.resolve(ctx.cwd, requested));
|
|
152
|
-
} catch {
|
|
153
|
-
return {
|
|
154
|
-
block: true,
|
|
155
|
-
reason: `${event.toolName} path cannot be resolved inside the evaluation environment: ${requested}`,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
const roots = event.toolName === "read" ? allowedRoots : [writableRoot];
|
|
159
|
-
if (!roots.some((root) => isContained(root, canonical))) {
|
|
160
|
-
return { block: true, reason: `${event.toolName} path escapes the evaluation environment: ${requested}` };
|
|
161
|
-
}
|
|
162
|
-
return undefined;
|
|
163
|
-
});
|
|
164
|
-
}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { runEvaluation } from "./lib/runner.mjs";
|
|
4
|
-
import { renderResult } from "./lib/view.mjs";
|
|
5
|
-
|
|
6
|
-
const commands = new Set(["run", "view"]);
|
|
7
|
-
const argv = process.argv.slice(2);
|
|
8
|
-
const [command] = argv;
|
|
9
|
-
|
|
10
|
-
function printUsage() {
|
|
11
|
-
process.stdout.write(
|
|
12
|
-
`Usage:
|
|
13
|
-
skill-eval run <suite-or-group-path> [options]
|
|
14
|
-
skill-eval view <result-id-or-directory> [options]
|
|
15
|
-
|
|
16
|
-
Commands:
|
|
17
|
-
run Execute selected evaluation groups
|
|
18
|
-
view Render selected stored evidence
|
|
19
|
-
|
|
20
|
-
Selectors:
|
|
21
|
-
--group <id-or-position>
|
|
22
|
-
--variant <baseline|candidate>
|
|
23
|
-
|
|
24
|
-
Paths:
|
|
25
|
-
Definition paths resolve from the current working directory.
|
|
26
|
-
Suite group references resolve relative to the suite file.
|
|
27
|
-
Results are stored under <cwd>/.skill-eval/runs/<result-id>.
|
|
28
|
-
view accepts a stored result ID or an explicit result directory.
|
|
29
|
-
|
|
30
|
-
Selection:
|
|
31
|
-
No selectors choose every suite group and both variants.
|
|
32
|
-
--group is invalid for a direct group definition or result.
|
|
33
|
-
|
|
34
|
-
Current run support:
|
|
35
|
-
Description and explicit-body groups with prompt or ordered turns
|
|
36
|
-
Working-tree or Git-backed ordered skills/context; optional fresh fixture copies
|
|
37
|
-
Description tools: read; body tools: read, write, edit, or declared extension tools
|
|
38
|
-
Runtime profiles: Pi or PiFlow hosts, ordered immutable extension bundles, environment overrides
|
|
39
|
-
Deterministic reads, paths, changed paths, text, JSON, tool calls, context observations, and factual comparisons
|
|
40
|
-
Ordered suites run serially and continue after isolated variant, group, or post-processing failures
|
|
41
|
-
Grade-first views show compact criterion details, usage, and result-relative artifact paths
|
|
42
|
-
`,
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function fail(message, exitCode = 2) {
|
|
47
|
-
process.stderr.write(`${message}\n`);
|
|
48
|
-
process.exitCode = exitCode;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function parseOperation(values) {
|
|
52
|
-
const [target, ...options] = values;
|
|
53
|
-
if (!target) throw new Error(`skill-eval ${command} requires a target`);
|
|
54
|
-
let group = null;
|
|
55
|
-
let variant = null;
|
|
56
|
-
for (let index = 0; index < options.length; index += 1) {
|
|
57
|
-
const option = options[index];
|
|
58
|
-
const value = options[index + 1];
|
|
59
|
-
if (option !== "--group" && option !== "--variant") throw new Error(`Unknown option: ${option}`);
|
|
60
|
-
if (!value || value.startsWith("--")) throw new Error(`${option} requires a value`);
|
|
61
|
-
if (option === "--group") {
|
|
62
|
-
if (group !== null) throw new Error("--group may be supplied only once");
|
|
63
|
-
group = value;
|
|
64
|
-
} else {
|
|
65
|
-
if (variant !== null) throw new Error("--variant may be supplied only once");
|
|
66
|
-
variant = value;
|
|
67
|
-
}
|
|
68
|
-
index += 1;
|
|
69
|
-
}
|
|
70
|
-
return { target, selectors: { group, variant } };
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (!command || command === "--help" || command === "-h") {
|
|
74
|
-
printUsage();
|
|
75
|
-
} else if (commands.has(command)) {
|
|
76
|
-
try {
|
|
77
|
-
const operation = parseOperation(argv.slice(1));
|
|
78
|
-
if (command === "view") {
|
|
79
|
-
process.stdout.write(await renderResult(operation.target, operation.selectors, { root: process.cwd() }));
|
|
80
|
-
} else {
|
|
81
|
-
const controller = new AbortController();
|
|
82
|
-
const abort = () => controller.abort();
|
|
83
|
-
process.once("SIGINT", abort);
|
|
84
|
-
process.once("SIGTERM", abort);
|
|
85
|
-
try {
|
|
86
|
-
const result = await runEvaluation(operation.target, operation.selectors, {
|
|
87
|
-
root: process.cwd(),
|
|
88
|
-
signal: controller.signal,
|
|
89
|
-
});
|
|
90
|
-
process.stdout.write(`Result: ${result.id}\nPath: ${result.path}\nState: ${result.state}\n`);
|
|
91
|
-
if (result.state !== "complete") process.exitCode = 1;
|
|
92
|
-
} finally {
|
|
93
|
-
process.removeListener("SIGINT", abort);
|
|
94
|
-
process.removeListener("SIGTERM", abort);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
} catch (error) {
|
|
98
|
-
fail(error instanceof Error ? error.message : String(error), 1);
|
|
99
|
-
}
|
|
100
|
-
} else {
|
|
101
|
-
fail(`Unknown command: ${command}`);
|
|
102
|
-
}
|