@towles/tool 0.0.109 → 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.
- package/package.json +9 -4
- package/{plugins/tt-agentboard → packages/agentboard}/README.md +1 -1
- package/{plugins/tt-agentboard → packages/agentboard}/apps/server/package.json +2 -1
- package/{plugins/tt-agentboard → packages/agentboard}/apps/server/src/main.ts +6 -20
- package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/package.json +4 -0
- package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/components/DetailPanel.tsx +3 -2
- package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/components/StatusBar.tsx +35 -0
- package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/constants.ts +1 -0
- package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/index.tsx +204 -225
- package/packages/agentboard/apps/tui/src/session-status.test.ts +70 -0
- package/packages/agentboard/apps/tui/src/session-status.ts +19 -0
- package/{plugins/tt-agentboard → packages/agentboard}/package.json +2 -6
- package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/package.json +3 -0
- package/{plugins/tt-agentboard/packages/runtime/test → packages/agentboard/packages/runtime/src/agents}/tracker.test.ts +2 -2
- package/packages/agentboard/packages/runtime/src/agents/watchers/claude-code.test.ts +63 -0
- package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/agents/watchers/claude-code.ts +26 -2
- package/packages/agentboard/packages/runtime/src/config.test.ts +107 -0
- package/packages/agentboard/packages/runtime/src/config.ts +80 -0
- package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/index.ts +1 -1
- package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/plugins/loader.ts +1 -33
- package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/git-info.ts +3 -2
- package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/index.ts +23 -37
- package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/launcher.ts +6 -18
- package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/pane-scanner.ts +6 -0
- package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/shared.ts +2 -0
- package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/tsconfig.json +1 -1
- package/packages/shared/package.json +15 -0
- package/packages/shared/src/git/exec.ts +41 -0
- package/{src/utils → packages/shared/src}/git/gh-cli-wrapper.ts +13 -18
- package/packages/shared/src/index.ts +8 -0
- package/packages/shared/tsconfig.json +16 -0
- package/src/cli.ts +1 -1
- package/src/commands/agentboard.ts +42 -59
- package/src/{lib → commands}/auto-claude/claude-cli.ts +1 -1
- package/src/commands/auto-claude/config-init-helpers.ts +79 -0
- package/src/commands/auto-claude/config-init.test.ts +137 -0
- package/src/commands/auto-claude/config-init.ts +159 -0
- package/src/{lib → commands}/auto-claude/config.ts +4 -8
- package/src/{lib → commands}/auto-claude/e2e.test.ts +6 -6
- package/src/commands/auto-claude/explain.test.ts +58 -0
- package/src/commands/auto-claude/explain.ts +97 -0
- package/src/commands/auto-claude/index.ts +37 -14
- package/src/{lib → commands}/auto-claude/labels.ts +1 -1
- package/src/commands/auto-claude/list.ts +5 -4
- package/src/{lib → commands}/auto-claude/pipeline-execution.test.ts +1 -1
- package/src/{lib → commands}/auto-claude/pipeline.ts +1 -3
- package/src/commands/auto-claude/retry.test.ts +2 -2
- package/src/commands/auto-claude/retry.ts +5 -5
- package/src/commands/auto-claude/shell.ts +3 -0
- package/src/commands/auto-claude/status.test.ts +2 -2
- package/src/commands/auto-claude/status.ts +4 -4
- package/src/{lib → commands}/auto-claude/steps/create-pr.ts +1 -3
- package/src/{lib → commands}/auto-claude/steps/fetch-issues.ts +1 -1
- package/src/{lib → commands}/auto-claude/steps/implement.ts +1 -2
- package/src/{lib → commands}/auto-claude/utils-execution.test.ts +6 -6
- package/src/{lib → commands}/auto-claude/utils.ts +10 -4
- package/src/{lib/install → commands}/claude-settings.ts +1 -1
- package/src/commands/config/config.test.ts +129 -0
- package/src/commands/config/index.ts +11 -0
- package/src/commands/config/reset.ts +53 -0
- package/src/commands/config/schema.ts +19 -0
- package/src/commands/{config.ts → config/show.ts} +2 -2
- package/src/commands/config/validate.ts +51 -0
- package/src/commands/doctor/checks.ts +167 -0
- package/src/commands/doctor/format.test.ts +63 -0
- package/src/commands/doctor/format.ts +5 -0
- package/src/commands/doctor/history.test.ts +161 -0
- package/src/commands/doctor/history.ts +130 -0
- package/src/commands/doctor.ts +80 -151
- package/src/commands/gh/branch-clean.ts +4 -4
- package/src/commands/gh/branch.test.ts +4 -5
- package/src/commands/gh/branch.ts +10 -5
- package/src/commands/gh/pr.ts +6 -7
- package/src/{lib → commands}/graph/analyzer.test.ts +4 -4
- package/src/commands/graph/format.test.ts +130 -0
- package/src/commands/graph/format.ts +94 -0
- package/src/commands/graph/index.ts +69 -41
- package/src/{lib → commands}/graph/labels.ts +4 -4
- package/src/{lib → commands}/graph/server.ts +2 -2
- package/src/{lib → commands}/graph/types.ts +2 -0
- package/src/commands/graph.test.ts +1 -1
- package/src/commands/install.ts +6 -6
- package/src/commands/journal/daily-notes.ts +4 -7
- package/src/{lib → commands}/journal/fs.ts +1 -1
- package/src/commands/journal/index.ts +2 -0
- package/src/commands/journal/list.test.ts +174 -0
- package/src/commands/journal/list.ts +213 -0
- package/src/commands/journal/meeting.ts +4 -7
- package/src/commands/journal/note.ts +4 -7
- package/src/{lib → commands}/journal/paths.ts +1 -1
- package/src/commands/journal/search.test.ts +156 -0
- package/src/commands/journal/search.ts +256 -0
- package/src/{lib → commands}/journal/templates.ts +1 -1
- package/src/config/settings.ts +35 -26
- package/plugins/tt-agentboard/bun.lock +0 -444
- package/plugins/tt-agentboard/packages/runtime/src/config.ts +0 -70
- package/plugins/tt-agentboard/packages/runtime/test/config.test.ts +0 -83
- package/plugins/tt-auto-claude/.claude-plugin/plugin.json +0 -8
- package/plugins/tt-auto-claude/commands/create-issue.md +0 -20
- package/plugins/tt-auto-claude/commands/list.md +0 -21
- package/plugins/tt-auto-claude/skills/auto-claude/SKILL.md +0 -71
- package/plugins/tt-core/promptfooconfig.interview-me.yaml +0 -155
- package/plugins/tt-core/promptfooconfig.refine-text.yaml +0 -242
- package/plugins/tt-core/promptfooconfig.tdd.yaml +0 -144
- package/plugins/tt-core/promptfooconfig.write-prd.yaml +0 -145
- package/src/commands/config.test.ts +0 -9
- package/src/lib/auto-claude/index.ts +0 -15
- package/src/lib/auto-claude/shell.ts +0 -6
- package/src/lib/graph/index.ts +0 -24
- package/src/lib/journal/index.ts +0 -11
- package/src/utils/git/exec.ts +0 -18
- /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/build.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/bunfig.toml +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/scripts/sessionizer.sh +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/components/DiffStats.tsx +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/components/SessionCard.tsx +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/detail-panel-height.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/src/mux-context.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/apps/tui/tsconfig.json +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/mux-tmux/package.json +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/mux-tmux/src/client.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/mux-tmux/src/index.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/mux-tmux/src/provider.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/mux-tmux/tsconfig.json +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/agents/tracker.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/agents/watchers/amp.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/agents/watchers/codex.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/agents/watchers/opencode.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/contracts/agent-watcher.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/contracts/agent.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/contracts/index.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/contracts/mux.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/debug.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/mux/detect.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/mux/registry.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/context.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/metadata-store.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/port-scanner.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/session-order.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/sidebar-manager.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/server/sidebar-width-sync.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/packages/runtime/src/themes.ts +0 -0
- /package/{plugins/tt-agentboard → packages/agentboard}/tsconfig.json +0 -0
- /package/{plugins/tt-core → packages/core}/.claude-plugin/plugin.json +0 -0
- /package/{plugins/tt-core → packages/core}/README.md +0 -0
- /package/{plugins/tt-core → packages/core}/commands/improve-architecture.md +0 -0
- /package/{plugins/tt-core → packages/core}/commands/interview-me.md +0 -0
- /package/{plugins/tt-core → packages/core}/commands/prd-to-issues.md +0 -0
- /package/{plugins/tt-core → packages/core}/commands/refine-text.md +0 -0
- /package/{plugins/tt-core → packages/core}/commands/task.md +0 -0
- /package/{plugins/tt-core → packages/core}/commands/tdd.md +0 -0
- /package/{plugins/tt-core → packages/core}/commands/write-prd.md +0 -0
- /package/{plugins/tt-core → packages/core}/skills/towles-tool/SKILL.md +0 -0
- /package/{src/utils → packages/shared/src}/date-utils.test.ts +0 -0
- /package/{src/utils → packages/shared/src}/date-utils.ts +0 -0
- /package/{src/utils → packages/shared/src}/fs.ts +0 -0
- /package/{src/utils → packages/shared/src}/git/branch-name.test.ts +0 -0
- /package/{src/utils → packages/shared/src}/git/branch-name.ts +0 -0
- /package/{src/utils → packages/shared/src}/git/gh-cli-wrapper.test.ts +0 -0
- /package/{src/utils → packages/shared/src}/render.test.ts +0 -0
- /package/{src/utils → packages/shared/src}/render.ts +0 -0
- /package/src/{lib → commands}/auto-claude/config.test.ts +0 -0
- /package/src/{lib → commands}/auto-claude/labels.test.ts +0 -0
- /package/src/{lib → commands}/auto-claude/pipeline.test.ts +0 -0
- /package/src/{lib → commands}/auto-claude/prompt-templates/01_plan.prompt.md +0 -0
- /package/src/{lib → commands}/auto-claude/prompt-templates/02_implement.prompt.md +0 -0
- /package/src/{lib → commands}/auto-claude/prompt-templates/03_simplify.prompt.md +0 -0
- /package/src/{lib → commands}/auto-claude/prompt-templates/04_review.prompt.md +0 -0
- /package/src/{lib → commands}/auto-claude/prompt-templates/CLAUDE.md +0 -0
- /package/src/{lib → commands}/auto-claude/prompt-templates/index.test.ts +0 -0
- /package/src/{lib → commands}/auto-claude/prompt-templates/index.ts +0 -0
- /package/src/{lib → commands}/auto-claude/run-claude.test.ts +0 -0
- /package/src/{lib → commands}/auto-claude/spawn-claude.ts +0 -0
- /package/src/{lib → commands}/auto-claude/steps/simple-steps.ts +0 -0
- /package/src/{lib → commands}/auto-claude/steps/steps.test.ts +0 -0
- /package/src/{lib → commands}/auto-claude/stream-parser.test.ts +0 -0
- /package/src/{lib → commands}/auto-claude/stream-parser.ts +0 -0
- /package/src/{lib → commands}/auto-claude/templates.test.ts +0 -0
- /package/src/{lib → commands}/auto-claude/templates.ts +0 -0
- /package/src/{lib → commands}/auto-claude/test-helpers.ts +0 -0
- /package/src/{lib → commands}/auto-claude/utils.test.ts +0 -0
- /package/src/{lib → commands}/graph/analyzer.ts +0 -0
- /package/src/{lib → commands}/graph/graph-template.html +0 -0
- /package/src/{lib → commands}/graph/parser.test.ts +0 -0
- /package/src/{lib → commands}/graph/parser.ts +0 -0
- /package/src/{lib → commands}/graph/render.ts +0 -0
- /package/src/{lib → commands}/graph/sessions.ts +0 -0
- /package/src/{lib → commands}/graph/tools.ts +0 -0
- /package/src/{lib → commands}/graph/treemap.ts +0 -0
- /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,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"
|