bod-cli 0.10.4 → 0.10.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -39,10 +39,23 @@ jobs:
39
39
  git add package.json
40
40
  git commit -m "chore: release v${VERSION} [skip ci]"
41
41
 
42
+ - name: Pull NPM_TOKEN from bodify secrets store
43
+ # The npm token is NOT a per-repo secret — a repo-scoped NPM_TOKEN goes stale silently and every
44
+ # publish then dies on a 404. Pull the canonical token from bodify at publish time, so rotating it
45
+ # in ONE place fixes every repo. Only GitHub secret needed: BODIFY_API_KEY.
46
+ env:
47
+ BODIFY_API_KEY: ${{ secrets.BODIFY_API_KEY }}
48
+ run: |
49
+ TOKEN=$(curl -fsS -H "Authorization: Bearer $BODIFY_API_KEY" \
50
+ "https://bodify.bod.ee/api/apps/9ddba0fb-03bc-4490-8577-5e094b5b6792/env/NPM_TOKEN?environment=prod" \
51
+ | jq -r '.value')
52
+ [ -n "$TOKEN" ] && [ "$TOKEN" != "null" ] || { echo "::error::could not fetch NPM_TOKEN from bodify"; exit 1; }
53
+ echo "::add-mask::$TOKEN"
54
+ echo "NODE_AUTH_TOKEN=$TOKEN" >> "$GITHUB_ENV"
42
55
  - name: Publish to npm
43
56
  run: npm publish --access public
44
57
  env:
45
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
58
+ NODE_AUTH_TOKEN: ${{ env.NODE_AUTH_TOKEN }}
46
59
 
47
60
  - name: Push tag
48
61
  run: |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bod-cli",
3
- "version": "0.10.4",
3
+ "version": "0.10.6",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "bod": "./src/cli.ts"
@@ -47,8 +47,12 @@ export const DEFAULT_EXCLUDES: { pattern: string; why: string }[] = [
47
47
  { pattern: '.tmp', why: 'repo-wide scratch convention — never runtime input' },
48
48
  { pattern: 'scratchpad', why: 'agent scratch dir, same class as .tmp' },
49
49
  { pattern: '.bodify', why: 'local `bod serve` state / dev database' },
50
- { pattern: '.mcp-android', why: 'local device-automation MCP state' },
51
- { pattern: '.mcp-ios', why: 'local device-automation MCP state' },
50
+ // Enumerating these by hand is what failed: `.mcp-android`/`.mcp-ios` were listed
51
+ // while `.mcp-playwright/profile` (41.8MB) and `.mcp-cursor/cache` (7.3MB) sailed
52
+ // through on para-li. The family is the unit, not each member. Still a BARE
53
+ // pattern (no leading `*/`), so it matches at top level too — pinned by test.
54
+ { pattern: '.mcp-*', why: 'local MCP tool state (android/ios/playwright/cursor/…)' },
55
+ { pattern: '.bodify-bak*', why: 'local `bod serve` db backups — same class as .bodify' },
52
56
  { pattern: '.frame-dev', why: 'frame dev-server cache' },
53
57
  { pattern: '.DS_Store', why: 'macOS Finder metadata' },
54
58
  ]
@@ -28,6 +28,9 @@ beforeAll(() => {
28
28
  f('packages/x/.agent/state.json')
29
29
  f('.claude/settings.json'); f('.cursor/rules'); f('.tmp/junk'); f('scratchpad/note')
30
30
  f('.bodify/dev.db'); f('.mcp-ios/x'); f('.mcp-android/x'); f('.vscode/settings.json')
31
+ // the family members hand-enumeration missed on para-li (41.8MB + 7.3MB)
32
+ f('.mcp-playwright/profile/p.bin'); f('.mcp-cursor/cache/c.bin')
33
+ f('packages/x/.mcp-ios/s.json'); f('.bodify-bak-1/data.db')
31
34
  f('.frame-dev/cache'); f('.DS_Store'); f('.env.local', 'SECRET=1')
32
35
  // per-app exclusion target
33
36
  f('native/App.js')
@@ -37,6 +40,7 @@ beforeAll(() => {
37
40
  f('dist/bundle.js', 'built') // re-included via the `!dist` escape hatch
38
41
  f('src/store/index.ts') // a real source dir named like a hand-rolled exclude
39
42
  f('src/test/unit.ts')
43
+ f('src/mcp-client/keep.ts') // a real source dir the `.mcp-*` family must NOT eat
40
44
  })
41
45
  afterAll(() => {
42
46
  rmSync(FIX, { recursive: true, force: true })
@@ -97,6 +101,8 @@ describe('the real upload tarball', () => {
97
101
  '.claude/settings.json', '.cursor/rules', '.tmp/junk', 'scratchpad/note',
98
102
  '.bodify/dev.db', '.mcp-ios/x', '.mcp-android/x', '.vscode/settings.json',
99
103
  '.frame-dev/cache', '.DS_Store', '.env.local',
104
+ '.mcp-playwright/profile/p.bin', '.mcp-cursor/cache/c.bin',
105
+ 'packages/x/.mcp-ios/s.json', '.bodify-bak-1/data.db',
100
106
  ]) expect(members).not.toContain(gone)
101
107
  })
102
108
 
@@ -115,6 +121,7 @@ describe('the real upload tarball', () => {
115
121
  expect(members).toContain('config.generated.json') // untracked-but-needed
116
122
  expect(members).toContain('src/store/index.ts')
117
123
  expect(members).toContain('src/test/unit.ts')
124
+ expect(members).toContain('src/mcp-client/keep.ts') // `.mcp-*` is dot-anchored, not a substring
118
125
  })
119
126
  })
120
127