| phase | implementation |
|---|---|
| title | Agent Manager Package - Implementation Guide |
| feature | agent-manager |
| description | Technical implementation notes for the @ai-devkit/agent-manager package |
- Node.js >= 16.0.0
- npm (workspaces enabled in root)
- TypeScript 5.3+
- Package directory created at
packages/agent-manager/ - Run
npm installfrom monorepo root to link workspace - Build with
npm run buildfrompackages/agent-manager/
src/
├── index.ts # Main barrel export
├── AgentManager.ts # Core orchestrator class
├── adapters/
│ ├── index.ts # Adapter barrel
│ ├── AgentAdapter.ts # Interface + types + enums
│ └── ClaudeCodeAdapter.ts # Claude Code detection
├── terminal/
│ ├── index.ts # Terminal barrel
│ └── TerminalFocusManager.ts # macOS terminal focus
└── utils/
├── index.ts # Utils barrel
├── process.ts # Process detection
└── file.ts # File reading helpers
| CLI Path | Agent Manager Path |
|---|---|
src/lib/AgentManager.ts |
src/AgentManager.ts |
src/lib/adapters/AgentAdapter.ts |
src/adapters/AgentAdapter.ts |
src/lib/adapters/ClaudeCodeAdapter.ts |
src/adapters/ClaudeCodeAdapter.ts |
src/lib/TerminalFocusManager.ts |
src/terminal/TerminalFocusManager.ts |
src/util/process.ts |
src/utils/process.ts |
src/util/file.ts |
src/utils/file.ts |
ClaudeCodeAdapter.ts:../../util/process→../utils/process,../../util/file→../utils/fileprocess.ts:../lib/adapters/AgentAdapter→../adapters/AgentAdapterTerminalFocusManager.ts:../util/process→../utils/process
- Adapter pattern: All agent detection goes through
AgentAdapterinterface - Barrel exports: Each directory has an
index.tsfor clean imports - Zero dependencies: Only Node.js built-ins (fs, path, child_process, util)
- Graceful degradation: Adapter failures don't crash the system — partial results returned
- AgentManager catches adapter errors individually, logs warnings, returns partial results
- File utilities return empty arrays/null on read failures
- Process utilities return empty results when
ps/lsofcommands fail - TerminalFocusManager returns
false/nullwhen terminal can't be found or focused
Completed on February 25, 2026 in worktree feature-agent-manager.
- Scaffolded
packages/agent-manager/withpackage.json,tsconfig.json,project.json,jest.config.js,.eslintrc.json - Extracted source files from CLI package into:
src/AgentManager.tssrc/adapters/AgentAdapter.tssrc/adapters/ClaudeCodeAdapter.tssrc/terminal/TerminalFocusManager.tssrc/utils/process.tssrc/utils/file.ts
- Applied import-path updates defined in design/planning docs
- Added barrel exports:
src/index.tssrc/adapters/index.tssrc/terminal/index.tssrc/utils/index.ts
- Extracted and fixed test imports for:
src/__tests__/AgentManager.test.tssrc/__tests__/adapters/ClaudeCodeAdapter.test.ts
Validation:
npm run lintpassesnpm run typecheckpassesnpm run buildpassesnpm run testpasses (38 tests)
Data-model refinements (February 25, 2026):
- Normalized
AgentTypeto code-style values:claude,gemini_cli,codex,other - Removed display-oriented contract elements from package API:
- Removed
STATUS_CONFIGandStatusConfig - Removed
AgentInfo.statusDisplay - Removed
AgentInfo.lastActiveDisplay
- Removed
- Updated
ClaudeCodeAdapterto return data-only fields (status,lastActive,summary) without UI formatting - Replaced hardcoded string literals with enums where appropriate:
- Added
TerminalTypeenum for terminal location/focus flow - Added
SessionEntryTypeenum inClaudeCodeAdapterstatus logic
- Added
- Overall status: Mostly aligned
- Requirements/design coverage: package scaffold, extracted components, API surface, and validations are implemented as specified
- Backward-compatibility non-goal respected: CLI behavior/source was not modified in this feature branch
packages/agent-manager/package.json- Matches package naming/version/scripts/engine constraints from requirements
- Uses zero runtime dependencies (only devDependencies)
packages/agent-manager/tsconfig.json,project.json,jest.config.js,.eslintrc.json- Conform to monorepo conventions and planned targets (build/test/lint/typecheck)
packages/agent-manager/src/AgentManager.ts- Adapter orchestration and status-based sorting match design
packages/agent-manager/src/adapters/AgentAdapter.ts- Types and interface extracted as designed
packages/agent-manager/src/adapters/ClaudeCodeAdapter.ts- Core detection/session/status logic extracted with planned import-path updates
packages/agent-manager/src/terminal/TerminalFocusManager.ts- Terminal focus logic extracted with planned import-path updates
packages/agent-manager/src/utils/process.ts,src/utils/file.ts- Utility extraction and API signatures match design intent
packages/agent-manager/src/index.tsand barrel files- Public API exports include core classes/types plus terminal and utils as designed
packages/agent-manager/src/__tests__/...- Test files extracted and passing in package context
- Resolved (February 25, 2026): Claude adapter tests now mock process/session/history dependencies and no longer rely on local
~/.claudestate orpsavailability. - Resolved (February 25, 2026): Explicit
anywarnings in extracted runtime code were removed by tightening adapter and utility generic typings.
- No major implementation/design mismatch detected.
- Proceed to Phase 8 (Code Review).
-
Resolved: tmux focus command previously used shell interpolation for the target identifier.
- Updated
TerminalFocusManager.focusTmuxPane()to useexecFile('tmux', ['switch-client', '-t', identifier])to avoid shell command injection paths.
- Updated
-
Non-blocking follow-up: coverage threshold enforcement currently depends on running Jest with coverage enabled.
- Suggested project policy: require
npm run test:coverage(or equivalent) in CI for this package.
- Suggested project policy: require
- No remaining blocking correctness or security issues in
packages/agent-manager. - Feature is ready for commit/PR from a code review perspective.
- No new blocking issues after
AgentTypenormalization and display-field removal. - Compatibility note: this is an intentional contract change for package consumers (type literals and removed display fields/constants).
- Requirements/design docs updated to describe the data-first API boundary.
- Added explicit migration notes for callers formatting status/time displays externally.