ultimate-pi 0.1.7 → 0.2.2
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/skills/graphify/.graphify_version +1 -0
- package/.agents/skills/graphify/SKILL.md +1204 -0
- package/.agents/skills/wiki-autoresearch/SKILL.md +225 -97
- package/.agents/skills/wiki-autoresearch/references/program.md +28 -62
- package/.agents/skills/wiki-autoresearch/references/quality-sites.md +32 -0
- package/.env.example +5 -1
- package/.gitattributes +1 -0
- package/.github/workflows/publish-github-packages.yml +1 -1
- package/.pi/SYSTEM.md +72 -18
- package/.pi/agents/harness/adversary.md +32 -0
- package/.pi/agents/harness/evaluator.md +32 -0
- package/.pi/agents/harness/executor.md +34 -0
- package/.pi/agents/harness/meta-optimizer.md +33 -0
- package/.pi/agents/harness/planner.md +33 -0
- package/.pi/agents/harness/tie-breaker.md +35 -0
- package/.pi/agents/harness/trace-librarian.md +32 -0
- package/.pi/extensions/banner.png +0 -0
- package/.pi/extensions/budget-guard.ts +265 -0
- package/.pi/extensions/custom-footer.ts +194 -22
- package/.pi/extensions/custom-header.ts +47 -9
- package/.pi/extensions/debate-orchestrator.ts +479 -0
- package/.pi/extensions/harness-live-widget.ts +438 -0
- package/.pi/extensions/policy-gate.ts +349 -0
- package/.pi/extensions/review-integrity.ts +198 -0
- package/.pi/extensions/test-diff-integrity.ts +240 -0
- package/.pi/extensions/trace-recorder.ts +315 -0
- package/.pi/harness/README.md +23 -0
- package/.pi/harness/router/README.md +35 -0
- package/.pi/harness/router/apply-router-proposal.mjs +153 -0
- package/.pi/harness/router/propose-router-tuning.mjs +149 -0
- package/.pi/harness/specs/README.md +37 -0
- package/.pi/harness/specs/adversary-report.schema.json +53 -0
- package/.pi/harness/specs/budget-exhausted-event.schema.json +93 -0
- package/.pi/harness/specs/consensus-packet.schema.json +175 -0
- package/.pi/harness/specs/eval-verdict.schema.json +59 -0
- package/.pi/harness/specs/incident-record.schema.json +84 -0
- package/.pi/harness/specs/plan-packet.schema.json +90 -0
- package/.pi/harness/specs/round-result.schema.json +126 -0
- package/.pi/harness/specs/router-tuning-proposal.schema.json +114 -0
- package/.pi/harness/specs/run-trace.schema.json +107 -0
- package/.pi/lib/harness-ui-state.ts +311 -0
- package/.pi/mcp.json +4 -0
- package/.pi/model-router.json +93 -93
- package/.pi/prompts/graphify.md +23 -0
- package/.pi/prompts/harness-abort.md +41 -0
- package/.pi/prompts/harness-auto.md +83 -0
- package/.pi/prompts/harness-critic.md +52 -0
- package/.pi/prompts/harness-eval.md +51 -0
- package/.pi/prompts/harness-incident.md +51 -0
- package/.pi/prompts/harness-plan.md +64 -0
- package/.pi/prompts/harness-review.md +52 -0
- package/.pi/prompts/harness-router-tune.md +74 -0
- package/.pi/prompts/harness-run.md +59 -0
- package/.pi/prompts/harness-setup.md +316 -216
- package/.pi/prompts/harness-trace.md +51 -0
- package/.pi/prompts/wiki-autoresearch.md +9 -7
- package/.pi/prompts/wiki-save.md +20 -0
- package/.pi/skills/agent-router/SKILL.md +2 -4
- package/.pi/skills/ast-grep/SKILL.md +354 -0
- package/.pi/sounds/project-sounds.json +18 -24
- package/AGENTS.md +30 -0
- package/CHANGELOG.md +89 -0
- package/CONTRIBUTING.md +51 -1
- package/README.md +264 -20
- package/biome.json +8 -2
- package/lefthook.yml +3 -2
- package/node_modules/@sting8k/pi-vcc/README.md +200 -0
- package/node_modules/@sting8k/pi-vcc/index.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/package.json +26 -0
- package/node_modules/@sting8k/pi-vcc/scripts/audit-sessions.ts +88 -0
- package/node_modules/@sting8k/pi-vcc/scripts/benchmark-real-sessions.ts +25 -0
- package/node_modules/@sting8k/pi-vcc/scripts/compare-before-after.ts +36 -0
- package/node_modules/@sting8k/pi-vcc/scripts/dump-branch-output.ts +20 -0
- package/node_modules/@sting8k/pi-vcc/src/commands/pi-vcc.ts +36 -0
- package/node_modules/@sting8k/pi-vcc/src/commands/vcc-recall.ts +65 -0
- package/node_modules/@sting8k/pi-vcc/src/core/brief.ts +381 -0
- package/node_modules/@sting8k/pi-vcc/src/core/build-sections.ts +79 -0
- package/node_modules/@sting8k/pi-vcc/src/core/content.ts +60 -0
- package/node_modules/@sting8k/pi-vcc/src/core/filter-noise.ts +42 -0
- package/node_modules/@sting8k/pi-vcc/src/core/format-recall.ts +27 -0
- package/node_modules/@sting8k/pi-vcc/src/core/format.ts +49 -0
- package/node_modules/@sting8k/pi-vcc/src/core/lineage.ts +26 -0
- package/node_modules/@sting8k/pi-vcc/src/core/load-messages.ts +41 -0
- package/node_modules/@sting8k/pi-vcc/src/core/normalize.ts +66 -0
- package/node_modules/@sting8k/pi-vcc/src/core/recall-scope.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/src/core/render-entries.ts +55 -0
- package/node_modules/@sting8k/pi-vcc/src/core/report.ts +237 -0
- package/node_modules/@sting8k/pi-vcc/src/core/sanitize.ts +5 -0
- package/node_modules/@sting8k/pi-vcc/src/core/search-entries.ts +221 -0
- package/node_modules/@sting8k/pi-vcc/src/core/settings.ts +77 -0
- package/node_modules/@sting8k/pi-vcc/src/core/skill-collapse.ts +35 -0
- package/node_modules/@sting8k/pi-vcc/src/core/summarize.ts +157 -0
- package/node_modules/@sting8k/pi-vcc/src/core/tool-args.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/src/details.ts +7 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/commits.ts +69 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/files.ts +80 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/goals.ts +79 -0
- package/node_modules/@sting8k/pi-vcc/src/extract/preferences.ts +55 -0
- package/node_modules/@sting8k/pi-vcc/src/hooks/before-compact.ts +322 -0
- package/node_modules/@sting8k/pi-vcc/src/sections.ts +12 -0
- package/node_modules/@sting8k/pi-vcc/src/tools/recall.ts +109 -0
- package/node_modules/@sting8k/pi-vcc/src/types.ts +14 -0
- package/node_modules/@sting8k/pi-vcc/tests/before-compact-hook.test.ts +181 -0
- package/node_modules/@sting8k/pi-vcc/tests/before-compact.test.ts +140 -0
- package/node_modules/@sting8k/pi-vcc/tests/brief.test.ts +206 -0
- package/node_modules/@sting8k/pi-vcc/tests/build-sections.test.ts +59 -0
- package/node_modules/@sting8k/pi-vcc/tests/compile.test.ts +80 -0
- package/node_modules/@sting8k/pi-vcc/tests/content.test.ts +31 -0
- package/node_modules/@sting8k/pi-vcc/tests/extract-goals.test.ts +86 -0
- package/node_modules/@sting8k/pi-vcc/tests/extract-preferences.test.ts +30 -0
- package/node_modules/@sting8k/pi-vcc/tests/filter-noise.test.ts +61 -0
- package/node_modules/@sting8k/pi-vcc/tests/fixtures.ts +61 -0
- package/node_modules/@sting8k/pi-vcc/tests/format-recall.test.ts +30 -0
- package/node_modules/@sting8k/pi-vcc/tests/format.test.ts +62 -0
- package/node_modules/@sting8k/pi-vcc/tests/lineage.test.ts +33 -0
- package/node_modules/@sting8k/pi-vcc/tests/load-messages.test.ts +51 -0
- package/node_modules/@sting8k/pi-vcc/tests/normalize.test.ts +97 -0
- package/node_modules/@sting8k/pi-vcc/tests/real-sessions.test.ts +38 -0
- package/node_modules/@sting8k/pi-vcc/tests/recall-expand.test.ts +15 -0
- package/node_modules/@sting8k/pi-vcc/tests/recall-scope.test.ts +32 -0
- package/node_modules/@sting8k/pi-vcc/tests/recall-tool-scope.test.ts +67 -0
- package/node_modules/@sting8k/pi-vcc/tests/render-entries.test.ts +62 -0
- package/node_modules/@sting8k/pi-vcc/tests/report.test.ts +44 -0
- package/node_modules/@sting8k/pi-vcc/tests/sanitize.test.ts +24 -0
- package/node_modules/@sting8k/pi-vcc/tests/search-entries.test.ts +144 -0
- package/node_modules/@sting8k/pi-vcc/tests/support/load-session.ts +23 -0
- package/node_modules/@sting8k/pi-vcc/tests/support/real-sessions.ts +51 -0
- package/package.json +15 -4
- package/scripts/__pycache__/merge_graphify_corpora.cpython-314.pyc +0 -0
- package/scripts/index_youtube_urls.py +376 -0
- package/scripts/merge_graphify_corpora.py +398 -0
- package/scripts/regen_graphify_html.py +46 -0
- package/.agents/skills/defuddle/SKILL.md +0 -90
- package/.agents/skills/wiki/SKILL.md +0 -215
- package/.agents/skills/wiki/references/css-snippets.md +0 -122
- package/.agents/skills/wiki/references/frontmatter.md +0 -107
- package/.agents/skills/wiki/references/git-setup.md +0 -58
- package/.agents/skills/wiki/references/mcp-setup.md +0 -149
- package/.agents/skills/wiki/references/modes.md +0 -259
- package/.agents/skills/wiki/references/plugins.md +0 -96
- package/.agents/skills/wiki/references/rest-api.md +0 -124
- package/.agents/skills/wiki-fold/SKILL.md +0 -204
- package/.agents/skills/wiki-fold/references/fold-template.md +0 -133
- package/.agents/skills/wiki-ingest/SKILL.md +0 -288
- package/.agents/skills/wiki-lint/SKILL.md +0 -183
- package/.agents/skills/wiki-query/SKILL.md +0 -176
- package/.pi/agents/rethink.md +0 -140
- package/.pi/agents/wiki-ingest.md +0 -67
- package/.pi/agents/wiki-lint.md +0 -75
- package/.pi/internal/cursor-sdk-transcript-parser.ts +0 -59
- package/.pi/prompts/save.md +0 -16
- package/.pi/prompts/wiki.md +0 -23
- package/.pi/providers/cursor-sdk-provider.test.mjs +0 -476
- package/.pi/providers/cursor-sdk-provider.ts +0 -1085
- package/vault/AGENTS.md +0 -37
- package/vault/wiki/_templates/comparison.md +0 -39
- package/vault/wiki/_templates/concept.md +0 -40
- package/vault/wiki/_templates/decision.md +0 -21
- package/vault/wiki/_templates/entity.md +0 -32
- package/vault/wiki/_templates/flow.md +0 -14
- package/vault/wiki/_templates/module.md +0 -18
- package/vault/wiki/_templates/question.md +0 -31
- package/vault/wiki/_templates/source.md +0 -39
- package/vault/wiki/concepts/AST-Aware Code Chunking.md +0 -44
- package/vault/wiki/concepts/Build-Time Prompt Compilation.md +0 -107
- package/vault/wiki/concepts/Context Engine (AI Coding).md +0 -47
- package/vault/wiki/concepts/Context-Aware System Reminders.md +0 -61
- package/vault/wiki/concepts/Contextualized Text Embedding.md +0 -42
- package/vault/wiki/concepts/Contractor vs Employee AI Model.md +0 -55
- package/vault/wiki/concepts/Dual-Model Agent Architecture.md +0 -65
- package/vault/wiki/concepts/Late Chunking vs Early Chunking.md +0 -43
- package/vault/wiki/concepts/Majority Vote Ensembling.md +0 -68
- package/vault/wiki/concepts/Meta-Harness.md +0 -16
- package/vault/wiki/concepts/Multi-Agent AI Coding Architecture.md +0 -75
- package/vault/wiki/concepts/Prompt Enhancement.md +0 -90
- package/vault/wiki/concepts/Prompt Renderer.md +0 -89
- package/vault/wiki/concepts/Semantic Codebase Indexing.md +0 -67
- package/vault/wiki/concepts/additive-config-hierarchy.md +0 -16
- package/vault/wiki/concepts/agent-artifacts-verifiable-deliverables.md +0 -71
- package/vault/wiki/concepts/agent-browser-browser-automation.md +0 -99
- package/vault/wiki/concepts/agent-codebase-interface.md +0 -43
- package/vault/wiki/concepts/agent-harness-architecture.md +0 -67
- package/vault/wiki/concepts/agent-loop-detection-patterns.md +0 -133
- package/vault/wiki/concepts/agent-search-enforcement.md +0 -126
- package/vault/wiki/concepts/agent-skills-ecosystem.md +0 -74
- package/vault/wiki/concepts/agent-skills-pattern.md +0 -68
- package/vault/wiki/concepts/agentic-harness-context-enforcement.md +0 -91
- package/vault/wiki/concepts/agentic-harness.md +0 -34
- package/vault/wiki/concepts/agentic-orchestration-pipeline.md +0 -56
- package/vault/wiki/concepts/agentic-search-no-embeddings.md +0 -18
- package/vault/wiki/concepts/anthropic-context-engineering.md +0 -13
- package/vault/wiki/concepts/antigravity-agent-first-architecture.md +0 -61
- package/vault/wiki/concepts/ast-compression.md +0 -19
- package/vault/wiki/concepts/ast-truncation.md +0 -66
- package/vault/wiki/concepts/barrel-files.md +0 -37
- package/vault/wiki/concepts/browser-harness-agent.md +0 -41
- package/vault/wiki/concepts/browser-subagent-visual-verification.md +0 -82
- package/vault/wiki/concepts/codebase-intelligence-ecosystem-comparison.md +0 -192
- package/vault/wiki/concepts/codebase-intelligence-harness-integration.md +0 -161
- package/vault/wiki/concepts/codebase-to-context-ingestion.md +0 -46
- package/vault/wiki/concepts/codex-harness-innovations.md +0 -147
- package/vault/wiki/concepts/consensus-debate-flow.md +0 -17
- package/vault/wiki/concepts/consensus-debate.md +0 -206
- package/vault/wiki/concepts/content-addressed-spec-identity.md +0 -166
- package/vault/wiki/concepts/context-anxiety.md +0 -57
- package/vault/wiki/concepts/context-compression-techniques.md +0 -19
- package/vault/wiki/concepts/context-continuity.md +0 -22
- package/vault/wiki/concepts/context-drift-in-agents.md +0 -106
- package/vault/wiki/concepts/context-engineering.md +0 -62
- package/vault/wiki/concepts/context-folding.md +0 -67
- package/vault/wiki/concepts/context-mode.md +0 -38
- package/vault/wiki/concepts/cursor-harness-innovations.md +0 -107
- package/vault/wiki/concepts/deterministic-session-compaction.md +0 -79
- package/vault/wiki/concepts/drift-detection-unified.md +0 -296
- package/vault/wiki/concepts/execution-feedback-loop.md +0 -46
- package/vault/wiki/concepts/feedforward-feedback-harness.md +0 -60
- package/vault/wiki/concepts/five-root-cause-metrics-sentrux.md +0 -40
- package/vault/wiki/concepts/fork-safe-spec-storage.md +0 -89
- package/vault/wiki/concepts/fts5-sandbox.md +0 -19
- package/vault/wiki/concepts/fuzzy-edit-matching.md +0 -71
- package/vault/wiki/concepts/gemini-cli-architecture.md +0 -104
- package/vault/wiki/concepts/generator-evaluator-architecture.md +0 -64
- package/vault/wiki/concepts/guardian-agent-pattern.md +0 -67
- package/vault/wiki/concepts/harness-configuration-layers.md +0 -89
- package/vault/wiki/concepts/harness-control-frameworks.md +0 -155
- package/vault/wiki/concepts/harness-engineering-first-principles.md +0 -90
- package/vault/wiki/concepts/harness-h-formalism.md +0 -53
- package/vault/wiki/concepts/hybrid-code-search.md +0 -61
- package/vault/wiki/concepts/inline-post-edit-validation.md +0 -112
- package/vault/wiki/concepts/legendary-engineering-patterns-harness.md +0 -110
- package/vault/wiki/concepts/lifecycle-hooks.md +0 -94
- package/vault/wiki/concepts/mcp-tool-routing.md +0 -102
- package/vault/wiki/concepts/memory-system-of-record-vs-ephemeral-cache.md +0 -47
- package/vault/wiki/concepts/meta-agent-context-pruning.md +0 -151
- package/vault/wiki/concepts/model-adaptive-harness.md +0 -122
- package/vault/wiki/concepts/model-routing-agents.md +0 -101
- package/vault/wiki/concepts/monorepo-architecture.md +0 -45
- package/vault/wiki/concepts/multi-agent-specialization.md +0 -61
- package/vault/wiki/concepts/permission-subsystem.md +0 -16
- package/vault/wiki/concepts/pi-messenger-analysis.md +0 -243
- package/vault/wiki/concepts/pi-vscode-extension-landscape.md +0 -37
- package/vault/wiki/concepts/policy-engine-pattern.md +0 -78
- package/vault/wiki/concepts/progressive-disclosure-agents.md +0 -53
- package/vault/wiki/concepts/progressive-skill-disclosure.md +0 -17
- package/vault/wiki/concepts/provider-native-prompting.md +0 -203
- package/vault/wiki/concepts/quality-signal-sentrux.md +0 -37
- package/vault/wiki/concepts/repo-map-ranking.md +0 -42
- package/vault/wiki/concepts/result-monad-error-handling.md +0 -47
- package/vault/wiki/concepts/safety-defense-in-depth.md +0 -83
- package/vault/wiki/concepts/sandbox-os-enforcement.md +0 -18
- package/vault/wiki/concepts/selective-debate-routing.md +0 -70
- package/vault/wiki/concepts/self-evolving-harness.md +0 -60
- package/vault/wiki/concepts/sentrux-mcp-integration.md +0 -36
- package/vault/wiki/concepts/sentrux-rules-engine.md +0 -49
- package/vault/wiki/concepts/shell-pattern-compression.md +0 -24
- package/vault/wiki/concepts/skill-first-architecture.md +0 -166
- package/vault/wiki/concepts/structured-compaction.md +0 -78
- package/vault/wiki/concepts/subagent-orchestration.md +0 -17
- package/vault/wiki/concepts/subagent-worktree-isolation.md +0 -68
- package/vault/wiki/concepts/superpowers-methodology.md +0 -78
- package/vault/wiki/concepts/think-in-code.md +0 -73
- package/vault/wiki/concepts/ts-execution-layer.md +0 -100
- package/vault/wiki/concepts/typescript-strict-mode.md +0 -37
- package/vault/wiki/concepts/vcc-conversation-compaction-for-pi.md +0 -53
- package/vault/wiki/concepts/verification-drift-detection.md +0 -19
- package/vault/wiki/consensus/consensus-records.md +0 -58
- package/vault/wiki/decisions/2026-04-30-pi-lean-ctx-native.md +0 -122
- package/vault/wiki/decisions/2026-05-07-replace-lean-ctx-with-context-mode.md +0 -59
- package/vault/wiki/decisions/adr-008.md +0 -40
- package/vault/wiki/decisions/adr-009.md +0 -46
- package/vault/wiki/decisions/adr-010.md +0 -55
- package/vault/wiki/decisions/adr-011.md +0 -165
- package/vault/wiki/decisions/adr-012.md +0 -102
- package/vault/wiki/decisions/adr-013.md +0 -59
- package/vault/wiki/decisions/adr-014.md +0 -73
- package/vault/wiki/decisions/adr-015.md +0 -81
- package/vault/wiki/decisions/adr-016.md +0 -91
- package/vault/wiki/decisions/adr-017.md +0 -79
- package/vault/wiki/decisions/adr-018.md +0 -100
- package/vault/wiki/decisions/adr-019.md +0 -75
- package/vault/wiki/decisions/adr-020.md +0 -106
- package/vault/wiki/decisions/adr-021.md +0 -86
- package/vault/wiki/decisions/adr-022.md +0 -113
- package/vault/wiki/decisions/adr-023.md +0 -113
- package/vault/wiki/decisions/adr-024.md +0 -73
- package/vault/wiki/decisions/adr-025.md +0 -130
- package/vault/wiki/decisions/adr-026.md +0 -56
- package/vault/wiki/decisions/adr-027.md +0 -94
- package/vault/wiki/decisions/colocate-wiki.md +0 -34
- package/vault/wiki/entities/Anders Hejlsberg.md +0 -29
- package/vault/wiki/entities/Anthropic.md +0 -17
- package/vault/wiki/entities/Augment Code.md +0 -49
- package/vault/wiki/entities/Bjarne Stroustrup.md +0 -26
- package/vault/wiki/entities/Bolt.new (StackBlitz).md +0 -39
- package/vault/wiki/entities/Boris Cherny.md +0 -11
- package/vault/wiki/entities/Claude Code.md +0 -19
- package/vault/wiki/entities/Dennis Ritchie.md +0 -26
- package/vault/wiki/entities/Emergent Labs.md +0 -32
- package/vault/wiki/entities/Google Cloud.md +0 -16
- package/vault/wiki/entities/Guido van Rossum.md +0 -28
- package/vault/wiki/entities/Ken Thompson.md +0 -28
- package/vault/wiki/entities/Lee et al.md +0 -16
- package/vault/wiki/entities/Linus Torvalds.md +0 -28
- package/vault/wiki/entities/Lovable (company).md +0 -40
- package/vault/wiki/entities/Martin Fowler.md +0 -16
- package/vault/wiki/entities/Meng et al.md +0 -16
- package/vault/wiki/entities/OpenAI.md +0 -16
- package/vault/wiki/entities/Rocket.new.md +0 -38
- package/vault/wiki/entities/VILA-Lab.md +0 -15
- package/vault/wiki/entities/autodev-codebase.md +0 -18
- package/vault/wiki/entities/ck-tool.md +0 -59
- package/vault/wiki/entities/codesearch.md +0 -18
- package/vault/wiki/entities/disler-indydevdan.md +0 -33
- package/vault/wiki/entities/gsd-get-shit-done.md +0 -56
- package/vault/wiki/entities/javascript-runtimes.md +0 -48
- package/vault/wiki/entities/jesse-vincent.md +0 -38
- package/vault/wiki/entities/lean-ctx.md +0 -32
- package/vault/wiki/entities/opendev.md +0 -41
- package/vault/wiki/entities/ops-codegraph-tool.md +0 -18
- package/vault/wiki/entities/pi-coding-agent.md +0 -53
- package/vault/wiki/entities/sentrux.md +0 -54
- package/vault/wiki/entities/vgrep-tool.md +0 -57
- package/vault/wiki/entities/vitest.md +0 -41
- package/vault/wiki/flows/harness-wiki-pipeline.md +0 -204
- package/vault/wiki/hot.md +0 -932
- package/vault/wiki/index.md +0 -437
- package/vault/wiki/log.md +0 -422
- package/vault/wiki/meta/dashboard.md +0 -30
- package/vault/wiki/meta/lint-report-2026-04-30.md +0 -86
- package/vault/wiki/meta/lint-report-2026-05-02.md +0 -251
- package/vault/wiki/meta/overview.canvas +0 -43
- package/vault/wiki/modules/adversarial-verification.md +0 -57
- package/vault/wiki/modules/automated-observability.md +0 -54
- package/vault/wiki/modules/bench.md +0 -20
- package/vault/wiki/modules/extensions.md +0 -23
- package/vault/wiki/modules/grounding-checkpoints.md +0 -62
- package/vault/wiki/modules/harness-implementation-plan.md +0 -345
- package/vault/wiki/modules/harness-wiki-skill-mapping.md +0 -135
- package/vault/wiki/modules/harness.md +0 -86
- package/vault/wiki/modules/persistent-memory.md +0 -85
- package/vault/wiki/modules/schema-orchestration.md +0 -68
- package/vault/wiki/modules/skills.md +0 -27
- package/vault/wiki/modules/spec-hardening.md +0 -58
- package/vault/wiki/modules/structured-planning.md +0 -53
- package/vault/wiki/modules/think-in-code-enforcement.md +0 -153
- package/vault/wiki/modules/wiki-query-interface.md +0 -64
- package/vault/wiki/overview.md +0 -51
- package/vault/wiki/questions/Research-pi-vs-claude-code-agentic-orchestration-pipeline.md +0 -87
- package/vault/wiki/questions/Research-sentrux-dev.md +0 -123
- package/vault/wiki/questions/Research-superpowers-skill-for-agentic-coding-agents.md +0 -164
- package/vault/wiki/questions/Research: Augment Code Context Engine.md +0 -244
- package/vault/wiki/questions/Research: Automating Software Engineering - Lovable, Bolt, Emergent, Rocket.md +0 -112
- package/vault/wiki/questions/Research: Claude Code State-of-the-Art Harness Improvements.md +0 -209
- package/vault/wiki/questions/Research: Codex State-of-the-Art Harness Improvements.md +0 -99
- package/vault/wiki/questions/Research: Engineering Workflows of Legendary Programmers and AI Harness Mapping.md +0 -107
- package/vault/wiki/questions/Research: Fallow Codebase Intelligence Harness Integration.md +0 -72
- package/vault/wiki/questions/Research: Gemini CLI SOTA Harness Integration.md +0 -166
- package/vault/wiki/questions/Research: GitHub Issues as Harness Spec Storage.md +0 -188
- package/vault/wiki/questions/Research: Google Antigravity Harness Integration.md +0 -120
- package/vault/wiki/questions/Research: Meta-Agent Context Drift Detection.md +0 -236
- package/vault/wiki/questions/Research: Model-Adaptive Agent Harness Design.md +0 -95
- package/vault/wiki/questions/Research: Model-Specific Prompting Guides.md +0 -165
- package/vault/wiki/questions/Research: Prompt Renderer for Multi-Model Agent Harness.md +0 -216
- package/vault/wiki/questions/Research: Skill-First Harness Architecture.md +0 -91
- package/vault/wiki/questions/Research: TypeScript Best Practices and Codebase Structure.md +0 -88
- package/vault/wiki/questions/Research: TypeScript Execution Layer for Agent Tool Calling.md +0 -81
- package/vault/wiki/questions/Research: claude-mem over Obsidian for Harness Layer.md +0 -71
- package/vault/wiki/questions/Research: claude-mem over obsidian wiki as the knowledge base for our agentic harness pipeline. think from first principles. does this replace or complement our current setup? no hard feelings about previous decisions. gimme accurate points.md +0 -80
- package/vault/wiki/questions/Research: context-mode vs lean-ctx.md +0 -72
- package/vault/wiki/questions/Research: cursor.sh Harness Innovations.md +0 -92
- package/vault/wiki/questions/Research: executor.sh Harness Integration.md +0 -170
- package/vault/wiki/questions/Research: how GSD fits into our coding harness setup.md +0 -97
- package/vault/wiki/questions/Research: how claude-mem fits into our workflow. and whether it should replace obsidian in the codebase. no hard feelings about previous actions, rethink from first principles always.md +0 -80
- package/vault/wiki/questions/Research: pi-vcc.md +0 -113
- package/vault/wiki/questions/Research: semantic code search tools.md +0 -69
- package/vault/wiki/questions/Research: vcc extension for pi coding agent.md +0 -73
- package/vault/wiki/questions/how-to-enable-semantic-code-search-now.md +0 -111
- package/vault/wiki/questions/mvp-implementation-blueprint.md +0 -552
- package/vault/wiki/questions/research-agent-first-codebase-exploration.md +0 -199
- package/vault/wiki/questions/research-agentic-coding-harness-latest-papers.md +0 -142
- package/vault/wiki/questions/research-gitingest-gitreverse-integration.md +0 -100
- package/vault/wiki/questions/research-wozcode-token-reduction.md +0 -67
- package/vault/wiki/questions/resolved-context-pruning-inplace-vs-restart.md +0 -95
- package/vault/wiki/questions/resolved-context-window-economics.md +0 -167
- package/vault/wiki/questions/resolved-imad-debate-gating-transfer.md +0 -126
- package/vault/wiki/questions/resolved-mcp-tool-preference.md +0 -112
- package/vault/wiki/questions/resolved-small-model-meta-agents.md +0 -107
- package/vault/wiki/questions/resolved-treesitter-dynamic-languages.md +0 -95
- package/vault/wiki/sources/Auggie Context MCP Server.md +0 -63
- package/vault/wiki/sources/Augment Code Codacy AI Giants.md +0 -61
- package/vault/wiki/sources/Augment Code MCP SiliconAngle.md +0 -49
- package/vault/wiki/sources/Augment Code WorkOS ERC 2025.md +0 -55
- package/vault/wiki/sources/Augment Context Engine Official.md +0 -71
- package/vault/wiki/sources/Augment SWE-bench Agent GitHub.md +0 -74
- package/vault/wiki/sources/Augment SWE-bench Pro Blog.md +0 -58
- package/vault/wiki/sources/Source: AgentBus Jinja2 Prompt Pipelines.md +0 -75
- package/vault/wiki/sources/Source: Arxiv /342/200/224 Don't Break the Cache.md" +0 -85
- package/vault/wiki/sources/Source: Augment - Harness Engineering for AI Coding Agents.md +0 -58
- package/vault/wiki/sources/Source: Blake Crosley Agent Architecture Guide.md +0 -100
- package/vault/wiki/sources/Source: Bolt.new Architecture & Case Study.md +0 -75
- package/vault/wiki/sources/Source: Build-Time Prompt Compilation Architecture.md +0 -107
- package/vault/wiki/sources/Source: Claude API Agent Skills Overview.md +0 -70
- package/vault/wiki/sources/Source: Gemini CLI Changelogs.md +0 -88
- package/vault/wiki/sources/Source: Google Blog - Gemini CLI Announcement.md +0 -57
- package/vault/wiki/sources/Source: Google Gemini CLI Architecture Docs.md +0 -53
- package/vault/wiki/sources/Source: LangChain - Anatomy of Agent Harness.md +0 -65
- package/vault/wiki/sources/Source: Lovable Architecture & Clone Analysis.md +0 -83
- package/vault/wiki/sources/Source: Martin Fowler - Harness Engineering.md +0 -70
- package/vault/wiki/sources/Source: OpenAI Harness Engineering Five Principles.md +0 -58
- package/vault/wiki/sources/Source: OpenAI Harness Engineering /342/200/224 0 Lines of Human Code.md" +0 -101
- package/vault/wiki/sources/Source: OpenDev /342/200/224 Building AI Coding Agents for the Terminal.md" +0 -100
- package/vault/wiki/sources/Source: Render AI Coding Agents Benchmark 2025.md +0 -53
- package/vault/wiki/sources/Source: Rocket.new /342/200/224 Vibe Solutioning Platform.md" +0 -70
- package/vault/wiki/sources/Source: SwirlAI Agent Skills Progressive Disclosure.md +0 -71
- package/vault/wiki/sources/Source: TianPan Prompt Caching Architecture.md +0 -89
- package/vault/wiki/sources/Source: Vercel Labs agent-browser.md +0 -155
- package/vault/wiki/sources/Source: browser-harness CDP Harness.md +0 -126
- package/vault/wiki/sources/agent-drift-academic-paper.md +0 -79
- package/vault/wiki/sources/aider-repomap-tree-sitter.md +0 -42
- package/vault/wiki/sources/anthropic-compaction-api.md +0 -58
- package/vault/wiki/sources/anthropic-effective-harnesses.md +0 -42
- package/vault/wiki/sources/anthropic-prompt-best-practices.md +0 -100
- package/vault/wiki/sources/anthropic2026-harness-design.md +0 -63
- package/vault/wiki/sources/barrel-files-tkdodo.md +0 -38
- package/vault/wiki/sources/birth-of-unix-kernighan-interview.md +0 -57
- package/vault/wiki/sources/bockeler2026-harness-engineering.md +0 -69
- package/vault/wiki/sources/cast-code-chunking-paper.md +0 -50
- package/vault/wiki/sources/ck-semantic-search.md +0 -78
- package/vault/wiki/sources/claude-code-architecture-karaxai-2026.md +0 -71
- package/vault/wiki/sources/claude-code-architecture-qubytes-2026.md +0 -50
- package/vault/wiki/sources/claude-code-architecture-vila-lab-2026.md +0 -64
- package/vault/wiki/sources/claude-code-security-architecture-penligent-2026.md +0 -70
- package/vault/wiki/sources/claude-context-editing-docs.md +0 -13
- package/vault/wiki/sources/cloudflare-codemode.md +0 -63
- package/vault/wiki/sources/code-chunk-library-supermemory.md +0 -63
- package/vault/wiki/sources/codeact-apple-2024.md +0 -62
- package/vault/wiki/sources/codex-dsc-rfc-8573.md +0 -41
- package/vault/wiki/sources/codex-open-source-agent-2026.md +0 -110
- package/vault/wiki/sources/coir-code-retrieval-benchmark.md +0 -51
- package/vault/wiki/sources/colinmcnamara-context-optimization-codemode.md +0 -48
- package/vault/wiki/sources/context-folding-paper.md +0 -61
- package/vault/wiki/sources/context-mode-website.md +0 -63
- package/vault/wiki/sources/cursor-agent-best-practices-2026.md +0 -62
- package/vault/wiki/sources/cursor-fork-29b-2025.md +0 -50
- package/vault/wiki/sources/cursor-harness-april-2026.md +0 -76
- package/vault/wiki/sources/cursor-instant-apply-2024.md +0 -45
- package/vault/wiki/sources/cursor-shadow-workspace-2024.md +0 -52
- package/vault/wiki/sources/cursor-shipped-coding-agent-2026.md +0 -53
- package/vault/wiki/sources/cursor-vs-antigravity-2026.md +0 -51
- package/vault/wiki/sources/disler-pi-vs-claude-code.md +0 -69
- package/vault/wiki/sources/distill-deterministic-context-compression.md +0 -53
- package/vault/wiki/sources/embedding-models-benchmark-supermemory-2025.md +0 -48
- package/vault/wiki/sources/executor-rhyssullivan.md +0 -122
- package/vault/wiki/sources/fallow-rs-codebase-intelligence.md +0 -125
- package/vault/wiki/sources/fan2025-imad.md +0 -60
- package/vault/wiki/sources/forgecode-gpt5-agent-improvements.md +0 -63
- package/vault/wiki/sources/gemini-3-prompting-guide.md +0 -78
- package/vault/wiki/sources/gh-cli-sub-issue-rfc.md +0 -50
- package/vault/wiki/sources/gh-sub-issue-extension.md +0 -72
- package/vault/wiki/sources/github-fork-issues-discussion.md +0 -44
- package/vault/wiki/sources/github-issue-dependencies-docs.md +0 -49
- package/vault/wiki/sources/github-sub-issues-docs.md +0 -51
- package/vault/wiki/sources/gitingest.md +0 -91
- package/vault/wiki/sources/gitreverse.md +0 -63
- package/vault/wiki/sources/google-antigravity-official-blog.md +0 -47
- package/vault/wiki/sources/google-antigravity-wikipedia.md +0 -53
- package/vault/wiki/sources/gsd-codecentric-deep-dive.md +0 -57
- package/vault/wiki/sources/gsd-github-repo.md +0 -51
- package/vault/wiki/sources/gsd-hn-discussion.md +0 -59
- package/vault/wiki/sources/guido-python-design-philosophy.md +0 -56
- package/vault/wiki/sources/hejlsberg-7-learnings.md +0 -48
- package/vault/wiki/sources/ironclaw-drift-monitor.md +0 -80
- package/vault/wiki/sources/langsight-loop-detection.md +0 -80
- package/vault/wiki/sources/leanctx-website.md +0 -69
- package/vault/wiki/sources/lee2026-meta-harness.md +0 -59
- package/vault/wiki/sources/linux-kernel-coding-workflow.md +0 -50
- package/vault/wiki/sources/lou2026-autoharness.md +0 -53
- package/vault/wiki/sources/martin-fowler-harness-engineering.md +0 -73
- package/vault/wiki/sources/mcp-architecture-docs.md +0 -13
- package/vault/wiki/sources/meng2026-agent-harness-survey.md +0 -79
- package/vault/wiki/sources/mindstudio-four-agent-types.md +0 -68
- package/vault/wiki/sources/ms-chat-history-management.md +0 -13
- package/vault/wiki/sources/openai-prompt-guidance.md +0 -104
- package/vault/wiki/sources/openclaw-session-pruning.md +0 -13
- package/vault/wiki/sources/opencode-dcp.md +0 -13
- package/vault/wiki/sources/opendev-arxiv-2603.05344v1.md +0 -79
- package/vault/wiki/sources/openhands-platform.md +0 -39
- package/vault/wiki/sources/oss-guide-codebase-exploration.md +0 -53
- package/vault/wiki/sources/pi-compaction-extensions-ecosystem.md +0 -102
- package/vault/wiki/sources/pi-context-prune-github-repo.md +0 -38
- package/vault/wiki/sources/pi-mono-compaction-docs.md +0 -38
- package/vault/wiki/sources/pi-omni-compact-github-repo.md +0 -50
- package/vault/wiki/sources/pi-rtk-optimizer-github-repo.md +0 -45
- package/vault/wiki/sources/pi-vcc-github-repo.md +0 -69
- package/vault/wiki/sources/pi-vscode-marketplace.md +0 -41
- package/vault/wiki/sources/pi-vscode-model-provider-marketplace.md +0 -39
- package/vault/wiki/sources/py-tree-sitter.md +0 -13
- package/vault/wiki/sources/sentrux-dev-landing.md +0 -40
- package/vault/wiki/sources/sentrux-docs-pro-architecture.md +0 -75
- package/vault/wiki/sources/sentrux-docs-quality-signal.md +0 -46
- package/vault/wiki/sources/sentrux-docs-root-cause-metrics.md +0 -57
- package/vault/wiki/sources/sentrux-docs-rules-engine.md +0 -58
- package/vault/wiki/sources/sentrux-github-repo.md +0 -56
- package/vault/wiki/sources/superpowers-github-repo.md +0 -56
- package/vault/wiki/sources/superpowers-release-blog.md +0 -54
- package/vault/wiki/sources/superpowers-termdock-analysis.md +0 -45
- package/vault/wiki/sources/swe-agent-aci.md +0 -42
- package/vault/wiki/sources/swe-bench.md +0 -45
- package/vault/wiki/sources/swe-pruner-context-pruning.md +0 -13
- package/vault/wiki/sources/think-in-code-blog.md +0 -48
- package/vault/wiki/sources/tree-sitter-docs.md +0 -13
- package/vault/wiki/sources/ts-best-practices-2025-devto.md +0 -42
- package/vault/wiki/sources/ts-folder-structure-mingyang.md +0 -58
- package/vault/wiki/sources/ts-monorepo-koerselman.md +0 -44
- package/vault/wiki/sources/ts-result-error-handling-kkalamarski.md +0 -52
- package/vault/wiki/sources/ts-runtimes-comparison-betterstack.md +0 -42
- package/vault/wiki/sources/ts-strict-mode-rishikc.md +0 -43
- package/vault/wiki/sources/unix-philosophy.md +0 -48
- package/vault/wiki/sources/vectara-chunking-vs-embedding-naacl2025.md +0 -39
- package/vault/wiki/sources/vectara-guardian-agents.md +0 -79
- package/vault/wiki/sources/vgrep-semantic-search.md +0 -76
- package/vault/wiki/sources/vitest-official.md +0 -41
- package/vault/wiki/sources/vscode-pi-community-extension.md +0 -40
- package/vault/wiki/sources/wozcode.md +0 -79
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { Message } from "@mariozechner/pi-ai";
|
|
2
|
+
import type { FileOps } from "../types";
|
|
3
|
+
import { normalize } from "./normalize";
|
|
4
|
+
import { filterNoise } from "./filter-noise";
|
|
5
|
+
import { buildSections } from "./build-sections";
|
|
6
|
+
import { formatSummary, capBrief, RECALL_NOTE } from "./format";
|
|
7
|
+
|
|
8
|
+
export interface CompileInput {
|
|
9
|
+
messages: Message[];
|
|
10
|
+
previousSummary?: string;
|
|
11
|
+
fileOps?: FileOps;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const HEADER_NAMES = ["Session Goal", "Files And Changes", "Commits", "Outstanding Context", "User Preferences"];
|
|
15
|
+
|
|
16
|
+
const SEPARATOR = "\n\n---\n\n";
|
|
17
|
+
|
|
18
|
+
/** Extract a named section from summary text */
|
|
19
|
+
const sectionOf = (text: string, header: string): string => {
|
|
20
|
+
const tag = `[${header}]`;
|
|
21
|
+
const start = text.indexOf(tag);
|
|
22
|
+
if (start < 0) return "";
|
|
23
|
+
const after = text.slice(start);
|
|
24
|
+
// Find next section header or separator
|
|
25
|
+
const nextSection = HEADER_NAMES
|
|
26
|
+
.filter((h) => h !== header)
|
|
27
|
+
.map((h) => after.indexOf(`[${h}]`))
|
|
28
|
+
.filter((n) => n > 0);
|
|
29
|
+
const nextSep = after.indexOf("\n\n---\n\n");
|
|
30
|
+
const candidates = [...nextSection, ...(nextSep > 0 ? [nextSep] : [])].sort((a, b) => a - b);
|
|
31
|
+
const end = candidates[0];
|
|
32
|
+
return (end ? after.slice(0, end) : after).trim();
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** Extract the brief transcript part (everything after ---) */
|
|
36
|
+
const briefOf = (text: string): string => {
|
|
37
|
+
const idx = text.indexOf(SEPARATOR);
|
|
38
|
+
if (idx < 0) return "";
|
|
39
|
+
return text.slice(idx + SEPARATOR.length).trim();
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/** Merge a header section */
|
|
43
|
+
const mergeHeaderSection = (header: string, prev: string, fresh: string): string => {
|
|
44
|
+
// Outstanding Context is volatile -- always use fresh only
|
|
45
|
+
if (header === "Outstanding Context") return fresh;
|
|
46
|
+
if (!prev) return fresh;
|
|
47
|
+
if (!fresh) return prev;
|
|
48
|
+
|
|
49
|
+
// Files And Changes: merge by category (Modified/Created/Read), dedup paths
|
|
50
|
+
if (header === "Files And Changes") {
|
|
51
|
+
return mergeFileLines(prev, fresh);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Session Goal, User Preferences: line-level dedup, cap
|
|
55
|
+
const isClean = (l: string) => l.startsWith("- ") && !l.includes("<skill") && !l.includes("</skill");
|
|
56
|
+
const prevLines = prev.split("\n").filter(isClean);
|
|
57
|
+
const freshLines = fresh.split("\n").filter(isClean);
|
|
58
|
+
const combined = [...new Set([...prevLines, ...freshLines])];
|
|
59
|
+
const CAP = header === "Session Goal" ? 8 : header === "Commits" ? 8 : 15;
|
|
60
|
+
const capped = combined.length > CAP ? combined.slice(-CAP) : combined;
|
|
61
|
+
if (capped.length === 0) return "";
|
|
62
|
+
return `[${header}]\n${capped.join("\n")}`;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/** Merge Files And Changes by category, dedup paths across compactions */
|
|
66
|
+
const mergeFileLines = (prev: string, fresh: string): string => {
|
|
67
|
+
const categories = ["Modified", "Created", "Read"] as const;
|
|
68
|
+
const merged: Record<string, Set<string>> = {};
|
|
69
|
+
for (const cat of categories) merged[cat] = new Set();
|
|
70
|
+
|
|
71
|
+
// Parse "- Modified: a, b, c (+N more)" lines from both prev and fresh
|
|
72
|
+
for (const text of [prev, fresh]) {
|
|
73
|
+
for (const line of text.split("\n")) {
|
|
74
|
+
for (const cat of categories) {
|
|
75
|
+
const prefix = `- ${cat}: `;
|
|
76
|
+
if (!line.startsWith(prefix)) continue;
|
|
77
|
+
let rest = line.slice(prefix.length);
|
|
78
|
+
// Strip "(+N more)" suffix
|
|
79
|
+
rest = rest.replace(/\s*\(\+\d+ more\)\s*$/, "");
|
|
80
|
+
for (const p of rest.split(",")) {
|
|
81
|
+
const trimmed = p.trim();
|
|
82
|
+
if (trimmed) merged[cat].add(trimmed);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Dedup: if already in Modified, drop from Created (file existed before)
|
|
89
|
+
for (const p of merged.Modified) merged.Created.delete(p);
|
|
90
|
+
|
|
91
|
+
const cap = (set: Set<string>, limit: number) => {
|
|
92
|
+
const arr = [...set];
|
|
93
|
+
if (arr.length <= limit) return arr.join(", ");
|
|
94
|
+
return arr.slice(0, limit).join(", ") + ` (+${arr.length - limit} more)`;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const lines: string[] = [];
|
|
98
|
+
if (merged.Modified.size > 0) lines.push(`- Modified: ${cap(merged.Modified, 10)}`);
|
|
99
|
+
if (merged.Created.size > 0) lines.push(`- Created: ${cap(merged.Created, 10)}`);
|
|
100
|
+
if (merged.Read.size > 0) lines.push(`- Read: ${cap(merged.Read, 10)}`);
|
|
101
|
+
if (lines.length === 0) return "";
|
|
102
|
+
return `[Files And Changes]\n${lines.join("\n")}`;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const mergeBriefTranscript = (prev: string, fresh: string): string => {
|
|
106
|
+
if (!prev) return fresh;
|
|
107
|
+
if (!fresh) return prev;
|
|
108
|
+
return prev + "\n\n" + fresh;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const mergePrevious = (prev: string, fresh: string): string => {
|
|
112
|
+
// Merge header sections
|
|
113
|
+
const headers = HEADER_NAMES
|
|
114
|
+
.map((header) => {
|
|
115
|
+
const freshSec = sectionOf(fresh, header);
|
|
116
|
+
const prevSec = sectionOf(prev, header);
|
|
117
|
+
return mergeHeaderSection(header, prevSec, freshSec);
|
|
118
|
+
})
|
|
119
|
+
.filter(Boolean);
|
|
120
|
+
|
|
121
|
+
// Merge brief transcript
|
|
122
|
+
const prevBrief = briefOf(prev);
|
|
123
|
+
const freshBrief = briefOf(fresh);
|
|
124
|
+
const mergedBrief = mergeBriefTranscript(prevBrief, freshBrief);
|
|
125
|
+
|
|
126
|
+
const parts: string[] = [];
|
|
127
|
+
if (headers.length > 0) {
|
|
128
|
+
parts.push(headers.join("\n\n"));
|
|
129
|
+
}
|
|
130
|
+
if (mergedBrief) {
|
|
131
|
+
parts.push(capBrief(mergedBrief));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return parts.join(SEPARATOR);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export const compile = (input: CompileInput): string => {
|
|
138
|
+
const blocks = filterNoise(normalize(input.messages));
|
|
139
|
+
const data = buildSections({ blocks });
|
|
140
|
+
const fresh = formatSummary(data);
|
|
141
|
+
// Strip any legacy RECALL_NOTE baked into prev summary (pre-fix format)
|
|
142
|
+
// so merge doesn't re-stack it inside the brief.
|
|
143
|
+
const prev = input.previousSummary
|
|
144
|
+
? stripRecallNote(input.previousSummary)
|
|
145
|
+
: undefined;
|
|
146
|
+
const merged = prev ? mergePrevious(prev, fresh) : fresh;
|
|
147
|
+
if (!merged) return "";
|
|
148
|
+
return merged + SEPARATOR + RECALL_NOTE;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const stripRecallNote = (text: string): string => {
|
|
152
|
+
// Remove trailing RECALL_NOTE (and any separators surrounding it) if present.
|
|
153
|
+
// Handles both current format (---\n\nNOTE) and bare trailing NOTE.
|
|
154
|
+
const idx = text.lastIndexOf(RECALL_NOTE);
|
|
155
|
+
if (idx < 0) return text;
|
|
156
|
+
return text.slice(0, idx).replace(/\s*(?:\n\n---\n\n)?\s*$/, "").trimEnd();
|
|
157
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const extractPath = (args: Record<string, unknown>): string | null => {
|
|
2
|
+
for (const key of ["path", "file_path", "filePath", "file"]) {
|
|
3
|
+
if (typeof args[key] === "string") return args[key] as string;
|
|
4
|
+
}
|
|
5
|
+
return null;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const summarizeToolArgs = (args: Record<string, unknown>): string => {
|
|
9
|
+
const path = extractPath(args);
|
|
10
|
+
if (path) return `path=${path}`;
|
|
11
|
+
if (typeof args.command === "string") return `command=${args.command}`;
|
|
12
|
+
if (typeof args.query === "string") return `query=${args.query}`;
|
|
13
|
+
return Object.keys(args).join(", ");
|
|
14
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { NormalizedBlock } from "../types";
|
|
2
|
+
|
|
3
|
+
interface CommitInfo {
|
|
4
|
+
hash?: string;
|
|
5
|
+
message: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const COMMIT_MSG_RE = /git\s+commit[^\n]*?-m\s+(?:"((?:[^"\\]|\\.)*)"|'((?:[^'\\]|\\.)*)'|\$?'((?:[^'\\]|\\.)*)')/;
|
|
9
|
+
// Match short hash from git output: "[branch hash]" or "main hash" or 7-12 hex
|
|
10
|
+
const HASH_RE = /\b([0-9a-f]{7,12})\b/;
|
|
11
|
+
|
|
12
|
+
const firstLineOf = (text: string): string => {
|
|
13
|
+
const line = text.split(/\\n|\n/)[0] ?? "";
|
|
14
|
+
return line.trim();
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const cleanMessage = (msg: string): string =>
|
|
18
|
+
msg.replace(/\\"/g, '"').replace(/\\'/g, "'").trim();
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Extract git commits from bash tool calls (`git commit -m "..."`) and pair
|
|
22
|
+
* with hash from the immediately following tool_result.
|
|
23
|
+
*/
|
|
24
|
+
export const extractCommits = (blocks: NormalizedBlock[]): CommitInfo[] => {
|
|
25
|
+
const commits: CommitInfo[] = [];
|
|
26
|
+
|
|
27
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
28
|
+
const b = blocks[i];
|
|
29
|
+
if (b.kind !== "tool_call" || b.name !== "bash") continue;
|
|
30
|
+
const cmd = typeof b.args.command === "string" ? b.args.command : "";
|
|
31
|
+
if (!/\bgit\s+commit\b/.test(cmd)) continue;
|
|
32
|
+
const m = cmd.match(COMMIT_MSG_RE);
|
|
33
|
+
if (!m) continue;
|
|
34
|
+
const message = firstLineOf(cleanMessage(m[1] ?? m[2] ?? m[3] ?? ""));
|
|
35
|
+
if (!message) continue;
|
|
36
|
+
|
|
37
|
+
let hash: string | undefined;
|
|
38
|
+
// Look at next tool_result for hash
|
|
39
|
+
for (let j = i + 1; j < Math.min(blocks.length, i + 3); j++) {
|
|
40
|
+
const r = blocks[j];
|
|
41
|
+
if (r.kind !== "tool_result") continue;
|
|
42
|
+
// Common git commit output: `[branch <hash>] message` or `<branch> <hash>..<hash>`
|
|
43
|
+
const bracket = r.text.match(/\[\S+\s+([0-9a-f]{7,12})\]/);
|
|
44
|
+
if (bracket) { hash = bracket[1]; break; }
|
|
45
|
+
const range = r.text.match(/\b([0-9a-f]{7,12})\.\.([0-9a-f]{7,12})\b/);
|
|
46
|
+
if (range) { hash = range[2]; break; }
|
|
47
|
+
const plain = r.text.match(HASH_RE);
|
|
48
|
+
if (plain) { hash = plain[1]; break; }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Dedup by message+hash
|
|
52
|
+
const key = `${hash ?? ""}::${message}`;
|
|
53
|
+
if (!commits.some((c) => `${c.hash ?? ""}::${c.message}` === key)) {
|
|
54
|
+
commits.push({ hash, message });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return commits;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const formatCommits = (commits: CommitInfo[], limit = 8): string[] => {
|
|
62
|
+
const lines: string[] = [];
|
|
63
|
+
const items = commits.slice(-limit); // keep most recent
|
|
64
|
+
for (const c of items) {
|
|
65
|
+
const prefix = c.hash ? `${c.hash}: ` : "";
|
|
66
|
+
lines.push(`${prefix}${c.message}`);
|
|
67
|
+
}
|
|
68
|
+
return lines;
|
|
69
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { FileOps, NormalizedBlock } from "../types";
|
|
2
|
+
import { extractPath } from "../core/tool-args";
|
|
3
|
+
|
|
4
|
+
interface FileActivity {
|
|
5
|
+
read: Set<string>;
|
|
6
|
+
modified: Set<string>;
|
|
7
|
+
created: Set<string>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const FILE_READ_TOOLS = new Set([
|
|
11
|
+
"Read", "read_file", "View",
|
|
12
|
+
]);
|
|
13
|
+
|
|
14
|
+
const FILE_WRITE_TOOLS = new Set([
|
|
15
|
+
"Edit", "Write", "edit", "write", "edit_file", "write_file",
|
|
16
|
+
"MultiEdit",
|
|
17
|
+
]);
|
|
18
|
+
|
|
19
|
+
const FILE_CREATE_TOOLS = new Set([
|
|
20
|
+
"Write", "write", "write_file",
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Find the longest common directory prefix among absolute paths.
|
|
25
|
+
* Returns "" if fewer than 2 absolute paths or no meaningful common prefix.
|
|
26
|
+
*/
|
|
27
|
+
const longestCommonDirPrefix = (paths: string[]): string => {
|
|
28
|
+
const abs = paths.filter((p) => p.startsWith("/"));
|
|
29
|
+
if (abs.length < 2) return "";
|
|
30
|
+
const split = abs.map((p) => p.split("/"));
|
|
31
|
+
const min = Math.min(...split.map((s) => s.length));
|
|
32
|
+
let i = 0;
|
|
33
|
+
while (i < min - 1) {
|
|
34
|
+
const seg = split[0][i];
|
|
35
|
+
if (!split.every((s) => s[i] === seg)) break;
|
|
36
|
+
i++;
|
|
37
|
+
}
|
|
38
|
+
if (i < 2) return ""; // require at least /a/b common
|
|
39
|
+
return split[0].slice(0, i).join("/") + "/";
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const trimPaths = (set: Set<string>, prefix: string): Set<string> => {
|
|
43
|
+
if (!prefix) return set;
|
|
44
|
+
const out = new Set<string>();
|
|
45
|
+
for (const p of set) {
|
|
46
|
+
out.add(p.startsWith(prefix) ? p.slice(prefix.length) : p);
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const extractFiles = (
|
|
52
|
+
blocks: NormalizedBlock[],
|
|
53
|
+
fileOps?: FileOps,
|
|
54
|
+
): FileActivity => {
|
|
55
|
+
const act: FileActivity = {
|
|
56
|
+
read: new Set(fileOps?.readFiles ?? []),
|
|
57
|
+
modified: new Set(fileOps?.modifiedFiles ?? []),
|
|
58
|
+
created: new Set(fileOps?.createdFiles ?? []),
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
for (const b of blocks) {
|
|
62
|
+
if (b.kind !== "tool_call") continue;
|
|
63
|
+
const p = extractPath(b.args);
|
|
64
|
+
if (!p) continue;
|
|
65
|
+
|
|
66
|
+
if (FILE_READ_TOOLS.has(b.name)) act.read.add(p);
|
|
67
|
+
if (FILE_WRITE_TOOLS.has(b.name)) act.modified.add(p);
|
|
68
|
+
if (FILE_CREATE_TOOLS.has(b.name)) act.created.add(p);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const all = [...act.read, ...act.modified, ...act.created];
|
|
72
|
+
const prefix = longestCommonDirPrefix(all);
|
|
73
|
+
if (prefix) {
|
|
74
|
+
act.read = trimPaths(act.read, prefix);
|
|
75
|
+
act.modified = trimPaths(act.modified, prefix);
|
|
76
|
+
act.created = trimPaths(act.created, prefix);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return act;
|
|
80
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { NormalizedBlock } from "../types";
|
|
2
|
+
import { nonEmptyLines, clip } from "../core/content";
|
|
3
|
+
import { collapseSkillLines } from "../core/skill-collapse";
|
|
4
|
+
|
|
5
|
+
const SCOPE_CHANGE_RE =
|
|
6
|
+
/\b(instead|actually|change of plan|forget that|new task|switch to|now I want|pivot|let'?s do|stop .* and)\b/i;
|
|
7
|
+
|
|
8
|
+
const TASK_RE =
|
|
9
|
+
/\b(fix|implement|add|create|build|refactor|debug|investigate|update|remove|delete|migrate|deploy|test|write|set up)\b/i;
|
|
10
|
+
|
|
11
|
+
const NOISE_SHORT_RE = /^(ok|yes|no|sure|yeah|yep|go|hi|hey|thx|thanks|ok\b.*|y|n|k)\s*[.!?]*$/i;
|
|
12
|
+
|
|
13
|
+
// Reject lines that are clearly not user goals (pasted output, code, paths, tool dumps)
|
|
14
|
+
// or meta-prompt boilerplate (command templates like `/issues` that start with "For each issue:"
|
|
15
|
+
// followed by numbered "Read the issue in full..." steps).
|
|
16
|
+
const NON_GOAL_RE =
|
|
17
|
+
/^\s*[\[│├└─╭╰]|```|^\s*(=[A-Z]+\(|function |const |let |var |import |export |class )|^(https?:|file:|\/[A-Za-z])|\\n|^\s*For each\b|\bin full\b[^\n]*\b(comments|issue|issues|PRs?|linked)\b/;
|
|
18
|
+
|
|
19
|
+
// Signals that the rest of the user message is a command template (e.g. /issues),
|
|
20
|
+
// in which case we should stop collecting goals at the signal line.
|
|
21
|
+
const TEMPLATE_SIGNAL_RE =
|
|
22
|
+
/^\s*(For each\b|Do NOT implement\b|Analyze and propose\b|If Task\/context\b|Output:\s*$)/i;
|
|
23
|
+
|
|
24
|
+
const truncateAtTemplate = (lines: string[]): string[] => {
|
|
25
|
+
const idx = lines.findIndex((l) => TEMPLATE_SIGNAL_RE.test(l));
|
|
26
|
+
return idx >= 0 ? lines.slice(0, idx) : lines;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const stripLeadingBullet = (line: string): string =>
|
|
30
|
+
line.replace(/^\s*(?:[-*+]|\d+\.)\s+/, "").trim();
|
|
31
|
+
|
|
32
|
+
const MAX_GOAL_CHARS = 200;
|
|
33
|
+
|
|
34
|
+
const isSubstantiveGoal = (text: string): boolean => {
|
|
35
|
+
const t = text.trim();
|
|
36
|
+
if (t.length <= 5) return false;
|
|
37
|
+
if (t.length > MAX_GOAL_CHARS) return false;
|
|
38
|
+
if (NOISE_SHORT_RE.test(t)) return false;
|
|
39
|
+
if (NON_GOAL_RE.test(t)) return false;
|
|
40
|
+
return true;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// Test scope-change / task intent only on the leading portion of a user block
|
|
44
|
+
// so that pasted outputs below the actual instruction do not trigger matches.
|
|
45
|
+
const LEADING_CHARS = 200;
|
|
46
|
+
|
|
47
|
+
export const extractGoals = (blocks: NormalizedBlock[]): string[] => {
|
|
48
|
+
const goals: string[] = [];
|
|
49
|
+
let latestScopeChange: string[] | null = null;
|
|
50
|
+
|
|
51
|
+
for (const b of blocks) {
|
|
52
|
+
if (b.kind !== "user") continue;
|
|
53
|
+
const rawLines = nonEmptyLines(b.text);
|
|
54
|
+
const truncated = truncateAtTemplate(rawLines);
|
|
55
|
+
const lines = collapseSkillLines(truncated.filter(isSubstantiveGoal))
|
|
56
|
+
.map(stripLeadingBullet)
|
|
57
|
+
.filter((l) => l.length > 5);
|
|
58
|
+
if (lines.length === 0) continue;
|
|
59
|
+
|
|
60
|
+
if (goals.length === 0) {
|
|
61
|
+
goals.push(...lines.slice(0, 6));
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const leading = b.text.slice(0, LEADING_CHARS);
|
|
66
|
+
if (SCOPE_CHANGE_RE.test(leading)) {
|
|
67
|
+
latestScopeChange = lines.slice(0, 3).map((l) => clip(l, MAX_GOAL_CHARS));
|
|
68
|
+
} else if (TASK_RE.test(leading) && lines[0].length > 15) {
|
|
69
|
+
latestScopeChange = lines.slice(0, 2).map((l) => clip(l, MAX_GOAL_CHARS));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Only emit the [Scope change] marker when we actually captured bullets.
|
|
74
|
+
if (latestScopeChange && latestScopeChange.length > 0) {
|
|
75
|
+
goals.push("[Scope change]", ...latestScopeChange);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return goals.slice(0, 8);
|
|
79
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { NormalizedBlock } from "../types";
|
|
2
|
+
import { clip, nonEmptyLines } from "../core/content";
|
|
3
|
+
|
|
4
|
+
// Tightened patterns: require a clear preference construction, not bare keywords.
|
|
5
|
+
const PREF_PATTERNS = [
|
|
6
|
+
/\bprefer(?:s|red|ring)?\s+\w/i,
|
|
7
|
+
/\bdon'?t want\b/i,
|
|
8
|
+
/\balways (?:use|do|run|prefer|keep|make|format|write|add|set|put|prefix|start|include|append)\b/i,
|
|
9
|
+
/\bnever (?:use|do|run|push|commit|write|ignore|add|set|put|remove|delete|include|deploy)\b/i,
|
|
10
|
+
/\bplease (?:use|avoid|keep|make|don'?t|do not|format|write)\b/i,
|
|
11
|
+
/\b(?:style|format|language|naming)\s*[:=]\s*\S/i,
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
export const extractPreferences = (blocks: NormalizedBlock[]): string[] => {
|
|
15
|
+
const prefs: string[] = [];
|
|
16
|
+
const seen = new Set<string>();
|
|
17
|
+
|
|
18
|
+
for (const b of blocks) {
|
|
19
|
+
if (b.kind !== "user") continue;
|
|
20
|
+
|
|
21
|
+
let perBlock = 0;
|
|
22
|
+
for (const line of nonEmptyLines(b.text)) {
|
|
23
|
+
const trimmed = line.trim();
|
|
24
|
+
if (!trimmed || trimmed.length < 5) continue;
|
|
25
|
+
if (trimmed.length > 200) continue;
|
|
26
|
+
// Reject questions.
|
|
27
|
+
if (trimmed.endsWith("?") || trimmed.includes("?...")) continue;
|
|
28
|
+
if (!PREF_PATTERNS.some((p) => p.test(trimmed))) continue;
|
|
29
|
+
|
|
30
|
+
const clipped = clip(trimmed, 200);
|
|
31
|
+
const key = clipped.toLowerCase();
|
|
32
|
+
if (seen.has(key)) continue;
|
|
33
|
+
seen.add(key);
|
|
34
|
+
prefs.push(clipped);
|
|
35
|
+
|
|
36
|
+
// Cap per user block to avoid pasting long rule lists as many prefs.
|
|
37
|
+
if (++perBlock >= 1) break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return prefs.slice(0, 10);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Remove preferences that duplicate goals (case-insensitive, trimmed).
|
|
46
|
+
* Called by `buildSections` so that the two sections do not overlap.
|
|
47
|
+
*/
|
|
48
|
+
export const dedupPreferencesAgainstGoals = (
|
|
49
|
+
prefs: string[],
|
|
50
|
+
goals: string[],
|
|
51
|
+
): string[] => {
|
|
52
|
+
const norm = (s: string) => s.trim().toLowerCase();
|
|
53
|
+
const goalSet = new Set(goals.map(norm));
|
|
54
|
+
return prefs.filter((p) => !goalSet.has(norm(p)));
|
|
55
|
+
};
|