Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
2b1982c
fix(ci): clone @focusmcp/core as sibling before install (#1)
samuelds Apr 16, 2026
8cc281b
style: migrate indent from 2 to 4 spaces (Biome config) (#2)
samuelds Apr 17, 2026
a6b162d
docs: add CLAUDE.md (agent guidance, replaces ~/.claude memory) (#4)
samuelds Apr 17, 2026
98249d6
chore: add gitleaks to pre-commit (#3)
samuelds Apr 19, 2026
bd3f8e3
feat: implement focus start — stdio + HTTP MCP transport (#5)
samuelds Apr 20, 2026
952674a
feat: load bricks from center.json on focus start (#6)
samuelds Apr 20, 2026
31138fd
feat: display CLI and core versions in focus --version (#7)
samuelds Apr 20, 2026
45fc5ae
feat: support TS brick loading + fix arg forwarding to start command …
samuelds Apr 20, 2026
b3ce0a3
feat: expose focus_list, focus_load, focus_unload as MCP tools (#9)
samuelds Apr 20, 2026
3fd6598
feat: focus_load + focus_reload + tools/list_changed notifications (#10)
samuelds Apr 20, 2026
0e92c2e
ci: add Claude Code Review action (#12)
samuelds Apr 21, 2026
5e4c4aa
chore(ci): bump GitHub Actions to v5 (Node.js 24) (#15)
samuelds Apr 21, 2026
8395877
feat: add marketplace CLI commands and IO adapters (#16)
samuelds Apr 22, 2026
1134d0d
ci: add GitHub Packages publish workflow for develop (#18)
samuelds Apr 22, 2026
10d8418
fix(ci): use composite setup action in publish-dev workflow (#19)
samuelds Apr 22, 2026
8ca2790
feat: rename npm scope from @focusmcp to @focus-mcp (#22)
samuelds Apr 22, 2026
d525623
feat: wire marketplace commands in bin + add 7 MCP tools (#17)
samuelds Apr 22, 2026
a9de254
fix(ci): add id-token permission for npm provenance (#23)
samuelds Apr 22, 2026
75c6399
feat(ci): dev publish workflow (#25)
samuelds Apr 22, 2026
51e41d7
fix(ci): use GitHub Packages for dev publish (#26)
samuelds Apr 23, 2026
57f996e
fix(ci): add id-token:write permission + remove duplicate workflow (#27)
samuelds Apr 23, 2026
2f55123
chore(release): v1.0.0 + stable-publish (#28)
samuelds Apr 23, 2026
90160ea
feat(cli): focus browse interactive TUI (#31)
samuelds Apr 23, 2026
b959169
docs: v1.1.0 cleanup — VISION, ARCHITECTURE, AGENTS.md, AI transparen…
samuelds Apr 23, 2026
533be95
fix(ci): rename \`direct_prompt\` → \`prompt\` in claude-code-action …
samuelds Apr 23, 2026
c98e7e5
fix(ci): add checkout step to claude-review workflow (#37)
samuelds Apr 24, 2026
165ff6d
fix(brick-source): use node module resolution for npm-nested and flat…
samuelds Apr 24, 2026
b31ba2c
chore: sync main back into develop (release bumps) (#40)
samuelds Apr 24, 2026
640136a
chore(release): bump cli to 1.2.0 (PR #38 resolver) (#42)
samuelds Apr 24, 2026
7bc498a
fix(catalog): default URL targets GitHub Pages CDN + bump 1.3.0
samuelds Apr 24, 2026
dce5a30
test(catalog): import DEFAULT_CATALOG_URL from core instead of hardco…
samuelds Apr 24, 2026
221e642
chore: sync main back into develop (release bumps)
samuelds Apr 24, 2026
3d1bbcb
fix(cli): unify center.lock parser + --force catalog remove + schema …
samuelds Apr 24, 2026
ef24f66
chore(release): bump @focus-mcp/cli to 1.4.0
samuelds Apr 24, 2026
d201301
feat(cli): bulk add/remove + auto-install deps (#54)
samuelds Apr 24, 2026
7b68dc4
feat(cli): add focus doctor command (#56)
samuelds Apr 24, 2026
31e9105
chore(release): cli 1.6.0 (focus doctor) (#58)
samuelds Apr 24, 2026
7c5184e
feat(cli): add focus upgrade command
samuelds Apr 24, 2026
e0a7b05
feat(cli): DX improvements — force reinstall, doctor --fix, actionabl…
samuelds Apr 24, 2026
5f729c6
fix(cli): test fix — move enrichStartError test inside startCommand d…
samuelds Apr 24, 2026
94bf832
fix(cli): fix biome format in start.test.ts enrichStartError test (#67)
samuelds Apr 24, 2026
9d82945
feat(cli): FOCUS_BENCH_MODE env var skips meta tools for bench isolat…
samuelds Apr 26, 2026
f082a6d
docs: replace aspirational slogan with measured token savings (#69)
samuelds Apr 27, 2026
4af2f8e
feat: implement focus_update + focus_upgrade MCP tools + CLI update a…
samuelds Apr 28, 2026
ebecc34
chore(ci): add back-merge workflow to auto-sync main → develop (#71)
samuelds Apr 28, 2026
9417d15
refactor(upgrade): thin wrapper around core.executeUpgrade (#72)
samuelds Apr 28, 2026
81bb2b0
fix(ci): dev-publish uses changeset snapshot for proper next-version …
samuelds Apr 28, 2026
4aa4203
chore(release): @focus-mcp/cli 1.8.1 — bench mode + core 1.2.0 (#74)
samuelds Apr 28, 2026
3795270
chore(release): merge develop into main — @focus-mcp/cli 1.8.1
Apr 28, 2026
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
79 changes: 79 additions & 0 deletions .github/workflows/back-merge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# SPDX-FileCopyrightText: 2026 FocusMCP contributors
# SPDX-License-Identifier: MIT

name: Back-merge main → develop

on:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: write

concurrency:
group: back-merge-${{ github.ref }}
cancel-in-progress: false

jobs:
back-merge:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
ref: develop
token: ${{ secrets.RELEASE_TOKEN }}

- name: Configure git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"

- name: Check skip flag
id: check-skip
env:
COMMIT_MSG: ${{ github.event.head_commit.message }}
run: |
if echo "$COMMIT_MSG" | grep -qF '[skip back-merge]'; then
echo "skip=true" >> $GITHUB_OUTPUT
else
echo "skip=false" >> $GITHUB_OUTPUT
fi

- name: Attempt back-merge from main
id: merge
if: steps.check-skip.outputs.skip == 'false'
continue-on-error: true
run: |
set -euo pipefail
git fetch origin main
if git merge-base --is-ancestor origin/main HEAD; then
echo "merged=false" >> $GITHUB_OUTPUT
echo "Develop is already up to date with main — nothing to back-merge."
exit 0
fi
if git merge origin/main --no-edit -m "chore(back-merge): main → develop after release [skip ci]"; then
echo "merged=true" >> $GITHUB_OUTPUT
else
echo "merged=false" >> $GITHUB_OUTPUT
echo "::warning ::Back-merge failed (conflicts). A manual PR is required."
git merge --abort || true
exit 1
fi

- name: Push develop
if: steps.merge.outputs.merged == 'true'
run: git push origin develop

- name: Open PR if conflicts
if: failure() && steps.merge.outcome == 'failure'
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.RELEASE_TOKEN }}
base: develop
branch: chore/back-merge-main-${{ github.run_id }}
title: "chore: back-merge main → develop (manual conflict resolution required)"
body: |
Automatic back-merge from main failed due to conflicts. Resolve manually.
commit-message: "chore: open back-merge PR after auto-merge conflict"
18 changes: 5 additions & 13 deletions .github/workflows/dev-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,21 +31,13 @@ jobs:
node-version: 22
registry-url: https://registry.npmjs.org
scope: '@focus-mcp'
- name: Compute dev version
id: version
- name: Apply changeset snapshot version
run: |
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || git rev-list --max-parents=0 HEAD)
DEV_NUM=$(git rev-list --count ${LAST_TAG}..HEAD)
BASE_VERSION=$(node -e "const p=require('./package.json'); console.log(p.version || '0.1.0')")
DEV_VERSION="${BASE_VERSION}-dev.${DEV_NUM}"
echo "version=${DEV_VERSION}" >> "$GITHUB_OUTPUT"
echo "Dev version: ${DEV_VERSION}"
- name: Set dev version
run: npm version "${DEV_VERSION}" --no-git-tag-version
env:
DEV_VERSION: ${{ steps.version.outputs.version }}
# Produces versions like 1.9.0-dev-20260428-abc1234 from pending changesets.
# Falls back gracefully when no changesets are pending (no-op).
pnpm changeset version --snapshot dev || true
- run: pnpm build
- name: Publish with dev tag
run: npm publish --tag dev --access public
run: pnpm changeset publish --no-git-tag --tag dev
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @focus-mcp/cli

## 1.8.1

### Patch Changes

- 9d82945: feat(cli): FOCUS_BENCH_MODE env var skips meta tools (focus_list, focus_install, etc.) for benchmark isolation. Default behavior unchanged.

## 1.8.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ SPDX-License-Identifier: MIT

# @focus-mcp/cli

> Focus your AI agents on what matters. Reduce context from 200k to ~2k tokens.
> Focus your AI agents on what matters. **Measured savings: 65.9% on output tokens** across 29 bricks ([details](https://github.com/focus-mcp/marketplace/blob/main/benchmarks/equivalence-report.md)).

[![npm](https://img.shields.io/npm/v/@focus-mcp/cli)](https://www.npmjs.com/package/@focus-mcp/cli)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@focus-mcp/cli",
"version": "1.8.0",
"version": "1.8.1",
"private": false,
"description": "Focus your AI agents on what matters. 68+ bricks, 1 MCP server, modular context — from 200k to 2k tokens. Works with Claude Code, Cursor, Codex.",
"license": "MIT",
Expand Down Expand Up @@ -80,7 +80,7 @@
"@commitlint/cli": "^19.6.0",
"@commitlint/config-conventional": "^19.6.0",
"@commitlint/types": "^19.8.1",
"@focus-mcp/core": "file:../core/packages/core",
"@focus-mcp/core": "^1.2.0",
"@types/node": "^22.10.0",
"@types/react": "^18.3.0",
"@vitest/coverage-v8": "^3.2.0",
Expand Down
10 changes: 5 additions & 5 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/bin/focus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ async function main(argv: string[]): Promise<number> {
case 'reinstall':
return runReinstall(rest);
case 'upgrade':
case 'update':
return runUpgrade(rest);
case 'search':
return runSearch(rest);
Expand Down
2 changes: 1 addition & 1 deletion src/commands/add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ export async function addManyCommand({
if (!force) {
const ver = centerJson.bricks[brickName]?.version ?? 'unknown';
messages.push(
`Brick "${brickName}" is already installed (version ${ver}). Use \`focus update\` to upgrade.`,
`Brick "${brickName}" is already installed (version ${ver}). Use \`focus upgrade\` (or \`focus update\`) to upgrade.`,
);
continue;
}
Expand Down
Loading
Loading