Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
1a2c067
✨ feat(monorepo): bootstrap pnpm 9 in place of npm workspaces
claude May 28, 2026
5546660
✨ feat(monorepo): declare phantom deps surfaced by pnpm strict resolu…
claude May 28, 2026
5dc1749
👷 ci: switch GitHub Actions workflows to pnpm
claude May 28, 2026
ed33419
🐳 chore(docker): run pnpm via corepack in docker images and compose s…
claude May 28, 2026
bb498da
✨ feat(api): declare webpack as a direct devDependency
claude May 28, 2026
f4a42e0
✨ feat(frontend): declare @storybook/react as a direct devDependency
claude May 28, 2026
c8f8e76
🙈 chore: ignore Node V8 compile cache directory
claude May 28, 2026
8f1e5de
🐛 fix(cli): install dist runtime dependencies before invoking the bun…
claude May 28, 2026
13740a8
🐛 fix(integration-tests): widen transformIgnorePatterns for pnpm node…
claude May 28, 2026
64bb6aa
🩹 fix: address greptile review on the pnpm migration PR
claude May 28, 2026
40ee4a7
⚡ perf(docker): cache pnpm via shared COREPACK_HOME and reuse the sto…
claude May 28, 2026
f8429ca
⚡ perf(ci): skip prepare hook in CI and prefer offline package resolu…
claude May 28, 2026
71e86d3
🔧 chore(scripts): extract install-dist-cli-deps and use frozen lockfile
cteyton May 28, 2026
add2f31
🐛 fix(docker): ignore lifecycle scripts in API migrations install
cteyton May 28, 2026
262202d
🐛 fix(docker-compose): fail fast on pnpm lockfile drift
cteyton May 28, 2026
14bd612
🐛 fix(scripts): drop frozen-lockfile from dist CLI install
cteyton May 28, 2026
26a40b3
🐛 fix(docker): pin API runtime installs to pnpm lockfile
cteyton Jun 1, 2026
6d57418
🐛 fix(scripts): invalidate dist CLI deps cache on manifest change
cteyton Jun 1, 2026
0b4e419
📝 docs(contributing): add npm-to-pnpm migration script and update setup
cteyton Jun 1, 2026
f641d26
🐛 fix(docker): add runtime deps missing from bundled api/mcp images
cteyton Jun 1, 2026
a838304
⬆️ chore(pnpm): relocate config to pnpm-workspace.yaml for v11
cteyton Jun 1, 2026
39ec701
⬆️ chore(pnpm): pin pnpm 11.5.0 across docker and CI
cteyton Jun 1, 2026
6b78787
⬆️ chore(pnpm): regenerate lockfile under pnpm 11.5.0
cteyton Jun 1, 2026
5fddd7d
📝 docs(contributing): note pnpm 11 and pnpm-workspace.yaml config
cteyton Jun 1, 2026
320a339
👷 ci(pnpm): read pnpm version from packageManager field
cteyton Jun 1, 2026
2e7b902
Merge remote-tracking branch 'origin/main' into claude/upbeat-gates-o…
cteyton Jun 2, 2026
62f3e26
🐛 fix(pnpm): set explicit allowBuilds bools for ignored deps
cteyton Jun 2, 2026
cbc7f76
Edit pnpm files
cteyton Jun 2, 2026
c0178cb
🔀 Merge origin/main into pnpm migration branch
cteyton Jun 2, 2026
17fa4cb
🐛 fix(ci): disable strictDepBuilds for throwaway prod-CLI install
cteyton Jun 2, 2026
a7ee647
Fix prettier issues
cteyton Jun 2, 2026
ec2d8f5
👷 ci(pnpm): add build smoke check to migration script
cteyton Jun 2, 2026
468636f
⚡ perf(ci): cache pnpm supply-chain verification
cteyton Jun 2, 2026
004bb83
🔁 ci: empty commit to test pnpm verify cache hit
cteyton Jun 2, 2026
14f8fe8
📝 docs(pnpm): soften workspace config rationale comments
cteyton Jun 2, 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
83 changes: 65 additions & 18 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,18 @@ jobs:

steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci --ignore-scripts --no-audit --no-fund
cache: 'pnpm'
- name: Cache pnpm supply-chain verification
uses: actions/cache@v4
with:
path: ~/.cache/pnpm
key: pnpm-verify-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- run: pnpm install --frozen-lockfile --prefer-offline
- name: Generate tsconfig
env:
PACKMIND_EDITION: ${{ vars.PACKMIND_EDITION }}
Expand All @@ -75,7 +81,7 @@ jobs:
run: ./node_modules/.bin/nx test api
- run: cp apps/api/docker-package.json dist/apps/api/.
- run: cp package.json dist/apps/api/.
- run: cp package-lock.json dist/apps/api/.
- run: cp pnpm-lock.yaml dist/apps/api/.
- run: cp tsconfig.base.effective.json dist/apps/api/.

- name: Upload API build artifacts
Expand All @@ -95,22 +101,28 @@ jobs:

steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci --ignore-scripts --no-audit --no-fund
cache: 'pnpm'
- name: Cache pnpm supply-chain verification
uses: actions/cache@v4
with:
path: ~/.cache/pnpm
key: pnpm-verify-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- run: pnpm install --frozen-lockfile --prefer-offline
- name: Generate tsconfig
env:
PACKMIND_EDITION: ${{ vars.PACKMIND_EDITION }}
run: node scripts/select-tsconfig.mjs
- name: Generate Chakra types
env:
PACKMIND_EDITION: ${{ vars.PACKMIND_EDITION }}
run: npm run chakra:typegen
run: pnpm chakra:typegen
- name: Typechecks
run: npm run typecheck:frontend
run: pnpm typecheck:frontend
- name: Test Frontend
env:
PACKMIND_EDITION: ${{ vars.PACKMIND_EDITION }}
Expand Down Expand Up @@ -144,12 +156,18 @@ jobs:

steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci --ignore-scripts --no-audit --no-fund
cache: 'pnpm'
- name: Cache pnpm supply-chain verification
uses: actions/cache@v4
with:
path: ~/.cache/pnpm
key: pnpm-verify-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- run: pnpm install --frozen-lockfile --prefer-offline
- name: Generate tsconfig
env:
PACKMIND_EDITION: ${{ vars.PACKMIND_EDITION }}
Expand All @@ -165,6 +183,7 @@ jobs:
NODE_OPTIONS: '--max-old-space-size=16384 --no-experimental-strip-types'
run: ./node_modules/.bin/nx test mcp-server
- run: cp tsconfig.base.effective.json dist/apps/mcp-server/.
- run: cp pnpm-lock.yaml dist/apps/mcp-server/.

- name: Upload MCP-Server build artifacts
uses: actions/upload-artifact@v4
Expand All @@ -183,12 +202,18 @@ jobs:

steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci --ignore-scripts --no-audit --no-fund
cache: 'pnpm'
- name: Cache pnpm supply-chain verification
uses: actions/cache@v4
with:
path: ~/.cache/pnpm
key: pnpm-verify-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- run: pnpm install --frozen-lockfile --prefer-offline
- name: Generate tsconfig
env:
PACKMIND_EDITION: ${{ vars.PACKMIND_EDITION }}
Expand Down Expand Up @@ -224,11 +249,12 @@ jobs:

steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
cache: 'pnpm'

- name: Set up Bun
uses: oven-sh/setup-bun@v2
Expand All @@ -239,7 +265,12 @@ jobs:
id: get-version
run: echo "version=$(node -p "require('./apps/cli/package.json').version")" >> $GITHUB_OUTPUT

- run: npm ci --ignore-scripts --no-audit --no-fund
- name: Cache pnpm supply-chain verification
uses: actions/cache@v4
with:
path: ~/.cache/pnpm
key: pnpm-verify-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- run: pnpm install --frozen-lockfile --prefer-offline
- name: Generate tsconfig
env:
PACKMIND_EDITION: ${{ vars.PACKMIND_EDITION }}
Expand Down Expand Up @@ -272,6 +303,9 @@ jobs:
echo "Built executables (with embedded WASM files):"
ls -lh dist/apps/cli-executables/

- name: Install dist CLI runtime dependencies
run: sh scripts/install-dist-cli-deps.sh

- name: Test executables
run: |
node dist/apps/cli/main.cjs --version
Expand Down Expand Up @@ -300,14 +334,20 @@ jobs:

steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
cache: 'pnpm'

- run: npm ci --ignore-scripts --no-audit --no-fund
- name: Cache pnpm supply-chain verification
uses: actions/cache@v4
with:
path: ~/.cache/pnpm
key: pnpm-verify-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- run: pnpm install --frozen-lockfile --prefer-offline

- name: Generate tsconfig
env:
Expand All @@ -316,6 +356,9 @@ jobs:

- run: ./node_modules/.bin/nx run packmind-cli:build

- name: Install dist CLI runtime dependencies
run: sh scripts/install-dist-cli-deps.sh

- name: Fix CLI artifacts permissions
run: |
chmod +x dist/apps/cli/main.cjs || true
Expand Down Expand Up @@ -358,12 +401,16 @@ jobs:
NODE_OPTIONS: '--max-old-space-size=16384 --no-experimental-strip-types'
run: ./node_modules/.bin/nx test cli-e2e-tests

- name: Install latest production CLI from npm
- name: Install latest production CLI from registry
run: |
PROD_CLI_DIR="$(mktemp -d)"
cd "${PROD_CLI_DIR}"
npm init -y --silent
npm install @packmind/cli
pnpm init
# Throwaway install: only need the CLI binary resolvable to run --version.
# bcrypt/msgpackr-extract ship prebuilt binaries, so their build scripts
# are not required. Disable strictDepBuilds (default true in pnpm 11) to
# avoid ERR_PNPM_IGNORED_BUILDS here where there is no allowBuilds config.
pnpm add @packmind/cli --config.strictDepBuilds=false
CLI_BINARY_PATH="$(node -e "console.log(require.resolve('@packmind/cli'))")"
cd -
echo "Installed CLI version: $(node "${CLI_BINARY_PATH}" --version)"
Expand Down
11 changes: 9 additions & 2 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,13 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4

- uses: pnpm/action-setup@v4

- name: Set up Node.js ${{ inputs.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
cache: 'npm'
cache: 'pnpm'

- name: Get package version
id: get-version
Expand Down Expand Up @@ -144,8 +146,13 @@ jobs:
echo "tag=${{ github.sha }}" >> $GITHUB_OUTPUT
fi

- name: Cache pnpm supply-chain verification
uses: actions/cache@v4
with:
path: ~/.cache/pnpm
key: pnpm-verify-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- name: Install dependencies
run: npm ci --ignore-scripts --no-audit --no-fund
run: pnpm install --frozen-lockfile --prefer-offline

# Download all build artifacts
- name: Download API build artifacts
Expand Down
22 changes: 17 additions & 5 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,18 @@ jobs:
- uses: actions/checkout@v4
with:
fetch-depth: 10
- uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci --ignore-scripts --no-audit --no-fund
cache: 'pnpm'
- name: Cache pnpm supply-chain verification
uses: actions/cache@v4
with:
path: ~/.cache/pnpm
key: pnpm-verify-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- run: pnpm install --frozen-lockfile --prefer-offline
- name: Generate Proprietary tsconfig
env:
PACKMIND_EDITION: ${{ env.ENTERPRISE_EDITION }}
Expand All @@ -73,7 +79,7 @@ jobs:
PACKMIND_EDITION: ${{ env.ENTERPRISE_EDITION }}
run: ./node_modules/.bin/nx run-many -t lint --tuiAutoExit
- name: Check code formatting
run: npm run prettier:check
run: pnpm prettier:check

sonarqube:
if: vars.PACKMIND_EDITION != 'proprietary'
Expand All @@ -87,12 +93,18 @@ jobs:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: pnpm/action-setup@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci --ignore-scripts --no-audit --no-fund
cache: 'pnpm'
- name: Cache pnpm supply-chain verification
uses: actions/cache@v4
with:
path: ~/.cache/pnpm
key: pnpm-verify-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
- run: pnpm install --frozen-lockfile --prefer-offline
- name: Generate Proprietary tsconfig
env:
PACKMIND_EDITION: ${{ env.ENTERPRISE_EDITION }}
Expand Down
12 changes: 9 additions & 3 deletions .github/workflows/tmp-cli-lint-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,23 @@ jobs:
- name: Checkout
uses: actions/checkout@v4

- uses: pnpm/action-setup@v4

- name: Use Node.js 24.15.0
uses: actions/setup-node@v4
with:
node-version: '24.15.0'
cache: 'npm'
cache: 'pnpm'

- name: Install dependencies
run: npm ci --ignore-scripts --no-audit --no-fund
run: pnpm install --frozen-lockfile --prefer-offline

- name: Build CLI
run: npm run packmind-cli:build
run: pnpm packmind-cli:build

- name: Install dist CLI runtime dependencies
shell: bash
run: sh scripts/install-dist-cli-deps.sh

- name: Run CLI lint
run: node dist/apps/cli/main.cjs lint .
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
.nx-daemon/
.pnpm-store/
node_modules/
.vscode/
.idea/
Expand Down Expand Up @@ -56,4 +57,7 @@ apps/mcp-server/key.pem
docker/nginx/ssl

.nx/polygraph
.nx/self-healing
.nx/self-healing

# Node.js V8 compile cache (auto-generated by Node 22+ when NODE_COMPILE_CACHE is set)
node-compile-cache/
2 changes: 1 addition & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
npx pretty-quick --staged
pnpm exec pretty-quick --staged
scripts/precommit-lint.sh
21 changes: 19 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,34 @@

## Starting the stack:

You will need node 24.15.0 and docker to start the development stack:
You will need node 24.15.0 and docker to start the development stack. This repo
uses **pnpm 11** (pinned via `packageManager` in `package.json`); enable it through
corepack — no global install needed. pnpm settings (overrides, `allowBuilds`,
hoisting) live in `pnpm-workspace.yaml`, not `.npmrc` or the `package.json` `pnpm`
field, as required since pnpm 11:

```shell
nvm use
npm i
corepack enable
pnpm install --frozen-lockfile
PACKMIND_EDITION=oss node scripts/select-tsconfig.mjs
docker compose --profile=dev up
```

The app should be available at [http://localhost:4200](http://localhost:4200)

## Migrating an existing checkout from npm to pnpm

If you previously worked with npm, run the one-shot migration script from the
repo root. It removes stale `node_modules` and `package-lock.json`, activates
pnpm via corepack, installs against the lockfile, and regenerates the tsconfig:

```shell
./pnpm_migrate.sh
```

The script is safe to re-run.

## Switching packmind-cli versions (pvm)

`pvm` is a lightweight dev tool (inspired by nvm) to manage multiple packmind-cli versions locally.
Expand Down
Loading
Loading