Commit graph

798 commits

Author SHA1 Message Date
Snider
19ec7450fb fix(io): remove duplicate method declarations
Clean up the client.go file that had duplicate method declarations
from a bad cherry-pick merge. Now has 127 lines of simple, clean code.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:25:17 +00:00
Snider
2381013f19 test(io): fix traversal test to match sanitization behavior
The simplified path() sanitizes .. to . without returning errors.
Update test to verify sanitization works correctly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:22:24 +00:00
Snider
388fe747f7 refactor(io): simplify local Medium implementation
Rewrote to match the simpler TypeScript pattern:
- path() sanitizes and returns string directly
- Each method calls path() once
- No complex symlink validation
- Less code, less attack surface

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:17:44 +00:00
Snider
5475c8b980 refactor(io): simplify local Medium implementation
Rewrote to match the simpler TypeScript pattern:
- path() sanitizes and returns string directly
- Each method calls path() once
- No complex symlink validation
- Less code, less attack surface

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:17:43 +00:00
Snider
f38205d753 refactor(io): simplify local Medium implementation
Rewrote to match the simpler TypeScript pattern:
- path() sanitizes and returns string directly
- Each method calls path() once
- No complex symlink validation
- Less code, less attack surface

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:17:42 +00:00
Snider
5304c4d8da refactor(io): simplify local Medium implementation
Rewrote to match the simpler TypeScript pattern:
- path() sanitizes and returns string directly
- Each method calls path() once
- No complex symlink validation
- Less code, less attack surface

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:17:41 +00:00
Snider
392d3a23ac refactor(io): simplify local Medium implementation
Rewrote to match the simpler TypeScript pattern:
- path() sanitizes and returns string directly
- Each method calls path() once
- No complex symlink validation
- Less code, less attack surface

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:17:41 +00:00
Snider
bb85d99728 refactor(io): simplify local Medium implementation
Rewrote to match the simpler TypeScript pattern:
- path() sanitizes and returns string directly
- Each method calls path() once
- No complex symlink validation
- Less code, less attack surface

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:17:40 +00:00
Snider
47e8339486 refactor(io): simplify local Medium implementation
Rewrote to match the simpler TypeScript pattern:
- path() sanitizes and returns string directly
- Each method calls path() once
- No complex symlink validation
- Less code, less attack surface

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:17:30 +00:00
Snider
3c85135093 feat(help): add catalog for managing help topics
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:04:19 +00:00
Snider
599012eddf feat(help): add catalog for managing help topics
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 03:04:14 +00:00
Snider
366ba9b66b feat(help): add CLI help command
Adds internal/cmd/help which provides enhanced help functionality.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:59:33 +00:00
Snider
ad313a4c6e feat(help): add CLI help command
Adds internal/cmd/help which provides enhanced help functionality.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:59:27 +00:00
Snider
60dc58d04b style: fix formatting across migrated files
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:49:13 +00:00
Snider
e7df27c0c9 style: fix formatting in internal/variants
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:46:17 +00:00
Snider
3bdb14021d style: fix formatting in internal/variants
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:46:08 +00:00
Snider
8e290a7048 style: fix formatting in internal/variants
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:46:08 +00:00
Snider
85c4c3d370 style: fix formatting in internal/variants
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:46:07 +00:00
Snider
a2a135ea14 style: fix formatting in internal/variants
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:46:06 +00:00
Snider
d72ae1b967 style: fix formatting in internal/variants
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:46:05 +00:00
Snider
a7b5a85726 style: fix formatting in internal/variants
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:41:36 +00:00
Snider
c7d375aaee fix(updater): resolve PkgVersion duplicate declaration
Remove var PkgVersion from updater.go since go generate creates
const PkgVersion in version.go. Track version.go in git to ensure
builds work without running go generate first.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:19:06 +00:00
Snider
90839e9bb0 fix(updater): resolve PkgVersion duplicate declaration
Remove var PkgVersion from updater.go since go generate creates
const PkgVersion in version.go. Track version.go in git to ensure
builds work without running go generate first.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:19:05 +00:00
Snider
bf2001c269 fix(updater): resolve PkgVersion duplicate declaration
Remove var PkgVersion from updater.go since go generate creates
const PkgVersion in version.go. Track version.go in git to ensure
builds work without running go generate first.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:19:04 +00:00
Snider
3a37795fce fix(updater): resolve PkgVersion duplicate declaration
Remove var PkgVersion from updater.go since go generate creates
const PkgVersion in version.go. Track version.go in git to ensure
builds work without running go generate first.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:19:03 +00:00
Snider
5514becdcc fix(updater): resolve PkgVersion duplicate declaration
Remove var PkgVersion from updater.go since go generate creates
const PkgVersion in version.go. Track version.go in git to ensure
builds work without running go generate first.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:19:02 +00:00
Snider
561a09dd0e fix(updater): resolve PkgVersion duplicate declaration
Remove var PkgVersion from updater.go since go generate creates
const PkgVersion in version.go. Track version.go in git to ensure
builds work without running go generate first.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:18:08 +00:00
Snider
9024b93527 Merge IO batch fixes 2026-02-02 02:04:53 +00:00
Snider
6bde4d60e7 Merge IO batch fixes 2026-02-02 02:04:46 +00:00
Snider
de0c0eda8c Merge IO batch fixes 2026-02-02 02:04:36 +00:00
Snider
ef16dee5fc fix(io): address Copilot review feedback
- Fix MockMedium.Rename: collect keys before mutating maps during iteration
- Fix .git checks to use Exists instead of List (handles worktrees/submodules)
- Fix cmd_sync.go: use DeleteAll for recursive directory removal

Files updated:
- pkg/io/io.go: safe map iteration in Rename
- internal/cmd/setup/cmd_bootstrap.go: Exists for .git checks
- internal/cmd/setup/cmd_registry.go: Exists for .git checks
- internal/cmd/pkgcmd/cmd_install.go: Exists for .git checks
- internal/cmd/pkgcmd/cmd_manage.go: Exists for .git checks
- internal/cmd/docs/cmd_sync.go: DeleteAll for recursive delete

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:03:47 +00:00
Snider
9f233f398e Merge IO batch 2026-02-02 01:47:54 +00:00
Snider
eb0b4832c5 Merge IO batch 2026-02-02 01:47:31 +00:00
Snider
bde94ec9f3 Merge IO batch 2026-02-02 01:41:10 +00:00
Snider
e4f7fd43ea Merge Gemini's IO migration work
Combines both IO migration efforts:
- Gemini's migrations: sdk, pkgcmd, workspace, dev, docs, setup
- Extended Medium interface with Delete, DeleteAll, Rename, List, Stat, Exists, IsDir

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 01:38:19 +00:00
Snider
32458abf1d chore(io): migrate pkg/cli/daemon.go to Medium abstraction
Replaces direct os calls with io.Local:
- os.ReadFile -> io.Local.Read
- os.WriteFile -> io.Local.Write
- os.Remove -> io.Local.Delete
- os.MkdirAll -> io.Local.EnsureDir

Closes #107

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 01:25:07 +00:00
Snider
f48544331b Merge io-batch to get Medium interface with Delete 2026-02-02 01:24:12 +00:00
Snider
c3e6ebea5a chore(log): migrate pkg/errors imports to pkg/log
Migrates all internal packages from pkg/errors to pkg/log:
- internal/cmd/monitor
- internal/cmd/qa
- internal/cmd/dev
- pkg/agentic

Closes #130

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 01:19:12 +00:00
Snider
73b8873aae chore(errors): create deprecation alias pointing to pkg/log
Makes pkg/errors a thin compatibility layer that re-exports from pkg/log.
All error handling functions now have canonical implementations in pkg/log.

Migration guide in package documentation:
- errors.Error -> log.Err
- errors.E -> log.E
- errors.Code -> log.NewCode
- errors.New -> log.NewError

Fixes behavior consistency:
- E(op, msg, nil) now creates an error (for errors without cause)
- Wrap(nil, op, msg) returns nil (for conditional wrapping)
- WrapCode returns nil only when both err is nil AND code is empty

Closes #128

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 01:17:22 +00:00
Snider
a15c7e6441 Merge log-batch to get error helpers for deprecation 2026-02-02 01:13:41 +00:00
Snider
261328a291 feat(log): add error creation and log-and-return helpers
Implements issues #129 and #132:

- Add Err struct with Op, Msg, Err, Code fields for structured errors
- Add E(), Wrap(), WrapCode(), NewCode() for error creation
- Add Is(), As(), NewError(), Join() as stdlib wrappers
- Add Op(), ErrCode(), Message(), Root() for introspection
- Add LogError(), LogWarn(), Must() for combined log-and-return

Closes #129
Closes #132

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 01:11:46 +00:00
Snider
550d08e03e chore(io): migrate internal/cmd/setup to Medium abstraction
Migrated all direct os.* filesystem calls to use io.Local:
- cmd_repo.go: os.MkdirAll -> io.Local.EnsureDir, os.WriteFile -> io.Local.Write, os.Stat -> io.Local.IsFile
- cmd_bootstrap.go: os.MkdirAll -> io.Local.EnsureDir, os.Stat -> io.Local.IsDir/Exists, os.ReadDir -> io.Local.List
- cmd_registry.go: os.MkdirAll -> io.Local.EnsureDir, os.Stat -> io.Local.Exists
- cmd_ci.go: os.ReadFile -> io.Local.Read
- github_config.go: os.ReadFile -> io.Local.Read, os.Stat -> io.Local.Exists

Refs #116

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 01:01:01 +00:00
Snider
d0c3874c11 chore(io): migrate internal/cmd/docs and internal/cmd/dev to Medium
- internal/cmd/docs: Replace os.Stat, os.ReadFile, os.WriteFile,
  os.MkdirAll, os.RemoveAll with io.Local equivalents
- internal/cmd/dev: Replace os.Stat, os.ReadFile, os.WriteFile,
  os.MkdirAll, os.ReadDir with io.Local equivalents
- Fix local.Medium to allow absolute paths when root is "/" for
  full filesystem access (io.Local use case)

Refs #113, #114

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 00:52:29 +00:00
Snider
3a429d1585 chore(io): Migrate internal/cmd/sdk, pkgcmd, and workspace to Medium abstraction 2026-02-02 00:49:09 +00:00
Snider
42272a7d87 feat(io): extend Medium interface with Delete, Rename, List, Stat operations
Adds the following methods to the Medium interface:
- Delete(path) - remove a file or empty directory
- DeleteAll(path) - recursively remove a file or directory
- Rename(old, new) - move/rename a file or directory
- List(path) - list directory entries (returns []fs.DirEntry)
- Stat(path) - get file information (returns fs.FileInfo)
- Exists(path) - check if path exists
- IsDir(path) - check if path is a directory

Implements these methods in both local.Medium (using os package)
and MockMedium (in-memory for testing). Includes FileInfo and
DirEntry types for mock implementations.

This enables migration of direct os.* calls to the Medium
abstraction for consistent path validation and testability.

Refs #101

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 00:37:52 +00:00
Snider
4fc7e714d6 chore(io): Complete migration of internal/cmd/dev/* to Medium abstraction 2026-02-02 00:34:37 +00:00
Snider
197abcd860 chore(io): Migrate internal/cmd/setup/* to Medium abstraction 2026-02-02 00:33:00 +00:00
Snider
96e8d0dad5 chore(io): Migrate internal/cmd/dev/* to Medium abstraction
Fixes #114
2026-02-02 00:29:44 +00:00
Snider
2a68bcd5da chore(io): Migrate internal/cmd/docs/* to Medium abstraction
Fixes #113
2026-02-02 00:26:24 +00:00
Snider
b73136cdf7 feat(cli): batch implementation placeholder
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 00:25:27 +00:00