# REQ-015: Branding Renames

## Metadata

| Field | Value |
|-------|-------|
| ID | REQ-015 |
| Title | Branding Renames |
| Status | implemented |
| Version | 1 |
| Priority | medium |
| Dependencies | REQ-000 |
| Blocks | — |
| Open questions | 0 |
| Source | User request 2026-03-05 |

## Summary

Three housekeeping renames with no behavior change:

1. **Skill `evo` → `ievo`** — the bundled skill directory and all internal references are renamed from `evo` to `ievo`.
2. **Command `init` → `install`** — the `ievo init` command is renamed to `ievo install` and promoted from deprecated to first-class (no deprecation wrapper).
3. **`contextPaths` in `settings.local.json`** — add `"contextPaths": [".ievo/iEVO.md"]` to the `CLAUDE_SETTINGS_LOCAL_JSON` template so Claude Code auto-loads iEVO.md on every session.

## Context

### Project structure (relevant paths)

```
src/ievo/
├── cli.py                          # Typer app — registers all commands
├── commands/
│   ├── init.py                     # Current init command (with deprecated_command wrapper)
│   └── init_templates.py           # CLAUDE_SETTINGS_LOCAL_JSON, CLAUDE_MD, GITIGNORE, SPEC_INDEX_MD
├── marketplace/
│   ├── agents/debugger.md          # References /evo skill in `skills:` frontmatter and body
│   ├── skills/
│   │   ├── evo/SKILL.md            # Bundled skill — must become ievo/SKILL.md
│   │   └── extract-best-practices/SKILL.md  # References /evo in body text
│   └── __init__.py                 # bundled_skill_path(), list_bundled_skills() access layer
tests/
├── test_init.py                    # All init tests — must become test_install.py
├── test_templates.py               # Tests CLAUDE_SETTINGS_LOCAL_JSON structure
└── test_cli_app.py                 # Tests registered command names (references "init")
```

### Skill `evo` — current state

- Source: `src/ievo/marketplace/skills/evo/SKILL.md`
- Deployed by `sync_marketplace()` to `.claude/skills/evo/SKILL.md` in user projects
- `debugger.md` frontmatter: `skills:\n  - evo`
- `debugger.md` body: references `/evo` command
- `extract-best-practices/SKILL.md` body: references `/evo` in multiple places
- After rename, the directory is `src/ievo/marketplace/skills/ievo/SKILL.md`
- `SKILL.md` frontmatter: `name: evo` → `name: ievo`
- Deployed path in user projects: `.claude/skills/ievo/SKILL.md`
- Godfather workspace has a symlink at `/Users/denis/projects/ievo-ai/godfather/.claude/skills/evo` that must be recreated as `ievo`

### Command `init` — current state

- Source: `src/ievo/commands/init.py`, function `init()`
- Registered in `src/ievo/cli.py` as `app.command(name="init", ...)(init.init)`
- The function body starts with `deprecated_command("ievo init", alternative=...)`
- `cli.py` `main()` callback calls `init.init(name=".")` when auto-initializing
- Tests: `tests/test_init.py`, imports from `ievo.commands.init`

### Command `install` — target state

- File renamed: `src/ievo/commands/init.py` → `src/ievo/commands/install.py`
- Function renamed: `init()` → `install()`
- `deprecated_command()` wrapper removed entirely — `install` is a first-class command
- Help text: `"Set up iEvo in the current project."`
- `cli.py`: import `install` instead of `init`, register as `app.command(name="install", ...)(install.install)`
- `cli.py` `main()` callback: `install.install(name=".")` instead of `init.init(name=".")`
- Tests: `tests/test_install.py` (renamed from `test_init.py`), all imports and references updated

### `CLAUDE_SETTINGS_LOCAL_JSON` — current state

Located in `src/ievo/commands/init_templates.py`:

```python
CLAUDE_SETTINGS_LOCAL_JSON = """\
{
  "hooks": {
    "PreCompact": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "python3 .claude/hooks/precompact_save.py"
          }
        ]
      }
    ]
  }
}
"""
```

### `CLAUDE_SETTINGS_LOCAL_JSON` — target state

```python
CLAUDE_SETTINGS_LOCAL_JSON = """\
{
  "hooks": {
    "PreCompact": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "python3 .claude/hooks/precompact_save.py"
          }
        ]
      }
    ]
  },
  "contextPaths": [".ievo/iEVO.md"]
}
"""
```

### Deprecation utility

`src/ievo/utils/deprecation.py` — `deprecated_command(name, alternative=None)` prints a Rich warning and returns. The `install` command must NOT call this function. The `init` command no longer exists.

### Test for `settings.local.json`

`tests/test_init.py::test_init_creates_settings_local` currently asserts `"PreCompact" in data["hooks"]`. After rename: `tests/test_install.py::test_install_creates_settings_local` must additionally assert `"contextPaths" in data` and `data["contextPaths"] == [".ievo/iEVO.md"]`.

## Scope

### In scope

- Rename skill directory `evo` → `ievo` and update `name:` in frontmatter
- Update `/evo` references to `/ievo` in `debugger.md` and `extract-best-practices/SKILL.md`
- Rename `init.py` → `install.py`, function `init()` → `install()`, remove deprecation wrapper
- Update `cli.py` to import and register `install` instead of `init`
- Update `cli.py` `main()` callback to call `install.install(name=".")`
- Add `"contextPaths": [".ievo/iEVO.md"]` to `CLAUDE_SETTINGS_LOCAL_JSON` template
- Rename `tests/test_init.py` → `tests/test_install.py`, update all references inside it
- Update any other test file that imports from `ievo.commands.init` or references the `"init"` command name
- Recreate the godfather symlink at `.claude/skills/ievo` (remove the old `evo` symlink)

### Out of scope

- Changing the behavior of `install` (it does the same thing `init` did)
- Any database or manifest format changes
- Updating user documentation or README files
- Changing any other command names

## Acceptance Criteria

### 1. Skill directory renamed

- `src/ievo/marketplace/skills/ievo/SKILL.md` exists
- `src/ievo/marketplace/skills/evo/` does not exist
- `SKILL.md` frontmatter contains `name: ievo`
- `SKILL.md` body contains `/ievo` as the invocation name (not `/evo`)

### 2. Skill references updated in debugger.md

- `src/ievo/marketplace/agents/debugger.md` frontmatter contains `- ievo` under `skills:` (not `- evo`)
- `src/ievo/marketplace/agents/debugger.md` body contains `/ievo` wherever `/evo` appeared (not `/evo`)

### 3. Skill references updated in extract-best-practices

- `src/ievo/marketplace/skills/extract-best-practices/SKILL.md` contains `/ievo` wherever `/evo` appeared
- No remaining occurrences of ` /evo` (with space+slash) in `extract-best-practices/SKILL.md`

### 4. `ievo install` command exists and works

- `ievo install --help` exits 0 and outputs `"Set up iEvo in the current project."`
- `ievo install` with an empty `tmp_path` creates `.ievo/manifest.yaml`
- `ievo install` does NOT print a deprecation warning (no Rich warning output)

### 5. `ievo init` command no longer registered

- `ievo init --help` exits with a non-zero code (command not found)
- `app.registered_commands` does not contain a command named `"init"`

### 6. `cli.py` imports and callback updated

- `src/ievo/cli.py` imports `install` from `ievo.commands.install` (not `init` from `ievo.commands.init`)
- `src/ievo/cli.py` `main()` callback calls `install.install(name=".")` (not `init.init(name=".")`)

### 7. `settings.local.json` template includes `contextPaths`

- `CLAUDE_SETTINGS_LOCAL_JSON` constant in `src/ievo/commands/init_templates.py` parses as valid JSON
- Parsed JSON contains key `"contextPaths"` at the top level
- `data["contextPaths"] == [".ievo/iEVO.md"]`
- Parsed JSON still contains `data["hooks"]["PreCompact"]` (existing hook preserved)

### 8. `ievo install` deploys `settings.local.json` with `contextPaths`

- After `install(name=".")` on a fresh `tmp_path`: `.claude/settings.local.json` exists
- Parsed content contains `"contextPaths": [".ievo/iEVO.md"]`
- Parsed content contains `data["hooks"]["PreCompact"]`

### 9. `ievo install` deploys skill as `ievo` not `evo`

- After `install(name=".")` on a fresh `tmp_path`: `.claude/skills/ievo/SKILL.md` exists
- `.claude/skills/evo/` does not exist in the deployed project
- Deployed `SKILL.md` content matches bundled `src/ievo/marketplace/skills/ievo/SKILL.md` verbatim

### 10. `tests/test_install.py` replaces `tests/test_init.py`

- `tests/test_install.py` exists and all tests pass
- `tests/test_init.py` does not exist
- All imports inside `tests/test_install.py` reference `ievo.commands.install` (not `ievo.commands.init`)
- `test_install_shows_no_deprecation_warning` asserts that `ievo.utils.deprecation.warn` is NOT called

### 11. `test_cli_app.py` updated

- `tests/test_cli_app.py` does not reference the string `"init"` as a registered command name
- `tests/test_cli_app.py` references `"install"` in the expected command names set

### 12. Test coverage

- `uv run pytest --cov --cov-fail-under=100` passes with no coverage gaps on changed files

## Priority Score

`score = (5×3) + (0×2) + (1×1) - (2×0.5) - (0×5) = 15 + 0 + 1 - 1 - 0 = 15`

- Priority: medium (weight 5)
- Blocking count: 0
- Dependencies met: REQ-000 implemented (1)
- Complexity: low-medium (2)
- Open questions: 0
