Prompt Portability Audit
Complete inventory of claude-custom assets (35 hooks, 4 agents, 1 command) with portability assessment for Goose migration. Conducted 2026-03-14.
Summary
| Category |
Total |
Portable |
Needs Adaptation |
Claude-Specific |
| Hooks |
35 |
17 (49%) |
11 (31%) |
7 (20%) |
| Agent Definitions |
4 |
4 (100%) |
0 |
0 |
| Commands/Skills |
1 |
0 |
1 (100%) |
0 |
| <strong>Total</strong> |
<strong>40</strong> |
<strong>21 (53%)</strong> |
<strong>12 (30%)</strong> |
<strong>7 (17%)</strong> |
Portability Key
- PORTABLE — Works with any framework. Generic bash/Python, checks files, runs linters. Minimal adaptation needed.
- NEEDS_ADAPTATION — Core logic is reusable but references Claude-specific APIs, hook JSON format, or environment variables. Goose equivalent exists.
- CLAUDE_SPECIFIC — Deeply tied to Claude Code internals (permission decision API, tool matcher format, agent spawn gates). Needs full rewrite for Goose.
Hooks: Enforcement (8)
| Hook |
Type |
What it does |
Portability |
Adaptation needed |
| block-main-commits.sh |
PreToolUse |
Blocks git commit/push on main/master |
NEEDS_ADAPTATION |
Hook JSON permissionDecision format |
| block-write-tools.sh |
PreToolUse |
Blocks Write, Edit, Bash tools entirely |
NEEDS_ADAPTATION |
Tool name matcher API |
| block-docs-writes.sh |
PreToolUse |
Blocks all 17 pal-e-docs MCP write ops |
PORTABLE |
MCP tool blocklist is framework-agnostic |
| block-dottie-code-writes.sh |
PreToolUse |
Blocks Dottie from Write/Edit/Bash on repos |
PORTABLE |
Path pattern matching is generic |
| block-claude-custom-main-edit.sh |
PreToolUse |
Blocks Write/Edit to claude-custom on main |
PORTABLE |
Git branch check + path resolution |
| block-pr-merge.sh |
PreToolUse |
Prompts user before PR merge |
PORTABLE |
Merge gate pattern is reusable |
| block-mcp-merge.sh |
PreToolUse |
Forces confirmation before MCP merge |
NEEDS_ADAPTATION |
MCP tool JSON schema + hook “ask” API |
| block-upstream.sh |
PreToolUse |
Blocks gh pr/issue create on upstream repos |
PORTABLE |
Repo blocklist logic is generic |
Hooks: Validation & Template Enforcement (8)
| Hook |
Type |
What it does |
Portability |
Adaptation needed |
| check-issue.sh |
PreToolUse |
Enforces issue-driven development. Validates issues exist via API. |
NEEDS_ADAPTATION |
API calls platform-specific, branching logic reusable |
| check-mcp-servers.sh |
SessionStart |
Detects missing MCP servers at session start |
CLAUDE_SPECIFIC |
Reads ~/.mcp.json format, process fingerprinting |
| check-issue-template.sh |
PreToolUse |
Enforces issue body template compliance |
NEEDS_ADAPTATION |
REST API + template validation, fail-open |
| check-note-template.sh |
PreToolUse |
Enforces pal-e-docs note templates by tags |
NEEDS_ADAPTATION |
REST API + HTML parsing |
| check-phase-template.sh |
PreToolUse |
Enforces phase note template fields |
PORTABLE |
Field validation is generic |
| check-pr-template.sh |
PreToolUse |
Enforces PR body: Closes #N + heading validation |
NEEDS_ADAPTATION |
REST API calls, logic reusable |
| check-agent-spawn.sh |
PreToolUse |
Capability-based agent spawn gate via JSON schema |
CLAUDE_SPECIFIC |
Agent spawn context + JSON schema matching |
| check-ruff-before-commit.sh |
PreToolUse |
Runs ruff check before git commit in Python repos |
PORTABLE |
Linter enforcement is generic |
Hooks: Labeling & Automation (3)
| Hook |
Type |
What it does |
Portability |
Adaptation needed |
| label-on-branch.sh |
PostToolUse |
Auto-sets status:in-progress on branch creation |
NEEDS_ADAPTATION |
Forgejo API, label-setting pattern reusable |
| label-on-pr.sh |
PostToolUse |
Auto-sets status:qa on PR submission |
NEEDS_ADAPTATION |
Forgejo API, comments PR URL on issue |
| label-on-verdict.sh |
PostToolUse |
Auto-sets status based on QA verdict |
NEEDS_ADAPTATION |
Forgejo API, verdict parsing reusable |
Hooks: Reminders & Guidance (6)
| Hook |
Type |
What it does |
Portability |
Adaptation needed |
| remind-review-loop.sh |
PostToolUse |
Reminds agent to run review-fix loop after PR |
PORTABLE |
Command pattern matching |
| remind-mcp-review-loop.sh |
PostToolUse |
Reminds about review-fix loop after MCP PR |
CLAUDE_SPECIFIC |
MCP-specific trigger |
| remind-sprint-update.sh |
PostToolUse |
Reminds to move board item to done after merge |
PORTABLE |
Advisory text only |
| remind-update-docs.sh |
PostToolUse |
Mandates /update-docs after merge (blocking) |
PORTABLE |
Context injection |
| stop-doc-checkin.sh |
Stop |
Reminds to update pal-e-docs before session ends |
PORTABLE |
Reminder text only |
| warn-delete-note.sh |
PreToolUse |
Warns before deleting notes |
PORTABLE |
Warning text only |
Hooks: Merge & Rebase (2)
| Hook |
Type |
What it does |
Portability |
Adaptation needed |
| post-merge-rebase.sh |
PostToolUse |
Fast-forwards local main after gh pr merge |
PORTABLE |
Git operations are generic |
| post-mcp-merge-rebase.sh |
PostToolUse |
Same as above for MCP tool calls |
CLAUDE_SPECIFIC |
MCP tool response JSON format |
| Hook |
Type |
What it does |
Portability |
Adaptation needed |
| auto-ruff-format.sh |
PreToolUse |
Auto-formats staged Python files with ruff before commit |
PORTABLE |
Ruff + venv detection is generic |
| pypi-pr-checklist.sh |
PreToolUse |
Enforces PyPI version bump checklist |
PORTABLE |
Checklist validation is generic |
Hooks: Session & Worktree Management (4)
| Hook |
Type |
What it does |
Portability |
Adaptation needed |
| check-claude-custom-clean.sh |
SessionStart |
Warns if ~/claude-custom has uncommitted changes |
PORTABLE |
Git status check is generic |
| cleanup-worktrees.sh |
SessionStart |
Removes stale worktrees (>7 days old) |
PORTABLE |
Worktree detection is generic |
| session-start-context.sh |
SessionStart |
Injects platform detection + SOPs + plans + personality |
NEEDS_ADAPTATION |
REST API + pal-e-docs specific, architecture reusable |
| inject-subagent-context.sh |
SubagentStart |
Injects agent-type-specific guidance into spawned agents |
PORTABLE |
Agent context mapping is generic |
Hooks: Helper/Shared (1)
| Hook |
Type |
What it does |
Portability |
Adaptation needed |
| forgejo-helper.sh |
Sourced |
Shared Forgejo API functions (10+ helpers) |
NEEDS_ADAPTATION |
Forgejo API specific, credential management reusable |
Agent Definitions (4)
| Agent |
File |
Role |
Portability |
Notes |
| Betty Sue |
betty-sue.md |
Main session: planning, docs, agent dispatch |
PORTABLE |
Pure personality definition. No implementation details. |
| Dev |
dev.md |
Code implementation: writes code, opens PRs |
PORTABLE |
YAML frontmatter needs format translation for Goose. |
| QA |
qa.md |
PR review: reads code, produces verdict |
PORTABLE |
YAML frontmatter needs format translation. Read-only constraints portable. |
| Dottie |
dottie.md |
Doc librarian: reads/writes pal-e-docs |
PORTABLE |
YAML frontmatter needs format translation. MCP access list portable. |
Key finding: All agent personalities are pure text — they describe behavior, voice, and constraints without implementation coupling. The YAML frontmatter (mcpServers, disallowedTools, isolation) needs format translation for Goose, but the core personality prompts are directly reusable.
Commands/Skills (1)
| Command |
File |
What it does |
Portability |
Notes |
| /update-docs |
update-docs.md |
Post-merge documentation chain walk |
NEEDS_ADAPTATION |
Workflow is reusable but references Forgejo API + pal-e-docs tools. Core chain: close issue → update phase → update plan → update project → move board item → update memory. |
Porting Strategy
These hooks use generic bash (git checks, linter enforcement, reminder text, path matching). They can be ported by translating the hook event trigger format from Claude Code to Goose’s extension system.
Phase 2: Adaptation (12 hooks + 1 command)
These hooks have reusable core logic but reference platform-specific APIs (Forgejo, pal-e-docs REST, Claude Code hook JSON format). The porting strategy is:
- Extract the validation/automation logic into standalone functions
- Create a Goose extension wrapper that calls those functions
- Translate Claude Code’s
permissionDecision: "deny" to Goose’s equivalent gating mechanism
Phase 3: Rewrite (7 Claude-specific hooks)
These hooks are deeply tied to Claude Code internals — permission decision API, agent spawn gates, MCP tool response format. They need full reimplementation as Goose extensions with equivalent behavior.
Agent Porting
All 4 agent definitions are portable. The porting path is:
- Convert YAML frontmatter to Goose agent config format
- Copy personality text verbatim (it’s framework-agnostic)
- Map
disallowedTools to Goose’s permission system
- Map
mcpServers to Goose’s extension connections