Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
406 commits
Select commit Hold shift + click to select a range
534442b
Document G002 security verification ownership for integration
May 14, 2026
180ebb3
Reject Windows absolute PowerShell paths from workspace scope
May 14, 2026
9bc55f9
omx(team): auto-checkpoint worker-1 [1]
May 14, 2026
f2dc615
Prevent workspace escape through tool path resolution
May 14, 2026
37b2b75
Keep G002 path-scope tests aligned with enforced denials
May 14, 2026
3a8ce83
Deny scoped file reads before tool dispatch
May 14, 2026
ac88862
Merge commit '3a8ce832341884322ede0855b150e3ceebe9180d'
May 14, 2026
d87c3e6
Make roadmap PR intake durable for CC2
May 14, 2026
964458a
omx(team): auto-checkpoint worker-1 [1]
May 14, 2026
3cf0db8
omx(team): merge worker-1
May 14, 2026
6df60a4
omx(team): auto-checkpoint worker-2 [unknown]
May 14, 2026
a6ee51b
omx(team): auto-checkpoint worker-3 [unknown]
May 14, 2026
087e31d
Keep G003 integrated runtime tests compiling
May 14, 2026
675d9dd
Harden workspace path classification
May 14, 2026
5f45740
omx(team): auto-checkpoint worker-2 [unknown]
May 14, 2026
9ec4d83
omx(team): auto-checkpoint worker-3 [unknown]
May 14, 2026
79d3b80
omx(team): auto-checkpoint worker-4 [unknown]
May 14, 2026
2012718
Map G003 boot session verification
May 14, 2026
8c11dd1
task: preserve startup no-evidence timestamp evidence
May 14, 2026
307b23d
omx(team): auto-checkpoint worker-4 [unknown]
May 14, 2026
43b1828
Lock doctor JSON boot preflight contract
May 14, 2026
aec291c
omx(team): auto-checkpoint worker-4 [unknown]
May 14, 2026
4e0211d
Expose boot preflight evidence in diagnostic JSON
May 14, 2026
42c7921
Merge commit '4e0211d36c0180e787e73f96d52381f40a4c7ac4'
May 14, 2026
16d6525
omx(team): auto-checkpoint worker-2 [3]
May 14, 2026
030f2ef
omx(team): merge worker-2
May 14, 2026
f4e08d0
omx(team): auto-checkpoint worker-2 [3]
May 14, 2026
ed3ccae
omx(team): auto-checkpoint worker-4 [unknown]
May 14, 2026
06e5453
omx(team): auto-checkpoint worker-1 [1]
May 14, 2026
57b3e32
omx(team): auto-checkpoint worker-2 [3]
May 14, 2026
c8c936e
omx(team): auto-checkpoint worker-3 [6]
May 14, 2026
f8d744b
omx(team): auto-checkpoint worker-1 [1]
May 14, 2026
ff37d39
Stabilize G004 contract integration after worker merges
May 14, 2026
e34209f
omx(team): auto-checkpoint worker-2 [3]
May 14, 2026
bf533d7
task: approval token chain
May 14, 2026
5cebdd9
omx(team): auto-checkpoint worker-2 [3]
May 14, 2026
e1641aa
Prove G004 contract bundles are machine-checkable
May 14, 2026
f79ca98
omx(team): merge worker-3
May 14, 2026
dcf11f8
harden report contract projection identity
May 14, 2026
7214573
Keep approval token contracts in their own runtime module
May 14, 2026
0b0d55d
omx(team): auto-checkpoint worker-1 [1]
May 14, 2026
879962b
map g004 event report verification lanes
May 14, 2026
1fbde9f
omx(team): auto-checkpoint worker-1 [1]
May 14, 2026
2ad5686
omx(team): merge worker-1
May 14, 2026
0bca524
omx(team): auto-checkpoint worker-1 [1]
May 14, 2026
6a37442
omx(team): auto-checkpoint worker-2 [3]
May 14, 2026
4f60cf7
omx(team): merge worker-2
May 14, 2026
5625ba5
omx(team): auto-checkpoint worker-1 [1]
May 14, 2026
5c40d4e
omx(team): auto-checkpoint worker-3 [4]
May 14, 2026
204af77
Keep recovery recipe lint green for ledger reporting
May 14, 2026
d3f8ff9
omx(team): auto-checkpoint worker-1 [1]
May 14, 2026
607f071
harden branch recovery reporting
May 14, 2026
d2b5f5d
require provenance for green contracts
May 14, 2026
8f7eaff
Close the G005 verification gaps before checkpoint
May 14, 2026
7426ede
map branch recovery verification evidence
May 14, 2026
41b769f
Merge commit '204af77596345c120e25ce9d433dad0676a59b37'
May 14, 2026
f7235ca
Make G006 task policy state machine executable
May 15, 2026
6d809cb
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
65a144c
Keep G006 packet regressions aligned with shipped schema
May 15, 2026
18805b5
omx(team): auto-checkpoint worker-2 [2]
May 15, 2026
391e343
omx(team): merge worker-2
May 15, 2026
0a14f85
omx(team): auto-checkpoint worker-4 [5]
May 15, 2026
76920c7
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
f2ba364
omx(team): auto-checkpoint worker-3 [4]
May 15, 2026
0cd1eab
Keep G007 plugin command integration compiling
May 15, 2026
1a6e475
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
12ca555
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
b01192d
omx(team): auto-checkpoint worker-3 [4]
May 15, 2026
80b8984
omx(team): auto-checkpoint worker-4 [5]
May 15, 2026
17b4ab4
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
2454f01
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
f0e8896
omx(team): auto-checkpoint worker-2 [2]
May 15, 2026
db91a23
omx(team): merge worker-2
May 15, 2026
c522dc9
Preserve plugin lifecycle JSON in G007 CLI output
May 15, 2026
985c6e9
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
9ae6aa3
Keep plugin introspection available when MCP config is malformed
May 15, 2026
cac73b4
omx(team): auto-checkpoint worker-3 [4]
May 15, 2026
983ceb9
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
db6f30f
verify plugin lifecycle JSON contract
May 15, 2026
ace2601
omx(team): auto-checkpoint worker-3 [4]
May 15, 2026
2831c45
omx(team): auto-checkpoint worker-2 [2]
May 15, 2026
7ce6b78
Document G007 mock parity verification boundaries
May 15, 2026
faa7551
omx(team): merge worker-2
May 15, 2026
d3ae7be
omx(team): auto-checkpoint worker-2 [2]
May 15, 2026
686cc89
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
39568fe
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
9910d58
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
4a76632
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
0bcab57
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
1f00771
Keep plugin lifecycle JSON complete after team merges
May 15, 2026
557ab8a
surface required MCP server semantics
May 15, 2026
ccd99a5
omx(team): auto-checkpoint worker-2 [2]
May 15, 2026
d6b4349
Keep G007 mock parity references executable
May 15, 2026
e05268e
omx(team): merge worker-2
May 15, 2026
b655d49
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
5de73ec
Prevent plugin command aliases from becoming prompts
May 15, 2026
7ed1cab
Prove observable MCP required optional contracts
May 15, 2026
8565b68
omx(team): merge worker-4
May 15, 2026
98204a7
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
2202410
map MCP lifecycle maturity surfaces
May 15, 2026
29029bf
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
4cf9d43
omx(team): merge worker-1
May 15, 2026
3ff8743
omx(team): auto-checkpoint worker-2 [unknown]
May 15, 2026
a6ca5c4
omx(team): auto-checkpoint worker-4 [unknown]
May 15, 2026
82ec223
omx(team): auto-checkpoint worker-2 [unknown]
May 15, 2026
76581f7
omx(team): auto-checkpoint worker-3 [unknown]
May 15, 2026
e4ef0f7
omx(team): auto-checkpoint worker-4 [unknown]
May 15, 2026
685f078
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
1a110bd
omx(team): auto-checkpoint worker-4 [unknown]
May 15, 2026
2cac66c
Stabilize provider compatibility integration verification
May 15, 2026
a212c66
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
bc32639
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
ce02ace
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
dec8efa
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
ea95bf2
omx(team): auto-checkpoint worker-3 [unknown]
May 15, 2026
dccb3e7
Stabilize OpenAI-compatible mock transport verification
May 15, 2026
b63a1bf
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
d5620c0
Document provider compatibility diagnostics and passthrough
May 15, 2026
8c9a05e
Restore provider compatibility diagnostics as API types
May 15, 2026
3767add
omx(team): auto-checkpoint worker-2 [unknown]
May 15, 2026
90c1d38
omx(team): merge worker-2
May 15, 2026
8c9e41a
omx(team): auto-checkpoint worker-3 [unknown]
May 15, 2026
2db0a5f
omx(team): auto-checkpoint worker-4 [unknown]
May 15, 2026
7b21ac1
omx(team): auto-checkpoint worker-2 [unknown]
May 15, 2026
0bb1451
omx(team): auto-checkpoint worker-4 [unknown]
May 15, 2026
0940253
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
f8270b3
omx(team): merge worker-1
May 15, 2026
c886cbc
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
7d859ae
Close Windows release artifact verification gap
May 15, 2026
99efb21
Ensure release docs are auditable before Windows adoption
May 15, 2026
1bceda2
Clarify Windows release onboarding
May 15, 2026
a3af013
Preserve Windows checksum verification after docs merge
May 15, 2026
5294648
Record G009 release readiness quality gate
May 15, 2026
f27bd46
Update ultragoal ledger for G009 completion
May 15, 2026
e199a39
Start G010 session hygiene stream
May 15, 2026
fc35dc8
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
673d37d
omx(team): merge worker-1
May 15, 2026
afd8808
omx(team): auto-checkpoint worker-2 [5]
May 15, 2026
89d1052
omx(team): auto-checkpoint worker-3 [unknown]
May 15, 2026
33ac5c3
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
51fa5a7
omx(team): auto-checkpoint worker-3 [unknown]
May 15, 2026
5e0cf62
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
c9b34a2
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
deeb1ef
omx(team): merge worker-1
May 15, 2026
5155225
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
761e50d
omx(team): merge worker-1
May 15, 2026
fb9095c
omx(team): auto-checkpoint worker-4 [unknown]
May 15, 2026
0f87178
omx(team): auto-checkpoint worker-4 [unknown]
May 15, 2026
8fd5894
omx(team): merge worker-4
May 15, 2026
d04a74c
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
238c0a4
omx(team): merge worker-1
May 15, 2026
d7f1ad7
omx(team): auto-checkpoint worker-4 [unknown]
May 15, 2026
c5a18e1
Preserve resumed session command exhaustiveness
May 15, 2026
2221dd4
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
4ccbd8f
Keep resumed session handling exhaustive
May 15, 2026
060603c
omx(team): merge worker-1
May 15, 2026
11c6a60
omx(team): auto-checkpoint worker-4 [unknown]
May 15, 2026
eb7a208
omx(team): auto-checkpoint worker-4 [unknown]
May 15, 2026
124d55f
omx(team): merge worker-4
May 15, 2026
21bbbb7
Route resumed session commands exhaustively
May 15, 2026
8019999
Record G010 final verification rerun
May 15, 2026
cf5eb15
Update ultragoal ledger for G010 completion
May 15, 2026
4d78e91
Start G011 ecosystem ops UX stream
May 15, 2026
de0f1bb
omx(team): auto-checkpoint worker-2 [4]
May 15, 2026
b11cdf3
omx(team): merge worker-2
May 15, 2026
7b63c0a
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
02889d7
omx(team): auto-checkpoint worker-3 [6]
May 15, 2026
9278748
omx(team): auto-checkpoint worker-4 [7]
May 15, 2026
62bc7b6
Stabilize G011 integrated evidence
May 15, 2026
4cd2bb8
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
2c601ef
Gate issue and PR triage on evidence
May 15, 2026
5a43d3b
Keep G011 verification commands runnable
May 15, 2026
ab27f61
omx(team): auto-checkpoint worker-4 [7]
May 15, 2026
1ac8ce8
Keep G011 artifacts reviewable
May 15, 2026
2e93264
Record G011 ultragoal completion
May 15, 2026
0eddcca
omx(team): auto-checkpoint worker-1 [1]
May 15, 2026
0fb1c2d
omx(team): merge worker-1
May 15, 2026
a92e5b2
omx(team): auto-checkpoint worker-3 [unknown]
May 15, 2026
6f73103
Record why issue reconciliation is evidence-gated
May 15, 2026
17260f6
Preserve final-gate evidence for release arbitration
May 15, 2026
33df16b
Record PR gate evidence to avoid unsafe final merges
May 15, 2026
04c2abb
Stabilize final gate before release checkpoint
May 15, 2026
c910063
Close the ultragoal ledger after final gate
May 15, 2026
63ce483
Merge commit '17260f69f14d28d0f22ce46e330e98c8d9ff9fd5'
May 15, 2026
a35ee9a
docs(roadmap): add #449 — session list routes through ResumeSession a…
code-yeongyu May 12, 2026
f8e1bb7
docs(roadmap): add #450 — prompt JSON error routed to stderr not stdo…
code-yeongyu May 16, 2026
5200d1a
docs(roadmap): add #692 — dump-manifests help json lacks source schem…
Yeachan-Heo May 25, 2026
c881069
docs(roadmap): batch merge #451-#470, #681-#691 roadmap entries
code-yeongyu May 25, 2026
a61d023
fix: unify user_agent to 'clawd-rust-tools/0.1'
LLuke May 25, 2026
f72681f
fix: recognize OPENAI_API_KEY as valid auth for OpenAI-compatible end…
EmreCelenli May 25, 2026
739488f
fix: return conservative token limits for unspecified models
LLuke May 25, 2026
1c62116
feat: truncate oversized git diff in system prompt
olabi May 25, 2026
fc26e16
fix: resolve model aliases before syntax validation
niStee May 25, 2026
fdcb05b
fix: echo reasoning_content back for DeepSeek V4 multi-turn tool calls
Psy-lzh May 25, 2026
b071fac
feat: add native Gemini support to openai_compat provider
Ajinkya-Kardile May 25, 2026
5a9550d
fix: flatten prior compaction highlights to prevent nesting compounding
joshbowyer May 25, 2026
f967df7
ci: add Rust CI workflow
drlexpeterka-collab May 25, 2026
5fb2ed9
docs: document TweetClaw skill install example
kriptoburak May 25, 2026
271283c
chore: bump rustls-webpki to 0.103.13
AlexMelanFromRingo May 25, 2026
96ddeca
fix: resolve EACCES error from incorrect bundled plugins directory
camAtGitHub May 25, 2026
aefa5b0
feat(tools): add LoggingAspect to unified tool dispatch entry point
yijunyu May 25, 2026
7149bbc
fix: streaming robustness — OpenAI parsing, error detection, reasonin…
TheArchitectit May 25, 2026
88f79bb
docs(roadmap): batch merge remaining open ROADMAP doc PRs (#2841-#2876)
code-yeongyu May 25, 2026
bc1b3c8
build: docker compose + dockerignore
gismo212 May 25, 2026
cef45ef
feat: interactive provider wizard with fast model selection
TheArchitectit May 25, 2026
0975252
feat: git-aware context tools
TheArchitectit May 25, 2026
f1a55a2
fix: /resume latest searches all workspaces
TheArchitectit May 25, 2026
b43a6f2
feat: auto-compact and retry on context window errors
TheArchitectit May 25, 2026
52572d5
docs: personal assistant roadmap
gismo212 May 25, 2026
a4efdc4
feat(rag): add claw-rag-service
gismo212 May 25, 2026
ae30bf4
feat(analog): add claw-analog minimal harness
gismo212 May 25, 2026
c8b4487
fix: CVE-2021-29937 security vulnerability (#3056)
orbisai0security May 25, 2026
c32288b
docs(roadmap): add #693 — claw-analog bootstrap phase parser silent u…
code-yeongyu May 25, 2026
499125c
ci: fix rust.yml working-directory — set defaults.run.working-directo…
code-yeongyu May 25, 2026
3364dc4
chore: fix conflict markers and cargo fmt drift in main (commands, op…
code-yeongyu May 25, 2026
495e7a0
fix: remove stale retry_after field, Team variant, config_load_error_…
code-yeongyu May 25, 2026
bf7bae8
docs(roadmap): add #694 — no pre-push cargo build gate lets broken ma…
code-yeongyu May 25, 2026
ba941f7
docs(roadmap): add #695 — agent stale-worktree startup burn + sandbox…
code-yeongyu May 25, 2026
03bd461
fix: ChunkDelta thinking field in tests, remove residual retry_after …
code-yeongyu May 25, 2026
1f572ff
fix: add missing config_load_error_kind to test StatusContext initial…
code-yeongyu May 25, 2026
06c126a
fix(claw-analog): reject backslash paths in validate_rel_path (dotdot…
code-yeongyu May 25, 2026
0423321
fix(test): update compact test to reflect flattened previous-context …
code-yeongyu May 25, 2026
3489ec5
fix(#160): add regression test for SessionStore lifecycle (list_sessi…
code-yeongyu May 25, 2026
1f330c6
chore: cargo fmt --all on fix-160 branch
code-yeongyu May 25, 2026
779cf1c
test(api): fill thinking in stream chunk fixtures
Yeachan-Heo May 25, 2026
fdbc789
fix(api): skip preflight for unknown model limits
Yeachan-Heo May 25, 2026
6f5465a
fix(test): update client_integration version string 0.1.0 -> 0.1.3
code-yeongyu May 25, 2026
3d02baf
fix(#683): claw skills remove/add/uninstall/delete emits typed error,…
code-yeongyu May 25, 2026
0136944
chore: sync Cargo.lock and openai_compat.rs to main (stash artifact c…
code-yeongyu May 25, 2026
a76dda2
chore: cargo fmt --all on fix-683 branch
code-yeongyu May 25, 2026
f003a10
fix: remove stale retry_after refs from openai_compat.rs
code-yeongyu May 25, 2026
e7d5d08
fix: ChunkDelta thinking field in test initializers; fix parse_local_…
code-yeongyu May 25, 2026
bd9102f
fix(api): skip preflight for unknown model limits
Yeachan-Heo May 25, 2026
60108df
fix(test): update client_integration version string 0.1.0 -> 0.1.3
code-yeongyu May 25, 2026
bd8a27b
Merge pull request #3096 from ultraworkers/fix-160-session-store-life…
code-yeongyu May 25, 2026
706ac0f
Merge pull request #3097 from ultraworkers/fix-683-unsupported-skills…
code-yeongyu May 25, 2026
78a0ff6
Merge pull request #3014 from wangguan1995/fix_qwen
code-yeongyu May 25, 2026
8806e62
docs(roadmap): add #330 — resume mode stats/cost always zero
code-yeongyu Apr 29, 2026
bb2a923
Merge pull request #2839 from ultraworkers/docs/roadmap-324-resume-st…
code-yeongyu May 25, 2026
da7924d
docs(roadmap): add #696 — compact hangs in non-interactive mode with …
code-yeongyu May 25, 2026
63a5a87
fix(#696): exit with typed error when stdin is not a TTY and no promp…
code-yeongyu May 25, 2026
1003510
docs(roadmap): add #697 — plugins remove silent ok on missing plugin;…
code-yeongyu May 25, 2026
c613e8e
feat: sweep
Yeachan-Heo May 25, 2026
91a0681
fix(#697): agents unknown subcommand exits 1 with typed error; plugin…
code-yeongyu May 25, 2026
c345ce6
fix: mcp/agents/skills help envelopes set ok:false + status:error on …
code-yeongyu May 25, 2026
b64df99
fix(#698): dedup config deprecation warnings per process; add tempfil…
code-yeongyu May 25, 2026
9c3d52d
Report structured config file load statuses
Yeachan-Heo Apr 30, 2026
707f4a4
Fix config JSON test isolation
Yeachan-Heo Apr 30, 2026
688f331
Isolate config report tests
Yeachan-Heo Apr 30, 2026
39ab68e
Add .worktrees to gitignore for worktree isolation
May 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Keep docker build context small (Windows-friendly).
.git
.github
**/target
**/.claw-rag
**/.claw
**/.claude
**/.cursor
**/node_modules
**/dist
**/build
**/*.log
**/*.tmp
**/*.sqlite
**/*.sqlite-wal
**/*.sqlite-shm
**/.DS_Store
54 changes: 54 additions & 0 deletions .github/ISSUE_TEMPLATE/anti_slop_triage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Anti-slop triage
about: Classify low-signal, duplicate, generated, or unsafe reports before engineering work starts.
title: "triage: "
labels: ["needs-triage"]
body:
- type: markdown
attributes:
value: |
Use this form for issue intake that needs evidence-backed classification before anyone closes, fixes, or escalates it.
Do not paste secrets, live tokens, private logs, or non-public customer data.
- type: dropdown
id: classification
attributes:
label: Initial classification
description: Pick the strongest current classification. Update it if evidence changes.
options:
- actionable-bug
- actionable-docs
- actionable-feature
- duplicate
- spam-or-promotion
- generated-slop-or-hallucinated
- unsafe-or-security-sensitive
- not-reproducible-yet
- externally-blocked
validations:
required: true
- type: textarea
id: evidence
attributes:
label: Evidence
description: Link the PR, issue, command output, docs page, reproduction, duplicate, or policy that supports the classification.
placeholder: "Evidence: ..."
validations:
required: true
- type: textarea
id: safe_next_action
attributes:
label: Safe next action
description: State the next non-destructive action. If closure or merge is proposed, name the required owner/gate.
placeholder: "Next action: label only / request repro / link duplicate / fix docs / defer with rationale / owner review required"
validations:
required: true
- type: checkboxes
id: guardrails
attributes:
label: Guardrails
options:
- label: I did not close, merge, or mutate remote state as part of this triage-only report.
required: true
- label: I checked for duplicates or related PRs/issues before recommending action.
required: true
- label: If this touches credentials, security, or private data, I avoided public reproduction details and routed to the appropriate private/security path.
required: true
17 changes: 17 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## Summary
- TBD

## Anti-slop triage
- Classification: <!-- actionable-fix | docs-only | duplicate | generated-slop | unsafe | out-of-scope | needs-maintainer-decision -->
- Evidence: <!-- issue link, repro command, failing test, docs source, or duplicate PR -->
- Non-destructive review result: <!-- merge candidate | request changes | close/defer with rationale | needs owner gate -->

## Verification
- [ ] Targeted tests/docs checks ran, or the gap is explicitly recorded.
- [ ] `git diff --check` passes.
- [ ] No live secrets, tokens, private logs, or unrelated generated churn are included.

## Resolution gate
- [ ] If this PR resolves an issue, the issue number and fix evidence are linked.
- [ ] If this PR should not merge, the rejection/defer rationale is evidence-backed and does not rely on vibes.
- [ ] I did not merge/close remote PRs or issues from an automation lane without owner approval.
20 changes: 20 additions & 0 deletions .github/hooks/pre-push
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Claw Code local pre-push safety gate.
#
# Install with:
# git config core.hooksPath .github/hooks
#
# This intentionally mirrors the CI build gate so stale field/enum references are
# caught before pushing to main or PR branches.
set -euo pipefail

repo_root="$(git rev-parse --show-toplevel 2>/dev/null)"
cd "$repo_root"

if [[ ! -f rust/Cargo.toml ]]; then
echo "pre-push: rust/Cargo.toml not found; skipping cargo workspace build" >&2
exit 0
fi

echo "pre-push: cargo build --manifest-path rust/Cargo.toml --workspace" >&2
cargo build --manifest-path rust/Cargo.toml --workspace
169 changes: 169 additions & 0 deletions .github/scripts/check_release_readiness.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
#!/usr/bin/env python3
"""Validate release-readiness docs that are easy to regress.

The check is intentionally dependency-free so it can run on developer machines,
Windows CI, and minimal release jobs. It validates:

* required repository policy files exist;
* local Markdown links and image targets resolve;
* local heading anchors referenced from Markdown resolve; and
* command examples do not present the deprecated `cargo install claw-code`
package as an executable install path.
"""

from __future__ import annotations

from pathlib import Path
from urllib.parse import unquote, urlparse
import re
import sys

ROOT = Path(__file__).resolve().parents[2]

REQUIRED_POLICY_FILES = [
"LICENSE",
"CONTRIBUTING.md",
"SECURITY.md",
"SUPPORT.md",
"CODE_OF_CONDUCT.md",
]

MARKDOWN_ROOTS = [
ROOT / "README.md",
ROOT / "USAGE.md",
ROOT / "PARITY.md",
ROOT / "PHILOSOPHY.md",
ROOT / "ROADMAP.md",
ROOT / "CONTRIBUTING.md",
ROOT / "SECURITY.md",
ROOT / "SUPPORT.md",
ROOT / "CODE_OF_CONDUCT.md",
ROOT / "docs",
ROOT / "rust" / "README.md",
ROOT / "rust" / "USAGE.md",
ROOT / "rust" / "MOCK_PARITY_HARNESS.md",
]

LINK_PATTERN = re.compile(r"(?<!!)\[[^\]\n]+\]\(([^)\s]+)(?:\s+\"[^\"]*\")?\)")
HTML_LINK_PATTERN = re.compile(r"""<(?:a|img)\b[^>]*(?:href|src)=["']([^"']+)["']""", re.I)
FENCE_PATTERN = re.compile(r"```(?P<lang>[^\n`]*)\n(?P<body>.*?)```", re.S)


def iter_markdown_files() -> list[Path]:
files: set[Path] = set()
for entry in MARKDOWN_ROOTS:
if entry.is_file():
files.add(entry)
elif entry.is_dir():
files.update(entry.rglob("*.md"))
return sorted(files)


def github_anchor(heading: str) -> str:
anchor = heading.strip().lower()
anchor = re.sub(r"<[^>]+>", "", anchor)
anchor = re.sub(r"`([^`]*)`", r"\1", anchor)
anchor = re.sub(r"[^a-z0-9 _-]", "", anchor)
anchor = anchor.replace(" ", "-")
anchor = re.sub(r"-+", "-", anchor)
return anchor.strip("-")


def anchors_for(path: Path) -> set[str]:
anchors: set[str] = set()
for line in path.read_text(encoding="utf-8").splitlines():
match = re.match(r"^(#{1,6})\s+(.+?)\s*#*\s*$", line)
if match:
anchors.add(github_anchor(match.group(2)))
return anchors


def is_external(target: str) -> bool:
parsed = urlparse(target)
return parsed.scheme in {"http", "https", "mailto"}


def validate_policies(errors: list[str]) -> None:
for relative in REQUIRED_POLICY_FILES:
path = ROOT / relative
if not path.is_file():
errors.append(f"missing required policy file: {relative}")


def validate_markdown_links(errors: list[str]) -> None:
anchor_cache: dict[Path, set[str]] = {}
for path in iter_markdown_files():
text = path.read_text(encoding="utf-8")
candidates = [m.group(1) for m in LINK_PATTERN.finditer(text)]
candidates.extend(m.group(1) for m in HTML_LINK_PATTERN.finditer(text))
for target in candidates:
if (
not target
or is_external(target)
or target.startswith(("mailto:", "tel:", "data:"))
):
continue
link_path, _, raw_anchor = target.partition("#")
if not link_path:
destination = path
else:
destination = (path.parent / unquote(link_path)).resolve()
try:
destination.relative_to(ROOT)
except ValueError:
errors.append(
f"{path.relative_to(ROOT)}: link escapes repo root: {target}"
)
continue
if not destination.exists():
errors.append(
f"{path.relative_to(ROOT)}: missing local link target: {target}"
)
continue
if raw_anchor and destination.suffix.lower() == ".md":
anchor = unquote(raw_anchor).lower()
anchor_cache.setdefault(destination, anchors_for(destination))
if anchor not in anchor_cache[destination]:
errors.append(
f"{path.relative_to(ROOT)}: missing anchor `{raw_anchor}` in "
f"{destination.relative_to(ROOT)}"
)


def validate_command_examples(errors: list[str]) -> None:
for path in iter_markdown_files():
text = path.read_text(encoding="utf-8")
for match in FENCE_PATTERN.finditer(text):
lang = match.group("lang").strip().lower()
if lang not in {"bash", "sh", "shell", "zsh", "powershell", "ps1"}:
continue
body = match.group("body")
for offset, line in enumerate(body.splitlines(), start=1):
stripped = line.strip()
if not stripped or stripped.startswith(("#", ">")):
continue
if re.search(r"\bcargo\s+install\s+claw-code\b", stripped):
line_no = text.count("\n", 0, match.start()) + offset + 1
errors.append(
f"{path.relative_to(ROOT)}:{line_no}: deprecated "
"`cargo install claw-code` appears in an executable "
"command block; use build-from-source docs instead"
)


def main() -> int:
errors: list[str] = []
validate_policies(errors)
validate_markdown_links(errors)
validate_command_examples(errors)
if errors:
print("release-readiness check failed:", file=sys.stderr)
for error in errors:
print(f" - {error}", file=sys.stderr)
return 1
print("release-readiness check passed")
return 0


if __name__ == "__main__":
raise SystemExit(main())
15 changes: 12 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ jobs:
os: macos-14
bin: claw
artifact_name: claw-macos-arm64
- name: windows-x64
os: windows-latest
bin: claw.exe
artifact_name: claw-windows-x64.exe
defaults:
run:
working-directory: rust
Expand All @@ -47,22 +51,27 @@ jobs:
- name: Build release binary
run: cargo build --release -p rusty-claude-cli

- name: Package artifact
- name: Package artifact and checksum
shell: bash
run: |
mkdir -p dist
cp "target/release/${{ matrix.bin }}" "dist/${{ matrix.artifact_name }}"
chmod +x "dist/${{ matrix.artifact_name }}"
(cd dist && sha256sum "${{ matrix.artifact_name }}" > "${{ matrix.artifact_name }}.sha256")

- name: Upload workflow artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact_name }}
path: rust/dist/${{ matrix.artifact_name }}
path: |
rust/dist/${{ matrix.artifact_name }}
rust/dist/${{ matrix.artifact_name }}.sha256

- name: Upload release asset
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: rust/dist/${{ matrix.artifact_name }}
files: |
rust/dist/${{ matrix.artifact_name }}
rust/dist/${{ matrix.artifact_name }}.sha256
fail_on_unmatched_files: true
Loading