@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,7 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { execFile as execFileCallback } from "node:child_process";
|
|
3
3
|
import { lstat, mkdir, readdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
4
|
-
import { realpathSync } from "node:fs";
|
|
4
|
+
import { readFileSync, realpathSync } from "node:fs";
|
|
5
5
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
6
6
|
import { promisify } from "node:util";
|
|
7
7
|
|
|
@@ -30,12 +30,14 @@ async function gitCommand(root, args) {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
async function assertGitSafePath(root, path) {
|
|
33
|
+
async function assertGitSafePath(root, path, { directory = false } = {}) {
|
|
34
34
|
const repository = await gitCommand(root, ["rev-parse", "--show-toplevel"]);
|
|
35
35
|
if (!repository.ok) return;
|
|
36
36
|
const repositoryRoot = canonicalPath(repository.stdout.trim());
|
|
37
37
|
const relativePath = relative(repositoryRoot, canonicalPath(path)).split(sep).join("/");
|
|
38
|
-
|
|
38
|
+
// A trailing slash lets a directory-only rule such as `.freeflow/*/` match a folder that does not exist yet.
|
|
39
|
+
const ignorePath = directory ? `${relativePath}/` : relativePath;
|
|
40
|
+
const ignored = await gitCommand(repositoryRoot, ["check-ignore", "--no-index", "-q", "--", ignorePath]);
|
|
39
41
|
if (!ignored.ok) fail("unignored-path", `Record path is not ignored by Git: ${relativePath}`);
|
|
40
42
|
const tracked = await gitCommand(repositoryRoot, ["ls-files", "--error-unmatch", "--", relativePath]);
|
|
41
43
|
if (tracked.ok) fail("tracked-path", `Record path is already tracked by Git: ${relativePath}`);
|
|
@@ -67,21 +69,49 @@ async function assertNoSymlinkPath(target, stopAt) {
|
|
|
67
69
|
}
|
|
68
70
|
}
|
|
69
71
|
|
|
72
|
+
/** The marker a project store keeps at its root; see registry.mjs. */
|
|
73
|
+
export const STORE_MARKER = "store.json";
|
|
74
|
+
|
|
75
|
+
/** In a tasks directory: the highest task number a removal took away, so numbering never goes back. */
|
|
76
|
+
export const LAST_TASK_NUMBER = ".last-task-number";
|
|
77
|
+
|
|
78
|
+
/** Whether root is a project store: its store.json is the registry's marker, not some other file of that name. */
|
|
79
|
+
function isStore(root) {
|
|
80
|
+
try {
|
|
81
|
+
const marker = JSON.parse(readFileSync(join(root, STORE_MARKER), "utf8"));
|
|
82
|
+
return marker?.version === 1 && typeof marker.project === "string";
|
|
83
|
+
} catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** A repository keeps its records in .freeflow/tasks; a project store, marked by store.json, in tasks. */
|
|
70
89
|
export function taskRoot(root) {
|
|
71
|
-
return resolve(root, ".freeflow", "tasks");
|
|
90
|
+
return isStore(root) ? resolve(root, "tasks") : resolve(root, ".freeflow", "tasks");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** The project store holding an absolute record path (<store>/tasks/<task>/record.md), or undefined. */
|
|
94
|
+
export function storeOf(recordPath) {
|
|
95
|
+
const store = dirname(dirname(dirname(resolve(recordPath))));
|
|
96
|
+
return basename(dirname(dirname(resolve(recordPath)))) === "tasks" && isStore(store) ? store : undefined;
|
|
72
97
|
}
|
|
73
98
|
|
|
99
|
+
/**
|
|
100
|
+
* The path with every symlink resolved, including for a path that does not exist yet: the nearest existing ancestor is
|
|
101
|
+
* resolved and the rest appended. Git reports canonical paths, so comparisons with it need the same form.
|
|
102
|
+
*/
|
|
74
103
|
function canonicalPath(path) {
|
|
75
104
|
const candidate = resolve(path);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const parent = dirname(candidate);
|
|
80
|
-
if (parent === candidate) return candidate;
|
|
105
|
+
const missing = [];
|
|
106
|
+
let current = candidate;
|
|
107
|
+
for (;;) {
|
|
81
108
|
try {
|
|
82
|
-
return join(realpathSync(
|
|
109
|
+
return join(realpathSync(current), ...missing);
|
|
83
110
|
} catch {
|
|
84
|
-
|
|
111
|
+
const parent = dirname(current);
|
|
112
|
+
if (parent === current) return candidate;
|
|
113
|
+
missing.unshift(basename(current));
|
|
114
|
+
current = parent;
|
|
85
115
|
}
|
|
86
116
|
}
|
|
87
117
|
}
|
|
@@ -94,9 +124,9 @@ export function resolveRecordPath(root, supplied) {
|
|
|
94
124
|
const recordPath = basename(candidate) === "record.md" ? candidate : join(candidate, "record.md");
|
|
95
125
|
const canonicalRecord = canonicalPath(recordPath);
|
|
96
126
|
if (!inside(tasks, canonicalRecord) || basename(canonicalRecord) !== "record.md")
|
|
97
|
-
fail("unsafe-path", `Record must be a record.md below ${tasks}`);
|
|
127
|
+
fail("unsafe-path", `Record must be a record.md below ${tasks}; pass --root or an absolute --record path`);
|
|
98
128
|
const taskDirectory = basename(dirname(canonicalRecord));
|
|
99
|
-
if (!/^task-\d{3}-[a-z0-9][a-z0-9-]*$/.test(taskDirectory))
|
|
129
|
+
if (!/^task-\d{3,}-[a-z0-9][a-z0-9-]*$/.test(taskDirectory))
|
|
100
130
|
fail("unsafe-path", `Invalid task directory: ${taskDirectory}`);
|
|
101
131
|
return canonicalRecord;
|
|
102
132
|
}
|
|
@@ -137,26 +167,26 @@ export async function readInput(inputPath, cwd = process.cwd()) {
|
|
|
137
167
|
}
|
|
138
168
|
}
|
|
139
169
|
|
|
140
|
-
async function nextTaskNumber(tasks) {
|
|
170
|
+
export async function nextTaskNumber(tasks) {
|
|
141
171
|
let entries = [];
|
|
142
172
|
try {
|
|
143
173
|
entries = await readdir(tasks, { withFileTypes: true });
|
|
144
174
|
} catch (error) {
|
|
145
175
|
if (error?.code !== "ENOENT") throw error;
|
|
146
176
|
}
|
|
147
|
-
|
|
177
|
+
// Numbers are never reused, so an old reference to a deleted task cannot point at a new one; a removal records the
|
|
178
|
+
// highest number it took away (LAST_TASK_NUMBER), since its directory is gone.
|
|
179
|
+
let highest = Number((await readFile(join(tasks, LAST_TASK_NUMBER), "utf8").catch(() => "0")).trim()) || 0;
|
|
148
180
|
for (const entry of entries) {
|
|
149
|
-
const match = /^task-(\d{3})-/.exec(entry.name);
|
|
150
|
-
if (entry.isDirectory() && match)
|
|
181
|
+
const match = /^task-(\d{3,})-/.exec(entry.name);
|
|
182
|
+
if (entry.isDirectory() && match) highest = Math.max(highest, Number(match[1]));
|
|
151
183
|
}
|
|
152
|
-
|
|
153
|
-
while (used.has(number)) number += 1;
|
|
154
|
-
return number;
|
|
184
|
+
return highest + 1;
|
|
155
185
|
}
|
|
156
186
|
|
|
157
187
|
export async function createRecordPath(root, taskName, slug) {
|
|
158
188
|
const tasks = taskRoot(root);
|
|
159
|
-
await assertGitSafePath(root, tasks);
|
|
189
|
+
await assertGitSafePath(root, tasks, { directory: true });
|
|
160
190
|
await mkdir(tasks, { recursive: true });
|
|
161
191
|
await assertNoSymlinkPath(tasks, canonicalPath(root));
|
|
162
192
|
const number = await nextTaskNumber(tasks);
|
|
@@ -169,6 +199,8 @@ export async function createRecordPath(root, taskName, slug) {
|
|
|
169
199
|
if (error?.code === "EEXIST") fail("task-already-exists", `Task directory already exists: ${directory}`);
|
|
170
200
|
throw error;
|
|
171
201
|
}
|
|
202
|
+
// The task's place for temporary work, ignored by Git with the rest of the task directory.
|
|
203
|
+
await mkdir(join(directory, "scratch"));
|
|
172
204
|
return { path, taskName };
|
|
173
205
|
}
|
|
174
206
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ACTIVE_SLICE_FIELDS,
|
|
3
|
+
CHECKPOINT_TYPES,
|
|
3
4
|
DECISION_FIELDS,
|
|
4
5
|
HISTORICAL_CHECKPOINT_FIELDS,
|
|
5
6
|
HISTORICAL_CHECKPOINT_STATES,
|
|
@@ -18,6 +19,7 @@ import {
|
|
|
18
19
|
parseDocument,
|
|
19
20
|
parseFragment,
|
|
20
21
|
renderBlock,
|
|
22
|
+
validateOccurred,
|
|
21
23
|
} from "./document.mjs";
|
|
22
24
|
import { writeAtomically } from "./store.mjs";
|
|
23
25
|
|
|
@@ -60,6 +62,8 @@ const DECISION_ORDER = [
|
|
|
60
62
|
const HISTORICAL_SLICE_ORDER = [
|
|
61
63
|
"State",
|
|
62
64
|
"Type",
|
|
65
|
+
"Occurred",
|
|
66
|
+
"Recorded",
|
|
63
67
|
"Intended result",
|
|
64
68
|
"Authority source",
|
|
65
69
|
"Result",
|
|
@@ -331,7 +335,7 @@ async function startSlice(options, input, loaded) {
|
|
|
331
335
|
{ start: proposal.start, end: proposal.end, lines: [] },
|
|
332
336
|
{
|
|
333
337
|
start: document.current.sliceHeadingIndex + 1,
|
|
334
|
-
end: document.current.
|
|
338
|
+
end: document.current.sliceEnd,
|
|
335
339
|
lines: ["", ...currentLines, ""],
|
|
336
340
|
},
|
|
337
341
|
nextActionReplacement(document, nextAction),
|
|
@@ -393,7 +397,7 @@ async function startDirectSlice(options, input, loaded) {
|
|
|
393
397
|
const candidate = withLineChanges(document, [
|
|
394
398
|
{
|
|
395
399
|
start: document.current.sliceHeadingIndex + 1,
|
|
396
|
-
end: document.current.
|
|
400
|
+
end: document.current.sliceEnd,
|
|
397
401
|
lines: ["", ...currentLines, ""],
|
|
398
402
|
},
|
|
399
403
|
nextActionReplacement(document, nextAction),
|
|
@@ -476,7 +480,7 @@ async function closeSlice(options, input, loaded) {
|
|
|
476
480
|
const candidate = withLineChanges(document, [
|
|
477
481
|
{
|
|
478
482
|
start: document.current.sliceHeadingIndex + 1,
|
|
479
|
-
end: document.current.
|
|
483
|
+
end: document.current.sliceEnd,
|
|
480
484
|
lines: ["", "None", ""],
|
|
481
485
|
},
|
|
482
486
|
{ start: document.history.slices.end, end: document.history.slices.end, lines: historical },
|
|
@@ -485,6 +489,65 @@ async function closeSlice(options, input, loaded) {
|
|
|
485
489
|
return publish(loaded, candidate, `Closed Slice: ${slice.id} — ${state}`);
|
|
486
490
|
}
|
|
487
491
|
|
|
492
|
+
function localDate(date = new Date()) {
|
|
493
|
+
const pad = (value) => String(value).padStart(2, "0");
|
|
494
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
async function recordSlice(options, input, loaded) {
|
|
498
|
+
const document = parseDocument(loaded.text);
|
|
499
|
+
if (!["active", "paused"].includes(document.header.state))
|
|
500
|
+
fail("invalid-task-state", `Cannot record a Slice while task state is ${document.header.state}`);
|
|
501
|
+
const title = requiredStringOption(options, "--title");
|
|
502
|
+
const state = requiredStringOption(options, "--state");
|
|
503
|
+
if (!HISTORICAL_SLICE_STATES.has(state)) fail("invalid-state", `Invalid historical Slice state: ${state}`);
|
|
504
|
+
const fragment = parseInput(
|
|
505
|
+
input,
|
|
506
|
+
new Set([
|
|
507
|
+
"Type",
|
|
508
|
+
"Occurred",
|
|
509
|
+
"Intended result",
|
|
510
|
+
"Authority source",
|
|
511
|
+
"Result",
|
|
512
|
+
"Evidence and limits",
|
|
513
|
+
"Task effect",
|
|
514
|
+
"Resume when",
|
|
515
|
+
"Reason",
|
|
516
|
+
"Residual effects",
|
|
517
|
+
]),
|
|
518
|
+
"slice record",
|
|
519
|
+
);
|
|
520
|
+
const values = { State: state };
|
|
521
|
+
for (const field of [
|
|
522
|
+
"Occurred",
|
|
523
|
+
"Intended result",
|
|
524
|
+
"Authority source",
|
|
525
|
+
"Result",
|
|
526
|
+
"Evidence and limits",
|
|
527
|
+
"Task effect",
|
|
528
|
+
])
|
|
529
|
+
values[field] = requireFragment(fragment, field, "slice record");
|
|
530
|
+
for (const field of ["Type", "Resume when", "Reason", "Residual effects"]) {
|
|
531
|
+
const lines = fragmentValue(fragment, field);
|
|
532
|
+
if (lines?.length) values[field] = lines;
|
|
533
|
+
}
|
|
534
|
+
if (state === "blocked") values["Resume when"] = requireFragment(fragment, "Resume when", "slice record");
|
|
535
|
+
if (state === "abandoned") values.Reason = requireFragment(fragment, "Reason", "slice record");
|
|
536
|
+
const recordedOn = localDate();
|
|
537
|
+
const occurredEnd = validateOccurred(fragmentText(fragment, "Occurred"), "slice record input");
|
|
538
|
+
if (occurredEnd > recordedOn) fail("invalid-occurred", `Occurred cannot end after today (${recordedOn})`);
|
|
539
|
+
values.Recorded = [`retroactively on ${recordedOn}`];
|
|
540
|
+
const id = nextEntityId(document, "slice");
|
|
541
|
+
const candidate = withLineChanges(document, [
|
|
542
|
+
{
|
|
543
|
+
start: document.history.slices.end,
|
|
544
|
+
end: document.history.slices.end,
|
|
545
|
+
lines: renderHistoricalSlice(values, title, id),
|
|
546
|
+
},
|
|
547
|
+
]);
|
|
548
|
+
return publish(loaded, candidate, `Recorded Slice: ${id} — ${title} (${state}, retroactive)`);
|
|
549
|
+
}
|
|
550
|
+
|
|
488
551
|
async function reopenSlice(options, input, loaded) {
|
|
489
552
|
const document = parseDocument(loaded.text);
|
|
490
553
|
assertTaskActive(document, "reopen a Slice");
|
|
@@ -528,7 +591,7 @@ async function reopenSlice(options, input, loaded) {
|
|
|
528
591
|
const candidate = withLineChanges(document, [
|
|
529
592
|
{
|
|
530
593
|
start: document.current.sliceHeadingIndex + 1,
|
|
531
|
-
end: document.current.
|
|
594
|
+
end: document.current.sliceEnd,
|
|
532
595
|
lines: ["", ...currentLines, ""],
|
|
533
596
|
},
|
|
534
597
|
nextActionReplacement(document, nextAction),
|
|
@@ -546,6 +609,9 @@ async function proposeCheckpoint(options, input, loaded) {
|
|
|
546
609
|
assertUniqueFutureTitle(document, title);
|
|
547
610
|
const fragment = checkpointInput(input, "checkpoint propose");
|
|
548
611
|
requireFragment(fragment, "Type", "checkpoint propose");
|
|
612
|
+
const type = fragmentText(fragment, "Type");
|
|
613
|
+
if (!CHECKPOINT_TYPES.has(type))
|
|
614
|
+
fail("invalid-type", `Checkpoint Type must be one of ${[...CHECKPOINT_TYPES].join(", ")}; found ${type}`);
|
|
549
615
|
requireFragment(fragment, "Condition", "checkpoint propose");
|
|
550
616
|
requireFragment(fragment, "Applies to", "checkpoint propose");
|
|
551
617
|
const values = {
|
|
@@ -616,6 +682,7 @@ async function closeCheckpoint(options, input, loaded) {
|
|
|
616
682
|
new Set(["Result", "Evidence", "Task effect", "Reason", "Replaced by"]),
|
|
617
683
|
"checkpoint close",
|
|
618
684
|
);
|
|
685
|
+
if (state === "replaced") assertOpenReplacement(document, id, fragmentText(fragment, "Replaced by"));
|
|
619
686
|
const values = {
|
|
620
687
|
State: state,
|
|
621
688
|
Type: fieldLines(checkpoint, "Type"),
|
|
@@ -640,6 +707,13 @@ async function closeCheckpoint(options, input, loaded) {
|
|
|
640
707
|
return publish(loaded, candidate, `Closed Checkpoint: ${id} — ${state}`);
|
|
641
708
|
}
|
|
642
709
|
|
|
710
|
+
// A replacement must still be able to carry the boundary; a closed Checkpoint cannot.
|
|
711
|
+
function assertOpenReplacement(document, id, replacementId) {
|
|
712
|
+
const replacement = document.future.items.find((item) => item.kind === "checkpoint" && item.id === replacementId);
|
|
713
|
+
if (!replacement || replacementId === id || !["pending", "deferred"].includes(fieldValue(replacement, "State")))
|
|
714
|
+
fail("invalid-reference", `Replaced by must name another Checkpoint that is pending or deferred: ${replacementId}`);
|
|
715
|
+
}
|
|
716
|
+
|
|
643
717
|
function decisionInput(input, command) {
|
|
644
718
|
return parseInput(
|
|
645
719
|
input,
|
|
@@ -772,6 +846,7 @@ export async function runTransition(command, positionals, options, input, loaded
|
|
|
772
846
|
if (operation === "resume") return resumeSlice(options, input, loaded);
|
|
773
847
|
if (operation === "close") return closeSlice(options, input, loaded);
|
|
774
848
|
if (operation === "reopen") return reopenSlice(options, input, loaded);
|
|
849
|
+
if (operation === "record") return recordSlice(options, input, loaded);
|
|
775
850
|
}
|
|
776
851
|
if (command === "checkpoint") {
|
|
777
852
|
if (operation === "propose") return proposeCheckpoint(options, input, loaded);
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
activeDecisionBlocks,
|
|
3
|
+
blockLines,
|
|
4
|
+
fieldValue,
|
|
5
|
+
findEntity,
|
|
6
|
+
hasField,
|
|
7
|
+
parseDocument,
|
|
8
|
+
sectionContentLines,
|
|
9
|
+
} from "./document.mjs";
|
|
2
10
|
|
|
3
11
|
function trimTrailing(lines) {
|
|
4
12
|
const result = [...lines];
|
|
@@ -35,6 +43,47 @@ export function renderResume(text) {
|
|
|
35
43
|
|
|
36
44
|
chunks.push(joinChunk(document.lines.slice(current.headingIndex, current.end), newline));
|
|
37
45
|
chunks.push(joinChunk(document.lines.slice(future.headingIndex, future.end), newline));
|
|
46
|
+
const index = historyIndexLines(document);
|
|
47
|
+
if (index.length) {
|
|
48
|
+
chunks.push(
|
|
49
|
+
joinChunk(
|
|
50
|
+
[
|
|
51
|
+
"## History index",
|
|
52
|
+
"",
|
|
53
|
+
"Closed History, one line per entry. Read an entry with `view entry <ID>`.",
|
|
54
|
+
"",
|
|
55
|
+
...index,
|
|
56
|
+
],
|
|
57
|
+
newline,
|
|
58
|
+
),
|
|
59
|
+
);
|
|
60
|
+
}
|
|
38
61
|
chunks.push(joinChunk(document.lines.slice(notes.headingIndex, document.lines.length), newline));
|
|
39
62
|
return `${chunks.filter(Boolean).join(`${newline}${newline}`)}${newline}`;
|
|
40
63
|
}
|
|
64
|
+
|
|
65
|
+
function hasCorrections(document, block) {
|
|
66
|
+
return blockLines(document, block).some((line) => /^#####\s+Corrections\s*$/.test(line));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function indexLine(document, block) {
|
|
70
|
+
const state = fieldValue(block, "State");
|
|
71
|
+
let label = `${block.id} ${state}`;
|
|
72
|
+
if (state === "superseded" && hasField(block, "Superseded by")) label += ` by ${fieldValue(block, "Superseded by")}`;
|
|
73
|
+
if (hasField(block, "Recorded")) label += ", recorded retroactively";
|
|
74
|
+
const corrected = hasCorrections(document, block) ? " (corrected)" : "";
|
|
75
|
+
return `- ${label} — ${block.title}${corrected}`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function historyIndexLines(document) {
|
|
79
|
+
const { decisions, checkpoints, slices } = document.history;
|
|
80
|
+
const closedDecisions = decisions.blocks.filter((block) => fieldValue(block, "State") !== "active");
|
|
81
|
+
return [...closedDecisions, ...checkpoints.blocks, ...slices.blocks].map((block) => indexLine(document, block));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function renderEntries(text, ids) {
|
|
85
|
+
const document = parseDocument(text);
|
|
86
|
+
const { newline } = document;
|
|
87
|
+
const blocks = ids.map((id) => findEntity(document, id));
|
|
88
|
+
return `${blocks.map((block) => joinChunk(blockLines(document, block), newline)).join(`${newline}${newline}`)}${newline}`;
|
|
89
|
+
}
|