all-hands-cli 0.1.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/.allhands/README.md +75 -0
- package/.allhands/agents/compounder.yaml +15 -0
- package/.allhands/agents/coordinator.yaml +17 -0
- package/.allhands/agents/documentor.yaml +15 -0
- package/.allhands/agents/e2e-test-planner.yaml +17 -0
- package/.allhands/agents/emergent.yaml +22 -0
- package/.allhands/agents/executor.yaml +14 -0
- package/.allhands/agents/ideation.yaml +11 -0
- package/.allhands/agents/initiative-steering.yaml +19 -0
- package/.allhands/agents/judge.yaml +13 -0
- package/.allhands/agents/planner.yaml +19 -0
- package/.allhands/agents/pr-reviewer.yaml +15 -0
- package/.allhands/docs.json +5 -0
- package/.allhands/docs.local.json +26 -0
- package/.allhands/flows/COMPOUNDING.md +203 -0
- package/.allhands/flows/COORDINATION.md +89 -0
- package/.allhands/flows/CORE.md +87 -0
- package/.allhands/flows/DOCUMENTATION.md +218 -0
- package/.allhands/flows/E2E_TEST_PLAN_BUILDING.md +140 -0
- package/.allhands/flows/EMERGENT_PLANNING.md +57 -0
- package/.allhands/flows/IDEATION_SCOPING.md +154 -0
- package/.allhands/flows/INITIATIVE_STEERING.md +110 -0
- package/.allhands/flows/JUDGE_REVIEWING.md +79 -0
- package/.allhands/flows/PROMPT_TASK_EXECUTION.md +68 -0
- package/.allhands/flows/PR_REVIEWING.md +43 -0
- package/.allhands/flows/SPEC_PLANNING.md +216 -0
- package/.allhands/flows/harness/WRITING_HARNESS_FLOWS.md +27 -0
- package/.allhands/flows/harness/WRITING_HARNESS_KNOWLEDGE.md +27 -0
- package/.allhands/flows/harness/WRITING_HARNESS_ORCHESTRATION.md +27 -0
- package/.allhands/flows/harness/WRITING_HARNESS_SKILLS.md +27 -0
- package/.allhands/flows/harness/WRITING_HARNESS_TOOLS.md +27 -0
- package/.allhands/flows/harness/WRITING_HARNESS_VALIDATION_TOOLING.md +27 -0
- package/.allhands/flows/shared/CODEBASE_UNDERSTANDING.md +72 -0
- package/.allhands/flows/shared/CREATE_HARNESS_SPEC.md +48 -0
- package/.allhands/flows/shared/CREATE_SPEC.md +41 -0
- package/.allhands/flows/shared/CREATE_VALIDATION_TOOLING_SPEC.md +70 -0
- package/.allhands/flows/shared/DOCUMENTATION_DISCOVERY.md +123 -0
- package/.allhands/flows/shared/DOCUMENTATION_WRITER.md +101 -0
- package/.allhands/flows/shared/EMERGENT_REFINEMENT_ANALYSIS.md +76 -0
- package/.allhands/flows/shared/EXTERNAL_TECH_GUIDANCE.md +97 -0
- package/.allhands/flows/shared/IDEATION_CODEBASE_GROUNDING.md +49 -0
- package/.allhands/flows/shared/PLAN_DEEPENING.md +152 -0
- package/.allhands/flows/shared/PROMPT_TASKS_CURATION.md +113 -0
- package/.allhands/flows/shared/PROMPT_VALIDATION_REVIEW.MD +99 -0
- package/.allhands/flows/shared/QUICK_PREMORTEM.md +70 -0
- package/.allhands/flows/shared/RESEARCH_GUIDANCE.md +38 -0
- package/.allhands/flows/shared/REVIEW_OPTIONS_BREAKDOWN.md +68 -0
- package/.allhands/flows/shared/SKILL_EXTRACTION.md +84 -0
- package/.allhands/flows/shared/SPEC_FLOW_ANALYSIS.md +119 -0
- package/.allhands/flows/shared/TDD_WORKFLOW.md +109 -0
- package/.allhands/flows/shared/UTILIZE_VALIDATION_TOOLING.md +84 -0
- package/.allhands/flows/shared/WRITING_HARNESS_FLOWS.md +11 -0
- package/.allhands/flows/shared/WRITING_HARNESS_MCP_TOOLS.md +84 -0
- package/.allhands/flows/shared/jury/ARCHITECTURE_REVIEW.md +91 -0
- package/.allhands/flows/shared/jury/BEST_PRACTICES_REVIEW.md +80 -0
- package/.allhands/flows/shared/jury/CLAIM_VERIFICATION_REVIEW.md +101 -0
- package/.allhands/flows/shared/jury/EXPECTATIONS_FIT_REVIEW.md +78 -0
- package/.allhands/flows/shared/jury/MAINTAINABILITY_REVIEW.md +110 -0
- package/.allhands/flows/shared/jury/PROMPTS_EXPECTATIONS_FIT.md +74 -0
- package/.allhands/flows/shared/jury/PROMPTS_FLOW_ANALYSIS.md +92 -0
- package/.allhands/flows/shared/jury/PROMPTS_YAGNI.md +78 -0
- package/.allhands/flows/shared/jury/PROMPT_PREMORTEM.md +125 -0
- package/.allhands/flows/shared/jury/SECURITY_REVIEW.md +86 -0
- package/.allhands/flows/shared/jury/YAGNI_REVIEW.md +82 -0
- package/.allhands/flows/wip/DEBUG_INVESTIGATION.md +162 -0
- package/.allhands/flows/wip/MEMORY_RECALL.md +62 -0
- package/.allhands/harness/ah +131 -0
- package/.allhands/harness/package-lock.json +5292 -0
- package/.allhands/harness/package.json +52 -0
- package/.allhands/harness/src/__tests__/e2e/commands.test.ts +307 -0
- package/.allhands/harness/src/__tests__/e2e/event-loop.test.ts +539 -0
- package/.allhands/harness/src/__tests__/e2e/hooks.test.ts +427 -0
- package/.allhands/harness/src/__tests__/e2e/new-initiative-routing.test.ts +137 -0
- package/.allhands/harness/src/__tests__/e2e/run-e2e.ts +109 -0
- package/.allhands/harness/src/__tests__/e2e/specs-type.test.ts +210 -0
- package/.allhands/harness/src/__tests__/e2e/validation-hooks.test.ts +669 -0
- package/.allhands/harness/src/__tests__/e2e/validation-path-consistency.test.ts +354 -0
- package/.allhands/harness/src/__tests__/e2e/validation.test.ts +528 -0
- package/.allhands/harness/src/__tests__/harness/assertions.ts +318 -0
- package/.allhands/harness/src/__tests__/harness/cli-runner.ts +359 -0
- package/.allhands/harness/src/__tests__/harness/fixture.ts +384 -0
- package/.allhands/harness/src/__tests__/harness/hook-runner.ts +411 -0
- package/.allhands/harness/src/__tests__/harness/index.ts +122 -0
- package/.allhands/harness/src/cli.ts +36 -0
- package/.allhands/harness/src/commands/complexity.ts +177 -0
- package/.allhands/harness/src/commands/context7.ts +202 -0
- package/.allhands/harness/src/commands/docs.ts +557 -0
- package/.allhands/harness/src/commands/hooks.ts +24 -0
- package/.allhands/harness/src/commands/index.ts +51 -0
- package/.allhands/harness/src/commands/knowledge.ts +382 -0
- package/.allhands/harness/src/commands/memories.ts +302 -0
- package/.allhands/harness/src/commands/notify.ts +61 -0
- package/.allhands/harness/src/commands/oracle.ts +158 -0
- package/.allhands/harness/src/commands/perplexity.ts +220 -0
- package/.allhands/harness/src/commands/planning.ts +245 -0
- package/.allhands/harness/src/commands/schema.ts +73 -0
- package/.allhands/harness/src/commands/skills.ts +128 -0
- package/.allhands/harness/src/commands/solutions.ts +353 -0
- package/.allhands/harness/src/commands/spawn.ts +158 -0
- package/.allhands/harness/src/commands/specs.ts +532 -0
- package/.allhands/harness/src/commands/tavily.ts +226 -0
- package/.allhands/harness/src/commands/tools.ts +579 -0
- package/.allhands/harness/src/commands/trace.ts +327 -0
- package/.allhands/harness/src/commands/tui.ts +960 -0
- package/.allhands/harness/src/commands/validate.ts +143 -0
- package/.allhands/harness/src/commands/validation-tools.ts +108 -0
- package/.allhands/harness/src/hooks/context.ts +1442 -0
- package/.allhands/harness/src/hooks/enforcement.ts +170 -0
- package/.allhands/harness/src/hooks/index.ts +54 -0
- package/.allhands/harness/src/hooks/lifecycle.ts +229 -0
- package/.allhands/harness/src/hooks/notification.ts +104 -0
- package/.allhands/harness/src/hooks/observability.ts +551 -0
- package/.allhands/harness/src/hooks/session.ts +88 -0
- package/.allhands/harness/src/hooks/shared.ts +815 -0
- package/.allhands/harness/src/hooks/transcript-parser.ts +208 -0
- package/.allhands/harness/src/hooks/validation.ts +617 -0
- package/.allhands/harness/src/lib/__tests__/ctags.test.ts +244 -0
- package/.allhands/harness/src/lib/__tests__/docs-validation.test.ts +344 -0
- package/.allhands/harness/src/lib/__tests__/mcp-runtime.test.ts +190 -0
- package/.allhands/harness/src/lib/__tests__/schema.test.ts +861 -0
- package/.allhands/harness/src/lib/base-command.ts +198 -0
- package/.allhands/harness/src/lib/cli-daemon.ts +343 -0
- package/.allhands/harness/src/lib/compaction.ts +313 -0
- package/.allhands/harness/src/lib/ctags.ts +497 -0
- package/.allhands/harness/src/lib/docs-validation.ts +907 -0
- package/.allhands/harness/src/lib/event-loop.ts +662 -0
- package/.allhands/harness/src/lib/flows.ts +155 -0
- package/.allhands/harness/src/lib/git.ts +276 -0
- package/.allhands/harness/src/lib/knowledge-worker.ts +72 -0
- package/.allhands/harness/src/lib/knowledge.ts +810 -0
- package/.allhands/harness/src/lib/llm.ts +255 -0
- package/.allhands/harness/src/lib/mcp-client.ts +432 -0
- package/.allhands/harness/src/lib/mcp-daemon.ts +486 -0
- package/.allhands/harness/src/lib/mcp-runtime.ts +418 -0
- package/.allhands/harness/src/lib/notification.ts +115 -0
- package/.allhands/harness/src/lib/opencode/index.ts +70 -0
- package/.allhands/harness/src/lib/opencode/profiles.ts +300 -0
- package/.allhands/harness/src/lib/opencode/prompts/codesearch.md +98 -0
- package/.allhands/harness/src/lib/opencode/prompts/knowledge-aggregator.md +67 -0
- package/.allhands/harness/src/lib/opencode/runner.ts +281 -0
- package/.allhands/harness/src/lib/oracle.ts +926 -0
- package/.allhands/harness/src/lib/planning-utils.ts +150 -0
- package/.allhands/harness/src/lib/planning.ts +605 -0
- package/.allhands/harness/src/lib/pr-review.ts +225 -0
- package/.allhands/harness/src/lib/prompts.ts +522 -0
- package/.allhands/harness/src/lib/schema.ts +418 -0
- package/.allhands/harness/src/lib/schemas/agent-profile.ts +141 -0
- package/.allhands/harness/src/lib/schemas/template-vars.ts +138 -0
- package/.allhands/harness/src/lib/session.ts +164 -0
- package/.allhands/harness/src/lib/specs.ts +348 -0
- package/.allhands/harness/src/lib/tldr.ts +829 -0
- package/.allhands/harness/src/lib/tmux.ts +1051 -0
- package/.allhands/harness/src/lib/trace-store.ts +714 -0
- package/.allhands/harness/src/mcp/__tests__/index.test.ts +46 -0
- package/.allhands/harness/src/mcp/_template.ts +47 -0
- package/.allhands/harness/src/mcp/filesystem.ts +33 -0
- package/.allhands/harness/src/mcp/index.ts +69 -0
- package/.allhands/harness/src/mcp/playwright.ts +34 -0
- package/.allhands/harness/src/mcp/xcodebuild.ts +29 -0
- package/.allhands/harness/src/schemas/docs.schema.json +44 -0
- package/.allhands/harness/src/schemas/settings.schema.json +214 -0
- package/.allhands/harness/src/tui/actions.ts +227 -0
- package/.allhands/harness/src/tui/file-viewer-modal.ts +270 -0
- package/.allhands/harness/src/tui/index.ts +1574 -0
- package/.allhands/harness/src/tui/modal.ts +232 -0
- package/.allhands/harness/src/tui/prompts-pane.ts +186 -0
- package/.allhands/harness/src/tui/status-pane.ts +434 -0
- package/.allhands/harness/tsconfig.json +22 -0
- package/.allhands/harness/vitest.config.ts +13 -0
- package/.allhands/pillars.md +33 -0
- package/.allhands/principles.md +88 -0
- package/.allhands/schemas/alignment.yaml +51 -0
- package/.allhands/schemas/documentation.yaml +10 -0
- package/.allhands/schemas/prompt.yaml +92 -0
- package/.allhands/schemas/skill.yaml +34 -0
- package/.allhands/schemas/solution.yaml +131 -0
- package/.allhands/schemas/spec.yaml +67 -0
- package/.allhands/schemas/validation-suite.yaml +49 -0
- package/.allhands/schemas/workflow.yaml +51 -0
- package/.allhands/settings.json +57 -0
- package/.allhands/skills/claude-code-patterns/SKILL.md +60 -0
- package/.allhands/skills/claude-code-patterns/docs/context-hygiene.md +19 -0
- package/.allhands/skills/harness-maintenance/SKILL.md +449 -0
- package/.allhands/skills/harness-maintenance/references/core-architecture.md +187 -0
- package/.allhands/skills/harness-maintenance/references/harness-skills.md +87 -0
- package/.allhands/skills/harness-maintenance/references/knowledge-compounding.md +78 -0
- package/.allhands/skills/harness-maintenance/references/tools-commands-mcp-hooks.md +115 -0
- package/.allhands/skills/harness-maintenance/references/validation-tooling.md +77 -0
- package/.allhands/skills/harness-maintenance/references/writing-flows.md +84 -0
- package/.allhands/validation/browser-automation.md +109 -0
- package/.allhands/validation/xcode-automation.md +195 -0
- package/.allhands/workflows/documentation.md +86 -0
- package/.allhands/workflows/investigation.md +81 -0
- package/.allhands/workflows/milestone.md +91 -0
- package/.allhands/workflows/optimization.md +85 -0
- package/.allhands/workflows/refactor.md +99 -0
- package/.allhands/workflows/triage.md +81 -0
- package/.claude/README.md +1 -0
- package/.claude/agents/explorer.md +10 -0
- package/.claude/agents/researcher.md +11 -0
- package/.claude/agents/task-runner.md +8 -0
- package/.claude/settings.json +231 -0
- package/.env.ai.example +7 -0
- package/.github/workflows/npm-publish.yml +69 -0
- package/.internal.json +45 -0
- package/.tldr/config.json +11 -0
- package/.tldrignore +90 -0
- package/CLAUDE.md +6 -0
- package/README.md +98 -0
- package/bin/sync-cli.js +7552 -0
- package/concerns.md +7 -0
- package/docs/README.md +41 -0
- package/docs/agents/README.md +24 -0
- package/docs/agents/agent-configuration-system.md +86 -0
- package/docs/agents/execution-agents.md +50 -0
- package/docs/agents/knowledge-agents.md +61 -0
- package/docs/agents/orchestration-agent.md +57 -0
- package/docs/agents/planning-agents.md +84 -0
- package/docs/agents/quality-review-agents.md +67 -0
- package/docs/agents/workflow-agent-orchestration.md +69 -0
- package/docs/flows/README.md +44 -0
- package/docs/flows/compounding.md +126 -0
- package/docs/flows/coordination.md +72 -0
- package/docs/flows/core-harness-integration.md +63 -0
- package/docs/flows/documentation-orchestration.md +98 -0
- package/docs/flows/e2e-test-plan-building.md +83 -0
- package/docs/flows/emergent-refinement.md +104 -0
- package/docs/flows/flow-authoring-and-mcp-tools.md +89 -0
- package/docs/flows/judge-reviewing.md +112 -0
- package/docs/flows/plan-deepening-and-research.md +107 -0
- package/docs/flows/plan-review-jury.md +114 -0
- package/docs/flows/pr-reviewing.md +54 -0
- package/docs/flows/prompt-task-execution.md +119 -0
- package/docs/flows/spec-planning.md +162 -0
- package/docs/flows/type-specific-scoping-flows.md +49 -0
- package/docs/flows/validation-and-skills-integration.md +145 -0
- package/docs/flows/wip/wip-flows.md +102 -0
- package/docs/harness/README.md +23 -0
- package/docs/harness/agent-profiles.md +84 -0
- package/docs/harness/cli/README.md +24 -0
- package/docs/harness/cli/cli-entry-and-command-discovery.md +91 -0
- package/docs/harness/cli/docs-command.md +87 -0
- package/docs/harness/cli/knowledge-command.md +91 -0
- package/docs/harness/cli/minor-cli-commands.md +65 -0
- package/docs/harness/cli/oracle-command.md +113 -0
- package/docs/harness/cli/planning-command.md +95 -0
- package/docs/harness/cli/schema-and-validation-commands.md +154 -0
- package/docs/harness/cli/search-commands.md +97 -0
- package/docs/harness/cli/spawn-command.md +136 -0
- package/docs/harness/cli/specs-command.md +102 -0
- package/docs/harness/cli/tools-command.md +122 -0
- package/docs/harness/cli/trace-command.md +122 -0
- package/docs/harness/cli-daemon.md +92 -0
- package/docs/harness/event-loop.md +184 -0
- package/docs/harness/hooks/README.md +15 -0
- package/docs/harness/hooks/context-hooks.md +96 -0
- package/docs/harness/hooks/lifecycle-and-observability-hooks.md +135 -0
- package/docs/harness/hooks/validation-hooks.md +97 -0
- package/docs/harness/test-harness.md +149 -0
- package/docs/harness/tui.md +176 -0
- package/docs/memories.md +20 -0
- package/docs/solutions/agentic-issues/premature-agent-deletion-tui-action-dependency-20260130.md +49 -0
- package/docs/solutions/agentic-issues/ref-anchor-scope-mismatch-skill-references-20260131.md +55 -0
- package/docs/solutions/agentic-issues/tautological-tests-routing-20260131.md +52 -0
- package/docs/solutions/integration_issue/blocktool-output-format-mismatch-hook-runner-20260130.md +52 -0
- package/docs/solutions/integration_issue/dual-validation-path-divergence-schema-20260130.md +66 -0
- package/docs/solutions/security-issues/unsanitized-domain-path-join-20260131.md +52 -0
- package/docs/solutions/test-failures/event-loop-mock-ordering-checkAgentWindows-20260130.md +63 -0
- package/docs/sync-cli/README.md +19 -0
- package/docs/sync-cli/cli-entrypoint-and-commands.md +39 -0
- package/docs/sync-cli/commands/README.md +11 -0
- package/docs/sync-cli/commands/pull-manifest-command.md +36 -0
- package/docs/sync-cli/commands/push-command.md +84 -0
- package/docs/sync-cli/commands/sync-command.md +71 -0
- package/docs/sync-cli/systems/README.md +14 -0
- package/docs/sync-cli/systems/git-and-github-integration.md +49 -0
- package/docs/sync-cli/systems/interactive-ui.md +43 -0
- package/docs/sync-cli/systems/manifest-and-distribution.md +51 -0
- package/docs/sync-cli/systems/path-resolution.md +42 -0
- package/package.json +46 -0
- package/scripts/install-shim.sh +40 -0
- package/scripts/pre-pack.sh +25 -0
- package/specs/harness-maintenance-skill.spec.md +138 -0
- package/specs/roadmap/git-spec-lifecycle-management.spec.md +113 -0
- package/specs/sync-init-flag.spec.md +117 -0
- package/specs/unified-workflow-orchestration.spec.md +250 -0
- package/specs/validation-tooling-practice.spec.md +98 -0
- package/specs/workflow-domain-configuration.spec.md +265 -0
- package/src/commands/pull-manifest.ts +31 -0
- package/src/commands/push.ts +344 -0
- package/src/commands/sync.ts +289 -0
- package/src/lib/constants.ts +10 -0
- package/src/lib/dotfiles.ts +36 -0
- package/src/lib/fs-utils.ts +18 -0
- package/src/lib/gh.ts +40 -0
- package/src/lib/git.ts +63 -0
- package/src/lib/gitignore.ts +167 -0
- package/src/lib/manifest.ts +121 -0
- package/src/lib/marker-sync.ts +39 -0
- package/src/lib/paths.ts +38 -0
- package/src/lib/target-lines.ts +66 -0
- package/src/lib/ui.ts +78 -0
- package/src/sync-cli.ts +120 -0
- package/target-lines.json +23 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compaction Handler
|
|
3
|
+
*
|
|
4
|
+
* Post-agent analysis and learning extraction.
|
|
5
|
+
* Analyzes conversation logs, git diff, and prompt state to determine:
|
|
6
|
+
* - Whether to keep or discard code changes
|
|
7
|
+
* - What learnings to preserve for the next attempt
|
|
8
|
+
* - How to update the prompt's progress section
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { readFileSync, existsSync } from 'fs';
|
|
12
|
+
import {
|
|
13
|
+
analyzeConversation,
|
|
14
|
+
recommendAction,
|
|
15
|
+
type ConversationAnalysis,
|
|
16
|
+
type ActionRecommendation,
|
|
17
|
+
} from './oracle.js';
|
|
18
|
+
import {
|
|
19
|
+
appendToProgressSection,
|
|
20
|
+
incrementAttempts,
|
|
21
|
+
parsePromptFile,
|
|
22
|
+
} from './prompts.js';
|
|
23
|
+
import { readAlignment, getCurrentBranch } from './planning.js';
|
|
24
|
+
import { gitExec } from './git.js';
|
|
25
|
+
|
|
26
|
+
export interface CompactionInput {
|
|
27
|
+
conversationLogs: string; // File path
|
|
28
|
+
promptFile: string; // File path
|
|
29
|
+
cwd?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface CompactionResult {
|
|
33
|
+
success: boolean;
|
|
34
|
+
analysis: ConversationAnalysis;
|
|
35
|
+
recommendation: ActionRecommendation;
|
|
36
|
+
gitDiff: string;
|
|
37
|
+
attemptNumber: number;
|
|
38
|
+
progressUpdate: string;
|
|
39
|
+
committed: boolean;
|
|
40
|
+
error?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get a summary of the current git diff
|
|
45
|
+
*
|
|
46
|
+
* Returns the --stat output for a quick overview of changes.
|
|
47
|
+
*/
|
|
48
|
+
export function getGitDiffSummary(cwd?: string): string {
|
|
49
|
+
const workingDir = cwd || process.cwd();
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
// Get both staged and unstaged changes
|
|
53
|
+
const stagedResult = gitExec(['diff', '--cached', '--stat'], workingDir);
|
|
54
|
+
const staged = stagedResult.stdout;
|
|
55
|
+
|
|
56
|
+
const unstagedResult = gitExec(['diff', '--stat'], workingDir);
|
|
57
|
+
const unstaged = unstagedResult.stdout;
|
|
58
|
+
|
|
59
|
+
const parts: string[] = [];
|
|
60
|
+
if (staged) {
|
|
61
|
+
parts.push('Staged:\n' + staged);
|
|
62
|
+
}
|
|
63
|
+
if (unstaged) {
|
|
64
|
+
parts.push('Unstaged:\n' + unstaged);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (parts.length === 0) {
|
|
68
|
+
return 'No changes detected';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return parts.join('\n\n');
|
|
72
|
+
} catch {
|
|
73
|
+
return 'Unable to get git diff';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Get the full git diff (not just stat)
|
|
79
|
+
*/
|
|
80
|
+
export function getGitDiffFull(cwd?: string, maxLines: number = 500): string {
|
|
81
|
+
const workingDir = cwd || process.cwd();
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
const diffResult = gitExec(['diff', 'HEAD'], workingDir);
|
|
85
|
+
const diff = diffResult.stdout;
|
|
86
|
+
|
|
87
|
+
// Truncate if too long
|
|
88
|
+
const lines = diff.split('\n');
|
|
89
|
+
if (lines.length > maxLines) {
|
|
90
|
+
return lines.slice(0, maxLines).join('\n') + '\n... (truncated)';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return diff;
|
|
94
|
+
} catch {
|
|
95
|
+
return '';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Run the compaction process
|
|
101
|
+
*
|
|
102
|
+
* 1. Read all input files
|
|
103
|
+
* 2. Get git diff
|
|
104
|
+
* 3. Analyze conversation with oracle
|
|
105
|
+
* 4. Get action recommendation
|
|
106
|
+
* 5. Update prompt progress section
|
|
107
|
+
* 6. Increment attempts
|
|
108
|
+
* 7. Execute recommendation (commit or discard)
|
|
109
|
+
*/
|
|
110
|
+
export async function runCompaction(input: CompactionInput): Promise<CompactionResult> {
|
|
111
|
+
const workingDir = input.cwd || process.cwd();
|
|
112
|
+
|
|
113
|
+
// Read input files
|
|
114
|
+
let conversationLogs: string;
|
|
115
|
+
let promptContent: string;
|
|
116
|
+
let alignmentContent: string;
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
if (!existsSync(input.conversationLogs)) {
|
|
120
|
+
throw new Error(`Conversation logs not found: ${input.conversationLogs}`);
|
|
121
|
+
}
|
|
122
|
+
conversationLogs = readFileSync(input.conversationLogs, 'utf-8');
|
|
123
|
+
|
|
124
|
+
if (!existsSync(input.promptFile)) {
|
|
125
|
+
throw new Error(`Prompt file not found: ${input.promptFile}`);
|
|
126
|
+
}
|
|
127
|
+
promptContent = readFileSync(input.promptFile, 'utf-8');
|
|
128
|
+
|
|
129
|
+
// Infer alignment doc from current branch
|
|
130
|
+
const branch = getCurrentBranch(workingDir);
|
|
131
|
+
alignmentContent = readAlignment(branch, workingDir) || '';
|
|
132
|
+
} catch (error) {
|
|
133
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
analysis: {
|
|
137
|
+
wasGettingClose: false,
|
|
138
|
+
progressPercentage: 0,
|
|
139
|
+
keyLearnings: [],
|
|
140
|
+
blockers: [errorMsg],
|
|
141
|
+
partialWork: [],
|
|
142
|
+
},
|
|
143
|
+
recommendation: {
|
|
144
|
+
action: 'continue',
|
|
145
|
+
reasoning: 'File read error - defaulting to continue',
|
|
146
|
+
preserveFiles: [],
|
|
147
|
+
discardFiles: [],
|
|
148
|
+
},
|
|
149
|
+
gitDiff: '',
|
|
150
|
+
attemptNumber: 0,
|
|
151
|
+
progressUpdate: '',
|
|
152
|
+
committed: false,
|
|
153
|
+
error: errorMsg,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Get git diff
|
|
158
|
+
const gitDiffSummary = getGitDiffSummary(workingDir);
|
|
159
|
+
const gitDiffFull = getGitDiffFull(workingDir);
|
|
160
|
+
|
|
161
|
+
// Analyze conversation
|
|
162
|
+
const analysis = await analyzeConversation(
|
|
163
|
+
conversationLogs,
|
|
164
|
+
promptContent,
|
|
165
|
+
alignmentContent,
|
|
166
|
+
gitDiffFull
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
// Get current attempt number and increment
|
|
170
|
+
const prompt = parsePromptFile(input.promptFile);
|
|
171
|
+
const currentAttempt = prompt?.frontmatter.attempts || 0;
|
|
172
|
+
const attemptNumber = incrementAttempts(input.promptFile);
|
|
173
|
+
|
|
174
|
+
// Get action recommendation
|
|
175
|
+
const recommendation = await recommendAction(analysis, attemptNumber, gitDiffFull);
|
|
176
|
+
|
|
177
|
+
// Build progress update
|
|
178
|
+
const progressUpdate = formatProgressUpdate(
|
|
179
|
+
attemptNumber,
|
|
180
|
+
analysis,
|
|
181
|
+
recommendation
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
// Append to prompt progress section
|
|
185
|
+
appendToProgressSection(input.promptFile, progressUpdate);
|
|
186
|
+
|
|
187
|
+
// Execute recommendation
|
|
188
|
+
let committed = false;
|
|
189
|
+
try {
|
|
190
|
+
committed = await executeRecommendation(
|
|
191
|
+
recommendation,
|
|
192
|
+
`compaction(prompt-${prompt?.frontmatter.number || 0}): ${recommendation.action} - ${recommendation.reasoning.substring(0, 50)}`,
|
|
193
|
+
workingDir
|
|
194
|
+
);
|
|
195
|
+
} catch {
|
|
196
|
+
// Execution failed but analysis succeeded
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return {
|
|
200
|
+
success: true,
|
|
201
|
+
analysis,
|
|
202
|
+
recommendation,
|
|
203
|
+
gitDiff: gitDiffSummary,
|
|
204
|
+
attemptNumber,
|
|
205
|
+
progressUpdate,
|
|
206
|
+
committed,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Format the progress update for the prompt file
|
|
212
|
+
*/
|
|
213
|
+
function formatProgressUpdate(
|
|
214
|
+
attemptNumber: number,
|
|
215
|
+
analysis: ConversationAnalysis,
|
|
216
|
+
recommendation: ActionRecommendation
|
|
217
|
+
): string {
|
|
218
|
+
const timestamp = new Date().toISOString();
|
|
219
|
+
const lines: string[] = [
|
|
220
|
+
`### Attempt ${attemptNumber} (${timestamp})`,
|
|
221
|
+
`**Result**: ${recommendation.action.charAt(0).toUpperCase() + recommendation.action.slice(1)} | **Progress**: ${analysis.progressPercentage}%`,
|
|
222
|
+
'',
|
|
223
|
+
];
|
|
224
|
+
|
|
225
|
+
if (analysis.keyLearnings.length > 0) {
|
|
226
|
+
lines.push('**Key Learnings**:');
|
|
227
|
+
for (const learning of analysis.keyLearnings) {
|
|
228
|
+
lines.push(`- ${learning}`);
|
|
229
|
+
}
|
|
230
|
+
lines.push('');
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (analysis.blockers.length > 0) {
|
|
234
|
+
lines.push(`**Blockers**: ${analysis.blockers.join('; ')}`);
|
|
235
|
+
lines.push('');
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (recommendation.preserveFiles.length > 0) {
|
|
239
|
+
const files = recommendation.preserveFiles.map((f) => `\`${f}\``).join(', ');
|
|
240
|
+
lines.push(`**Preserved**: ${files}`);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return lines.join('\n');
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Execute the recommendation (commit or discard changes)
|
|
248
|
+
*
|
|
249
|
+
* Returns true if a commit was made.
|
|
250
|
+
*/
|
|
251
|
+
export async function executeRecommendation(
|
|
252
|
+
recommendation: ActionRecommendation,
|
|
253
|
+
commitMessage: string,
|
|
254
|
+
cwd?: string
|
|
255
|
+
): Promise<boolean> {
|
|
256
|
+
const workingDir = cwd || process.cwd();
|
|
257
|
+
|
|
258
|
+
if (recommendation.action === 'continue') {
|
|
259
|
+
// Commit all changes
|
|
260
|
+
try {
|
|
261
|
+
// Stage all changes
|
|
262
|
+
gitExec(['add', '-A'], workingDir);
|
|
263
|
+
|
|
264
|
+
// Check if there are staged changes
|
|
265
|
+
const statusResult = gitExec(['status', '--porcelain'], workingDir);
|
|
266
|
+
|
|
267
|
+
if (statusResult.stdout) {
|
|
268
|
+
// Commit — spawnSync handles the message safely, no shell escaping needed
|
|
269
|
+
gitExec(['commit', '-m', commitMessage], workingDir);
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return false;
|
|
274
|
+
} catch {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
} else {
|
|
278
|
+
// Scratch - discard changes but preserve specified files
|
|
279
|
+
try {
|
|
280
|
+
if (recommendation.preserveFiles.length > 0) {
|
|
281
|
+
// Stash preserve files first
|
|
282
|
+
for (const file of recommendation.preserveFiles) {
|
|
283
|
+
try {
|
|
284
|
+
gitExec(['stash', 'push', '-m', `preserve-${file}`, '--', file], workingDir);
|
|
285
|
+
} catch {
|
|
286
|
+
// File might not have changes
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Discard all changes
|
|
292
|
+
gitExec(['checkout', '.'], workingDir);
|
|
293
|
+
|
|
294
|
+
// Clean untracked files (except .planning/)
|
|
295
|
+
gitExec(['clean', '-fd', '--exclude=.planning'], workingDir);
|
|
296
|
+
|
|
297
|
+
// Restore preserved files (reverse order — git stash is LIFO)
|
|
298
|
+
if (recommendation.preserveFiles.length > 0) {
|
|
299
|
+
for (let i = recommendation.preserveFiles.length - 1; i >= 0; i--) {
|
|
300
|
+
try {
|
|
301
|
+
gitExec(['stash', 'pop'], workingDir);
|
|
302
|
+
} catch {
|
|
303
|
+
// Stash might be empty
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return false;
|
|
309
|
+
} catch {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|