Run before opening a PR:
pnpm run typecheck
pnpm run test
pnpm run lint
ci.yml validate job:
typechecktestlintAfter Phase 2 implementation, verify the publishable package:
cd packages/canonry && npm pack
npm install -g ./ainyc-canonry-*.tgz
canonry init
canonry serve
apps/worker/src/audit-client.ts still imports from @ainyc/aeo-audit.packages/api-routes/ has no direct dependency on apps/*.packages/canonry/ bundles SPA assets correctly (build-web.ts).All three providers (packages/provider-gemini, packages/provider-openai, packages/provider-claude) have unit tests that validate:
These tests do not make real API calls. They test normalizeResult against synthetic raw result objects to verify the parsing and extraction logic.
candidates[].content.parts[].text + groundingMetadata.groundingChunksoutput[].content[].text + output[].content[].annotations[] (URL citations)content[].text + web_search_tool_result blocks with search_resultsTo test live API calls, use the CLI with real API keys:
canonry init # provide API keys for one or more providers
canonry project create test --domain example.com --country US --language en
canonry keyword add test "best dentist brooklyn"
canonry run test # runs against all configured providers
canonry run test --provider gemini # single-provider run
canonry status test # view citation results
canonry init creates ~/.canonry/ with SQLite DB and auto-generated API keycanonry serve starts server, dashboard loadscanonry project create / keyword add / run workflow completes with results from all configured providerscanonry export produces valid canonry.yamlcanonry apply is idempotent and records audit log entriesGET /runs/:id returns snapshots with groundingSources, searchQueries, and model fields