# Complete Implementation Plan for Onyx Phase 1 ## Milestone 1: Action Log and onx init ### Action Log Implementation 13. **Create oplog binary format** (`internal/storage/oplog.go`) ```go type OplogEntry struct { ID uint64 ParentID uint64 Timestamp int64 Command string StateBefore map[string]string StateAfter map[string]string } ``` 14. **Implement oplog writer** (`internal/storage/oplog_writer.go`) - `OpenOplog(path string) (*OplogWriter, error)` - `AppendEntry(entry *OplogEntry) error` - Use binary encoding (gob or protobuf) - Implement file locking for concurrent access 15. **Implement oplog reader** (`internal/storage/oplog_reader.go`) - `ReadLastEntry() (*OplogEntry, error)` - `ReadEntry(id uint64) (*OplogEntry, error)` - `GetUndoStack() ([]*OplogEntry, error)` 16. **Create transactional wrapper** (`internal/core/transaction.go`) ```go func ExecuteWithTransaction(repo *Repository, cmd string, fn func() error) error { // 1. Capture state_before // 2. Create oplog entry // 3. Execute fn() // 4. Capture state_after // 5. Finalize oplog entry // 6. Handle rollback on error } ``` ### onx init Command 17. **Implement init command** (`internal/commands/init.go`) - Create .git directory (via go-git) - Create .onx directory structure - Initialize empty oplog file - Create default workstreams.json - Create workspace pointer file - Add .onx to .gitignore 18. **Create CLI structure** (`cmd/onx/main.go`) ```go func main() { rootCmd := &cobra.Command{ Use: "onx", Short: "The iPhone of Version Control", } rootCmd.AddCommand(commands.InitCmd()) rootCmd.Execute() } ``` ### onx undo Command 19. **Implement undo logic** (`internal/commands/undo.go`) - Read last oplog entry - Restore all refs from state_before - Update workspace pointer - Mark entry as undone in oplog - Perform git checkout to restore working directory 20. **Add undo tests** (`internal/commands/undo_test.go`) - Test undo after init - Test sequential undos - Test undo with nothing to undo