setup notes for milestone 1

This commit is contained in:
2025-10-09 19:08:59 -04:00
parent e52dd17a41
commit f7674cc2b0
2 changed files with 66 additions and 151 deletions

View File

@ -1,87 +1,78 @@
# Complete Implementation Plan for Onyx Phase 1 # 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`)
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
```
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
```
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/
```
### Core Abstractions Implementation
9. **Define core interfaces** (`internal/core/interfaces.go`)
```go ```go
type Repository interface { type OplogEntry struct {
Init(path string) error ID uint64
GetGitRepo() *git.Repository ParentID uint64
GetOnyxMetadata() *OnyxMetadata Timestamp int64
} Command string
StateBefore map[string]string
type GitBackend interface { StateAfter map[string]string
CreateCommit(tree, parent, message string) (string, error)
CreateTree(entries []TreeEntry) (string, error)
UpdateRef(name, sha string) error
GetRef(name string) (string, error)
} }
``` ```
10. **Implement Repository struct** (`internal/core/repository.go`) 14. **Implement oplog writer** (`internal/storage/oplog_writer.go`)
- Fields: gitRepo (*git.Repository), onyxPath (string), gitPath (string) - `OpenOplog(path string) (*OplogWriter, error)`
- Methods: Open(), Close(), IsOnyxRepo() - `AppendEntry(entry *OplogEntry) error`
- Error handling for missing .git or .onx directories - Use binary encoding (gob or protobuf)
- Implement file locking for concurrent access
11. **Implement Git object operations** (`internal/git/objects.go`) 15. **Implement oplog reader** (`internal/storage/oplog_reader.go`)
- `CreateBlob(content []byte) (string, error)` - `ReadLastEntry() (*OplogEntry, error)`
- `CreateTree(entries []TreeEntry) (string, error)` - `ReadEntry(id uint64) (*OplogEntry, error)`
- `CreateCommit(tree, parent, message, author string) (string, error)` - `GetUndoStack() ([]*OplogEntry, error)`
- `GetObject(sha string) (Object, 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
12. **Create data models** (`internal/models/`)
- `oplog.go`: OplogEntry struct with serialization
- `workstream.go`: Workstream, WorkstreamCommit structs
- `workspace.go`: WorkspaceState struct

View File

@ -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 ## Milestone 2: Transparent Versioning and onx save
### Filesystem Daemon Implementation ### Filesystem Daemon Implementation