diff --git a/notes/checklist.md b/notes/checklist.md index 45b0581..e43ba2c 100644 --- a/notes/checklist.md +++ b/notes/checklist.md @@ -1,87 +1,78 @@ # Complete Implementation Plan for Onyx Phase 1 +## Milestone 1: Action Log and onx init -## Milestone 0: Foundation and Core Abstractions +### Action Log Implementation -### Project Structure Setup +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 + } + ``` -6. **Create directory structure** - ``` - onyx/ - ├── cmd/ - │ ├── onx/ # CLI entry point - │ └── onxd/ # Daemon entry point - ├── internal/ - │ ├── core/ # Core abstractions - │ ├── git/ # Git interaction layer - │ ├── models/ # Data models - │ ├── storage/ # .onx directory management - │ ├── commands/ # CLI command implementations - │ ├── daemon/ # Daemon implementation - │ └── utils/ # Utilities - ├── pkg/ # Public APIs (if needed) - ├── test/ # Integration tests - ├── docs/ # Documentation - └── scripts/ # Build/deployment scripts - ``` +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 -7. **Set up dependency management** - ```bash - go get github.com/go-git/go-git/v5@latest - go get github.com/spf13/cobra@latest - go get github.com/fsnotify/fsnotify@latest - ``` +15. **Implement oplog reader** (`internal/storage/oplog_reader.go`) + - `ReadLastEntry() (*OplogEntry, error)` + - `ReadEntry(id uint64) (*OplogEntry, error)` + - `GetUndoStack() ([]*OplogEntry, error)` -8. **Create Makefile** - ```makefile - # Makefile - .PHONY: build test clean install - - build: - go build -o bin/onx ./cmd/onx - go build -o bin/onxd ./cmd/onxd - - test: - go test -v ./... - - install: - go install ./cmd/onx - go install ./cmd/onxd - - clean: - rm -rf bin/ - ``` +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 + } + ``` -### Core Abstractions Implementation +### onx init Command -9. **Define core interfaces** (`internal/core/interfaces.go`) - ```go - type Repository interface { - Init(path string) error - GetGitRepo() *git.Repository - GetOnyxMetadata() *OnyxMetadata - } - - type GitBackend interface { - CreateCommit(tree, parent, message string) (string, error) - CreateTree(entries []TreeEntry) (string, error) - UpdateRef(name, sha string) error - GetRef(name string) (string, error) - } - ``` +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 -10. **Implement Repository struct** (`internal/core/repository.go`) - - Fields: gitRepo (*git.Repository), onyxPath (string), gitPath (string) - - Methods: Open(), Close(), IsOnyxRepo() - - Error handling for missing .git or .onx directories +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() + } + ``` -11. **Implement Git object operations** (`internal/git/objects.go`) - - `CreateBlob(content []byte) (string, error)` - - `CreateTree(entries []TreeEntry) (string, error)` - - `CreateCommit(tree, parent, message, author string) (string, error)` - - `GetObject(sha string) (Object, error)` +### 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 -12. **Create data models** (`internal/models/`) - - `oplog.go`: OplogEntry struct with serialization - - `workstream.go`: Workstream, WorkstreamCommit structs - - `workspace.go`: WorkspaceState struct diff --git a/notes/future.md b/notes/future.md index e1877ef..a95fe90 100644 --- a/notes/future.md +++ b/notes/future.md @@ -1,79 +1,3 @@ -## 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 - ## Milestone 2: Transparent Versioning and onx save ### Filesystem Daemon Implementation