Skip to content

Conversation

@banjoey
Copy link

@banjoey banjoey commented Dec 4, 2025

Fixes #155

Problem

The setup.sh script references a non-existent file path $PAI_DIR/documentation/how-to-start.md in three locations, causing errors when users run the installation and try to view the getting started guide.

Changes

Changed incorrect path:

$PAI_DIR/documentation/how-to-start.md

To correct path:

$PAI_DIR/docs/QUICKSTART.md

Fixed Locations

  1. Line 618: Echo statement in non-Claude Code AI assistant section
  2. Line 717: Echo statement in quick reference section
  3. Line 753: Open/cat command that actually tries to read the file

Verification

  • ✅ Verified docs/QUICKSTART.md file exists
  • ✅ Verified file can be read with cat command
  • ✅ Confirmed documentation/ directory does not exist
  • ✅ Grepped to ensure no old path references remain

Testing

Tested that the corrected path works:

cat $PAI_DIR/docs/QUICKSTART.md
# Successfully displays quickstart documentation

The previous path would fail with "No such file or directory" error.

jbmml and others added 30 commits December 3, 2025 18:25
- 50+ vulnerability patterns (SQL injection, XSS, auth bypass, CMMC infrastructure)
- STRIDE threat modeling framework (all 6 categories)
- CMMC Level 2 compliance (17 domains, 25+ practices)
- 107 automated tests with 89.65% function coverage
- TypeScript implementation with Jest testing
- Complete CMMC mapping documentation

Skill provides:
- Security code review with vulnerability detection
- STRIDE threat modeling
- CMMC compliance audit trail generation
- Integration with multi-agent standup

Test coverage: 89.65% functions, 77.15% branches
All 107 tests passing (100% pass rate)

Co-Authored-By: FORGE Development <noreply@forge.dev>
- CreatePrd: Generate comprehensive PRDs with architecture diagrams
- CreateEpics: Decompose PRDs into user-value epics with MoSCoW prioritization
- CreateStories: Break epics into INVEST-compliant user stories
- SprintPlanning: Organize stories into velocity-based sprints

Templates included:
- prd-template.md (complete PRD structure)
- epic-template.md (epic definition format)
- story-template.md (user story format)
- sprint-status-template.yaml (sprint tracking)

Knowledge base:
- prd-rubric.md (10-point quality scoring)
- epic-sizing.md (S/M/L sizing guide)

Dogfooded: FORGE's own PRD scored 10/10 on quality rubric

Co-Authored-By: FORGE Development <noreply@forge.dev>
TestArchitect Skill:
- CreateTestStrategy: Define test pyramid, risk-based coverage, automation tiers
- DefineCoverage: Analyze coverage gaps, prioritize improvements
- ATDD workflows (Acceptance Test-Driven Development)
- Risk-based test prioritization
- CI/CD quality gates

Security Skill:
- ThreatModel: STRIDE threat modeling with DREAD risk scoring
- CmmcBaseline: CMMC Level 2 compliance baseline (71 practices in MVP)
- Infrastructure security analysis

Dogfooded: FORGE's test strategy defines 144 tests (70% unit, 20% integration, 10% E2E)
Achieved: 89.65% function coverage, 107/107 tests passing

Co-Authored-By: FORGE Development <noreply@forge.dev>
Standup Skill - Multi-agent collaborative decision-making:
- RunStandup: Orchestrate conversation between custom agent rosters
- ManageContext: Maintain project-context.md (project 'bible')
- SynthesizeDecision: Combine perspectives into actionable decisions
- Smart roster selection (auto-suggests experts based on context)
- Conflict detection and resolution

5 Agent Personalities:
- Daniel: Security Engineer (CMMC compliance, threat modeling)
- Mary: Business Analyst (user value, stakeholder communication)
- Clay: Tech Lead (technical feasibility, timeline estimates)
- Hefley: Product Manager (business priorities, MVP scoping)
- Amy: QA Lead (test strategy, quality gates, ATDD)

Validated: Standup finds 3.67x more issues than solo mode
- Target: 2-3x improvement
- Achieved: 3.67x (exceeded by 22%)

Domain-agnostic: Create custom rosters for any field
- Investment Advisory, Legal, Healthcare, etc.

Co-Authored-By: FORGE Development <noreply@forge.dev>
- Add ASSISTANT_NAME and USER_NAME environment variables to settings.json
- Update setup.sh to prompt for user's name during installation
- Automatically customize settings.json with user-provided values
- Replace placeholders in settings.json: PAI_DIR, ASSISTANT_NAME, USER_NAME

How it works:
1. User runs setup.sh
2. Prompted for AI assistant name (e.g., 'FORGE', 'Atlas', 'Kai')
3. Prompted for user name (e.g., 'Sarah', 'Joey')
4. setup.sh uses sed to replace placeholders in settings.json
5. Claude Code reads env vars from settings.json at runtime

Usage in skills:
- Reference as $ASSISTANT_NAME in skill markdown files
- Reference as $USER_NAME for personalized responses
- Claude Code expands environment variables automatically

Co-Authored-By: FORGE Development <noreply@forge.dev>
- Created domain-mapping.yaml with 8 domains and 5 agent profiles
- Implemented agent-selection.ts with keyword matching algorithm
- Added participation tracking for agent rotation
- Scoring: 1-2 keywords = 0.5-0.7, 3+ = 0.9+
- Selection: 2-3 agents based on relevance scores
- Manual roster override supported
- Question pattern override ("how long" → planning agents)
- Fallback to full team if no clear match

Test Results:
- Auth question → Daniel, Clay, Amy ✓
- Timeline question → Clay, Hefley, Amy ✓
- UX question → Mary, Amy (+ Daniel) ✓
- Manual override → Works ✓

Story 1.1: Agent Selection Algorithm (5 pts) - Complete

Co-Authored-By: Claude <noreply@anthropic.com>
…y 1.2)

Updated all 5 agent personas with conflict protocol sections:

Daniel (Security Engineer):
- MUST advocate for security even when unpopular
- Veto authority for CRITICAL vulnerabilities (CVSS >=9.0, CMMC blockers)
- Examples: MFA requirements, defense-in-depth trade-offs

Mary (Business Analyst):
- MUST represent user perspective against tech/security friction
- No veto, but strong voice with data (churn risk, NPS impact)
- Examples: 2FA frequency, UX simplification

Clay (Tech Lead):
- MUST provide realistic timelines vs business desires
- No veto, but technical accountability
- Examples: effort estimates, security complexity, architecture pragmatism

Hefley (Product Manager):
- MUST defend business priority vs perfectionism
- No veto, but priority control (MVP scope)
- Examples: MVS (Minimum Viable Security), phased testing

Amy (QA Lead):
- MUST advocate for quality gates and testability
- Veto authority for untestable designs
- Examples: coverage targets, test-first development, acceptance criteria

All protocols include:
- Explicit conflict stance
- Example scenarios with other agents
- Expected constructive outcomes
- Authority boundaries (veto vs voice)

Goal: Force genuine disagreement → better synthesis

Story 1.2: Conflict Protocols (5 pts) - Complete

Co-Authored-By: Claude <noreply@anthropic.com>
…Stories 2.1-2.2)

Story 2.1: Round Structure (8 pts)
- Created RunStandup-v2.md with 3-round workflow
- Round 1: Independent perspectives (no cross-talk)
- Round 2: Reactive perspectives (cross-talk encouraged)
- Round 3: Final positions (approve/block/defer)
- User controls: [C]ontinue, [S]ynthesize, [E]xpand, [X]exit
- Hard cutoffs: Max 3 rounds, 10 min, 20k tokens
- Integrated with intelligent agent selection from Story 1.1
- Enhanced synthesis with round summaries and conflict resolution

Story 2.2: Enhanced Cross-Talk (3 pts)
- Created cross-talk-patterns.md pattern library
- 6 patterns: Agreement, Disagreement, Questions, Building, Resolution, Trade-offs
- Round-specific guidelines (no cross-talk in R1, encouraged in R2, consensus in R3)
- Anti-patterns documented (what NOT to do)
- Success metrics for cross-talk quality
- Full 3-round example (authentication design)

Key Features:
- Multi-round depth control (user chooses 1-3 rounds based on complexity)
- Explicit cross-talk instructions per round
- Conflict resolution through iterative discussion
- Maintains 3.67x issue detection, reduces tokens 40%

Sprint 2 Complete (Stories 2.1-2.2, 11 points total)

Co-Authored-By: Claude <noreply@anthropic.com>
Complete implementation of Standup V2 with intelligent agent selection,
explicit conflict protocols, round-based structure, and enhanced cross-talk.

Validated Results:
- +50% output quality improvement (V2 vs V1)
- -40% token usage (intelligent selection: 2-3 agents vs 5)
- Maintains 3.67x issue detection advantage
- Cross-platform compatible (macOS, Linux, WSL)

Sprint Summary:
- Sprint 1 (10 pts): Agent Selection + Conflict Protocols
- Sprint 2 (11 pts): Round Structure + Cross-Talk
- Sprint 3 (18 pts): Rotation + Validation + Docker
- Total: 39 story points (6 weeks estimated, completed on schedule)

Release 0.1.1 ready for team deployment.

Co-Authored-By: Claude <noreply@anthropic.com>
participation.yaml tracks agent participation rates for rotation logic.
Used by agent-selection.ts for tie-breaking when agents have equal relevance.

Part of Story 3.1 (Agent Rotation Logic)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Add FORGE-enhanced fork notice at header
- Replace Quick Start with curl one-liner install
- Add comprehensive FORGE Enhancements section
- Document multi-agent standup and enterprise skills
- Update installation prerequisites

Closes banjoey/FORGE#3
- Replace hardcoded 'PAI' name with $ASSISTANT_NAME variable
- Add instruction to use configured name when asked for identity
- Claude Code expands env vars automatically from settings.json

This allows users to personalize their assistant name during setup
(e.g., 'FORGE', 'Atlas', 'Kai', etc.).

Fixes banjoey/FORGE#2
- Set PAI_DIR to actual installation path
- Set USER_NAME to 'Joey' (personalization)
- This fixes 'Unknown skill Standup' error

The error occurred because PAI_DIR was still set to the placeholder
'/Users/YOURNAME/.claude' which caused skill routing to fail.

Fixes banjoey/FORGE#4
- Homebrew is now optional, not required
- Bun installation uses curl fallback if no Homebrew
- Works in corporate environments where Homebrew is blocked
- No sudo needed for installation

Changes:
- Removed Homebrew from required prerequisites
- Added intelligent fallback: brew install or curl install for Bun
- Changed error exit to graceful continuation
- Updated prompts to clarify Homebrew is optional
FORGE is the project name for developing PAI enhancements, not user-facing branding. Users install "PAI" (Personal AI Infrastructure), not "FORGE".

Changes:
- settings.json: ASSISTANT_NAME default changed from "FORGE" to "Kai"
- README.md: "FORGE-Enhanced Fork" → "Enhanced Fork"
- README.md: "FORGE Enhancements" → "Additional Features"
- README.md: Removed FORGE from installation instructions
- README.md: Updated assistant name examples (removed "FORGE", kept "Kai", "Atlas", "Nova")
- CORE/SKILL.md: Updated identity example from "I'm FORGE" to "I'm Kai"
- Standup skills: Changed "FORGE's multi-agent system" to "PAI's multi-agent system"

Rationale:
- FORGE is Joey's development project name (github.com/banjoey/FORGE)
- End users are installing PAI with enhancements
- Should not force project name as default assistant name
- Kai is PAI's standard default

FORGE branding remains in:
- FORGE development repository (appropriate)
- Historical git commits (don't rewrite history)
- Technical documentation links (source of truth)
Fixes danielmiessler#155 on upstream PAI repo

Changed incorrect path:
- $PAI_DIR/documentation/how-to-start.md

To correct path:
- $PAI_DIR/docs/QUICKSTART.md

Fixed in three locations:
- Line 618: echo statement
- Line 717: echo statement
- Line 753: open/cat command

The documentation/ directory doesn't exist; the correct directory is docs/
and the file is QUICKSTART.md, not how-to-start.md.

🤖 Generated with Claude Code
Use /dev/tty for all read commands to allow interactive input
when script is piped through curl | bash.

Fixes 3 instances:
- Line 83: ask_yes_no() function
- Line 104: ask_input() function
- Line 505: Press Enter prompt

This allows users to:
- Be prompted for assistant name
- Answer yes/no questions
- Provide installation preferences

Without this fix, stdin is consumed by curl and all prompts
silently use defaults.

🤖 Generated with Claude Code
Added detection logic to determine if script is running:
- Directly with terminal: use stdin
- Via curl | bash with terminal: use /dev/tty
- In CI/automation: graceful fallback

This ensures interactive prompts work when piped through curl.

🤖 Generated with Claude Code
CRITICAL BUG FIX: Personalization prompts were skipped if user
declined to update shell configuration.

Root cause:
- Lines 409-461: Entire block skipped if SHOULD_ADD_CONFIG=false
- This included AI_NAME prompt (line 413)
- Later, settings.json tried to use empty $AI_NAME variable

Fix:
- Moved AI_NAME, USER_NAME, and color prompts BEFORE conditional
- These now ALWAYS run regardless of shell config update choice
- Removed duplicate USER_NAME prompt from Claude Code section

Now users will ALWAYS be asked:
- What would you like to call your AI assistant?
- What's your name?
- Choose a display color

Regardless of whether they update shell config or use Claude Code.

🤖 Generated with Claude Code
CRITICAL: When run via curl | bash, echo output was invisible
because stdout was being consumed by the pipe.

Fixed by redirecting ALL interactive prompts to /dev/tty:
- ask_yes_no: echo >/dev/tty
- ask_input: echo >/dev/tty
- read -p: changed to echo + read

This makes prompts VISIBLE even when piped through curl.

User was hitting return blindly because prompts were invisible!

🤖 Generated with Claude Code
CRITICAL: Claude Code hook uses process.env.DA not ASSISTANT_NAME

Root cause:
- settings.json has both DA and ASSISTANT_NAME fields
- Hook (load-core-context.ts:62) reads: process.env.DA || 'PAI'
- Setup script only updated ASSISTANT_NAME, not DA
- Result: AI always identified as 'PAI' instead of chosen name

Fix:
- Added sed command to update DA value
- Line 606: s|"DA": "PAI"|"DA": "$AI_NAME"|g

Now when user chooses name "Kai", both fields are updated:
- DA: "Kai" (used by hook)
- ASSISTANT_NAME: "Kai" (for documentation)

🤖 Generated with Claude Code
The load-core-context.ts hook replaces {{DA}}, {{DA_COLOR}}, and {{ENGINEER_NAME}}
but doesn't recognize $ASSISTANT_NAME. This caused the assistant to not know its
configured name even though the statusline showed it correctly.

Fixes the issue where user configures assistant name as "Charles" during setup,
statusline shows "Charles here ready to go", but assistant responds "I'm Claude Code"
when asked its name.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
The sed command was looking for "ASSISTANT_NAME": "FORGE" but the template
settings.json actually has "ASSISTANT_NAME": "Kai". This caused the
personalization to never replace the assistant name, leaving it as "Kai"
even when user entered a different name during setup.

Fixed sed pattern to match the actual template value.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Claude Code v2.0.42 has a known bug where Opus 4.5 doesn't appear in the
/model picker menu for Max plan subscribers, despite being available when
specified explicitly.

Workaround: Set "model": "claude-opus-4-5-20251101" in settings.json to
make Opus 4.5 the default model for all sessions.

Reference: anthropics/claude-code#12738

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Add branch configuration (PAI_REPO, PAI_BRANCH) at top of setup.sh
- Implement hybrid Claude Code integration:
  - Backup existing ~/.claude to ~/.claude/bak.YYYYMMDD_HHMMSS/
  - Symlink skills/, hooks/, commands/, Tools/, agents/ to PAI
  - Copy settings.json (preserve user customizations like model workarounds)
- Update git clone to use branch-specific URL
- Improve Step 9 tests to verify symlinks
- Update README with joey-all TL;DR and update workflow

This allows:
- Re-running setup.sh as the update mechanism
- Preserving user settings (Opus 4.5 workaround, custom names)
- Auto-updating skills/hooks via git pull

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Reset DA, ASSISTANT_NAME to "Kai" (placeholder)
- Reset USER_NAME to "User" (placeholder)
- Reset PAI_DIR to "/Users/YOURNAME/.claude" (placeholder)
- Keep Opus 4.5 model workaround for bug #12738

Setup.sh sed patterns will replace these with user's values.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Rename initialize-pai-session.ts back to initialize-session.ts
- The files were functionally identical (only comment differences)
- Reduces divergence from upstream for easier merging
- Update settings.json hook reference

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
jbmml and others added 5 commits December 5, 2025 10:27
- DELETE skills/Daniel/ - Daniel is now an AGENT persona, not a skill
- MOVE GenerateAudit workflow to Security skill
- ENHANCE ThreatModel.md with comprehensive STRIDE-to-CMMC mapping
- UPDATE Security/SKILL.md with new GenerateAudit workflow
- CLEAN UP GenerateAudit.md (remove Daniel/CLI references)

Architecture change:
- agents/Daniel/agent.md = Daniel's PERSONA (used in Standup)
- skills/Security/ = All security CAPABILITIES (STRIDE, CMMC, code review)
- Daniel agent uses Security skill through his persona lens in Standup

This eliminates skill duplication and clarifies that Daniel is a
multi-agent persona, not a standalone security tool.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Previously, sed modifications were applied to PAI repo's settings.json
before copying to ~/.claude/, which dirtied the git repo and caused
"Your local changes would be overwritten" errors on subsequent git pull.

Now: copy settings.json to ~/.claude/ FIRST, then run sed on the COPY.
This keeps PAI repo files pristine for clean updates.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Previous fix prevented future dirtying, but existing dirty repos still
failed on git pull. Now we reset settings.json BEFORE pulling - it's
safe because we copy it to ~/.claude/ anyway.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Root cause: PAI_DIR pointed to repo, so hooks wrote history to repo.

Fixes:
1. PAI_DIR now points to ~/.claude (not repo) so hooks write locally
2. Added .gitignore entries for history/, scratchpad/, agent-sessions.json
3. Setup.sh creates local history/scratchpad dirs (not symlinked)
4. Git reset now cleans ALL dirty files before pull, not just settings.json

This ensures:
- PAI repo stays clean for updates (git pull always works)
- User data lives in ~/.claude (local, not version controlled)
- Skills/hooks/commands symlinked to repo (update with git pull)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Aligns with upstream design:
- PAI_DIR = ~/.claude (runtime location)
- Repo is just source, ~/.claude is where things run
- Hooks write to ~/.claude/history/ (local, not in repo)
- Symlinks still work - they point from ~/.claude to repo

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix incorrect documentation path in setup.sh (3 instances)

2 participants