diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ded1a99..3e53f04 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -47,7 +47,7 @@ jobs: # Match squash merges from release/* branches or release prepare commits # Match: merge commits from release/*, squash merges (PR title "Release v..."), or release prepare commits - if echo "$COMMIT_MSG" | grep -qE "(^Merge pull request .* from .*/release/|^Release v|^chore: prepare release)"; then + if echo "$COMMIT_MSG" | grep -qE "(^Merge pull request .* from .*/release/|^Release v|^chore: prepare release|^chore\(release\))"; then echo "is-release=true" >> $GITHUB_OUTPUT echo "✅ Release commit detected — proceeding with publish" else diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 781665b..0000000 --- a/.npmignore +++ /dev/null @@ -1,26 +0,0 @@ -# Source files -src/ -*.test.ts - -# Config files -tsconfig.json -eslint.config.mjs -vitest.config.ts -.prettierrc -.nvmrc -.npmrc - -# Coverage -coverage/ -*.tsbuildinfo - -# IDE -.vscode/ -.idea/ - -# OS -.DS_Store -Thumbs.db - -# CI -.github/ diff --git a/CLAUDE.md b/CLAUDE.md index ed0f8dc..3214032 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -26,8 +26,8 @@ its agent-runtime patterns (the local memory daemon was deliberately ported from `spawn git` directly (memory-core's createGit is private); no new deps. `vault sync [name]` forces a cycle via the daemon (`/api/sync/run`) or in-process when it is down - `src/package-guard.test.ts` - CI guard: no agent-runtime remnants (express/ws/sqlite/ - core/platform/supabase), runtime deps stay exactly `@agentage/memory-core + chalk + - commander + open` + core/platform/supabase), runtime deps stay exactly `@agentage/memory-core + + @agentage/server-memory + @modelcontextprotocol/sdk + chalk + commander + open` ## Auth model Fresh DCR public client per `setup` run (the redirect URI binds the ephemeral callback diff --git a/package.json b/package.json index f3065d3..2ba5e75 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,20 @@ "description": "The agentage CLI - connect this machine to agentage from the terminal", "type": "module", "main": "./dist/index.js", + "types": "./dist/index.d.ts", "bin": { "agentage": "./dist/cli.js" }, + "author": "Volodymyr Vreshch", + "publishConfig": { + "access": "public" + }, + "bugs": { + "url": "https://github.com/agentage/cli/issues" + }, "files": [ - "dist" + "dist", + "CHANGELOG.md" ], "engines": { "node": ">=22.0.0", @@ -34,9 +43,9 @@ "@agentage/memory-core": "^0.3.2", "@agentage/server-memory": "^0.0.3", "@modelcontextprotocol/sdk": "^1.29.0", - "chalk": "latest", - "commander": "latest", - "open": "latest" + "chalk": "^5.6.2", + "commander": "^14.0.3", + "open": "^11.0.0" }, "devDependencies": { "@anthropic-ai/sdk": "0.110.0", diff --git a/scripts/bump-version.js b/scripts/bump-version.js index 9bb641d..16785a5 100755 --- a/scripts/bump-version.js +++ b/scripts/bump-version.js @@ -41,6 +41,11 @@ switch (bumpType) { break; } +// 0.1.19 is a permanently burned npm slot (unpublished); publishing it hard-403s, so skip it. +if (newVersion === '0.1.19') { + newVersion = '0.1.20'; +} + pkg.version = newVersion; writeFileSync(packagePath, JSON.stringify(pkg, null, 2) + '\n'); diff --git a/src/cli.ts b/src/cli.ts index 00d9cbb..54c6dda 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -13,6 +13,13 @@ import { disableDaemon } from './lib/daemon-pref.js'; import { refreshUpdateCache, updateHint } from './lib/update-cache.js'; import { VERSION } from './utils/version.js'; +// Dependency-free guard so the message survives even if deps fail to parse on old Node. +const nodeMajor = Number(process.versions.node.split('.')[0]); +if (nodeMajor < 22) { + process.stderr.write(`agentage requires Node.js >= 22 (you have v${process.versions.node})\n`); + process.exit(1); +} + const program = new Command(); program diff --git a/src/package-guard.test.ts b/src/package-guard.test.ts index 441da6c..765aa2e 100644 --- a/src/package-guard.test.ts +++ b/src/package-guard.test.ts @@ -52,6 +52,15 @@ describe('package guard (R6)', () => { expect(pkg.bin['agentage']).toBe('./dist/cli.js'); }); + it('no runtime dependency uses the "latest" specifier', () => { + const pkg = JSON.parse(readFileSync(PKG, 'utf-8')) as { + dependencies: Record; + }; + for (const [name, spec] of Object.entries(pkg.dependencies)) { + expect(spec, `${name} must pin a semver range, not "latest"`).not.toBe('latest'); + } + }); + it('homepage is set to the canonical site URL', () => { const pkg = JSON.parse(readFileSync(PKG, 'utf-8')) as { homepage: string }; expect(pkg.homepage).toBe('https://agentage.io'); diff --git a/tsconfig.build.json b/tsconfig.build.json index b47647e..3c8e701 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -1,4 +1,8 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "sourceMap": false, + "declarationMap": false + }, "exclude": ["node_modules", "dist", "coverage", "src/**/*.test.ts"] }