Skip to content
Open
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
70 changes: 40 additions & 30 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
name: tests
name: checks

# Offline by design. BOS_OFFLINE=1 makes the shared library refuse every
# network call, so this workflow can never reach the live API or read a real
# API key. No secrets are referenced anywhere in this file — on purpose.
# BOS is a no-code, no-Python pack: skills/commands are Markdown, the studios are
# Node. CI therefore does two things only — make sure no real credential ever
# lands in the repo, and make sure the deleted Python runtime never creeps back.
# No secrets are referenced anywhere in this file, on purpose. The secret scan
# uses TruffleHog (free, no license) in filesystem mode.

on:
push:
Expand All @@ -12,40 +14,48 @@ permissions:
contents: read

jobs:
test:
checks:
runs-on: ubuntu-latest
env:
BOS_OFFLINE: "1"
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Secret scan (no key may enter the repo)
run: python tools/check-no-secrets.py

- name: Lint every skill
run: |
set -euo pipefail
# Free, license-free secret scan. Filesystem mode is deterministic on
# both push and pull_request (no BASE/HEAD range to trip over).
curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh \
| sh -s -- -b /usr/local/bin
trufflehog filesystem . --results=verified,unknown --fail --no-update

- name: No-Python guard (the pack must stay pure-MCP)
run: |
set -e
for d in skills/*/; do
python tools/lint-skill.py "$d"
done

- name: Offline fixture tests (no key, no network)
# The Python data-fetch runtime was removed deliberately. Fail if any of
# it returns, or if a skill/command starts shelling out to python again.
if git ls-files '*.py' | grep -q .; then
echo "::error::A .py file is tracked. BOS is Python-free — remove it."
git ls-files '*.py'
exit 1
fi
if grep -RInE 'python (tools/|~/\.claude|skills/)|bos-run\.py|fetch\.py|trustpager_api' \
--include='*.md' skills commands agents knowledge templates README.md INSTALL.md; then
echo "::error::Found a reference to the removed Python runtime above."
exit 1
fi
echo "OK — no Python runtime references."

- name: Skill frontmatter sanity
run: |
set -e
# Every skill needs a SKILL.md with name + description frontmatter.
fail=0
for d in skills/*/; do
name="$(basename "$d")"
if [ -f "$d/test-fixture.json" ]; then
echo "== $name =="
python tools/test-skill.py "$name"
fi
f="$d/SKILL.md"
if [ ! -f "$f" ]; then echo "::error::$d has no SKILL.md"; fail=1; continue; fi
head -n 1 "$f" | grep -q '^---$' || { echo "::error::$f missing frontmatter"; fail=1; }
grep -q '^name:' "$f" || { echo "::error::$f missing name:"; fail=1; }
grep -q '^description:' "$f" || { echo "::error::$f missing description:"; fail=1; }
done

- name: Unit tests
run: python -m unittest discover -s tests -v

- name: Sequence linter self-check
run: python tools/lint-sequence.py --drafts tests/fixtures/sequence-mixed.json || test $? -eq 2
[ "$fail" -eq 0 ] && echo "OK — every skill has valid frontmatter."
exit $fail
19 changes: 5 additions & 14 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,11 @@ _staging/
*-keys.json
*api-keys.json
*credentials.json
bos.json
bos-journal/

# Local sweep reports (may contain sensitive matches mid-investigation).
_scripts/sweep-report-*.txt
_scripts/*.log
# Operator working files (created in the operator's project folder, not here —
# listed for safety in case anyone runs a skill from inside this repo).
.bos-memory/
.bos-journal.md

# OS / editor / tooling
.DS_Store
Expand All @@ -27,15 +26,7 @@ desktop.ini
*.swp
*~

# Python build artefacts (for the sweep script and any helpers)
__pycache__/
*.pyc
*.pyo
.pytest_cache/
venv/
.venv/

# Node — in case any installer wraps in npm
# Node (the studios)
node_modules/
package-lock.json
yarn.lock
Expand Down
87 changes: 35 additions & 52 deletions INSTALL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Install Business Operating System

Total time: about 10 minutes. No coding required.
Total time: about 5 minutes. No coding required, and **no Python** — everything runs through Claude Code and your TrustPager MCP connection.

---

Expand All @@ -9,64 +9,54 @@ Total time: about 10 minutes. No coding required.
You need:

1. **A TrustPager workspace.** Sign up at [trustpager.com](https://trustpager.com) — you'll get one free.
2. **TrustPager already connected to Claude.** If you're on Claude in the browser, connect TrustPager from the [TrustPager AI access page](https://app.trustpager.com/auto/ai-access). Once it's connected there, Claude Code picks it up automatically.
3. **Claude Code installed.** Get it from [claude.com/claude-code](https://claude.com/claude-code) (works on Mac, Windows, and Linux).
4. **Your TrustPager API key.** Find it under your workspace settings → API. It starts with `tp_live_`.
2. **Claude Code installed.** Get it from [claude.com/claude-code](https://claude.com/claude-code) (works on Mac, Windows, and Linux).
3. **Your TrustPager API key.** Find it under your workspace settings → API. It starts with `tp_live_`.

---

## Install in 2 steps

### Step 1 — Install the Business Operating System pack
### Step 1 — Connect TrustPager, then install the pack

You have two ways to get the skills + commands. **Either way you still run the
Python setup** in 1b, because that's what stores your API key for the tools.

**Option A — as a Claude Code plugin (recommended).** This registers every
command, skill, and subagent with Claude Code automatically. In Claude Code:
**1a — Connect your TrustPager workspace to Claude Code.** This is what gives the skills their `trustpager` tools. Add the TrustPager MCP server to Claude Code — either with the `/mcp` command, or by adding it to your `.mcp.json`:

```
/plugin marketplace add TrustPager/Business_Operating_System
/plugin install business-operating-system@trustpager
```json
{
"mcpServers": {
"trustpager": {
"type": "http",
"url": "https://mcp.trustpager.com/<your-workspace-slug>/mcp",
"headers": { "Authorization": "Bearer tp_live_..." }
}
}
}
```

Then clone the repo too (the Python tools and the installer live in it):
Replace `<your-workspace-slug>` and the `tp_live_...` key with yours. The exact connection details for your setup are at [docs.trustpager.com](https://docs.trustpager.com). The server **must** be named `trustpager` — the skills look for it by that name.

```
cd ~
git clone https://github.com/TrustPager/Business_Operating_System.git
```
> The MCP connection holds your API key. There's nothing else to store — no key file, no setup script.

**Option B — clone only.** Clone to your home folder and point Claude Code at
the directory (or run from inside it):
**1b — Install the Business Operating System pack.** This registers every command, skill, and subagent. In Claude Code:

```
cd ~
git clone https://github.com/TrustPager/Business_Operating_System.git
```

#### 1b — Run setup (both options, same on Mac, Linux, and Windows)

```
cd Business_Operating_System
python tools/setup.py
python tools/check-install.py
/plugin marketplace add TrustPager/Business_Operating_System
/plugin install business-operating-system@trustpager
```

`setup.py` writes your TrustPager API key to `~/.claude/bos.json`. If you've already connected TrustPager to Claude in the browser, it'll detect that key and offer to reuse it (no copy-paste needed).

`check-install.py` runs 7 quick health checks and prints a green / red list. If you see "All checks passed", you're ready.
(Prefer to clone? `git clone https://github.com/TrustPager/Business_Operating_System.git` into your home folder and point Claude Code at it. Either way there's no build step.)

### Step 2 — Teach Claude your business (run `/learn-my-business`)

**Restart Claude Code** so the new commands load, then type:
**Restart Claude Code** so the new commands and MCP connection load, then type:

```
/learn-my-business
```

It reads your live TrustPager workspace and writes a `CLAUDE.md` into your project folder for you — your real pipeline, products, and brand — and folds in the gotchas for your line of work. That file tells Claude the shape of your business so it doesn't have to ask every time. Re-run it whenever your pipeline, products, or brand change.

It also creates a local memory store (`.bos-memory/` in your project folder) that loads automatically each session. As you work, tell Claude to remember things with `/remember` — preferences, how you like things done, context the CRM doesn't hold — and it carries them forward. (If your project folder is a git repo, you may want to add `.bos-memory/` and `.bos-journal.md` to `.gitignore` — they're your private working notes and change log.)

**Prefer to do it by hand?** Copy `templates/CLAUDE.md` into your project folder as `CLAUDE.md` and fill in the `<<< ... >>>` blanks. Industry-specific gotchas live in `knowledge/industry-notes.md` (one section per vertical: mortgage/finance, trades, insurance, consulting, allied health, manufacturing).

---
Expand All @@ -85,14 +75,14 @@ You should see Claude pull up everything that needs your attention today — quo

## Troubleshooting

**"trustpager mcp not found"**
The TrustPager connector isn't connected to Claude. Connect it at [app.trustpager.com/auto/ai-access](https://app.trustpager.com/auto/ai-access), then restart Claude Code.
**"trustpager mcp not found" / the skills can't reach your data**
The `trustpager` MCP server isn't connected. Run `/mcp` in Claude Code to check it's listed and connected, re-check the URL + key in your `.mcp.json` (Step 1a), then restart Claude Code.

**"Authorization: Bearer invalid"**
The API key didn't paste correctly. Generate a new one in your TrustPager workspace settings → API → Create new key.
The API key is wrong or expired. Generate a new one in your TrustPager workspace settings → API → Create new key, and update it in your MCP connection.

**"command /sweep-my-day not found"**
Step 1 didn't complete. Make sure you ran `python tools/setup.py` from inside the `Business_Operating_System` folder and restart Claude Code.
The pack didn't install, or Claude Code needs a restart. Re-run the `/plugin install` step (Step 1b) and restart.

**"Claude doesn't know about my products / pipeline / brand"**
You skipped Step 2. Run `/learn-my-business` and it'll write your `CLAUDE.md` from your live workspace (or copy `templates/CLAUDE.md` in by hand). Claude picks it up next session.
Expand All @@ -101,34 +91,27 @@ You skipped Step 2. Run `/learn-my-business` and it'll write your `CLAUDE.md` fr

## Updating

When new skills ship, pull the latest:
When new skills ship, update the plugin:

```
cd ~/Business_Operating_System
git pull
python tools/setup.py # refreshes the skill launcher (safe to re-run; won't touch your key)
python tools/check-install.py
/plugin update business-operating-system@trustpager
```

Claude Code reads the skills directly from this folder, so there's no plugin re-install. The `setup.py` step just makes sure the `~/.claude/bos-run.py` launcher is present and points at this folder — it's idempotent and leaves your API key alone.
(Cloned instead? `cd ~/Business_Operating_System && git pull`.) There's no build step and nothing to re-run — the skills are Markdown that Claude reads directly, and your MCP connection and `CLAUDE.md` are untouched.

---

## Uninstall

To remove BOS, just delete the folder:

```
rm -rf ~/Business_Operating_System
/plugin uninstall business-operating-system@trustpager
```

Optionally clear the stored API key + cache:
(Or delete the cloned folder.) Optionally remove the `trustpager` entry from your `.mcp.json` to disconnect the workspace.

```
python tools/config.py --clear-all
```
Your memory store and change log live in your project folder, not in the pack — if you want to wipe them too, delete `.bos-memory/` and `.bos-journal.md` from that folder.

(Neither step touches your TrustPager workspace — your data is unaffected.)
(None of these steps touch your TrustPager workspace — your data is unaffected.)

---

Expand Down
12 changes: 10 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@ Claude: /sweep-my-day

The method behind automations is in [knowledge/automation-method.md](knowledge/automation-method.md); a catalogue of ready-to-adapt automations (missed-call recovery, lead intake, review requests, renewal reminders, and more — tagged by industry) is in [knowledge/automation-recipes.md](knowledge/automation-recipes.md).

**🧠 Memory & feedback** *(gets sharper the more you use it)*
- `/remember` — tell Claude something to carry into future sessions: how you like things done, soft context the CRM doesn't hold, a recurring quirk. Kept in a local store (`./.bos-memory/`), one fact per file, that loads automatically each session. Claude also saves things proactively as it learns them — and always tells you when it does.
- `/suggest-improvement` — wanted something that doesn't exist yet? Log it. Whether it's a missing BOS skill or a TrustPager capability that isn't there, it files a request to the TrustPager team so they can build it. That's how the thing you wanted becomes a feature.

The model behind both — what loads automatically, what's worth remembering, the rails, and how the feedback loop works — is in [knowledge/memory-and-feedback.md](knowledge/memory-and-feedback.md).

**📈 Reporting & cash flow (know your numbers, on a schedule)**
- `/outstanding-invoices` — who owes you money. Pulls accounts receivable from your connected accounting integration into an aged summary (Current / 1-30 / 31-60 / 61-90 / 90+), surfaces the worst offenders, and — if you want — builds a dashboard and emails it to you (and your bookkeeper) every morning.
- `/email-me-a-report` — deliver *any* report as a recurring email digest. Pick or build a dashboard, choose recipients and a cadence (e.g. 7am weekdays), and it lands in your inbox server-side with nothing open. The same mechanism behind the built-in Team Task Digest.
Expand Down Expand Up @@ -114,8 +120,10 @@ If that's you — this is built for you.

## How to install

No coding, no Python — it's a Claude Code plugin plus a TrustPager MCP connection.

1. Sign up for TrustPager and grab your API key from your workspace settings
2. Run the installer (see [INSTALL.md](./INSTALL.md))
2. Connect the `trustpager` MCP server to Claude Code, then install the pack (see [INSTALL.md](./INSTALL.md))
3. Restart Claude Code
4. Type `/sweep-my-day` and say good morning

Expand All @@ -141,7 +149,7 @@ Every skill in here:
- Is open source and inspectable — read the source, modify it, fork it
- Only ever talks to your TrustPager workspace (never anyone else's)
- Asks before doing anything destructive
- Logs what it did, so you can see the trail — every write lands in `~/.claude/bos-journal/`; read it any time with `python tools/journal.py`
- Logs what it did, so you can see the trail — every write is appended to `.bos-journal.md` in your project folder; open it any time

## Subagents

Expand Down
Loading
Loading