clud-bug 0.6.2 → 0.6.4

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/lib/prompts.js CHANGED
@@ -57,6 +57,32 @@ ${focusBullets}
57
57
  Skip style suggestions, minor naming issues, or anything that
58
58
  doesn't affect correctness, security, or performance.
59
59
 
60
+ Section budgets (token-frugal review — v0.6.4+):
61
+ The workflow sets env vars MAX_DIFF_BYTES / MAX_COMMENT_BYTES /
62
+ MAX_SKILL_BYTES. When fetching content via the Bash tool, cap each
63
+ section with \`head -c\` to keep your context lean. Caching covers
64
+ the stable system-prompt prefix (you're reading it now) at 10% of
65
+ standard input cost, but variable per-PR content is NOT cached, so
66
+ size discipline on those fetches pays back directly.
67
+
68
+ - PR diff: \`gh pr diff "$PR_NUMBER" | head -c "$MAX_DIFF_BYTES"\`
69
+ (default 80,000 bytes — covers ~95% of real PRs unbruised). If
70
+ the output looks truncated mid-line, note it in your review and
71
+ request the omitted hunks via \`gh pr diff "$PR_NUMBER" --name-only\`
72
+ + a targeted re-fetch of the specific files that need scrutiny.
73
+
74
+ - Skill files: \`head -c "$MAX_SKILL_BYTES" .claude/skills/<name>/SKILL.md\`
75
+ per file (default 4,000 bytes). Baseline skills fit easily;
76
+ bloated user-added skills get truncated.
77
+
78
+ - PR comments: \`gh api "repos/$REPO_OWNER/$REPO_NAME/issues/$PR_NUMBER/comments?per_page=20" --jq '.[] | select(.user.login != "claude[bot]")' | head -c "$MAX_COMMENT_BYTES"\`
79
+ (default 20,000 bytes, 20 most-recent). Skips your own prior
80
+ comments — the FIX-PUSH FLOW handles those via reviewThreads
81
+ GraphQL instead.
82
+
83
+ If you genuinely cannot review safely without the elided content,
84
+ say so plainly in the summary comment instead of speculating.
85
+
60
86
  Skills are not background context — they are review rules with
61
87
  authority. Before flagging any finding, scan the loaded skills in
62
88
  .claude/skills/ for relevant guidance. If a skill applies, your
@@ -78,8 +104,8 @@ frontmatter at .claude/skills/<name>/SKILL.md. Two values:
78
104
 
79
105
  Before writing the review, scan each loaded skill's frontmatter
80
106
  (the first \`---\`-delimited block of its SKILL.md) to identify
81
- its review_mode. You can read them with:
82
- cat .claude/skills/*/SKILL.md
107
+ its review_mode. Read each one capped at MAX_SKILL_BYTES:
108
+ head -c "$MAX_SKILL_BYTES" .claude/skills/*/SKILL.md
83
109
 
84
110
  At the end of every review, append a single-line footer:
85
111
  Skills referenced: [skill-name-1, skill-name-2, ...]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clud-bug",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
4
4
  "description": "Skill-driven Claude PR review. Ship a brand-voice skill, get brand reviews. Each finding cites the skill that motivated it. CLI installs the workflow + a baseline kit; add more from skills.sh.",
5
5
  "homepage": "https://cludbug.dev",
6
6
  "bugs": "https://github.com/thrillmade/clud-bug/issues",
@@ -54,17 +54,31 @@ jobs:
54
54
  if: steps.guard.outputs.skip != 'true'
55
55
  env:
56
56
  PR_NUMBER: ${{ github.event.pull_request.number }}
57
+ REPO_OWNER: ${{ github.repository_owner }}
58
+ REPO_NAME: ${{ github.event.repository.name }}
59
+ # Per-section byte budgets — see workflow.yml.tmpl for design notes.
60
+ MAX_DIFF_BYTES: '80000'
61
+ MAX_COMMENT_BYTES: '20000'
62
+ MAX_SKILL_BYTES: '4000'
63
+ # Stable prefix → CLI auto-cached system layer (10% cost on hits).
64
+ # See workflow.yml.tmpl for design notes.
65
+ APPEND_SYSTEM_PROMPT: |
66
+ {{REVIEW_PROMPT}}
57
67
  with:
58
68
  anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
59
69
  track_progress: true
70
+ show_full_output: true
60
71
  claude_args: |
61
- --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh api graphql:*),Bash(gh api repos/:*),Bash(git show:*),Bash(cat .claude/skills/.clud-bug.json),Bash(cat .claude/skills/*/SKILL.md)"
72
+ --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh api graphql:*),Bash(gh api repos/:*),Bash(git show:*),Bash(cat .claude/skills/.clud-bug.json),Bash(cat .claude/skills/*/SKILL.md),Bash(head:*)"
62
73
  prompt: |
63
- {{REVIEW_PROMPT}}
74
+ Review this pull request following the discipline in your
75
+ system prompt — every rule about skill routing, comment
76
+ format, the strict-mode header, the two-surface review
77
+ shape, and the FIX-PUSH FLOW applies.
64
78
 
65
79
  # Strict-mode gate — composite action; see workflow.yml.tmpl for design notes.
66
80
  - name: Strict mode — fail check on critical findings
67
81
  if: success()
68
- uses: thrillmade/clud-bug/.github/actions/strict-mode-gate@v0.6.2
82
+ uses: thrillmade/clud-bug/.github/actions/strict-mode-gate@v0.6.4
69
83
  with:
70
84
  github-token: ${{ secrets.GITHUB_TOKEN }}
@@ -54,17 +54,31 @@ jobs:
54
54
  if: steps.guard.outputs.skip != 'true'
55
55
  env:
56
56
  PR_NUMBER: ${{ github.event.pull_request.number }}
57
+ REPO_OWNER: ${{ github.repository_owner }}
58
+ REPO_NAME: ${{ github.event.repository.name }}
59
+ # Per-section byte budgets — see workflow.yml.tmpl for design notes.
60
+ MAX_DIFF_BYTES: '80000'
61
+ MAX_COMMENT_BYTES: '20000'
62
+ MAX_SKILL_BYTES: '4000'
63
+ # Stable prefix → CLI auto-cached system layer (10% cost on hits).
64
+ # See workflow.yml.tmpl for design notes.
65
+ APPEND_SYSTEM_PROMPT: |
66
+ {{REVIEW_PROMPT}}
57
67
  with:
58
68
  anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
59
69
  track_progress: true
70
+ show_full_output: true
60
71
  claude_args: |
61
- --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh api graphql:*),Bash(gh api repos/:*),Bash(git show:*),Bash(cat .claude/skills/.clud-bug.json),Bash(cat .claude/skills/*/SKILL.md)"
72
+ --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh api graphql:*),Bash(gh api repos/:*),Bash(git show:*),Bash(cat .claude/skills/.clud-bug.json),Bash(cat .claude/skills/*/SKILL.md),Bash(head:*)"
62
73
  prompt: |
63
- {{REVIEW_PROMPT}}
74
+ Review this pull request following the discipline in your
75
+ system prompt — every rule about skill routing, comment
76
+ format, the strict-mode header, the two-surface review
77
+ shape, and the FIX-PUSH FLOW applies.
64
78
 
65
79
  # Strict-mode gate — composite action; see workflow.yml.tmpl for design notes.
66
80
  - name: Strict mode — fail check on critical findings
67
81
  if: success()
68
- uses: thrillmade/clud-bug/.github/actions/strict-mode-gate@v0.6.2
82
+ uses: thrillmade/clud-bug/.github/actions/strict-mode-gate@v0.6.4
69
83
  with:
70
84
  github-token: ${{ secrets.GITHUB_TOKEN }}
@@ -80,13 +80,40 @@ jobs:
80
80
  if: steps.guard.outputs.skip != 'true'
81
81
  env:
82
82
  PR_NUMBER: ${{ github.event.pull_request.number }}
83
+ REPO_OWNER: ${{ github.repository_owner }}
84
+ REPO_NAME: ${{ github.event.repository.name }}
85
+ # Per-section byte budgets (v0.6.4). The system-prompt instructs
86
+ # Claude to cap each per-PR input fetch with `head -c`. Caching
87
+ # covers the stable system prefix; capping covers the variable
88
+ # suffix (diff, comments, skills). Override per-repo by setting
89
+ # these env vars in the consuming workflow if defaults don't fit.
90
+ MAX_DIFF_BYTES: '80000'
91
+ MAX_COMMENT_BYTES: '20000'
92
+ MAX_SKILL_BYTES: '4000'
93
+ # APPEND_SYSTEM_PROMPT lands inside the Claude Code CLI's auto-cached
94
+ # system layer (system prompt, tools, conversation history). Anthropic
95
+ # bills cached input tokens at 10% of standard input — within a 5-min
96
+ # window, the 2nd+ PR review in any consuming repo hits cache.
97
+ # See: src/entrypoints/run.ts in claude-code-action — `appendSystemPrompt:
98
+ # process.env.APPEND_SYSTEM_PROMPT` reads this var, threads it into the
99
+ # SDK's `systemPrompt.append`. Crucial: keep this content byte-stable
100
+ # across runs (no PR numbers, timestamps, SHAs) or the cache invalidates.
101
+ APPEND_SYSTEM_PROMPT: |
102
+ {{REVIEW_PROMPT}}
83
103
  with:
84
104
  anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
85
105
  track_progress: true
106
+ # show_full_output: exposes cache_read_input_tokens /
107
+ # cache_creation_input_tokens in the run's result JSON so we can
108
+ # measure caching effectiveness post-rollout (per v0.6.3 plan).
109
+ show_full_output: true
86
110
  claude_args: |
87
- --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh api graphql:*),Bash(gh api repos/:*),Bash(git show:*),Bash(cat .claude/skills/.clud-bug.json),Bash(cat .claude/skills/*/SKILL.md)"
111
+ --allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh api graphql:*),Bash(gh api repos/:*),Bash(git show:*),Bash(cat .claude/skills/.clud-bug.json),Bash(cat .claude/skills/*/SKILL.md),Bash(head:*)"
88
112
  prompt: |
89
- {{REVIEW_PROMPT}}
113
+ Review this pull request following the discipline in your
114
+ system prompt — every rule about skill routing, comment
115
+ format, the strict-mode header, the two-surface review
116
+ shape, and the FIX-PUSH FLOW applies.
90
117
 
91
118
  # Strict-mode gate. Fails the check when the BASE ref's manifest
92
119
  # has { "strictMode": true } AND the latest clud-bug review's first
@@ -103,6 +130,6 @@ jobs:
103
130
  # Letting the action's own failure fail the check is louder and right.
104
131
  - name: Strict mode — fail check on critical findings
105
132
  if: success()
106
- uses: thrillmade/clud-bug/.github/actions/strict-mode-gate@v0.6.2
133
+ uses: thrillmade/clud-bug/.github/actions/strict-mode-gate@v0.6.4
107
134
  with:
108
135
  github-token: ${{ secrets.GITHUB_TOKEN }}