@towles/tool 0.0.108 → 0.0.110

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.
Files changed (190) hide show
  1. package/package.json +9 -4
  2. package/{plugins/tt-agentboard → packages/agentboard}/README.md +1 -1
  3. package/{plugins/tt-agentboard → packages/agentboard}/apps/server/package.json +2 -1
  4. package/{plugins/tt-agentboard → packages/agentboard}/apps/server/src/main.ts +6 -20
  5. package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/package.json +4 -0
  6. package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/components/DetailPanel.tsx +3 -2
  7. package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/components/StatusBar.tsx +35 -0
  8. package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/constants.ts +1 -0
  9. package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/index.tsx +204 -225
  10. package/packages/agentboard/apps/tui/src/session-status.test.ts +70 -0
  11. package/packages/agentboard/apps/tui/src/session-status.ts +19 -0
  12. package/{plugins/tt-agentboard → packages/agentboard}/package.json +2 -6
  13. package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/package.json +3 -0
  14. package/{plugins/tt-agentboard/packages/runtime/test → packages/agentboard/packages/runtime/src/agents}/tracker.test.ts +2 -2
  15. package/packages/agentboard/packages/runtime/src/agents/watchers/claude-code.test.ts +63 -0
  16. package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/agents/watchers/claude-code.ts +26 -2
  17. package/packages/agentboard/packages/runtime/src/config.test.ts +107 -0
  18. package/packages/agentboard/packages/runtime/src/config.ts +80 -0
  19. package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/index.ts +1 -1
  20. package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/plugins/loader.ts +1 -33
  21. package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/git-info.ts +3 -2
  22. package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/index.ts +23 -37
  23. package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/launcher.ts +6 -18
  24. package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/pane-scanner.ts +6 -0
  25. package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/shared.ts +2 -0
  26. package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/tsconfig.json +1 -1
  27. package/{plugins/tt-core → packages/core}/.claude-plugin/plugin.json +1 -1
  28. package/packages/shared/package.json +15 -0
  29. package/packages/shared/src/git/exec.ts +41 -0
  30. package/{src/utils → packages/shared/src}/git/gh-cli-wrapper.ts +13 -18
  31. package/packages/shared/src/index.ts +8 -0
  32. package/packages/shared/tsconfig.json +16 -0
  33. package/src/cli.ts +3 -2
  34. package/src/commands/agentboard.ts +42 -59
  35. package/src/{lib → commands}/auto-claude/claude-cli.ts +1 -1
  36. package/src/commands/auto-claude/config-init-helpers.ts +79 -0
  37. package/src/commands/auto-claude/config-init.test.ts +137 -0
  38. package/src/commands/auto-claude/config-init.ts +159 -0
  39. package/src/{lib → commands}/auto-claude/config.ts +4 -8
  40. package/src/{lib → commands}/auto-claude/e2e.test.ts +6 -6
  41. package/src/commands/auto-claude/explain.test.ts +58 -0
  42. package/src/commands/auto-claude/explain.ts +97 -0
  43. package/src/commands/auto-claude/index.ts +37 -14
  44. package/src/{lib → commands}/auto-claude/labels.ts +1 -1
  45. package/src/commands/auto-claude/list.ts +5 -4
  46. package/src/{lib → commands}/auto-claude/pipeline-execution.test.ts +1 -1
  47. package/src/{lib → commands}/auto-claude/pipeline.ts +1 -3
  48. package/src/commands/auto-claude/retry.test.ts +2 -2
  49. package/src/commands/auto-claude/retry.ts +5 -5
  50. package/src/commands/auto-claude/shell.ts +3 -0
  51. package/src/commands/auto-claude/status.test.ts +2 -2
  52. package/src/commands/auto-claude/status.ts +4 -4
  53. package/src/{lib → commands}/auto-claude/steps/create-pr.ts +1 -3
  54. package/src/{lib → commands}/auto-claude/steps/fetch-issues.ts +1 -1
  55. package/src/{lib → commands}/auto-claude/steps/implement.ts +1 -2
  56. package/src/{lib → commands}/auto-claude/utils-execution.test.ts +6 -6
  57. package/src/{lib → commands}/auto-claude/utils.ts +10 -4
  58. package/src/{lib/install → commands}/claude-settings.ts +1 -1
  59. package/src/commands/config/config.test.ts +129 -0
  60. package/src/commands/config/index.ts +11 -0
  61. package/src/commands/config/reset.ts +53 -0
  62. package/src/commands/config/schema.ts +19 -0
  63. package/src/commands/{config.ts → config/show.ts} +2 -2
  64. package/src/commands/config/validate.ts +51 -0
  65. package/src/commands/doctor/checks.ts +167 -0
  66. package/src/commands/doctor/format.test.ts +63 -0
  67. package/src/commands/doctor/format.ts +5 -0
  68. package/src/commands/doctor/history.test.ts +161 -0
  69. package/src/commands/doctor/history.ts +130 -0
  70. package/src/commands/doctor.ts +80 -151
  71. package/src/commands/gh/branch-clean.ts +4 -4
  72. package/src/commands/gh/branch.test.ts +4 -5
  73. package/src/commands/gh/branch.ts +10 -5
  74. package/src/commands/gh/pr.ts +6 -7
  75. package/src/{lib → commands}/graph/analyzer.test.ts +4 -4
  76. package/src/commands/graph/format.test.ts +130 -0
  77. package/src/commands/graph/format.ts +94 -0
  78. package/src/commands/graph/index.ts +69 -41
  79. package/src/{lib → commands}/graph/labels.ts +4 -4
  80. package/src/{lib → commands}/graph/server.ts +2 -2
  81. package/src/{lib → commands}/graph/types.ts +2 -0
  82. package/src/commands/graph.test.ts +1 -1
  83. package/src/commands/install.ts +6 -6
  84. package/src/commands/journal/daily-notes.ts +4 -7
  85. package/src/{lib → commands}/journal/fs.ts +1 -1
  86. package/src/commands/journal/index.ts +2 -0
  87. package/src/commands/journal/list.test.ts +174 -0
  88. package/src/commands/journal/list.ts +213 -0
  89. package/src/commands/journal/meeting.ts +4 -7
  90. package/src/commands/journal/note.ts +4 -7
  91. package/src/{lib → commands}/journal/paths.ts +1 -1
  92. package/src/commands/journal/search.test.ts +156 -0
  93. package/src/commands/journal/search.ts +256 -0
  94. package/src/{lib → commands}/journal/templates.ts +1 -1
  95. package/src/config/settings.ts +35 -26
  96. package/plugins/tt-agentboard/bun.lock +0 -444
  97. package/plugins/tt-agentboard/packages/runtime/src/config.ts +0 -70
  98. package/plugins/tt-agentboard/packages/runtime/test/config.test.ts +0 -83
  99. package/plugins/tt-auto-claude/.claude-plugin/plugin.json +0 -8
  100. package/plugins/tt-auto-claude/commands/create-issue.md +0 -20
  101. package/plugins/tt-auto-claude/commands/list.md +0 -21
  102. package/plugins/tt-auto-claude/skills/auto-claude/SKILL.md +0 -71
  103. package/plugins/tt-core/promptfooconfig.interview-me.yaml +0 -155
  104. package/plugins/tt-core/promptfooconfig.refine-text.yaml +0 -242
  105. package/plugins/tt-core/promptfooconfig.tdd.yaml +0 -144
  106. package/plugins/tt-core/promptfooconfig.write-prd.yaml +0 -145
  107. package/src/commands/config.test.ts +0 -9
  108. package/src/lib/auto-claude/index.ts +0 -15
  109. package/src/lib/auto-claude/shell.ts +0 -6
  110. package/src/lib/graph/index.ts +0 -24
  111. package/src/lib/journal/index.ts +0 -11
  112. package/src/utils/git/exec.ts +0 -18
  113. /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/build.ts +0 -0
  114. /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/bunfig.toml +0 -0
  115. /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/scripts/sessionizer.sh +0 -0
  116. /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/components/DiffStats.tsx +0 -0
  117. /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/components/SessionCard.tsx +0 -0
  118. /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/detail-panel-height.ts +0 -0
  119. /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/mux-context.ts +0 -0
  120. /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/tsconfig.json +0 -0
  121. /package/{plugins/tt-agentboard → packages/agentboard}/packages/mux-tmux/package.json +0 -0
  122. /package/{plugins/tt-agentboard → packages/agentboard}/packages/mux-tmux/src/client.ts +0 -0
  123. /package/{plugins/tt-agentboard → packages/agentboard}/packages/mux-tmux/src/index.ts +0 -0
  124. /package/{plugins/tt-agentboard → packages/agentboard}/packages/mux-tmux/src/provider.ts +0 -0
  125. /package/{plugins/tt-agentboard → packages/agentboard}/packages/mux-tmux/tsconfig.json +0 -0
  126. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/agents/tracker.ts +0 -0
  127. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/agents/watchers/amp.ts +0 -0
  128. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/agents/watchers/codex.ts +0 -0
  129. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/agents/watchers/opencode.ts +0 -0
  130. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/contracts/agent-watcher.ts +0 -0
  131. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/contracts/agent.ts +0 -0
  132. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/contracts/index.ts +0 -0
  133. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/contracts/mux.ts +0 -0
  134. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/debug.ts +0 -0
  135. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/mux/detect.ts +0 -0
  136. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/mux/registry.ts +0 -0
  137. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/context.ts +0 -0
  138. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/metadata-store.ts +0 -0
  139. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/port-scanner.ts +0 -0
  140. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/session-order.ts +0 -0
  141. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/sidebar-manager.ts +0 -0
  142. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/sidebar-width-sync.ts +0 -0
  143. /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/themes.ts +0 -0
  144. /package/{plugins/tt-agentboard → packages/agentboard}/tsconfig.json +0 -0
  145. /package/{plugins/tt-core → packages/core}/README.md +0 -0
  146. /package/{plugins/tt-core → packages/core}/commands/improve-architecture.md +0 -0
  147. /package/{plugins/tt-core → packages/core}/commands/interview-me.md +0 -0
  148. /package/{plugins/tt-core → packages/core}/commands/prd-to-issues.md +0 -0
  149. /package/{plugins/tt-core → packages/core}/commands/refine-text.md +0 -0
  150. /package/{plugins/tt-core → packages/core}/commands/task.md +0 -0
  151. /package/{plugins/tt-core → packages/core}/commands/tdd.md +0 -0
  152. /package/{plugins/tt-core → packages/core}/commands/write-prd.md +0 -0
  153. /package/{plugins/tt-core → packages/core}/skills/towles-tool/SKILL.md +0 -0
  154. /package/{src/utils → packages/shared/src}/date-utils.test.ts +0 -0
  155. /package/{src/utils → packages/shared/src}/date-utils.ts +0 -0
  156. /package/{src/utils → packages/shared/src}/fs.ts +0 -0
  157. /package/{src/utils → packages/shared/src}/git/branch-name.test.ts +0 -0
  158. /package/{src/utils → packages/shared/src}/git/branch-name.ts +0 -0
  159. /package/{src/utils → packages/shared/src}/git/gh-cli-wrapper.test.ts +0 -0
  160. /package/{src/utils → packages/shared/src}/render.test.ts +0 -0
  161. /package/{src/utils → packages/shared/src}/render.ts +0 -0
  162. /package/src/{lib → commands}/auto-claude/config.test.ts +0 -0
  163. /package/src/{lib → commands}/auto-claude/labels.test.ts +0 -0
  164. /package/src/{lib → commands}/auto-claude/pipeline.test.ts +0 -0
  165. /package/src/{lib → commands}/auto-claude/prompt-templates/01_plan.prompt.md +0 -0
  166. /package/src/{lib → commands}/auto-claude/prompt-templates/02_implement.prompt.md +0 -0
  167. /package/src/{lib → commands}/auto-claude/prompt-templates/03_simplify.prompt.md +0 -0
  168. /package/src/{lib → commands}/auto-claude/prompt-templates/04_review.prompt.md +0 -0
  169. /package/src/{lib → commands}/auto-claude/prompt-templates/CLAUDE.md +0 -0
  170. /package/src/{lib → commands}/auto-claude/prompt-templates/index.test.ts +0 -0
  171. /package/src/{lib → commands}/auto-claude/prompt-templates/index.ts +0 -0
  172. /package/src/{lib → commands}/auto-claude/run-claude.test.ts +0 -0
  173. /package/src/{lib → commands}/auto-claude/spawn-claude.ts +0 -0
  174. /package/src/{lib → commands}/auto-claude/steps/simple-steps.ts +0 -0
  175. /package/src/{lib → commands}/auto-claude/steps/steps.test.ts +0 -0
  176. /package/src/{lib → commands}/auto-claude/stream-parser.test.ts +0 -0
  177. /package/src/{lib → commands}/auto-claude/stream-parser.ts +0 -0
  178. /package/src/{lib → commands}/auto-claude/templates.test.ts +0 -0
  179. /package/src/{lib → commands}/auto-claude/templates.ts +0 -0
  180. /package/src/{lib → commands}/auto-claude/test-helpers.ts +0 -0
  181. /package/src/{lib → commands}/auto-claude/utils.test.ts +0 -0
  182. /package/src/{lib → commands}/graph/analyzer.ts +0 -0
  183. /package/src/{lib → commands}/graph/graph-template.html +0 -0
  184. /package/src/{lib → commands}/graph/parser.test.ts +0 -0
  185. /package/src/{lib → commands}/graph/parser.ts +0 -0
  186. /package/src/{lib → commands}/graph/render.ts +0 -0
  187. /package/src/{lib → commands}/graph/sessions.ts +0 -0
  188. /package/src/{lib → commands}/graph/tools.ts +0 -0
  189. /package/src/{lib → commands}/graph/treemap.ts +0 -0
  190. /package/src/{lib → commands}/journal/editor.ts +0 -0
@@ -1,83 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "bun:test";
2
- import { mkdirSync, rmSync, existsSync, readFileSync, writeFileSync } from "node:fs";
3
- import { join } from "node:path";
4
- import { loadConfig, saveConfig } from "../src/config";
5
-
6
- const TEST_HOME = join(import.meta.dir, ".test-home");
7
- const CONFIG_DIR = join(TEST_HOME, ".config", "towles-tool", "agentboard");
8
- const CONFIG_FILE = join(CONFIG_DIR, "config.json");
9
-
10
- describe("config", () => {
11
- beforeEach(() => {
12
- rmSync(TEST_HOME, { recursive: true, force: true });
13
- });
14
-
15
- afterEach(() => {
16
- rmSync(TEST_HOME, { recursive: true, force: true });
17
- });
18
-
19
- describe("loadConfig", () => {
20
- it("returns defaults when no config file exists", () => {
21
- const config = loadConfig(TEST_HOME);
22
- expect(config.plugins).toEqual([]);
23
- expect(config.port).toBeUndefined();
24
- expect(config.theme).toBeUndefined();
25
- expect(config.sidebarWidth).toBeUndefined();
26
- });
27
-
28
- it("reads config from disk", () => {
29
- mkdirSync(CONFIG_DIR, { recursive: true });
30
- writeFileSync(
31
- CONFIG_FILE,
32
- JSON.stringify({
33
- port: 4201,
34
- theme: "tokyo-night",
35
- sidebarWidth: 30,
36
- plugins: ["my-plugin"],
37
- }),
38
- );
39
-
40
- const config = loadConfig(TEST_HOME);
41
- expect(config.port).toBe(4201);
42
- expect(config.theme).toBe("tokyo-night");
43
- expect(config.sidebarWidth).toBe(30);
44
- expect(config.plugins).toEqual(["my-plugin"]);
45
- });
46
-
47
- it("handles malformed JSON gracefully", () => {
48
- mkdirSync(CONFIG_DIR, { recursive: true });
49
- writeFileSync(CONFIG_FILE, "not json {{{");
50
-
51
- const config = loadConfig(TEST_HOME);
52
- expect(config.plugins).toEqual([]);
53
- });
54
- });
55
-
56
- describe("saveConfig", () => {
57
- it("creates config directory and file", () => {
58
- saveConfig({ theme: "gruvbox-dark" }, TEST_HOME);
59
-
60
- expect(existsSync(CONFIG_FILE)).toBe(true);
61
- const saved = JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
62
- expect(saved.theme).toBe("gruvbox-dark");
63
- });
64
-
65
- it("merges with existing config", () => {
66
- mkdirSync(CONFIG_DIR, { recursive: true });
67
- writeFileSync(
68
- CONFIG_FILE,
69
- JSON.stringify({
70
- theme: "nord",
71
- sidebarWidth: 28,
72
- plugins: [],
73
- }),
74
- );
75
-
76
- saveConfig({ sidebarWidth: 32 }, TEST_HOME);
77
-
78
- const saved = JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
79
- expect(saved.theme).toBe("nord");
80
- expect(saved.sidebarWidth).toBe(32);
81
- });
82
- });
83
- });
@@ -1,8 +0,0 @@
1
- {
2
- "name": "tt-ac",
3
- "description": "Auto-Claude pipeline: automated issue-to-PR workflows using Claude Code",
4
- "version": "0.0.108",
5
- "author": {
6
- "name": "Chris Towles"
7
- }
8
- }
@@ -1,20 +0,0 @@
1
- ---
2
- description: Create a GitHub issue with the auto-claude label for AI-driven work
3
- allowed-tools: Bash(gh *), AskUserQuestion(*)
4
- ---
5
-
6
- Create a GitHub issue with the `auto-claude` label for Claude Code pipeline work.
7
-
8
- 1. Get repo: `gh repo view --json nameWithOwner --jq '.nameWithOwner'`
9
- 2. Fetch labels: `gh label list --repo <repo> --json name --jq '.[].name'`
10
- 3. AskUserQuestion (up to 4 at once): title, description, extra labels (multi-select from repo labels)
11
- 4. `gh issue create`:
12
- - Always include `auto-claude` label + any extras
13
- - Prefix title with conventional type (`feat:`, `fix:`, `refactor:`, `research:`, `chore:`)
14
- - Body: `## Summary`, `## Type`, `## Notes` sections
15
- - If `auto-claude` label missing, create it first:
16
- `gh label create "auto-claude" --repo <repo> --description "Issue for Claude Code auto-claude pipeline" --color "7C3AED"`
17
- 5. **Batch**: multiple issues → create in parallel with appropriate prefix/labels each
18
- 6. Report all issue URLs in a table
19
-
20
- $ARGUMENTS
@@ -1,21 +0,0 @@
1
- ---
2
- description: List open issues with the auto-claude label in the current repo
3
- allowed-tools: Bash(gh *)
4
- ---
5
-
6
- List open issues across all auto-claude pipeline states in the current repo.
7
-
8
- 1. Get repo: `gh repo view --json nameWithOwner --jq '.nameWithOwner'`
9
- 2. `gh issue list --repo <repo> --state open --json number,title,labels,assignees,state --limit 50` for each label:
10
- - `auto-claude` (queued)
11
- - `auto-claude-in-progress`
12
- - `auto-claude-failed`
13
- - `auto-claude-review`
14
- 3. Deduplicate across queries. Display as a table sorted by issue number:
15
-
16
- | # | Title | Status | Labels | Assignee |
17
- | --- | ----- | ------ | ------ | -------- |
18
-
19
- Status derived from pipeline label. Labels column excludes pipeline labels. Assignee shows login or `—`.
20
-
21
- $ARGUMENTS
@@ -1,71 +0,0 @@
1
- ---
2
- name: auto-claude
3
- description: Use the auto-claude pipeline (`tt auto-claude` / `tt ac`) for automated issue-to-PR workflows — labels a GitHub issue, then runs plan → implement → simplify → review autonomously.
4
- ---
5
-
6
- # Auto-Claude Pipeline
7
-
8
- Automated issue-to-PR pipeline. Label a GitHub issue with `auto-claude` and the pipeline runs Claude Code locally through 4 steps: **plan → implement → simplify → review**.
9
-
10
- ## Pipeline Steps
11
-
12
- 1. **Plan** — Research, planning, and annotations. Produces `plan.md`.
13
- 2. **Implement** — Executes the plan: writes code, tests, commits. Produces `completed-summary.md`.
14
- 3. **Simplify** — Code-simplify pass: removes dead code, simplifies logic. Produces `simplify-summary.md`.
15
- 4. **Review** — Automated review outputs `PASS` or `FAIL` on first line of `review.md`.
16
-
17
- ## Label Flow
18
-
19
- 1. Issue labelled `auto-claude` triggers the pipeline.
20
- 2. Pipeline removes `auto-claude`, adds `auto-claude-in-progress`.
21
- 3. On success: removes `auto-claude-in-progress`, adds `auto-claude-review`, creates PR.
22
- 4. On failure: removes `auto-claude-in-progress`, adds `auto-claude-failed`.
23
-
24
- ## Retry Behavior
25
-
26
- If review outputs FAIL, the pipeline loops back to **implement → simplify → review** (clearing previous artifacts). Configurable via `maxReviewRetries` (default 2), so up to 3 total attempts.
27
-
28
- ## CLI Commands
29
-
30
- ```bash
31
- # Process specific issue
32
- tt auto-claude --issue 42
33
- tt ac --issue 42
34
-
35
- # Stop after planning step (review before implementation)
36
- tt ac --issue 42 --until plan
37
-
38
- # Rebase stale PR branch onto current main
39
- tt ac --refresh --issue 42
40
-
41
- # Reset state for an issue (force restart)
42
- tt ac --reset 42
43
-
44
- # Start polling loop (default 30min interval)
45
- tt ac --loop
46
-
47
- # Custom interval and limit
48
- tt ac --loop --interval 15 --limit 3
49
-
50
- # Interactively pick an auto-claude issue to process
51
- tt ac list
52
- ```
53
-
54
- ## Config
55
-
56
- Auto-detects repo and main branch from cwd. Key settings:
57
-
58
- | Field | Default | Description |
59
- | ------------------------ | ------------- | ----------------------------------- |
60
- | `triggerLabel` | `auto-claude` | Label that triggers the pipeline |
61
- | `model` | `opus` | Claude model to use |
62
- | `maxReviewRetries` | `2` | Review failure retries |
63
- | `loopIntervalMinutes` | `30` | Polling interval for loop mode |
64
- | `maxImplementIterations` | `5` | Max Claude turns per implement step |
65
-
66
- ## Conventions
67
-
68
- - Artifacts: `.auto-claude/issue-{N}/`
69
- - Branch naming: `auto-claude/issue-{N}`
70
- - Steps are idempotent — check for output artifact before running
71
- - `--until <step>` pauses pipeline after the named step
@@ -1,155 +0,0 @@
1
- description: interview-me Iterative Eval
2
-
3
- providers:
4
- - id: anthropic:messages:claude-haiku-4-5-20251001
5
- config:
6
- max_tokens: 1024
7
-
8
- prompts:
9
- - '[{"role": "system", "content": "{{system_prompt}}"}, {"role": "user", "content": "{{user_message}}"}]'
10
-
11
- defaultTest:
12
- options:
13
- provider: anthropic:messages:claude-haiku-4-5-20251001
14
-
15
- tests:
16
- # --- Vague one-liner ideas ---
17
- - description: "Vague idea: todo app"
18
- vars:
19
- system_prompt: file://commands/interview-me.md
20
- user_message: "I want to build a todo app"
21
- assert:
22
- - type: llm-rubric
23
- value: "The response asks at least 3 probing questions about the idea. It does NOT propose any solutions, architectures, or implementations."
24
- - type: llm-rubric
25
- value: "The questions cover at least 2 different domains such as: user intent, target audience, data model, integrations, security, performance/scale, or edge cases."
26
-
27
- - description: "Vague idea: AI chatbot"
28
- vars:
29
- system_prompt: file://commands/interview-me.md
30
- user_message: "I want to make an AI chatbot for my business"
31
- assert:
32
- - type: llm-rubric
33
- value: "The response asks at least 3 probing questions. It does NOT suggest specific technologies, frameworks, or implementation approaches."
34
- - type: llm-rubric
35
- value: "At least one question addresses who the users are or what problem the chatbot solves."
36
-
37
- # --- Complex multi-paragraph ideas ---
38
- - description: "Complex idea: marketplace platform"
39
- vars:
40
- system_prompt: file://commands/interview-me.md
41
- user_message: "I'm building a two-sided marketplace for freelance developers. Clients post projects, devs bid on them. There's an escrow payment system, ratings/reviews, and a matching algorithm. We want to launch in 3 months with a team of 2 devs. We'll use React, Node.js, and PostgreSQL."
42
- assert:
43
- - type: llm-rubric
44
- value: "The response asks at least 3 probing questions that dig deeper into gaps in the described plan. It does NOT validate or approve the tech choices — it questions them or asks about tradeoffs."
45
- - type: llm-rubric
46
- value: "At least one question addresses the ambitious timeline/scope (3 months, 2 devs for a complex marketplace)."
47
-
48
- # --- Ideas with security gaps ---
49
- - description: "Security gap: health data app"
50
- vars:
51
- system_prompt: file://commands/interview-me.md
52
- user_message: "I want to build an app where users upload their medical records and get AI-powered health recommendations. Users can share their records with doctors."
53
- assert:
54
- - type: llm-rubric
55
- value: "The response asks at least one question about security, privacy, compliance (HIPAA, GDPR), or data protection related to handling medical records."
56
- - type: llm-rubric
57
- value: "The response does NOT propose solutions. It only asks questions."
58
-
59
- # --- Missing data model ---
60
- - description: "Missing data model: inventory system"
61
- vars:
62
- system_prompt: file://commands/interview-me.md
63
- user_message: "I need an inventory management system for my warehouse. It should track items coming in and going out and alert when stock is low."
64
- assert:
65
- - type: llm-rubric
66
- value: "At least one question probes the data model — e.g., what constitutes an 'item', how items are categorized, what metadata is tracked, relationships between entities."
67
- - type: llm-rubric
68
- value: "The response asks at least 3 questions total and does NOT propose a database schema or solution."
69
-
70
- # --- Unclear performance/scale ---
71
- - description: "Scale unclear: real-time analytics"
72
- vars:
73
- system_prompt: file://commands/interview-me.md
74
- user_message: "I want to build a real-time analytics dashboard that shows live metrics from our IoT sensors deployed across multiple factories."
75
- assert:
76
- - type: llm-rubric
77
- value: "At least one question addresses scale or performance — e.g., how many sensors, data volume, latency requirements, or what 'real-time' means specifically."
78
- - type: llm-rubric
79
- value: "The response asks at least 3 probing questions and does NOT suggest specific technologies or architectures."
80
-
81
- # --- Vague follow-up answer ---
82
- - description: "Vague follow-up: pushes back"
83
- vars:
84
- system_prompt: file://commands/interview-me.md
85
- user_message: |
86
- I'm building a notification system for our SaaS platform.
87
-
88
- Previously you asked about notification channels and I said "we'll support all the usual ones." You asked about volume and I said "a lot, probably."
89
-
90
- Continue the interview.
91
- assert:
92
- - type: llm-rubric
93
- value: "The response pushes back on the vague answers ('all the usual ones' and 'a lot, probably') by asking for specifics — e.g., which exact channels, what volume numbers, what peak load looks like."
94
- - type: llm-rubric
95
- value: "The response does NOT accept the vague answers at face value and move on to unrelated topics."
96
-
97
- # --- Overly ambitious scope ---
98
- - description: "Overly ambitious: social media platform"
99
- vars:
100
- system_prompt: file://commands/interview-me.md
101
- user_message: "I want to build a social media platform with stories, reels, messaging, marketplace, groups, events, live streaming, and AR filters. I'm a solo developer and want to launch in 2 months."
102
- assert:
103
- - type: llm-rubric
104
- value: "The response questions the scope relative to the constraints (solo developer, 2-month timeline). It should probe what the MVP actually is or what can be cut."
105
- - type: llm-rubric
106
- value: "The response does NOT propose a phased plan or solution — it asks questions to help the user think about prioritization."
107
-
108
- # --- Edge cases domain ---
109
- - description: "Edge cases: booking system"
110
- vars:
111
- system_prompt: file://commands/interview-me.md
112
- user_message: "I'm building a booking system for a hair salon. Customers pick a service, choose a stylist, and book a time slot."
113
- assert:
114
- - type: llm-rubric
115
- value: "At least one question addresses edge cases — e.g., double bookings, cancellations, no-shows, overlapping appointments, different service durations."
116
- - type: llm-rubric
117
- value: "The response asks at least 3 questions and does NOT propose a solution or booking flow."
118
-
119
- # --- Summary behavior ---
120
- - description: "Summarizes understanding before asking more"
121
- vars:
122
- system_prompt: file://commands/interview-me.md
123
- user_message: |
124
- I'm building a CLI tool that generates changelogs from git commits.
125
-
126
- Previously you asked what format the changelog should be in and I said Markdown. You asked about commit conventions and I said we use conventional commits. You asked about the target audience and I said it's for internal developer teams.
127
-
128
- Continue the interview.
129
- assert:
130
- - type: llm-rubric
131
- value: "The response summarizes or restates what has been established so far (Markdown format, conventional commits, internal dev teams) before asking new questions."
132
- - type: llm-rubric
133
- value: "The response then asks at least 2 new probing questions about remaining gaps."
134
-
135
- # --- Does not propose solutions ---
136
- - description: "Never proposes solutions even when idea is clear"
137
- vars:
138
- system_prompt: file://commands/interview-me.md
139
- user_message: "I want to add a dark mode toggle to my React app. When toggled, all components should switch to a dark theme. The preference should persist across sessions."
140
- assert:
141
- - type: llm-rubric
142
- value: "The response does NOT propose an implementation (no mentions of CSS variables, localStorage, context providers, or specific code patterns). It only asks questions."
143
- - type: llm-rubric
144
- value: "The response asks probing questions even though the idea seems simple — e.g., about system preference detection, transition animations, component library support, accessibility."
145
-
146
- # --- Multi-domain coverage ---
147
- - description: "Covers multiple domains in questions"
148
- vars:
149
- system_prompt: file://commands/interview-me.md
150
- user_message: "I want to build a payment processing API that merchants integrate with to accept credit card payments."
151
- assert:
152
- - type: llm-rubric
153
- value: "The questions span at least 3 different domains from this list: security/compliance (PCI DSS), data model, integrations, user intent, performance/scale, edge cases (refunds, chargebacks, failures), or scope."
154
- - type: llm-rubric
155
- value: "The response asks at least 3 questions and does NOT suggest payment providers or implementation approaches."
@@ -1,242 +0,0 @@
1
- description: refine-text Iterative Eval
2
- providers:
3
- - id: anthropic:messages:claude-haiku-4-5-20251001
4
- config:
5
- max_tokens: 1024
6
- prompts:
7
- - '[{"role": "system", "content": "{{system_prompt}}"}, {"role": "user", "content": "{{user_message}}"}]'
8
- defaultTest:
9
- options:
10
- provider: anthropic:messages:claude-haiku-4-5-20251001
11
- vars:
12
- system_prompt: file://commands/refine-text.md
13
-
14
- tests:
15
- # 1. Multiple grammar errors
16
- - description: "fixes multiple grammar errors (verb agreement, apostrophes, spelling)"
17
- vars:
18
- user_message: >
19
- The developers has been working on there project for weeks. Its a really
20
- importent milestone and everyone are excited. The teams progres have been
21
- excelent and we doesnt want to loose momentum.
22
- assert:
23
- - type: llm-rubric
24
- value: "The output fixes all grammar errors: 'has' -> 'have', 'there' -> 'their', 'Its' -> 'It's', 'importent' -> 'important', 'are' -> 'is', 'progres' -> 'progress', 'excelent' -> 'excellent', 'doesnt' -> 'don't', 'loose' -> 'lose'. All corrections must be present."
25
- - type: llm-rubric
26
- value: "The output preserves the original meaning about developers working on a project, it being an important milestone, and not wanting to lose momentum."
27
- - type: not-icontains
28
- value: "here's"
29
- - type: not-icontains
30
- value: "refined version"
31
-
32
- # 2. Technical jargon preservation
33
- - description: "preserves technical jargon while fixing grammar"
34
- vars:
35
- user_message: >
36
- The kubernetes cluster are running on EKS with istio service mesh.
37
- We use gRPC for inter-service comunication and the p99 latency have
38
- been under 50ms. The CI/CD pipline deploys via ArgoCD using GitOps
39
- metodology.
40
- assert:
41
- - type: icontains
42
- value: "Kubernetes"
43
- - type: icontains
44
- value: "EKS"
45
- - type: icontains
46
- value: "Istio"
47
- - type: icontains
48
- value: "gRPC"
49
- - type: icontains
50
- value: "p99"
51
- - type: icontains
52
- value: "ArgoCD"
53
- - type: icontains
54
- value: "GitOps"
55
- - type: icontains
56
- value: "CI/CD"
57
- - type: llm-rubric
58
- value: "Spelling errors are fixed: 'comunication' -> 'communication', 'pipline' -> 'pipeline', 'metodology' -> 'methodology'. Grammar errors are fixed: 'are running' -> 'is running', 'have been' -> 'has been'."
59
-
60
- # 3. Casual voice preservation
61
- - description: "preserves casual/informal voice while cleaning up"
62
- vars:
63
- user_message: >
64
- So yeah, I've been messing around with this new API and honestly?
65
- Its pretty sweet. Like, the docs could definately be better but once
66
- you figure it out its kinda magical. Gonna write a blog post about
67
- it probly.
68
- assert:
69
- - type: llm-rubric
70
- value: "The output maintains the casual, conversational tone. Words like 'yeah', 'pretty sweet', 'kinda', 'gonna' or similar casual language should be preserved or only lightly adjusted, not replaced with formal language."
71
- - type: llm-rubric
72
- value: "Spelling and grammar errors are fixed: 'Its' -> 'It's' (both instances), 'definately' -> 'definitely', 'probly' -> 'probably'."
73
- - type: not-icontains
74
- value: "here is"
75
-
76
- # 4. Passive voice to active voice
77
- - description: "converts passive voice to active voice"
78
- vars:
79
- user_message: >
80
- The configuration was updated by the team lead. The tests were run by
81
- the CI system and the results were reviewed by the QA engineer. A new
82
- release was deployed by the DevOps team last Friday.
83
- assert:
84
- - type: llm-rubric
85
- value: "The output converts passive voice to active voice. For example, 'The configuration was updated by the team lead' should become something like 'The team lead updated the configuration'. At least 3 of the 4 passive constructions should be converted to active voice."
86
- - type: llm-rubric
87
- value: "The output preserves all the actors (team lead, CI system, QA engineer, DevOps team) and actions (updated configuration, ran tests, reviewed results, deployed release)."
88
-
89
- # 5. Bloated sentences that need trimming
90
- - description: "trims bloated and redundant sentences"
91
- vars:
92
- user_message: >
93
- In order to be able to successfully complete the process of migrating
94
- our database, it is absolutely essential and critically important that
95
- we first and foremost make sure to create a comprehensive and thorough
96
- backup of all of our existing data in its entirety before we proceed
97
- to begin the migration process.
98
- assert:
99
- - type: llm-rubric
100
- value: "The output is significantly shorter than the input — at least 30% fewer words. The bloated phrases like 'in order to be able to', 'absolutely essential and critically important', 'first and foremost', 'comprehensive and thorough', 'in its entirety', 'proceed to begin' should be simplified."
101
- - type: llm-rubric
102
- value: "The core meaning is preserved: back up data before migrating the database."
103
-
104
- # 6. Already well-written text (minimal changes)
105
- - description: "makes minimal changes to well-written text"
106
- vars:
107
- user_message: >
108
- TypeScript's type system catches errors at compile time, reducing
109
- runtime failures. Combined with strict null checks, it eliminates
110
- an entire class of bugs that plague JavaScript codebases. The trade-off
111
- is additional upfront complexity, but most teams find it worthwhile.
112
- assert:
113
- - type: llm-rubric
114
- value: "The output is very similar to the input with minimal changes. The text is already well-written, so it should not be substantially reworded or restructured. At most minor punctuation or word choice adjustments."
115
- - type: llm-rubric
116
- value: "The output preserves the three-sentence structure and the key concepts: TypeScript type system, strict null checks, and the trade-off."
117
-
118
- # 7. Code blocks must not be modified
119
- - description: "does not modify code blocks or inline code"
120
- vars:
121
- user_message: |
122
- To install the package, run this command:
123
-
124
- ```bash
125
- npm install @acme/widget --save-dev
126
- ```
127
-
128
- Then import it in you're code:
129
-
130
- ```typescript
131
- import { Widget } from '@acme/widget';
132
- const w = new Widget({ debug: treu });
133
- ```
134
-
135
- The `Widget` class accept a configuration object.
136
- assert:
137
- - type: icontains
138
- value: "npm install @acme/widget --save-dev"
139
- - type: icontains
140
- value: "import { Widget } from '@acme/widget'"
141
- - type: icontains
142
- value: "debug: treu"
143
- - type: llm-rubric
144
- value: "Grammar errors OUTSIDE code blocks are fixed: 'you're code' -> 'your code', 'accept' -> 'accepts'. But code blocks and inline code (including the typo 'treu' inside the code block) are NOT modified."
145
-
146
- # 8. Intentional style choices (fragments, rhetorical questions)
147
- - description: "preserves intentional style choices like fragments and rhetorical questions"
148
- vars:
149
- user_message: >
150
- Fast. Reliable. Secure. That's what we promise. But can we deliver?
151
- Absolutely. Our platform handles millions of requests daily. Zero
152
- downtime last quarter. Not a single data breach in five years.
153
- The secret? Obsessive testing and a paranoid security team.
154
- assert:
155
- - type: llm-rubric
156
- value: "The output preserves the short fragment style ('Fast. Reliable. Secure.', 'Zero downtime last quarter.') and rhetorical questions ('But can we deliver?', 'The secret?'). These are intentional stylistic choices, not grammar errors."
157
- - type: llm-rubric
158
- value: "The output preserves the punchy, marketing-style tone and makes minimal or no changes since the text is already well-written."
159
-
160
- # 9. Mixed formal/informal text
161
- - description: "handles mixed formal and informal registers appropriately"
162
- vars:
163
- user_message: >
164
- The quarterly financial report indicate a 15% increase in revenue.
165
- Pretty awesome numbers tbh. Operating expenses was reduced by 8%
166
- through strategic cost optimisation. Basically we crushed it this
167
- quarter and the board are super happy with the results.
168
- assert:
169
- - type: llm-rubric
170
- value: "Grammar errors are fixed: 'indicate' -> 'indicates', 'was reduced' -> 'were reduced', 'are' -> 'is'. The mix of formal financial language and casual commentary is preserved — the output should not make the casual parts formal or the formal parts casual."
171
- - type: llm-rubric
172
- value: "The core data is preserved: 15% revenue increase, 8% expense reduction."
173
-
174
- # 10. Text with links that must not be modified
175
- - description: "preserves URLs and markdown links"
176
- vars:
177
- user_message: >
178
- Check out the documentation at https://docs.example.com/api/v2
179
- for more informations. You can also read the [getting started guide](https://example.com/guide)
180
- which explain the basic concepts. The repositry is at
181
- [github.com/acme/widget](https://github.com/acme/widget).
182
- assert:
183
- - type: icontains
184
- value: "https://docs.example.com/api/v2"
185
- - type: icontains
186
- value: "https://example.com/guide"
187
- - type: icontains
188
- value: "https://github.com/acme/widget"
189
- - type: llm-rubric
190
- value: "Grammar and spelling errors are fixed: 'informations' -> 'information', 'explain' -> 'explains', 'repositry' -> 'repository'. All URLs and markdown links remain intact and unmodified."
191
-
192
- # 11. Meaning preservation under ambiguity
193
- - description: "does not change meaning when editing could be ambiguous"
194
- vars:
195
- user_message: >
196
- We decided not to implement caching because the latency impact was
197
- negligible and the added complexity weren't worth it. The team
198
- considred using Redis but ultimatly chose to keep things simple.
199
- assert:
200
- - type: llm-rubric
201
- value: "The meaning is strictly preserved: the team chose NOT to implement caching, the reason was negligible latency impact, and they considered but rejected Redis. The output must not accidentally flip the meaning (e.g., suggesting they did implement caching)."
202
- - type: llm-rubric
203
- value: "Grammar/spelling fixed: 'weren't' -> 'wasn't', 'considred' -> 'considered', 'ultimatly' -> 'ultimately'."
204
-
205
- # 12. No preamble or meta-commentary
206
- - description: "outputs only the refined text with no preamble or explanation"
207
- vars:
208
- user_message: >
209
- The meeting notes from yesterdays standup shows that the backend team
210
- are blocked on the database migration. Frontend team have finished
211
- the redesign and is waiting for API changes.
212
- assert:
213
- - type: not-icontains
214
- value: "here's"
215
- - type: not-icontains
216
- value: "refined version"
217
- - type: not-icontains
218
- value: "here is the"
219
- - type: not-icontains
220
- value: "I've refined"
221
- - type: not-icontains
222
- value: "changes made"
223
- - type: not-icontains
224
- value: "corrections"
225
- - type: llm-rubric
226
- value: "The output is ONLY the refined text itself. It does not start with any preamble, introduction, or explanation. It does not end with a summary of changes. It is just the cleaned-up text."
227
-
228
- # 13. Text with bullet points / list structure
229
- - description: "preserves list structure and formatting"
230
- vars:
231
- user_message: |
232
- Project update:
233
- - Backend API is complete and has been tested
234
- - Frontend redesign are 80% done
235
- - Database migraton is schedule for next week
236
- - The documentation needs updated badly
237
- - Performance testing havent started yet
238
- assert:
239
- - type: llm-rubric
240
- value: "The bullet list structure is preserved — the output still uses bullet points (- or *) with the same items. Grammar/spelling errors are fixed: 'are' -> 'is', 'migraton' -> 'migration', 'schedule' -> 'scheduled', 'needs updated' -> 'needs to be updated' or 'needs updating', 'havent' -> 'haven't'."
241
- - type: icontains
242
- value: "Project update"