release: v1.0.0 — agents.txt is generally available #486
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: AgentPress v1.0 Validate | |
| # Full CI matrix per LAUNCH/V1_RC2_GOAL.md Phase E: | |
| # Mac/Linux/Windows × Node 18/20/22 × Python 3.10–3.13. | |
| on: | |
| push: | |
| branches: [main, "v1.0", "v1.*"] | |
| pull_request: | |
| workflow_dispatch: | |
| jobs: | |
| # ---------- Dogfood our own setup-action ---------- | |
| agents-txt-self: | |
| name: agents.txt (eat our own action) | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: ./actions/setup-action | |
| with: | |
| file: agents.txt | |
| fail-on-warnings: false | |
| # ---------- @agent_press/core (TypeScript parser) ---------- | |
| ts-parser-matrix: | |
| name: '@agent_press/core (${{ matrix.os }} / Node ${{ matrix.node }})' | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| node: ['18', '20', '22'] | |
| defaults: | |
| run: | |
| working-directory: packages/core | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| - run: npm install --no-fund --no-audit | |
| - name: Build dual ESM + CJS | |
| shell: bash | |
| run: | | |
| npx tsc -p tsconfig.json | |
| if [ -f dist/index.js ]; then mv dist/index.js dist/index.mjs; fi | |
| if [ -f dist/index.js.map ]; then mv dist/index.js.map dist/index.mjs.map; fi | |
| npx tsc -p tsconfig.cjs.json | |
| if [ -f dist-cjs/index.js ]; then cp dist-cjs/index.js dist/index.cjs; fi | |
| - name: Test (parse + edge-cases) | |
| run: node --test test/parse.test.mjs test/edge-cases.test.mjs | |
| # ---------- agentpress-core (Python parser) ---------- | |
| python-parser-matrix: | |
| name: 'agentpress-core (${{ matrix.os }} / Python ${{ matrix.python }})' | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| python: ['3.10', '3.11', '3.12', '3.13'] | |
| defaults: | |
| run: | |
| working-directory: python-core | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python }} | |
| - run: python -m pip install --upgrade pip pytest | |
| - run: python -m pytest tests/ -q | |
| # ---------- Node CLI ---------- | |
| node-cli-matrix: | |
| name: 'Node CLI (${{ matrix.os }} / Node ${{ matrix.node }})' | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| node: ['18', '20', '22'] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| - name: Build local @agent_press/core (so the CLI can resolve it) | |
| shell: bash | |
| working-directory: packages/core | |
| run: | | |
| npm install --no-fund --no-audit | |
| npx tsc -p tsconfig.json | |
| if [ -f dist/index.js ]; then mv dist/index.js dist/index.mjs; fi | |
| if [ -f dist/index.js.map ]; then mv dist/index.js.map dist/index.mjs.map; fi | |
| npx tsc -p tsconfig.cjs.json | |
| if [ -f dist-cjs/index.js ]; then cp dist-cjs/index.js dist/index.cjs; fi | |
| - name: Install root deps (uses workspace-local core via npm pack) | |
| shell: bash | |
| run: | | |
| # Pack the local core and install it so the CLI resolves it. | |
| cd packages/core && npm pack --silent && cd ../.. | |
| mv packages/core/agent_press-core-*.tgz ./local-core.tgz | |
| npm install --no-fund --no-audit ./local-core.tgz | |
| - name: CLI smoke + install hygiene tests | |
| run: node --test tests/cli.test.mjs tests/install_hygiene.test.mjs | |
| # ---------- Python CLI ---------- | |
| python-cli-matrix: | |
| name: 'Python CLI (${{ matrix.os }} / Python ${{ matrix.python }})' | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| python: ['3.10', '3.11', '3.12', '3.13'] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python }} | |
| - run: python -m pip install --upgrade pip pytest | |
| - name: Install local agentpress-core then agentpress-static | |
| run: | | |
| python -m pip install -e ./python-core | |
| python -m pip install -e . | |
| - name: Python CLI smoke tests | |
| run: python -m pytest tests/test_cli_python.py -q | |
| # ---------- Cross-language receipt parity ---------- | |
| cross-language-parity: | |
| name: Cross-language receipt parity (Node ↔ Python) | |
| runs-on: ubuntu-latest | |
| needs: [ts-parser-matrix, python-parser-matrix] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - name: Build Node CLI dep | |
| shell: bash | |
| working-directory: packages/core | |
| run: | | |
| npm install --no-fund --no-audit | |
| npx tsc -p tsconfig.json | |
| if [ -f dist/index.js ]; then mv dist/index.js dist/index.mjs; fi | |
| if [ -f dist/index.js.map ]; then mv dist/index.js.map dist/index.mjs.map; fi | |
| npx tsc -p tsconfig.cjs.json | |
| if [ -f dist-cjs/index.js ]; then cp dist-cjs/index.js dist/index.cjs; fi | |
| - name: Install Node + Python CLIs locally | |
| run: | | |
| cd packages/core && npm pack --silent && cd ../.. | |
| mv packages/core/agent_press-core-*.tgz ./local-core.tgz | |
| npm install --no-fund --no-audit ./local-core.tgz | |
| python -m pip install -e ./python-core -e . | |
| - name: Both CLIs produce identical sha256 for the same agents.txt | |
| shell: bash | |
| run: | | |
| set -e | |
| NODE_HASH=$(node ./bin/agentpress.js receipt --stdout-only | python -c "import json,sys; print(json.load(sys.stdin)['agents_txt_sha256'])") | |
| PY_HASH=$(agentpress receipt --stdout-only | python -c "import json,sys; print(json.load(sys.stdin)['agents_txt_sha256'])") | |
| echo "node: $NODE_HASH" | |
| echo "python: $PY_HASH" | |
| if [ "$NODE_HASH" != "$PY_HASH" ]; then | |
| echo "::error::Cross-language hash mismatch — parsers disagree on canonical bytes." | |
| exit 1 | |
| fi | |
| # ---------- Tarball budget enforcement ---------- | |
| npm-pack-budget: | |
| name: npm pack size budget (<500 KB) | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| - name: npm pack and check size | |
| shell: bash | |
| run: | | |
| npm pack --silent | |
| SIZE=$(stat -c%s agent_press-agentpress-*.tgz 2>/dev/null || stat -f%z agent_press-agentpress-*.tgz) | |
| echo "tarball bytes: $SIZE" | |
| if [ "$SIZE" -gt 512000 ]; then | |
| echo "::error::npm tarball $SIZE bytes exceeds 500 KB budget" | |
| exit 1 | |
| fi | |
| echo "::notice::npm tarball $SIZE bytes (under 500 KB budget)" | |
| # ---------- MCP server boots without crashing ---------- | |
| mcp-server-smoke: | |
| name: '@agent_press/mcp-server boot smoke' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| - name: Build local @agent_press/core | |
| shell: bash | |
| working-directory: packages/core | |
| run: | | |
| npm install --no-fund --no-audit | |
| npx tsc -p tsconfig.json | |
| if [ -f dist/index.js ]; then mv dist/index.js dist/index.mjs; fi | |
| if [ -f dist/index.js.map ]; then mv dist/index.js.map dist/index.mjs.map; fi | |
| npx tsc -p tsconfig.cjs.json | |
| if [ -f dist-cjs/index.js ]; then cp dist-cjs/index.js dist/index.cjs; fi | |
| - name: Build + smoke-test MCP server | |
| working-directory: packages/mcp-server | |
| run: | | |
| # Replace registry dep with local tarball so the build resolves @agent_press/core | |
| cd ../core && npm pack --silent && cd ../mcp-server | |
| npm install --no-fund --no-audit ../core/agent_press-core-*.tgz | |
| npm install --no-fund --no-audit | |
| npx tsc -p tsconfig.json | |
| # Boot the server; expect it to start and wait on stdin (timeout = "ran cleanly") | |
| timeout 3s node dist/index.js < /dev/null || true | |
| # Verify the bundled file is non-empty | |
| test -s dist/index.js |