Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# CLAUDE.md

Working notes for AI agents in this repo (the Python Scout engine/plugin).

## Fixtures must be anonymized — this repo and its two siblings are public

Scout runs against a real person's vault, so anything lifted from it into a
fixture or an inline test string **must be scrubbed before it lands**. All three
Scout repos — this one, `Scout` (desktop), and `scout-iOS-app` — are public.

- **No real identifiers.** Strip company/product names, real coworker names, real
Linear IDs, GitHub repos, and Slack workspaces/channels. Use the shared
stand-ins so fixtures stay internally consistent:
- People: `Alex` / `Priya` / `Sam`; comment author `alex`.
- Linear: `PROJ-1234` (neutral prefixes like `OPS-`, `DESK-` for variety) —
never the real team prefixes (`AI-`, `KAI-`, `ST-`, …).
- GitHub: `example-org/<repo>`.
- Slack: `acme-co.slack.com/archives/C0123456789/p1700000000000000`.
- Vendors/products: a generic noun, not the brand.
- **Anonymize content, not structure.** Keep the tokens the parser is tested on
(synthetic `[#TAG]` prefixes, `**bold**`, `_(italic)_`, `[[wikilinks]]`,
` — ` separators, `` `code` ``). Only swap the words around them.
- **Don't hardcode personal config in source.** The Linear deep-link workspace is
read from `SCOUT_LINEAR_WORKSPACE` (default `your-workspace`), not baked in;
keep new connector/workspace specifics config- or env-driven the same way.
- **Preserve legitimate attribution** — NOT leaks, leave them: `pyproject` authors,
`.claude-plugin/marketplace.json` / `plugin.json` owner, `LICENSE`, and the
project's own `github.com/<org>/…` URLs (including the self-update URL).

### `parser-corpus.json` is ONE byte-identical file living in three repos

`engine/tests/fixtures/contract/parser-corpus.json` is the **canonical** copy;
`Scout` (desktop) and `scout-iOS-app` vendor byte-identical copies, checksum-guarded
on both the Python and Swift sides — so you cannot edit just one copy. On any change
(anonymizing counts):

1. Edit the corpus here; keep every `expected` field consistent with the parser
(`pytest tests/unit/test_parser_contract.py` is the judge).
2. Copy it byte-for-byte into the sibling checkouts (cloned alongside this repo):
- `../Scout/ScoutTests/Fixtures/parser-corpus.json`
- `../scout-ios/ScoutMobileTests/Fixtures/parser-corpus.json`
3. Update BOTH checksum guards to the new `shasum -a 256` of the file:
- `EXPECTED_SHA256` in `engine/tests/unit/test_parser_corpus_checksum.py`
- `canonicalSHA256` in `../Scout/ScoutTests/ActionItems/ParserContractTests.swift`
4. Verify all three: `pytest tests/unit/test_parser_contract.py
tests/unit/test_parser_corpus_checksum.py`, plus each Swift repo's
`ParserContractTests`.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -473,4 +473,4 @@ Scout is open-source under the [MIT License](LICENSE).
- **[Terms of Use](TERMS.md)** — free, open-source, provided as-is. ([web version](https://raven-scout.github.io/scout-plugin/terms.html))
- **[Security Policy](https://github.com/Raven-Scout/.github/blob/main/SECURITY.md)** · **[Code of Conduct](https://github.com/Raven-Scout/.github/blob/main/CODE_OF_CONDUCT.md)**

Scout is an independent project and is not affiliated with, endorsed by, or sponsored by Anthropic, Microsoft, Keboola, or any other company.
Scout is an independent project and is not affiliated with, endorsed by, or sponsored by Anthropic, Microsoft, or any other company.
2 changes: 1 addition & 1 deletion TERMS.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ By using Scout, you agree that you are responsible for:
Scout integrates with third-party services and runs on Anthropic's Claude. Those services are
controlled by their respective providers and governed by their own terms and privacy policies;
we are not responsible for them. Scout is an **independent project** and is **not affiliated with,
endorsed by, or sponsored by** Anthropic, Microsoft, Keboola, Slack, Google, Linear, GitHub, or
endorsed by, or sponsored by** Anthropic, Microsoft, Slack, Google, Linear, GitHub, or
any other company. All product names, logos, and trademarks are the property of their respective
owners and are used only to describe interoperability.

Expand Down
2 changes: 1 addition & 1 deletion commands/scout-work.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ The goal: the user decides, Scout drafts and executes. Never send a message, mer

4. **Skip** items from the **🟢 Watching** section — those are monitoring, not actionable.

5. **Skip** items explicitly described as blocked by another item (e.g., "Blocked by AI-2630", "Waiting on Legal review").
5. **Skip** items explicitly described as blocked by another item (e.g., "Blocked by PROJ-2630", "Waiting on Legal review").

6. Present a numbered summary:
```
Expand Down
2 changes: 1 addition & 1 deletion docs/assets/scout-demo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion docs/hybrid.css
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ h1 em{font-style:italic;color:var(--acc);}
.ctas{margin-top:32px;display:flex;gap:12px;flex-wrap:wrap;}
.note{margin-top:16px;font-family:var(--mono);font-size:11.5px;color:var(--ink-3);}

/* pull quote — Jordan's verbatim words */
/* pull quote — verbatim words */
.pull{margin:46px 0;padding:6px 0 6px 26px;border-left:3px solid var(--acc);}
.pull q,.pull .q{display:block;font-family:var(--serif);font-style:italic;font-size:26px;line-height:1.36;color:var(--ink);quotes:none;}
.pull .by{margin-top:12px;font-family:var(--mono);font-size:11.5px;letter-spacing:.04em;color:var(--ink-3);text-transform:uppercase;}
Expand Down
2 changes: 1 addition & 1 deletion docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@ <h1 style="margin-left:auto;margin-right:auto;max-width:17ch;">There's always mo

<div class="vrow">
<div class="vtext reveal"><p class="sysnum">Disagreement is the signal</p><h3>When tools conflict, it shows both sides.</h3><p>It won't pick a winner. That contradiction is usually the most important thing in your day — and what every other tool hides.</p></div>
<div class="vvis reveal"><div class="conflict" style="margin-top:0;"><div class="sd"><span class="l">Linear</span>moved to <b>Done</b> by Marcus, 6:12pm</div><div class="sd"><span class="l">GitHub</span>PR <b>#482 still open</b>, 0 approvals</div></div><div style="margin-top:10px;"><span class="tag x">contradicted</span> <span class="src" style="background:none;color:var(--ink-3)">→ held for you, never guessed</span></div></div>
<div class="vvis reveal"><div class="conflict" style="margin-top:0;"><div class="sd"><span class="l">Linear</span>moved to <b>Done</b> by Sam, 6:12pm</div><div class="sd"><span class="l">GitHub</span>PR <b>#482 still open</b>, 0 approvals</div></div><div style="margin-top:10px;"><span class="tag x">contradicted</span> <span class="src" style="background:none;color:var(--ink-3)">→ held for you, never guessed</span></div></div>
</div>
</div></div>

Expand Down
2 changes: 1 addition & 1 deletion docs/plans/2026-06-02-release-and-distribution-system.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
| `engine/pyproject.toml` | `[project]` → `version = "X"` |
| `engine/scout/__init__.py` | `__version__ = "X"` |

**Working directory for all commands:** `/Users/jordanburger/scout-plugin` (the `engine/.venv` is the test venv; run pytest/ruff/mypy from `engine/`).
**Working directory for all commands:** `~/scout-plugin` (the `engine/.venv` is the test venv; run pytest/ruff/mypy from `engine/`).

---

Expand Down
4 changes: 2 additions & 2 deletions docs/plans/2026-06-10-batch-1-quick-wins.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
- [ ] **Step 1: Create the working branch**

```bash
cd /Users/jordanburger/scout-plugin
cd ~/scout-plugin
git checkout -b fix/batch-1-quick-wins
```

Expand Down Expand Up @@ -789,7 +789,7 @@ Fixes #47"

Expected: pytest 0 failed / 0 xfailed; ruff and mypy clean.

- [ ] **Step 2: Push and open the PR (outward-facing — confirm with Jordan if not pre-authorized)**
- [ ] **Step 2: Push and open the PR (outward-facing — confirm with the maintainer if not pre-authorized)**

```bash
git push -u origin fix/batch-1-quick-wins
Expand Down
2 changes: 1 addition & 1 deletion docs/specs/2026-06-02-release-and-distribution-system.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ Today `/scout-update` upgrades the vault only. Extend it to the single "update S

1. **Bring the plugin to latest.** Adapts to marketplace type:
- GitHub marketplace (public users): `claude plugin marketplace update scout-plugin` (git pull) + reinstall.
- Directory marketplace (maintainer/Jordan, `~/scout-plugin`): `git -C ~/scout-plugin pull`; the editable venv auto-reflects it.
- Directory marketplace (maintainer, `~/scout-plugin`): `git -C ~/scout-plugin pull`; the editable venv auto-reflects it.
2. **Ensure the engine venv** via the plugin's existing `scripts/install-venv.sh`.
3. **Upgrade the vault against the _new_ plugin.** Resolve the freshly-installed plugin root (from `claude plugin list` / `installed_plugins.json`) and invoke `<new-plugin-root>/.venv/bin/scoutctl bootstrap upgrade` **by absolute path** — avoiding the stale `$CLAUDE_PLUGIN_ROOT`-in-session problem, so no restart is needed. This is the existing sidecar-safe 8-stage pipeline (including the `parser.py` 3-way merge).
4. **Doctor + report** old→new version and any `.proposed-merge` sidecars.
Expand Down
6 changes: 3 additions & 3 deletions docs/superpowers/plans/2026-06-14-connector-probe-overlay.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
- `engine/scout/scripts/connector_probes.py` already has `load_registry(path) -> dict[str, Probe]` (single-file parser, fully tested in `engine/tests/unit/test_connector_probe_registry.py`). It raises **`ValueError`** on malformed input — existing tests assert `ValueError`, so leave that behavior intact.
- `Probe` is a frozen dataclass with `.name`, `.kind` (`ProbeKind.MCP_TOOL` / `ProbeKind.BASH`), `.tool_chain: list[str]`, `.bash_command: str`, `.needs_user_input: list[str]`. `ProbeKind.MCP_TOOL.value == "mcp_tool"`, `ProbeKind.BASH.value == "bash"`.
- `ConfigError` is in `scout.errors` (subclass of `ScoutError`).
- Plugin root is `Path(scout.__file__).parent.parent.parent` (verified == `/Users/jordanburger/scout-plugin`); shipped registry is at `<plugin_root>/templates/connector-probes.yaml` (verified exists). Data dir comes from `scout.paths.data_dir()`.
- Plugin root is `Path(scout.__file__).parent.parent.parent` (verified == `~/scout-plugin`); shipped registry is at `<plugin_root>/templates/connector-probes.yaml` (verified exists). Data dir comes from `scout.paths.data_dir()`.
- The `connectors` Typer subapp is built in `engine/scout/cli.py` inside `_register_connectors()` (has `list`, `show`, `reload`, `snapshot`). **Subcommands import their heavy deps inside the function body** — a perf rule enforced by `engine/tests/perf/test_no_heavy_imports.py`. Follow that: import `connector_probes` inside the new command, not at module top.
- **This branch does NOT have the hermetic-test autouse fixture** (that's in the still-open Batch 1 PR #124). Consequence #1: this plan's tests must be self-contained — pass `plugin_root=`/`data_dir=` explicitly, or set `SCOUT_DATA_DIR` — never rely on `HOME` isolation. Consequence #2: a full `pytest tests/` run on this branch shows **2 pre-existing failures** in `test_cli_schedule_subapp.py` (the live-vault slot-count tests Batch 1 fixes). Those are not introduced here; the final-verification task accounts for them.

Expand All @@ -23,7 +23,7 @@

- [ ] **Step 1: Verify you're on the feature branch**

Run: `git -C /Users/jordanburger/scout-plugin branch --show-current`
Run: `git -C ~/scout-plugin branch --show-current`
Expected: `feat/connector-probe-overlay`. (If not, the spec commit `e30ee4d` is on it; check it out.)

---
Expand Down Expand Up @@ -461,7 +461,7 @@ In `commands/scout-update.md`, add a line to the upgrade report/notes section (w
- [ ] **Step 4: Sanity-check the wizard command end-to-end**

```bash
cd /Users/jordanburger/scout-plugin/engine && ../.venv/bin/python -m scout connectors probe-registry --json | head -20
cd ~/scout-plugin/engine && ../.venv/bin/python -m scout connectors probe-registry --json | head -20
```

Expected: a JSON object including `slack`, `github`, etc. (the shipped set; no overlay on this machine unless you created one).
Expand Down
Loading
Loading