Reposition as agent skills for all 37signals products - #6
Conversation
This repo publishes the agent skills of Basecamp, HEY, and Fizzy, but the README, install guide, and AGENTS.md still described it as Basecamp-only. README: name all three products, list every skill with the product and the CLI repo it is published from, and say where the hey and fizzy skills are until they land here (hey is absent because of the shared-manifest sync bug in #5; fizzy-cli has no skills sync yet). Requirements per product use each CLI's documented installer and auth command; the Homebrew cask is basecamp/tap/basecamp-cli, not basecamp/tap/basecamp, which does not exist. install.md: restructured per the install-md spec so an agent installs the Basecamp CLI (required) and the HEY and Fizzy CLIs only for the products the user has, with a verify step per product and a DONE WHEN that holds when only one CLI is installed. Points at the lowercase basecamp-cli install.md. AGENTS.md: describe the multi-source layout, the per-source manifests each sync owns and the legacy .managed-skills tombstone, and the rule that skills are edited upstream in each CLI's skills/ directory.
The plugin and marketplace descriptions said Basecamp only. Name Basecamp, HEY, and Fizzy, and bump the version. The plugin name stays basecamp-skills so existing installs keep resolving.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
All three CLIs' auth status commands return their OK envelope whether or not you are signed in (basecamp-cli app.OK, hey-cli writeOK, fizzy-cli printDetail), so a bare `auth status` in the DONE WHEN and the verify steps never failed. Test the JSON envelope's "authenticated": true instead, with --json so the shape does not depend on a TTY. Each CLI pretty-prints with a two-space indent, so that literal is exact.
There was a problem hiding this comment.
🟡 Changes recommended
Critical synchronization and multiple installation and verification issues remain unresolved.
Get a fresh assessment by requesting another Copilot review.
Pull request overview
Repositions the repository as the shared 37signals agent-skills publish target for Basecamp, HEY, and Fizzy.
Changes:
- Updates README, installation guidance, and contributor documentation.
- Documents product-specific CLI setup and skill sources.
- Defines multi-source synchronization rules.
- Updates plugin metadata and version to 0.2.0.
File summaries
| File | Summary |
|---|---|
README.md |
Multi-product overview, skills catalog, requirements, and contribution guidance; installer PATH and sync-state documentation need correction. |
install.md |
Product-specific CLI installation and verification flow; PATH handling and verification commands need correction. |
AGENTS.md |
Repository ownership and synchronization rules; documented manifest behavior is inconsistent with the current implementation. |
.claude-plugin/plugin.json |
Updated product descriptions and version metadata. |
.claude-plugin/marketplace.json |
Updated marketplace descriptions and version metadata. |
Review details
Suppressed comments (10)
README.md:54
- The curl-based HEY installer persists its PATH change for future shells but does not update the current one, so
hey auth logincan immediately fail withcommand not foundwhen neither default bin directory was already onPATH. Add a current-shell PATH update or require sourcing/restarting before login.
curl -fsSL https://hey.com/install-cli | bash # or: brew install --cask basecamp/tap/hey
hey auth login
README.md:46
- The curl-based Basecamp installer only writes its PATH change to a startup file, so the following
basecamp auth logincan fail in the same shell when the install directory was not already onPATH. The README's copy-paste setup should export the default install directories or tell the user to source/restart the shell before login.
curl -fsSL https://basecamp.com/install-cli | bash # or: brew install --cask basecamp/tap/basecamp-cli
basecamp auth login
README.md:62
- The Fizzy installer defaults to
~/.local/binand only records the PATH change in shell startup configuration. In a fresh shell without that directory onPATH, the immediately followingfizzy setupis not found. Export the install directory or use the installed binary's full path before setup.
curl -fsSL https://raw.githubusercontent.com/basecamp/fizzy-cli/master/scripts/install.sh | bash # or: brew install --cask basecamp/tap/fizzy
fizzy setup # personal access token, account, default board
README.md:83
- The About section currently says each CLI records its own managed directories, but this checkout still has only the shared
.managed-skillsmanifest with Basecamp entries, and the current upstream sync scripts use that shared file. Until the coordinated sync fixes ship, releases can still delete another product's skills, so this should be stated as future behavior or as conditional on those releases.
This repo is a publish target. On each release, a CLI's `scripts/sync-skills.sh`
copies its `skills/` tree into `skills/` here, records the directories it owns
in a manifest, and commits straight to `main`. Only the README, install.md,
AGENTS.md, and `.claude-plugin/` are written by hand.
install.md:40
basecamp auth statusdoes not emit JSON by default; the Basecamp CLI install guide documents a human-readableAuthenticatedline (optionallyAuthenticated (scope: read)). This expected result is therefore incorrect and can make a successful verification look like a failure. Update it to match the CLI's actual output.
# Expected: OK. The status command exits 0 even when signed out, so test the flag.
install.md:5
- This gate treats any
heyorfizzyexecutable on PATH as a product the user selected, so a machine with an already-installed but unused/unauthenticated optional CLI cannot satisfy DONE WHEN even though the Basecamp-only setup is complete. Make the optional checks conditional on the products the user chose, rather than oncommand -v.
DONE WHEN: `basecamp --version && basecamp auth status --json | grep -q '"authenticated": true' && (for cli in hey fizzy; do ! command -v "$cli" >/dev/null || "$cli" auth status --json | grep -q '"authenticated": true' || exit 1; done)` succeeds and `npx skills list` shows the basecamp skill.
install.md:20
- The Basecamp installer only persists its chosen bin directory in a shell startup file; it does not update the current shell's
PATH. On a fresh machine where neither~/binnor~/.local/binis already onPATH, the subsequentbasecamp --versionand auth commands fail withcommand not found. Export the installer directories (or source the updated startup file) before verification.
curl -fsSL https://basecamp.com/install-cli | bash
install.md:48
- The HEY installer writes a PATH change to the user's shell startup file but does not update this shell, so chaining
hey auth logincan resolve tocommand not foundwhen the default install directory was not already onPATH. Add the default bin directories toPATH(or require sourcing/restarting the shell) before invoking the freshly installed CLI.
curl -fsSL https://hey.com/install-cli | bash && hey auth login
install.md:62
- The Fizzy installer installs to
~/.local/binby default and only prints instructions to add it toPATH; it does not update the current shell. Therefore the chainedfizzy setupfails withcommand not foundfor a fresh user whosePATHlacks that directory. Export the install directory (or invoke the binary by its full path) before setup.
curl -fsSL https://raw.githubusercontent.com/basecamp/fizzy-cli/master/scripts/install.sh | bash && fizzy setup
install.md:68
- The Fizzy setup flow above uses
fizzy setup, but this verification invokesfizzy auth status(and the same check is embedded in both DONE WHEN expressions). Fizzy's documented CLI flow does not provide this Basecamp/HEY-style auth-status command, so a correctly configured Fizzy CLI will fail the prescribed verification and prevent the guide from completing. Use the documented Fizzy authentication/read-only verification command consistently here and in the DONE WHEN expressions.
fizzy --version && fizzy auth status --json | grep -q '"authenticated": true' && echo OK
# Expected: fizzy version X.Y.Z, then OK
- Files reviewed: 5/5 changed files
- Comments generated: 1
- Review effort level: Lite (auto)
Note
Copilot is running an experiment and ran this review at Lite.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9ee30e1ea1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 64fea1712d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…s from their CLIs
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7e38071263
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The plugin description named Basecamp, HEY and Fizzy as though all three were packaged, while skills/ holds only the Basecamp ones until the hey-cli and fizzy-cli syncs publish here. Keep the 37signals scope and state what installs now, in plugin.json and the matching marketplace plugin entry.
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 18ad514cec
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The completion predicate required every product CLI found on PATH to be signed in, so a machine with an unused, unauthenticated hey or fizzy binary could never finish a Basecamp-only run — or worse, sent the agent to sign in to a product the user did not choose. Completion now follows the TODO: each chosen product's auth status must report authenticated, at least one, and a CLI for a product that was not chosen is left alone.
|
Review threads: 1 resolved (1 fixed, 0 declined). |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9ccefba684
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…stalled Steps 2 and 3 told the reader to skip the installer when the CLI was present, but the only `skill install` command sat behind that installer in one && chain, so a machine that already had the CLI could finish the run without the selected product's skill. Each step is now three lines that stand alone: the installer runs only when the CLI is missing, sign-in only when not already signed in, and the skill install every time.
This repo publishes the agent skills for Basecamp, HEY, and Fizzy, but its README, install guide, AGENTS.md, and plugin manifest still described it as "AI agent skills for Basecamp". This PR repositions it as the skills repo for all 37signals products.
Fixes #1.
What changed
README.md
npx skills add basecamp/skills.basecamp,basecamp-doctor,hey,fizzy), descriptions taken from each SKILL.md's frontmatter, withheyandfizzymarked as not currently inskills/and pointed at their upstream directories.basecamp/tap/basecamp-cli; thebasecamp/tap/basecampthe old install.md used does not exist in the tap.skills/directory, and an About paragraph explaining that this repo is a publish target written by each CLI's release sync.install.md
npx skills add basecamp/skillsstep. The DONE WHEN holds when only one product's CLI is installed. Keeps the "Optional: Manual installation" section, and adds optional Homebrew and CLI-side (hey skill install,fizzy skill install) sections.install.mdlink; the uppercase one 404s).AGENTS.md
.managed-skills.basecamp-cli,.managed-skills.hey-cli,.managed-skills.fizzy-clionce Fizzy publishes) that each sync owns and only ever deletes from, the legacy.managed-skillskept as a comment-only tombstone so a CLI still on the old script deletes nothing, the "do not edit skills here" rule with each upstream path, and the safe-to-edit file list..claude-plugin/
descriptionfields and the marketplacemetadata.descriptionname all three products; version bumped to 0.2.0. Thenamefields staybasecamp-skillsso existing plugin installs keep resolving.Why HEY's skill is absent
The
heyskill is missing fromskills/because of the sync bug in #5: the basecamp-cli and hey-cli release syncs shared a single.managed-skillsmanifest, so each product's release deleted the other product's skills. Fixes are in flight in both CLIs. The README says the skill returns automatically on the first hey-cli release after that fix ships, and until then points at https://github.com/basecamp/hey-cli/tree/main/skills/hey. Nothing is hand-copied intoskills/here.Merge order
This branch includes #2's commit with its author intact, so either merge #2 first and this rebases clean, or merge this alone and #2 closes.
Checks
No CI here, so locally: both JSON files pass
python3 -m json.tool; every http(s) URL in the changed files returns 200 (the one exception is the pre-existing$schemaURL in marketplace.json, untouched);git diff --checkis clean; install.md passes the install-md eval checks.The sync ownership fixes the README refers to: basecamp/basecamp-cli#708, basecamp/hey-cli#434, and the seed template basecamp/cli#78.