Implement the following plan:
Reorganize reuse into subpackages by concern
Currently all code lives in one flat reuse package. Move parsers into public subpackages, matching the internal/core + type alias pattern used by manifests and registries.
Problem: import cycles
Root package (project.go) imports subpackages. Subpackages need ReuseInfo, SourceType, PrecedenceType from root. That's a cycle.
Fix: move shared types to internal/core. Root re-exports them as type aliases (type ReuseInfo = core.ReuseInfo). Subpackages import internal/core directly. No cycles.
Target structure
reuse/
reuse.go type aliases from internal/core, package docs
project.go Project, OpenProject, ReuseInfoOf, AllReuseInfo
project_test.go
covered.go IsCoveredFile, CoveredFiles, IsIgnoredDir, IsIgnoredFile
covered_test.go
internal/
core/
core.go ReuseInfo, SourceType, PrecedenceType (actual definitions + methods)
extract/
extract.go ExtractReuseInfo, ExtractFromFile, FilterIgnoreBlocks
extract_test.go
dep5/
dep5.go Dep5, ParseDep5, ParseDep5File, ReuseInfoOf
dep5_test.go
toml/
toml.go ReuseTOML, Annotation, ParseReuseTOML, ParseReuseTOMLFile, ReuseInfoOf
toml_test.go
glob.go GlobMatch (only used by toml, stays here)
glob_test.go
What moves where
reuse.go types/constants/methods -> internal/core/core.go
reuse.go becomes type aliases + package doc
extract.go + test -> extract/ subpackage, package extract, imports internal/core
dep5.go + test -> dep5/ subpackage, package dep5, imports internal/core
toml.go + test -> toml/ subpackage, package toml, imports internal/core and uses alias for BurntSushi/toml (btoml)
glob.go + test -> toml/ subpackage (glob is only used by toml matching)
covered.go + test -> stays in root (no deps on subpackages, no cycle risk)
project.go + test -> stays in root, imports extract, dep5, toml subpackages
Import paths after reorganization
Consumer usage:
go
Changes to each file
internal/core/core.go (new)
- All types, constants, methods from current
reuse.go
package core
reuse.go (rewrite)
- Package doc stays
- Type aliases:
type ReuseInfo = core.ReuseInfo, type SourceType = core.SourceType, etc.
- Constant re-exports:
const (FileHeader = core.FileHeader; ...)
extract/extract.go
- Change
package reuse -> package extract
- Import
github.com/git-pkgs/reuse/internal/core
- Replace
ReuseInfo with core.ReuseInfo, FileHeader with core.FileHeader
dep5/dep5.go
- Change
package reuse -> package dep5
- Import
github.com/git-pkgs/reuse/internal/core
- Same type replacements
toml/toml.go
- Change
package reuse -> package toml
- Import
btoml "github.com/BurntSushi/toml" (alias to avoid name conflict with package name)
- Import
github.com/git-pkgs/reuse/internal/core
- Same type replacements
toml/glob.go (moved from root)
- Change
package reuse -> package toml
- No other changes needed
project.go
- Add imports for
extract, dep5, toml subpackages
- Replace direct function calls:
ExtractFromFile -> extract.ExtractFromFile, etc.
- Replace
ParseReuseTOMLFile -> toml.ParseReuseTOMLFile
- Replace
ParseDep5File -> dep5.ParseDep5File
- Types stay as
ReuseInfo etc. since root re-exports them
covered.go
- No changes (no deps on moved code, only uses stdlib)
Tests
- Each test file moves with its source, changes package name
assertSlice helper is duplicated into each test package (or made a shared test helper)
mkfile helper stays in root test (project_test.go, covered_test.go)
extract_test.go and dep5_test.go each get their own assertSlice
Verification
go build ./...
go test -v -race ./...
go vet ./...
- Confirm 64 tests still pass across all packages
If you need specific details from before exiting plan mode (like exact code snippets, error messages, or content you generated), read the full transcript at: /Users/andrew/.claude/projects/-Users-andrew-code-git-pkgs/e29c14b3-41b4-4a33-a3ba-dc32811240a3.jsonl