Skip to content

@src/ references aren't rewritten at install time — /paul:map-codebase can't find its own workflow #23

Description

@gerbear1990

Summary

bin/install.js rewrites ~/.claude/ path references in .md files, but a large number of files reference framework assets as @src/... instead. Those are repo-relative and are not rewritten at install time, so after installation they resolve against the user's project directory rather than the installed framework.

58 such references across 23 files in v1.4.0 (960b05c).

Impact

Worst case is /paul:map-codebase, whose only pointer to its workflow is a @src/ path:

src/commands/map-codebase.md:8    @src/workflows/map-codebase.md
src/commands/map-codebase.md:12   **Follow workflow:** @src/workflows/map-codebase.md

After a global install the file lives at ~/.claude/paul-framework/workflows/map-codebase.md, but the command points at ./src/workflows/map-codebase.md relative to whatever project it's run in. Most projects have no root src/ at all (Android → app/src/, Python → package dirs), and even the ones that do won't have src/workflows/.

Every other command file uses the correct form, which is what makes this look like an oversight rather than a convention:

src/commands/plan.md:  @~/.claude/paul-framework/workflows/plan-phase.md
src/commands/init.md:  @~/.claude/paul-framework/workflows/init-project.md

The remaining @src/ references are inside src/workflows/, src/rules/ and src/references/, e.g.:

src/workflows/init-project.md:26    @src/templates/config.md
src/workflows/map-codebase.md:22-28 @src/templates/codebase/*.md   (all 7 templates)
src/rules/commands.md:41            @src/workflows/plan-phase.md
src/references/toml-sync.md:7       @src/templates/paul-toml.md, @src/templates/ledger-toml.md
src/workflows/apply-phase.md:343    @src/references/toml-sync.md

These are more forgiving because Claude can usually infer the intended file, but it's silent extra work at best and a wrong-file read at worst.

Suggested fix

Either extend the rewrite in copyWithPathReplacement() to also handle @src/:

content = content.replace(/~\/\.claude\//g, pathPrefix);
content = content.replace(/@src\/(workflows|templates|references|rules)\//g, `@${pathPrefix}paul-framework/$1/`);

…or change the sources to use @~/.claude/paul-framework/... consistently and let the existing rewrite handle them.

Two cases must be excluded from any regex — they're illustrative user-project paths, not framework assets:

  • src/references/context-management.md:51,61-63@src/models/user.ts, @src/api/routes.ts in the "Load What You Need" good/bad example
  • src/templates/codebase/structure.md:220`@src/workflows/{name}.md` documenting the extension convention (worth updating in prose either way, since it currently teaches the broken form)

Scoping the pattern to @src/(workflows|templates|references|rules)/…\.md and checking the target exists handles both cleanly.

Environment

PAUL v1.4.0 (960b05c), global install to ~/.claude, Claude Code on Windows 11. Verified the same reference layout is present in the repo itself, so it isn't install-specific.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions