diff --git a/todo/queued/make.md b/todo/doing/make.md similarity index 50% rename from todo/queued/make.md rename to todo/doing/make.md index e156b65..3711f2c 100644 --- a/todo/queued/make.md +++ b/todo/doing/make.md @@ -70,4 +70,46 @@ grokkit agent "Benchmark changes before commit" | Verify | **make** ← new | | Repo/log | tea/cnotes | -Instant feedback elevates agent reliability. \ No newline at end of file +Instant feedback elevates agent reliability.## Work Plan + +1. **Setup structure**: Create `internal/tools/make.go` and `internal/tools/make_test.go`. Add config flags in `internal/config/config.go` for `tools.make.enabled` (bool, default false) and `tools.make.timeout` (int, default 300). + +2. **Implement whitelist**: Define `validTargets = []string{"test", "lint", "build", "test-cover", "install"}`. Add `isValidTarget(target string) bool` func. + +3. **Implement `RunTarget`**: + - Check `tools.make.enabled`, Makefile exists (`os.Stat("Makefile")`), validate target. + - Use `exec.CommandContext` with timeout: `cd $PROJECT_DIR && make TARGET`. + - Capture stdout/stderr, return `{output: string, success: bool, exitCode: int}` as JSON. + - Error wrapping: `MakeError{target, output, exitCode}`. + +4. **Add `DryRun` tool**: Simulate `make -n TARGET` (no-execute mode), same safety checks. + +5. **Implement parsing helpers**: + - `ParseTestResult(output string) (pass bool, failures int)`: grep "PASS", "FAIL". + - `ParseCoverage(output string) (float64, error)`: regex for "%" coverage. + - `ParseErrors(output string) []string`: extract compiler/lint errors. + +6. **Register tools**: In `internal/agent/tools.go`, add `makeRun` and `makeDryRun` tool schemas calling `RunTarget`/`DryRun`. + +7. **Agent loop integration**: Update `internal/agent/run.go` post-edit: auto-call `make test` if Makefile exists, parse results, feed to next prompt ("Tests failed: ..."). + +8. **Safety hardening**: + - Set `exec.Dir = projectDir`, `Env` without `PATH` mods. + - Timeout enforcement, kill on ctx cancel. + - Log full output to `cnotes`. + +9. **Tests** (table-driven in `make_test.go`): + - Mock `exec.Command` returns (success/fail outputs). + - Invalid target → error. + - Timeout simulation. + - Parsing: PASS/FAIL, coverage "92.3%", lint errors. + - Run `go test ./internal/tools -v`. + +10. **Docs/Config**: Update README with tool examples. Add `[tools.make]` sample config. + +11. **Commit**: `git commit -m "feat: grokkit agent make integration + + - Add make tool wrappers (run_target, dry_run) + - Safety: whitelist, timeout, parsing for tests/cover + - Agent auto-verification loop + Closes #"` \ No newline at end of file