Working Through a Milestone
Before Starting
- •Review the last commit:
git show HEAD - •Run tests to see current state:
mise test - •Read relevant test files in
testcases/to understand expected behavior - •CRITICAL: Assess host interface sufficiency
- •Review
src/tclc.h(TclHostOps) to understand available primitives - •Determine if the feature can be implemented using existing ops
- •If TclHostOps needs to be extended: STOP IMMEDIATELY and inform the user
- •Do not proceed until you have received explicit approval and direction
- •Review
Implementation Loop
For each failing test:
- •Identify what's missing - parse test output to understand the gap
- •C interpreter changes (in
src/):- •Create new
builtin_*.cfile if adding a command - •Add declarations to
internal.h - •Register command in
interp.cbuiltins table - •Implement using
TclHostOpsprimitives only
- •Create new
- •Go host changes (in
interp/):- •Implement callbacks in
callbacks.go - •Add state to
Interpstruct intclc.goif needed - •Follow shimmering rules in
interp/CLAUDE.md
- •Implement callbacks in
- •Run tests:
mise test - •Iterate until tests pass
Key Patterns
- •List operations mutate: Use
ops->list.from()to copy before iterating - •String lengths: Count carefully, don't include null terminator
- •Shimmering: Use
Get*()methods in Go for type conversion, never access Object fields directly - •Error messages: Match TCL's exact format (check test expectations)
After All Tests Pass
- •Run tests multiple times to verify stability
- •Commit with detailed message explaining:
- •What was implemented
- •Key implementation details
- •Important learnings for future work
- •Use the format from CLAUDE.md (heredoc, co-author line)
File Checklist for New Commands
- •
src/builtin_<cmd>.c- implementation - •
src/internal.h- declaration - •
src/interp.c- registration - •
interp/callbacks.go- host callbacks (if new ops needed) - •
interp/tclc.go- state/structs (if needed)