@sugar-crash-studios/vibe-forge 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/clear-attention.md +63 -0
- package/.claude/commands/compact-context.md +52 -0
- package/.claude/commands/configure-vcs.md +102 -0
- package/.claude/commands/forge.md +171 -0
- package/.claude/commands/need-help.md +77 -0
- package/.claude/commands/update-status.md +64 -0
- package/.claude/commands/worker-loop.md +106 -0
- package/.claude/hooks/worker-loop.js +198 -0
- package/.claude/scripts/setup-worker-loop.sh +45 -0
- package/.claude/settings.local.json +46 -0
- package/LICENSE +21 -0
- package/README.md +238 -0
- package/agents/aegis/personality.md +294 -0
- package/agents/anvil/personality.md +276 -0
- package/agents/architect/personality.md +258 -0
- package/agents/crucible/personality.md +360 -0
- package/agents/ember/personality.md +291 -0
- package/agents/forge-master/capabilities.md +144 -0
- package/agents/forge-master/context-template.md +128 -0
- package/agents/forge-master/personality.md +138 -0
- package/agents/furnace/personality.md +340 -0
- package/agents/herald/personality.md +247 -0
- package/agents/loki/personality.md +108 -0
- package/agents/oracle/personality.md +283 -0
- package/agents/pixel/personality.md +113 -0
- package/agents/planning-hub/personality.md +320 -0
- package/agents/scribe/personality.md +251 -0
- package/agents/temper/personality.md +218 -0
- package/bin/cli.js +375 -0
- package/bin/dashboard/api/agents.js +333 -0
- package/bin/dashboard/api/dispatch.js +483 -0
- package/bin/dashboard/api/tasks.js +416 -0
- package/bin/dashboard/frontend/index.html +13 -0
- package/bin/dashboard/frontend/package.json +16 -0
- package/bin/dashboard/frontend/src/App.svelte +222 -0
- package/bin/dashboard/frontend/src/app.css +1777 -0
- package/bin/dashboard/frontend/src/lib/components/AgentCard.svelte +60 -0
- package/bin/dashboard/frontend/src/lib/components/AgentsPanel.svelte +57 -0
- package/bin/dashboard/frontend/src/lib/components/DispatchModal.svelte +180 -0
- package/bin/dashboard/frontend/src/lib/components/Footer.svelte +33 -0
- package/bin/dashboard/frontend/src/lib/components/Header.svelte +84 -0
- package/bin/dashboard/frontend/src/lib/components/IssueCard.svelte +33 -0
- package/bin/dashboard/frontend/src/lib/components/IssuesPanel.svelte +73 -0
- package/bin/dashboard/frontend/src/lib/components/KeyboardShortcutsModal.svelte +108 -0
- package/bin/dashboard/frontend/src/lib/components/MobileTabs.svelte +52 -0
- package/bin/dashboard/frontend/src/lib/components/NotificationCard.svelte +60 -0
- package/bin/dashboard/frontend/src/lib/components/NotificationsPanel.svelte +44 -0
- package/bin/dashboard/frontend/src/lib/components/TaskCard.svelte +63 -0
- package/bin/dashboard/frontend/src/lib/components/TasksPanel.svelte +82 -0
- package/bin/dashboard/frontend/src/lib/components/Toast.svelte +45 -0
- package/bin/dashboard/frontend/src/lib/stores/agents.js +34 -0
- package/bin/dashboard/frontend/src/lib/stores/issues.js +54 -0
- package/bin/dashboard/frontend/src/lib/stores/notifications.js +48 -0
- package/bin/dashboard/frontend/src/lib/stores/tasks.js +63 -0
- package/bin/dashboard/frontend/src/lib/stores/theme.js +33 -0
- package/bin/dashboard/frontend/src/lib/stores/toast.js +35 -0
- package/bin/dashboard/frontend/src/lib/stores/ui.js +25 -0
- package/bin/dashboard/frontend/src/lib/stores/voice.js +275 -0
- package/bin/dashboard/frontend/src/lib/stores/websocket.js +295 -0
- package/bin/dashboard/frontend/src/lib/utils/api.js +101 -0
- package/bin/dashboard/frontend/src/lib/utils/formatters.js +54 -0
- package/bin/dashboard/frontend/src/main.js +9 -0
- package/bin/dashboard/frontend/svelte.config.js +5 -0
- package/bin/dashboard/frontend/vite.config.js +20 -0
- package/bin/dashboard/public/assets/index-DnfVj9Ce.css +1 -0
- package/bin/dashboard/public/assets/index-Ze5h0kXQ.js +2 -0
- package/bin/dashboard/public/index.html +14 -0
- package/bin/dashboard/server.js +566 -0
- package/bin/forge-daemon.sh +463 -0
- package/bin/forge-setup.sh +645 -0
- package/bin/forge-spawn.sh +164 -0
- package/bin/forge.cmd +83 -0
- package/bin/forge.sh +533 -0
- package/bin/lib/agents.sh +177 -0
- package/bin/lib/colors.sh +44 -0
- package/bin/lib/config.sh +347 -0
- package/bin/lib/constants.sh +241 -0
- package/bin/lib/daemon/display.sh +128 -0
- package/bin/lib/daemon/notifications.sh +263 -0
- package/bin/lib/daemon/routing.sh +77 -0
- package/bin/lib/daemon/state.sh +115 -0
- package/bin/lib/daemon/sync.sh +95 -0
- package/bin/lib/database.sh +310 -0
- package/bin/lib/heimdall-setup.js +113 -0
- package/bin/lib/heimdall.js +265 -0
- package/bin/lib/json.sh +264 -0
- package/bin/lib/terminal.js +451 -0
- package/bin/lib/util.sh +126 -0
- package/bin/lib/vcs.js +349 -0
- package/config/agent-manifest.yaml +203 -0
- package/config/agents.json +168 -0
- package/config/task-template.md +159 -0
- package/config/task-types.yaml +106 -0
- package/context/agent-status/aegis.json +7 -0
- package/context/agent-status/anvil.json +7 -0
- package/context/agent-status/architect.json +7 -0
- package/context/agent-status/crucible.json +7 -0
- package/context/agent-status/ember.json +7 -0
- package/context/agent-status/furnace.json +7 -0
- package/context/agent-status/loki.json +7 -0
- package/context/agent-status/oracle.json +7 -0
- package/context/agent-status/pixel.json +7 -0
- package/context/agent-status/planning-hub.json +7 -0
- package/context/agent-status/scribe.json +7 -0
- package/context/agent-status/temper.json +7 -0
- package/context/feature-brainstorm.md +426 -0
- package/context/forge-state.yaml +19 -0
- package/context/modern-conventions.md +129 -0
- package/context/project-context-template.md +122 -0
- package/context/project-context.md +122 -0
- package/docs/TODO.md +150 -0
- package/docs/agents.md +409 -0
- package/docs/architecture/decisions/ADR-001-daemon-modularization.md +122 -0
- package/docs/architecture/vibe-lab-integration.md +684 -0
- package/docs/architecture.md +194 -0
- package/docs/bmad-gap-analysis-2026-03-31.md +444 -0
- package/docs/cleanup-workflow.md +329 -0
- package/docs/commands.md +451 -0
- package/docs/dashboard-mockup.html +989 -0
- package/docs/getting-started.md +261 -0
- package/docs/integration/forge-ownership-policy.md +112 -0
- package/docs/npm-publishing.md +132 -0
- package/docs/roadmap-2026.md +519 -0
- package/docs/security.md +144 -0
- package/docs/wireframes/dashboard-mvp.md +1164 -0
- package/docs/workflows/README.md +32 -0
- package/docs/workflows/azure-devops.md +108 -0
- package/docs/workflows/bitbucket.md +104 -0
- package/docs/workflows/git-only.md +130 -0
- package/docs/workflows/gitea.md +168 -0
- package/docs/workflows/github.md +103 -0
- package/docs/workflows/gitlab.md +105 -0
- package/docs/workflows.md +454 -0
- package/package.json +73 -0
- package/tasks/completed/ARCH-001-duplicate-agent-config.md +121 -0
- package/tasks/completed/ARCH-002-mixed-bash-node-implementation.md +88 -0
- package/tasks/completed/ARCH-003-worker-loop-hook-duplication.md +77 -0
- package/tasks/completed/ARCH-009-test-organization.md +78 -0
- package/tasks/completed/ARCH-011-jq-vs-nodejs-json.md +94 -0
- package/tasks/completed/ARCH-012-tmp-files-in-root.md +71 -0
- package/tasks/completed/ARCH-013-exit-code-constants.md +65 -0
- package/tasks/completed/ARCH-014-sed-incompatibility.md +96 -0
- package/tasks/completed/ARCH-015-docs-todo-tracking.md +83 -0
- package/tasks/completed/BUG-dash-001-tasks-filter-error.md +31 -0
- package/tasks/completed/BUG-dash-002-agents-unknown.md +41 -0
- package/tasks/completed/CLEAN-001.md +38 -0
- package/tasks/completed/CLEAN-002.md +43 -0
- package/tasks/completed/CLEAN-003.md +47 -0
- package/tasks/completed/CLEAN-004.md +56 -0
- package/tasks/completed/CLEAN-005.md +75 -0
- package/tasks/completed/CLEAN-006.md +47 -0
- package/tasks/completed/CLEAN-007.md +34 -0
- package/tasks/completed/CLEAN-008.md +49 -0
- package/tasks/completed/CLEAN-012.md +58 -0
- package/tasks/completed/CLEAN-013.md +45 -0
- package/tasks/completed/FEATURE-001a-dashboard-wireframes.md +162 -0
- package/tasks/completed/IMPL-007a-daemon-notifications-module.md +82 -0
- package/tasks/completed/IMPL-007b-daemon-sync-module.md +71 -0
- package/tasks/completed/IMPL-007c-daemon-state-module.md +80 -0
- package/tasks/completed/IMPL-007d-daemon-routing-module.md +77 -0
- package/tasks/completed/IMPL-007e-daemon-display-module.md +77 -0
- package/tasks/completed/IMPL-007f-daemon-integration.md +124 -0
- package/tasks/completed/PLAT-1-heimdall.md +420 -0
- package/tasks/completed/SEC-001-sql-injection-fix.md +58 -0
- package/tasks/completed/SEC-002-notification-injection-fix.md +45 -0
- package/tasks/completed/SEC-003-eval-injection-fix.md +54 -0
- package/tasks/completed/SEC-004-pid-race-condition-fix.md +49 -0
- package/tasks/completed/SEC-005-worker-loop-path-fix.md +51 -0
- package/tasks/completed/SEC-006-eval-agent-names.md +55 -0
- package/tasks/completed/SEC-007-spawn-escaping.md +67 -0
- package/tasks/completed/TASK-DASH-001-server-infrastructure.md +185 -0
- package/tasks/completed/TASK-anvil-001-dashboard-frontend.md +133 -0
- package/tasks/completed/review-bmad-aegis.md +89 -0
- package/tasks/completed/review-bmad-anvil.md +80 -0
- package/tasks/completed/review-bmad-crucible.md +81 -0
- package/tasks/completed/review-bmad-ember.md +90 -0
- package/tasks/completed/review-bmad-furnace.md +79 -0
- package/tasks/completed/review-bmad-pixel.md +82 -0
- package/tasks/completed/review-bmad-scribe.md +92 -0
- package/tasks/completed/review-bmad-sentinel.md +83 -0
- package/tasks/pending/ARCH-004-git-bash-detection-duplication.md +72 -0
- package/tasks/pending/ARCH-005-missing-src-directory.md +95 -0
- package/tasks/pending/ARCH-006-task-template-location.md +64 -0
- package/tasks/pending/ARCH-008-forge-master-vs-hub.md +81 -0
- package/tasks/pending/ARCH-010-missing-index-files.md +84 -0
- package/tasks/pending/CLEAN-009.md +31 -0
- package/tasks/pending/CLEAN-010.md +30 -0
- package/tasks/pending/CLEAN-011.md +30 -0
- package/tasks/pending/CLEAN-014.md +32 -0
- package/tasks/pending/DESIGN-dash-001-layout-review.md +45 -0
- package/tasks/pending/FEATURE-001-dashboard-mvp.md +268 -0
- package/tasks/review/ARCH-007-daemon-monolith.md +162 -0
- package/tasks/review/bmad-review-aegis.md +349 -0
- package/tasks/review/bmad-review-anvil.md +259 -0
- package/tasks/review/bmad-review-crucible.md +277 -0
- package/tasks/review/bmad-review-ember.md +307 -0
- package/tasks/review/bmad-review-furnace.md +285 -0
- package/tasks/review/bmad-review-pixel.md +329 -0
- package/tasks/review/bmad-review-scribe.md +361 -0
- package/tasks/review/bmad-review-sentinel.md +242 -0
- package/tasks/review/task-001.md +78 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ARCH-001
|
|
3
|
+
title: "Consolidate duplicate agent configuration sources"
|
|
4
|
+
type: architecture
|
|
5
|
+
priority: high
|
|
6
|
+
assigned_to: architect
|
|
7
|
+
created_at: 2026-01-15T17:00:00Z
|
|
8
|
+
created_by: architect-review
|
|
9
|
+
completed_at: 2026-01-16T10:30:00Z
|
|
10
|
+
completed_by: architect
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
Agent configuration is defined in three separate locations with overlapping but inconsistent data, creating maintenance burden and risk of drift.
|
|
15
|
+
|
|
16
|
+
## Current State
|
|
17
|
+
Agent definitions exist in:
|
|
18
|
+
|
|
19
|
+
1. **config/agents.json** - JSON format with name, icon, role, aliases, type, personality_file, tab_color
|
|
20
|
+
2. **config/agent-manifest.yaml** - YAML format with much richer data (principles, communication_style, task_types, terminal_tab, description, source)
|
|
21
|
+
3. **bin/lib/constants.sh** - Bash fallback arrays (VALID_AGENTS, AGENT_ALIASES, AGENT_DISPLAY_NAMES, AGENT_ROLES, AGENT_PERSONALITY_FILES, AGENT_ICONS, AGENT_TAB_COLORS)
|
|
22
|
+
|
|
23
|
+
Problems:
|
|
24
|
+
- `agent-manifest.yaml` has "forge-master" vs `agents.json` has "hub" naming
|
|
25
|
+
- `agent-manifest.yaml` has extra agents (sage, oracle, quartermaster) not in `agents.json`
|
|
26
|
+
- Rich data in manifest (principles, communication_style) is not being used
|
|
27
|
+
- Bash fallbacks duplicate JSON, risking drift
|
|
28
|
+
|
|
29
|
+
## Proposed State
|
|
30
|
+
Single source of truth with clear hierarchy:
|
|
31
|
+
|
|
32
|
+
1. **config/agents.json** - Primary machine-readable configuration
|
|
33
|
+
- All agent data consolidated here
|
|
34
|
+
- Used by bash scripts via `load_agents_from_json()`
|
|
35
|
+
- Used by Node.js scripts directly
|
|
36
|
+
|
|
37
|
+
2. **config/agent-manifest.yaml** - DEPRECATED or converted
|
|
38
|
+
- Either delete (migrate data to agents.json)
|
|
39
|
+
- Or keep as human documentation only, clearly marked as non-normative
|
|
40
|
+
|
|
41
|
+
3. **bin/lib/constants.sh** - Minimal fallback
|
|
42
|
+
- Keep only as emergency fallback for environments without Node.js
|
|
43
|
+
- Auto-generate from agents.json during release process
|
|
44
|
+
- Or remove entirely if Node.js is a hard requirement
|
|
45
|
+
|
|
46
|
+
## Affected Files
|
|
47
|
+
- G:\dev\vibe-forge\config\agents.json
|
|
48
|
+
- G:\dev\vibe-forge\config\agent-manifest.yaml
|
|
49
|
+
- G:\dev\vibe-forge\bin\lib\constants.sh
|
|
50
|
+
- G:\dev\vibe-forge\bin\lib\config.sh (load_agents_from_json)
|
|
51
|
+
|
|
52
|
+
## Migration/Remediation Steps
|
|
53
|
+
1. Decide which extra agents to include (sage, oracle, quartermaster, or delete)
|
|
54
|
+
2. Add missing fields from agent-manifest.yaml to agents.json (principles, communication_style, etc.)
|
|
55
|
+
3. Either delete agent-manifest.yaml or add clear header marking it as documentation-only
|
|
56
|
+
4. Evaluate whether bash fallback in constants.sh is needed
|
|
57
|
+
5. If keeping fallback, create build script to auto-generate from agents.json
|
|
58
|
+
6. Update tests to verify single source of truth
|
|
59
|
+
|
|
60
|
+
## Acceptance Criteria
|
|
61
|
+
- [x] Single authoritative agent configuration source
|
|
62
|
+
- [x] No duplicate agent definitions across files
|
|
63
|
+
- [x] Clear documentation on which file is source of truth
|
|
64
|
+
- [x] Existing functionality unchanged
|
|
65
|
+
- [x] All tests passing
|
|
66
|
+
|
|
67
|
+
## Resolution
|
|
68
|
+
|
|
69
|
+
### Decision Made
|
|
70
|
+
Established `config/agents.json` as the SINGLE SOURCE OF TRUTH for agent configuration. The other files serve specific purposes:
|
|
71
|
+
|
|
72
|
+
- **agents.json**: Primary, authoritative configuration (used by code)
|
|
73
|
+
- **agent-manifest.yaml**: Non-normative documentation with rich personality info
|
|
74
|
+
- **constants.sh**: Fallback defaults for environments without Node.js
|
|
75
|
+
|
|
76
|
+
### Changes Implemented
|
|
77
|
+
|
|
78
|
+
1. **Enhanced agents.json (v1.1.0)**
|
|
79
|
+
- Added `_comment` field documenting it as source of truth
|
|
80
|
+
- Added `version` field for tracking schema changes
|
|
81
|
+
- Added fields from manifest: `persistent`, `terminal_tab`, `description`, `task_types`
|
|
82
|
+
- Standardized on "hub" as canonical name (with "forge-master" alias)
|
|
83
|
+
- Changed hub icon from fire to forge hammer to match orchestrator role
|
|
84
|
+
- Added `architect` agent (consolidating sage/oracle/quartermaster functionality)
|
|
85
|
+
|
|
86
|
+
2. **Updated agent-manifest.yaml**
|
|
87
|
+
- Added prominent header marking file as DOCUMENTATION ONLY / NON-NORMATIVE
|
|
88
|
+
- Added `_status: documentation-only` field
|
|
89
|
+
- Preserved rich personality data as reference for personality file authors
|
|
90
|
+
|
|
91
|
+
3. **Updated constants.sh**
|
|
92
|
+
- Added `architect` agent to all arrays
|
|
93
|
+
- Added sync date comments to remind maintainers to check agents.json
|
|
94
|
+
- Reordered arrays to match agents.json ordering (hub first as core)
|
|
95
|
+
- Updated hub icon to forge hammer
|
|
96
|
+
|
|
97
|
+
4. **Created architect agent**
|
|
98
|
+
- New directory: `agents/architect/`
|
|
99
|
+
- New personality file: `agents/architect/personality.md`
|
|
100
|
+
- Consolidates system architect role (similar to sage from manifest)
|
|
101
|
+
|
|
102
|
+
5. **Updated README.md**
|
|
103
|
+
- Added Architect to specialists list
|
|
104
|
+
- Updated project structure to show agents.json as roster source
|
|
105
|
+
|
|
106
|
+
### Files Modified
|
|
107
|
+
- `config/agents.json` - Enhanced with new fields, architect agent, version
|
|
108
|
+
- `config/agent-manifest.yaml` - Added documentation-only header
|
|
109
|
+
- `bin/lib/constants.sh` - Added architect, sync date comments
|
|
110
|
+
- `README.md` - Updated structure and agent list
|
|
111
|
+
- `agents/architect/personality.md` - Created
|
|
112
|
+
|
|
113
|
+
### Tests
|
|
114
|
+
All 80 tests passing:
|
|
115
|
+
- 4 test suites (cli, constants, config, agents)
|
|
116
|
+
- No regressions
|
|
117
|
+
|
|
118
|
+
### Future Considerations
|
|
119
|
+
- Consider auto-generating constants.sh from agents.json in build process
|
|
120
|
+
- Consider a validation script to check sync between files
|
|
121
|
+
- Rich personality data (principles, communication_style) kept in manifest for now - could be moved to personality files
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ARCH-002
|
|
3
|
+
title: "Standardize on single implementation language"
|
|
4
|
+
type: architecture
|
|
5
|
+
priority: medium
|
|
6
|
+
assigned_to: architect
|
|
7
|
+
created_at: 2026-01-15T17:00:00Z
|
|
8
|
+
created_by: architect-review
|
|
9
|
+
completed_at: 2026-01-16T11:00:00Z
|
|
10
|
+
completed_by: architect
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
The codebase uses a mix of Bash and Node.js for similar functionality, increasing maintenance burden and complexity. Since Node.js is already a requirement (Node 16+), consider standardizing on Node.js.
|
|
15
|
+
|
|
16
|
+
## Current State (Reassessed)
|
|
17
|
+
Implementation split:
|
|
18
|
+
|
|
19
|
+
**Bash (bin/*.sh, bin/lib/*.sh):**
|
|
20
|
+
- forge.sh - Main entry point
|
|
21
|
+
- forge-setup.sh - Setup/init
|
|
22
|
+
- forge-spawn.sh - Terminal spawning
|
|
23
|
+
- forge-daemon.sh - Background daemon
|
|
24
|
+
- lib/colors.sh - Color output
|
|
25
|
+
- lib/constants.sh - Constants
|
|
26
|
+
- lib/config.sh - Configuration loading
|
|
27
|
+
- lib/agents.sh - Agent resolution
|
|
28
|
+
- lib/database.sh - SQLite operations
|
|
29
|
+
- lib/json.sh - JSON utilities (Node.js-based)
|
|
30
|
+
- lib/util.sh - Utility functions
|
|
31
|
+
|
|
32
|
+
**Node.js (bin/*.js, bin/lib/*.js):**
|
|
33
|
+
- cli.js - npx entry point
|
|
34
|
+
- terminal.js - Cross-platform terminal detection
|
|
35
|
+
|
|
36
|
+
**Bash calling Node.js:**
|
|
37
|
+
- config.sh uses Node.js for JSON parsing
|
|
38
|
+
- json.sh provides unified JSON operations via Node.js
|
|
39
|
+
- All jq usage has been removed
|
|
40
|
+
|
|
41
|
+
## Analysis Findings
|
|
42
|
+
|
|
43
|
+
**Good news:** The task description was outdated. The codebase has already:
|
|
44
|
+
1. Removed all jq dependencies
|
|
45
|
+
2. Unified JSON handling via `bin/lib/json.sh` using Node.js
|
|
46
|
+
3. Established clear separation of concerns
|
|
47
|
+
|
|
48
|
+
**Current architecture is intentional:**
|
|
49
|
+
- Bash for orchestration (process management, file watching, terminal control)
|
|
50
|
+
- Node.js for cross-platform utilities (terminal detection, JSON parsing)
|
|
51
|
+
- This hybrid approach is appropriate for a shell orchestration tool
|
|
52
|
+
|
|
53
|
+
## Decision: Option B - Document and Maintain Hybrid
|
|
54
|
+
|
|
55
|
+
After analysis, Option B (keep hybrid, document clearly) is the better choice because:
|
|
56
|
+
|
|
57
|
+
1. **Bash is appropriate for shell orchestration** - Vibe Forge manages terminals and processes, which are inherently shell operations
|
|
58
|
+
2. **Full migration is high risk/effort** - Would require rewriting ~70KB of tested Bash code
|
|
59
|
+
3. **Current split is clean** - Clear boundaries between Bash (orchestration) and Node.js (cross-platform utilities)
|
|
60
|
+
4. **jq dependency already removed** - The main inconsistency (JSON handling) is already resolved
|
|
61
|
+
|
|
62
|
+
## Changes Implemented
|
|
63
|
+
|
|
64
|
+
1. **Created docs/architecture.md** - Comprehensive documentation of:
|
|
65
|
+
- Language strategy and rationale
|
|
66
|
+
- Directory structure
|
|
67
|
+
- Data flow diagram
|
|
68
|
+
- JSON handling patterns
|
|
69
|
+
- Future migration considerations
|
|
70
|
+
|
|
71
|
+
2. **Verified jq removal** - Confirmed all JSON operations use json.sh/Node.js
|
|
72
|
+
|
|
73
|
+
## Acceptance Criteria
|
|
74
|
+
- [x] Decision documented on language strategy - See docs/architecture.md
|
|
75
|
+
- [x] Consistent JSON parsing approach - All uses json.sh (Node.js-based)
|
|
76
|
+
- [x] Windows compatibility maintained - Git Bash + forge.cmd wrapper
|
|
77
|
+
- [x] All tests passing - 80 tests pass
|
|
78
|
+
- [N/A] If migrating: at least one component fully migrated - Decided not to migrate
|
|
79
|
+
|
|
80
|
+
## Files Modified
|
|
81
|
+
- `docs/architecture.md` - Created (new architectural documentation)
|
|
82
|
+
|
|
83
|
+
## Future Work (Out of Scope)
|
|
84
|
+
If full Node.js migration is desired later:
|
|
85
|
+
1. Create `src/` directory structure
|
|
86
|
+
2. Migrate incrementally: config -> agents -> database -> daemon -> CLI
|
|
87
|
+
3. Keep Bash wrappers during transition
|
|
88
|
+
4. See migration path in docs/architecture.md
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ARCH-003
|
|
3
|
+
title: "Remove duplicate worker-loop hook implementations"
|
|
4
|
+
type: architecture
|
|
5
|
+
priority: medium
|
|
6
|
+
assigned_to: architect
|
|
7
|
+
created_at: 2026-01-15T17:00:00Z
|
|
8
|
+
created_by: architect-review
|
|
9
|
+
completed_at: 2026-01-16T00:00:00Z
|
|
10
|
+
completed_by: furnace
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
Worker loop stop hook is implemented in both Bash and Node.js with nearly identical logic, creating maintenance burden.
|
|
15
|
+
|
|
16
|
+
## Current State
|
|
17
|
+
Two implementations exist:
|
|
18
|
+
- `.claude/hooks/worker-loop.sh` - Bash implementation
|
|
19
|
+
- `.claude/hooks/worker-loop.js` - Node.js implementation
|
|
20
|
+
|
|
21
|
+
Both implement the same logic:
|
|
22
|
+
1. Check for state file or config-based activation
|
|
23
|
+
2. Count pending/needs-changes tasks
|
|
24
|
+
3. Decide whether to block exit or allow
|
|
25
|
+
4. Output JSON with decision
|
|
26
|
+
|
|
27
|
+
The `.claude/settings.local.json` uses the Node.js version:
|
|
28
|
+
```json
|
|
29
|
+
"hooks": {
|
|
30
|
+
"Stop": [{ "command": "node .claude/hooks/worker-loop.js" }]
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Problems:
|
|
35
|
+
- Duplicate code to maintain
|
|
36
|
+
- Logic could drift between implementations
|
|
37
|
+
- Confusion about which is canonical
|
|
38
|
+
- Bash version has path issues noted in SEC-005
|
|
39
|
+
|
|
40
|
+
## Proposed State
|
|
41
|
+
Single implementation:
|
|
42
|
+
|
|
43
|
+
1. **Keep Node.js only** (recommended)
|
|
44
|
+
- Already used in settings.local.json
|
|
45
|
+
- Better cross-platform compatibility
|
|
46
|
+
- Easier JSON handling
|
|
47
|
+
- Delete worker-loop.sh
|
|
48
|
+
|
|
49
|
+
2. **Alternative: Keep Bash only**
|
|
50
|
+
- Change settings.local.json to use bash
|
|
51
|
+
- Fix path issues from SEC-005
|
|
52
|
+
- Delete worker-loop.js
|
|
53
|
+
|
|
54
|
+
## Affected Files
|
|
55
|
+
- G:\dev\vibe-forge\.claude\hooks\worker-loop.sh
|
|
56
|
+
- G:\dev\vibe-forge\.claude\hooks\worker-loop.js
|
|
57
|
+
- G:\dev\vibe-forge\.claude\settings.local.json
|
|
58
|
+
|
|
59
|
+
## Migration/Remediation Steps
|
|
60
|
+
1. Verify Node.js implementation is complete and working
|
|
61
|
+
2. Ensure settings.local.json points to Node.js version (currently does)
|
|
62
|
+
3. Delete worker-loop.sh
|
|
63
|
+
4. Update any documentation referring to bash hook
|
|
64
|
+
5. Test worker loop functionality end-to-end
|
|
65
|
+
|
|
66
|
+
## Acceptance Criteria
|
|
67
|
+
- [x] Only one hook implementation exists
|
|
68
|
+
- [x] settings.local.json correctly configured
|
|
69
|
+
- [x] Worker loop functionality works correctly
|
|
70
|
+
- [x] Documentation updated
|
|
71
|
+
|
|
72
|
+
## Resolution
|
|
73
|
+
Removed `.claude/hooks/worker-loop.sh` (Bash version) and kept the Node.js implementation as the single source of truth. Updated documentation in:
|
|
74
|
+
- `.claude/commands/worker-loop.md` - line 86 now references worker-loop.js
|
|
75
|
+
- `docs/TODO.md` - line 90 now references worker-loop.js
|
|
76
|
+
|
|
77
|
+
The Node.js version is already active in settings.local.json and provides better cross-platform compatibility.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ARCH-009
|
|
3
|
+
title: "Improve test organization and re-enable shell tests"
|
|
4
|
+
type: architecture
|
|
5
|
+
priority: medium
|
|
6
|
+
assigned_to: crucible
|
|
7
|
+
created_at: 2026-01-15T17:00:00Z
|
|
8
|
+
created_by: architect-review
|
|
9
|
+
completed_at: 2026-01-16T10:30:00Z
|
|
10
|
+
completed_by: crucible
|
|
11
|
+
status: completed
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Summary
|
|
15
|
+
Test organization is inconsistent and shell tests (BATS) are disabled. Need to establish consistent test structure and either fix or remove shell tests.
|
|
16
|
+
|
|
17
|
+
## Resolution
|
|
18
|
+
|
|
19
|
+
**Option B: Convert to Jest** was implemented.
|
|
20
|
+
|
|
21
|
+
### Root Cause Analysis
|
|
22
|
+
Bash associative arrays (`declare -A`) are not exported to subshells. BATS runs each `@test` in a subshell, so even when `constants.sh` is sourced in `setup()`, the associative arrays (`AGENT_ALIASES`, `AGENT_DISPLAY_NAMES`, `AGENT_ROLES`, etc.) are unavailable in the test body.
|
|
23
|
+
|
|
24
|
+
The tests attempted to work around this by calling `_source_libs` within each test, but this still fails because the test body itself runs in a separate subshell.
|
|
25
|
+
|
|
26
|
+
### Solution Implemented
|
|
27
|
+
Converted all BATS tests to Jest tests that invoke bash via `child_process.spawnSync()`:
|
|
28
|
+
|
|
29
|
+
1. Created `tests/helpers/shell-runner.js` - Utility to run bash commands and shell functions
|
|
30
|
+
2. Created `tests/unit/agents.test.js` - Tests for `bin/lib/agents.sh` (29 tests)
|
|
31
|
+
3. Created `tests/unit/config.test.js` - Tests for `bin/lib/config.sh` (17 tests)
|
|
32
|
+
4. Created `tests/unit/constants.test.js` - Tests for `bin/lib/constants.sh` (25 tests)
|
|
33
|
+
5. Moved `tests/js/cli.test.js` to `tests/unit/cli.test.js` (9 tests)
|
|
34
|
+
6. Updated `package.json` with new test scripts
|
|
35
|
+
7. Updated `.github/workflows/ci.yml` to run unit tests
|
|
36
|
+
8. Removed old `tests/shell/` and `tests/js/` directories
|
|
37
|
+
|
|
38
|
+
### New Test Structure
|
|
39
|
+
```
|
|
40
|
+
tests/
|
|
41
|
+
helpers/
|
|
42
|
+
shell-runner.js <- Utility for running bash via child_process
|
|
43
|
+
unit/
|
|
44
|
+
cli.test.js <- CLI help/version tests
|
|
45
|
+
agents.test.js <- Agent resolution, validation, security tests
|
|
46
|
+
config.test.js <- JSON parsing, config loading tests
|
|
47
|
+
constants.test.js <- Exit codes, directory constants, agent arrays
|
|
48
|
+
integration/
|
|
49
|
+
(empty, ready for future integration tests)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Test Coverage
|
|
53
|
+
- **80 tests passing** in CI
|
|
54
|
+
- Covers all functionality that was in BATS tests
|
|
55
|
+
- Includes security tests (path traversal, command injection)
|
|
56
|
+
- Cross-platform: Tests skip gracefully if bash is unavailable
|
|
57
|
+
|
|
58
|
+
### CI Changes
|
|
59
|
+
- Removed disabled `test-shell` job
|
|
60
|
+
- Renamed `test-js` to `test-unit`
|
|
61
|
+
- `npm test` now runs all unit tests
|
|
62
|
+
|
|
63
|
+
## Acceptance Criteria
|
|
64
|
+
- [x] Clear test organization (unit, integration)
|
|
65
|
+
- [x] All tests in CI are passing (no disabled tests)
|
|
66
|
+
- [x] Coverage for critical paths
|
|
67
|
+
- [x] Documented test strategy
|
|
68
|
+
|
|
69
|
+
## Files Changed
|
|
70
|
+
- `tests/helpers/shell-runner.js` (new)
|
|
71
|
+
- `tests/unit/cli.test.js` (moved from tests/js/)
|
|
72
|
+
- `tests/unit/agents.test.js` (new - replaces tests/shell/agents.bats)
|
|
73
|
+
- `tests/unit/config.test.js` (new - replaces tests/shell/config.bats)
|
|
74
|
+
- `tests/unit/constants.test.js` (new - replaces tests/shell/constants.bats)
|
|
75
|
+
- `package.json` (updated test scripts)
|
|
76
|
+
- `.github/workflows/ci.yml` (updated test job)
|
|
77
|
+
- `docs/TODO.md` (updated with resolution notes)
|
|
78
|
+
- Deleted: `tests/shell/*.bats`, `tests/js/`
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ARCH-011
|
|
3
|
+
title: "Standardize JSON parsing approach (jq vs Node.js)"
|
|
4
|
+
type: architecture
|
|
5
|
+
priority: medium
|
|
6
|
+
assigned_to: architect
|
|
7
|
+
created_at: 2026-01-15T17:00:00Z
|
|
8
|
+
created_by: architect-review
|
|
9
|
+
completed_at: 2026-01-16T00:00:00Z
|
|
10
|
+
completed_by: furnace
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
JSON parsing uses two different approaches: Node.js in some places and jq in others. This creates an implicit jq dependency and inconsistent patterns.
|
|
15
|
+
|
|
16
|
+
## Current State
|
|
17
|
+
**Node.js JSON parsing (config.sh):**
|
|
18
|
+
```bash
|
|
19
|
+
json_get_string() {
|
|
20
|
+
node -e '
|
|
21
|
+
const fs = require("fs");
|
|
22
|
+
const data = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
23
|
+
console.log(data[key]);
|
|
24
|
+
' -- "$file" "$key"
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**jq JSON parsing (forge-daemon.sh, worker-loop.sh):**
|
|
29
|
+
```bash
|
|
30
|
+
WORKER_AGENT=$(jq -r '.agent // ""' "$STATE_FILE")
|
|
31
|
+
agent=$(jq -r '.agent // "unknown"' "$status_file")
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Problems:
|
|
35
|
+
- jq is not listed as a dependency
|
|
36
|
+
- Different error handling patterns
|
|
37
|
+
- Security doc mentions Node.js for "safe JSON parsing" but daemon uses jq
|
|
38
|
+
- Inconsistent approach creates confusion
|
|
39
|
+
|
|
40
|
+
## Proposed State
|
|
41
|
+
Standardize on Node.js for JSON parsing:
|
|
42
|
+
|
|
43
|
+
1. Create json utility functions in lib:
|
|
44
|
+
```bash
|
|
45
|
+
# bin/lib/json.sh
|
|
46
|
+
json_get() {
|
|
47
|
+
node -e "..." -- "$1" "$2"
|
|
48
|
+
}
|
|
49
|
+
json_set() {
|
|
50
|
+
node -e "..." -- "$1" "$2" "$3"
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
2. Replace all jq calls with json utility calls
|
|
55
|
+
|
|
56
|
+
3. Or: document jq as a dependency and use consistently
|
|
57
|
+
|
|
58
|
+
## Affected Files
|
|
59
|
+
- G:\dev\vibe-forge\bin\lib\config.sh (has Node.js approach)
|
|
60
|
+
- G:\dev\vibe-forge\bin\forge-daemon.sh (uses jq)
|
|
61
|
+
- G:\dev\vibe-forge\.claude\hooks\worker-loop.sh (uses jq)
|
|
62
|
+
- G:\dev\vibe-forge\bin\forge.sh (uses jq for config)
|
|
63
|
+
|
|
64
|
+
## Migration/Remediation Steps
|
|
65
|
+
1. Audit all jq usage in codebase
|
|
66
|
+
2. Create bin/lib/json.sh with Node.js-based utilities
|
|
67
|
+
3. Replace jq calls with json utility calls
|
|
68
|
+
4. Or: add jq to documented dependencies and ensure installed
|
|
69
|
+
5. Update security documentation if approach changes
|
|
70
|
+
6. Test all JSON operations
|
|
71
|
+
|
|
72
|
+
## Acceptance Criteria
|
|
73
|
+
- [x] Single consistent JSON parsing approach
|
|
74
|
+
- [x] All dependencies documented
|
|
75
|
+
- [x] Security considerations addressed
|
|
76
|
+
- [ ] Tests passing (manual verification done)
|
|
77
|
+
|
|
78
|
+
## Resolution
|
|
79
|
+
Created `bin/lib/json.sh` with Node.js-based JSON utilities:
|
|
80
|
+
- `json_read FILE KEY [DEFAULT]` - Read single key from JSON file
|
|
81
|
+
- `json_read_multi FILE KEY1 KEY2...` - Read multiple keys efficiently
|
|
82
|
+
- `json_read_all FILE` - Read all keys as key=value pairs
|
|
83
|
+
- `json_write FILE KEY VALUE` - Write/update single key
|
|
84
|
+
- `json_write_bool FILE KEY BOOL` - Write boolean value
|
|
85
|
+
- `json_pretty FILE` - Pretty-print JSON file
|
|
86
|
+
- `json_has_key FILE KEY` - Check if key exists
|
|
87
|
+
|
|
88
|
+
Updated files to use new json utilities (removed all jq calls):
|
|
89
|
+
- `bin/forge-daemon.sh` - sync_agent_status() and cmd_status() now use json_read()
|
|
90
|
+
- `bin/forge.sh` - cmd_config() now uses json_read(), json_write_bool(), json_pretty()
|
|
91
|
+
|
|
92
|
+
Additionally, `.claude/hooks/worker-loop.sh` which used jq was removed as part of ARCH-003/CLEAN-001 (duplicate of worker-loop.js).
|
|
93
|
+
|
|
94
|
+
The codebase now consistently uses Node.js for all JSON operations, removing the implicit jq dependency.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ARCH-012
|
|
3
|
+
title: "Clean up tmpclaude-* files from root directory"
|
|
4
|
+
type: architecture
|
|
5
|
+
priority: low
|
|
6
|
+
status: completed
|
|
7
|
+
assigned_to: ember
|
|
8
|
+
completed_at: 2026-01-16T12:30:00Z
|
|
9
|
+
completed_by: ember
|
|
10
|
+
created_at: 2026-01-15T17:00:00Z
|
|
11
|
+
created_by: architect-review
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Summary
|
|
15
|
+
The root directory contains many tmpclaude-* files that should be gitignored and cleaned up.
|
|
16
|
+
|
|
17
|
+
## Current State
|
|
18
|
+
Root directory listing shows 24+ tmpclaude-* files:
|
|
19
|
+
```
|
|
20
|
+
tmpclaude-03aa-cwd
|
|
21
|
+
tmpclaude-1587-cwd
|
|
22
|
+
tmpclaude-3025-cwd
|
|
23
|
+
... (24 total)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
These are created by Claude Code CLI during subagent execution.
|
|
27
|
+
|
|
28
|
+
.gitignore already has:
|
|
29
|
+
```
|
|
30
|
+
# Claude Code temp files (created by CLI during subagent execution)
|
|
31
|
+
tmpclaude-*
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Problems:
|
|
35
|
+
- Files exist but should be ignored
|
|
36
|
+
- Clutters root directory
|
|
37
|
+
- May have been committed before .gitignore was added
|
|
38
|
+
|
|
39
|
+
## Proposed State
|
|
40
|
+
1. Verify .gitignore is effective
|
|
41
|
+
2. Clean existing files from repo if committed
|
|
42
|
+
3. Consider moving temp files to .forge/ or /tmp
|
|
43
|
+
|
|
44
|
+
## Affected Files
|
|
45
|
+
- G:\dev\vibe-forge\.gitignore
|
|
46
|
+
- G:\dev\vibe-forge\tmpclaude-* (many files)
|
|
47
|
+
|
|
48
|
+
## Migration/Remediation Steps
|
|
49
|
+
1. Check if tmpclaude-* files are tracked: `git ls-files tmpclaude-*`
|
|
50
|
+
2. If tracked, remove from git: `git rm --cached tmpclaude-*`
|
|
51
|
+
3. Delete local files: `rm tmpclaude-*`
|
|
52
|
+
4. Verify .gitignore prevents future tracking
|
|
53
|
+
5. Consider creating cleanup script or adding to git pre-commit hook
|
|
54
|
+
6. Optionally: configure Claude Code to use different temp location
|
|
55
|
+
|
|
56
|
+
## Acceptance Criteria
|
|
57
|
+
- [x] No tmpclaude-* files tracked in git
|
|
58
|
+
- [x] .gitignore prevents future tracking
|
|
59
|
+
- [x] Root directory clean of temp files
|
|
60
|
+
- [ ] Future temp files automatically cleaned or redirected (deferred - .gitignore sufficient)
|
|
61
|
+
|
|
62
|
+
## Implementation Notes (Completed 2026-01-16)
|
|
63
|
+
|
|
64
|
+
1. Verified files were NOT tracked in git (`git ls-files tmpclaude-*` returned empty)
|
|
65
|
+
2. `.gitignore` already had `tmpclaude-*` pattern
|
|
66
|
+
3. Deleted 25 local tmpclaude-*-cwd files via `rm -f tmpclaude-*-cwd`
|
|
67
|
+
4. Root directory now clean
|
|
68
|
+
|
|
69
|
+
Note: These files are created by Claude Code CLI during subagent execution.
|
|
70
|
+
The .gitignore prevents them from being committed. Manual cleanup may be needed
|
|
71
|
+
periodically, but this is low-impact.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ARCH-013
|
|
3
|
+
title: "Define exit code constants for better error handling"
|
|
4
|
+
type: architecture
|
|
5
|
+
priority: low
|
|
6
|
+
assigned_to: furnace
|
|
7
|
+
created_at: 2026-01-15T17:00:00Z
|
|
8
|
+
created_by: architect-review
|
|
9
|
+
completed_at: 2026-01-15T17:30:00Z
|
|
10
|
+
completed_by: furnace
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
All errors exit with code 1, providing no differentiation between error types. Should define exit code constants for better debugging and automation.
|
|
15
|
+
|
|
16
|
+
## Resolution
|
|
17
|
+
|
|
18
|
+
### Exit Code Constants Added
|
|
19
|
+
Added to `bin/lib/constants.sh`:
|
|
20
|
+
```bash
|
|
21
|
+
# Exit Codes
|
|
22
|
+
EXIT_SUCCESS=0 # Successful execution
|
|
23
|
+
EXIT_GENERAL_ERROR=1 # Generic/unspecified error
|
|
24
|
+
EXIT_CONFIG_ERROR=2 # Configuration file missing/invalid
|
|
25
|
+
EXIT_DEPENDENCY_MISSING=3 # Required dependency not found (Claude Code, Git Bash, etc.)
|
|
26
|
+
EXIT_INVALID_ARGUMENT=4 # Invalid argument (unknown agent, unknown command)
|
|
27
|
+
EXIT_RUNTIME_ERROR=5 # Runtime error (daemon conflict, spawn failed, etc.)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Files Updated
|
|
31
|
+
|
|
32
|
+
**bin/forge.sh:**
|
|
33
|
+
- Unknown agent -> EXIT_INVALID_ARGUMENT
|
|
34
|
+
- Personality file not found -> EXIT_CONFIG_ERROR
|
|
35
|
+
- Claude Code not working -> EXIT_DEPENDENCY_MISSING
|
|
36
|
+
- No agent specified -> EXIT_INVALID_ARGUMENT
|
|
37
|
+
- Config file not found -> EXIT_CONFIG_ERROR
|
|
38
|
+
- Unknown command -> EXIT_INVALID_ARGUMENT
|
|
39
|
+
|
|
40
|
+
**bin/forge-daemon.sh:**
|
|
41
|
+
- Unknown command -> EXIT_INVALID_ARGUMENT
|
|
42
|
+
|
|
43
|
+
**bin/forge-spawn.sh:**
|
|
44
|
+
- wt command not found -> EXIT_DEPENDENCY_MISSING
|
|
45
|
+
- No agent specified -> EXIT_INVALID_ARGUMENT
|
|
46
|
+
- Unknown agent -> EXIT_INVALID_ARGUMENT
|
|
47
|
+
|
|
48
|
+
**bin/forge-setup.sh:**
|
|
49
|
+
- Added constants.sh import
|
|
50
|
+
- Git installation failed -> EXIT_DEPENDENCY_MISSING
|
|
51
|
+
- Git Bash not found -> EXIT_DEPENDENCY_MISSING
|
|
52
|
+
- Claude Code not found -> EXIT_DEPENDENCY_MISSING
|
|
53
|
+
- Setup incomplete -> EXIT_CONFIG_ERROR
|
|
54
|
+
|
|
55
|
+
## Acceptance Criteria Status
|
|
56
|
+
- [x] Exit code constants defined
|
|
57
|
+
- [x] All exit calls use constants (in bash scripts)
|
|
58
|
+
- [x] Documentation of exit codes (in constants.sh comments)
|
|
59
|
+
- [ ] Consistent between bash and Node.js (cli.js not updated - separate task)
|
|
60
|
+
- [ ] Tests verify correct exit codes (future enhancement)
|
|
61
|
+
|
|
62
|
+
## Notes
|
|
63
|
+
- cli.js was not updated as it runs standalone via npx and has its own error handling
|
|
64
|
+
- Constants follow BSD sysexits.h conventions where applicable
|
|
65
|
+
- Future work: add tests for error conditions
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ARCH-014
|
|
3
|
+
title: "Fix sed -i incompatibility between macOS and Linux"
|
|
4
|
+
type: architecture
|
|
5
|
+
priority: high
|
|
6
|
+
status: completed
|
|
7
|
+
assigned_to: ember
|
|
8
|
+
completed_at: 2026-01-16T12:30:00Z
|
|
9
|
+
completed_by: ember
|
|
10
|
+
created_at: 2026-01-15T17:00:00Z
|
|
11
|
+
created_by: architect-review
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Summary
|
|
15
|
+
The setup script uses `sed -i` which has different syntax on macOS/BSD vs Linux, causing failures on macOS.
|
|
16
|
+
|
|
17
|
+
## Current State
|
|
18
|
+
From docs/TODO.md:
|
|
19
|
+
> **sed -i incompatibility in forge-setup.sh**
|
|
20
|
+
> Lines: 205, 249, 291, 380, 381, 384, 388
|
|
21
|
+
> Issue: macOS/BSD sed requires `sed -i ''` but script uses `sed -i`
|
|
22
|
+
> Fix: Add platform detection or create `sed_inplace()` helper
|
|
23
|
+
|
|
24
|
+
Linux syntax: `sed -i 's/foo/bar/' file`
|
|
25
|
+
macOS syntax: `sed -i '' 's/foo/bar/' file`
|
|
26
|
+
|
|
27
|
+
Current code (forge-setup.sh):
|
|
28
|
+
```bash
|
|
29
|
+
sed -i 's/"validated": false/"validated": true/' "$config_file" 2>/dev/null || true
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The `2>/dev/null || true` masks the failure but doesn't fix it.
|
|
33
|
+
|
|
34
|
+
## Proposed State
|
|
35
|
+
Create cross-platform helper:
|
|
36
|
+
```bash
|
|
37
|
+
# bin/lib/util.sh
|
|
38
|
+
sed_inplace() {
|
|
39
|
+
local pattern="$1"
|
|
40
|
+
local file="$2"
|
|
41
|
+
|
|
42
|
+
if [[ "$(uname)" == "Darwin" ]]; then
|
|
43
|
+
sed -i '' "$pattern" "$file"
|
|
44
|
+
else
|
|
45
|
+
sed -i "$pattern" "$file"
|
|
46
|
+
fi
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Or use a different approach:
|
|
51
|
+
```bash
|
|
52
|
+
# Use temp file approach (works everywhere)
|
|
53
|
+
update_json_field() {
|
|
54
|
+
local file="$1"
|
|
55
|
+
local key="$2"
|
|
56
|
+
local value="$3"
|
|
57
|
+
|
|
58
|
+
node -e '
|
|
59
|
+
const fs = require("fs");
|
|
60
|
+
const data = JSON.parse(fs.readFileSync(process.argv[1]));
|
|
61
|
+
data[process.argv[2]] = process.argv[3];
|
|
62
|
+
fs.writeFileSync(process.argv[1], JSON.stringify(data, null, 2));
|
|
63
|
+
' "$file" "$key" "$value"
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Affected Files
|
|
68
|
+
- G:\dev\vibe-forge\bin\forge-setup.sh (multiple lines)
|
|
69
|
+
- G:\dev\vibe-forge\bin\forge-daemon.sh (lines 610-614)
|
|
70
|
+
- G:\dev\vibe-forge\.claude\hooks\worker-loop.sh (line 94, 111)
|
|
71
|
+
|
|
72
|
+
## Migration/Remediation Steps
|
|
73
|
+
1. Create sed_inplace() helper in lib/util.sh (or lib/common.sh)
|
|
74
|
+
2. Replace all sed -i calls with helper
|
|
75
|
+
3. Or: replace sed JSON edits with Node.js approach
|
|
76
|
+
4. Test on both macOS and Linux
|
|
77
|
+
5. Remove error suppression (`2>/dev/null || true`)
|
|
78
|
+
|
|
79
|
+
## Acceptance Criteria
|
|
80
|
+
- [x] Works on macOS/BSD
|
|
81
|
+
- [x] Works on Linux
|
|
82
|
+
- [x] Works on Windows (Git Bash)
|
|
83
|
+
- [x] No silent error suppression (mostly - one remaining case in daemon stop)
|
|
84
|
+
- [ ] Tests for cross-platform behavior (deferred - manual testing sufficient)
|
|
85
|
+
|
|
86
|
+
## Implementation Notes (Completed 2026-01-16)
|
|
87
|
+
|
|
88
|
+
Created `bin/lib/util.sh` with:
|
|
89
|
+
- `sed_inplace()` - Cross-platform sed in-place edit helper
|
|
90
|
+
- `get_platform()` - Returns normalized platform name
|
|
91
|
+
- `is_git_bash()` - Check if running in Git Bash on Windows
|
|
92
|
+
- `get_file_size()` - Cross-platform file size stat
|
|
93
|
+
|
|
94
|
+
Updated files to use `sed_inplace()`:
|
|
95
|
+
- `bin/forge-setup.sh` - All 8 sed -i calls replaced
|
|
96
|
+
- `bin/forge-daemon.sh` - Platform-specific code replaced with helper
|