Skip to content

Pack catalog

Every pack ships inside the CLI, so there is one install and nothing else to add:

bash
npm install --save-dev @suss/cli

Forty-nine packs read code today, across forty frameworks, eight HTTP and GraphQL clients, and the Node runtime. Ten contract readers turn a declared artifact into the same summary structure. Team-authored intent docs are their own stream, read by @suss/contract-intent.

Most of that is TypeScript and JavaScript. Four of the packs read another language: flask-restx and FastAPI read Python through @suss/adapter-python, and graphql-ruby and rails read Ruby through @suss/adapter-ruby. suss extract reaches those two adapters as well, and the Python and Ruby guide shows how.

The quickest way to find your packs is to let suss look:

bash
suss init

It reads your dependencies, tells you which packs match, and offers to write them into suss.json. The add-to-project guide walks the whole setup.

What to run, by stack

The first column of every table below is the name -f takes, and -f is repeatable. A declared artifact is read by suss contract --from <source> rather than by a pack.

StackWhat to run
ts-rest full-stack-f ts-rest, which reads the provider and the client through the contract
Hono and fetch-f hono -f fetch
Express and fetch-f express -f fetch
Next.js route handlers-f nextjs
React and GraphQL-f react -f apollo-client
Lambda and SQS-f aws-sqs -f node, and contract --from cloudformation
Cloudflare Worker-f cloudflare-workers, and contract --from wrangler
Postgres through Prismaadd -f prisma, and contract --from prisma
Postgres through Drizzleadd -f drizzle
MongoDB through Mongooseadd -f mongoose

Frameworks

A framework pack finds the units a framework defines: a route handler, a component, a resolver, a queue consumer. Run one of these and suss extract has something to describe.

NameWhat it readsCoverage
apolloApollo Server resolvers (code-first).
aws-lambdaAWS Lambda HTTP handlers, paired to SAM / CloudFormation-declared routes.
cloudflare-workersA Cloudflare Workers entrypoint: one unit per trigger the default export defines, and the bindings its code reads off the argument they arrive in.
expressExpress handlers.
fastapiFastAPI routes (Python): the verb comes from the decorator's own attribute name, APIRouter prefixes are composed one include_router hop deep, and response_model / status_code are taken as the declared contract.
fastifyFastify handlers.
flask-restxflask-restx Resource routes (Python), including a project's own wrapper module that re-exports the route decorator.
graphql-rubygraphql-ruby class-based field DSL (Ruby), including mutation: / resolver: wiring one hop out to what the referenced class itself declares, and the model a resolver reads through dataloader when a storage pack in the run recognizes it.
honoHono handlers, including the c.json(body, status) argument order.
nestjs-graphqlNestJS GraphQL resolvers.
nestjs-microservicesNestJS microservice handlers: @EventPattern and @MessagePattern consumers on the channel the decorator states.
nestjs-restNestJS REST controllers.
nextjsNext.js route handlers, pages, and server actions; the route comes from where the file is on disk, and a "use server" function becomes an action unit.
package-exportsThe boundary between packages in one workspace: public exports on the provider side, imports of them on the consumer side. Reads the workspace manifest, so it needs no per-project package list.
railsRails controller actions (Ruby), bound to the method and path config/routes.rb gives each one; an action the routes file does not reach is discovered with no boundary.
reactReact function components, event handlers, useEffect bodies.
react-queryTanStack Query hooks: ties a component to the query function its useQuery / useMutation call runs.
react-routerReact Router loaders / actions / routes.
ts-restts-rest providers + clients (contract-backed).

Clients

A client pack finds the other side, the call sites, and binds each one to the method and path it sends. That is what lets the checker pair a call against whoever serves the route.

NameWhat it readsCoverage
aiohttpaiohttp call sites (Python): the request methods on a ClientSession, opened with async with or held in an assignment.
apollo-client@apollo/client hooks + imperative client.query.
axiosaxios call sites + axios.create factories.
faradayFaraday call sites (Ruby): a request method on the module itself or on a connection Faraday.new built, served under the path that connection's own URL states.
fetchGlobal fetch call sites.
httpxhttpx call sites (Python): the verb functions, httpx.request, and a Client or AsyncClient held in an assignment or opened with with.
net-httpNet::HTTP call sites (Ruby): the module methods that send on their own, and a request object built with Net::HTTP::Get and its siblings, with the URL read through URI.
requestsrequests call sites (Python): the seven verb functions, requests.request, and a Session, each bound to the method and path the call states.

What your code reaches

An effects pack reads the calls inside a unit another pack discovered: a query, a publish, a read of the environment. On its own it comes back empty, so run it alongside the pack that finds the units.

NameWhat it readsCoverage
activerecordActiveRecord calls (Ruby): a call matches when its method is one ActiveRecord defines as a read or a write and the class behind its receiver reaches ActiveRecord::Base, following what each class extends through the project.
aws-dynamodbAWS SDK v3 DynamoDB calls, emits storage-access interactions.
aws-eventbridgeAWS EventBridge PutEvents producer calls, emits message-bus interactions.
aws-s3AWS SDK v3 S3 object calls, emits storage-access interactions.
aws-secrets-managerAWS Secrets Manager calls, emits storage-access interactions against the secret.
aws-snsAWS SDK v3 SNS Publish and PublishBatch calls, emits message-send interactions on the topic.
aws-sqsAWS SDK v3 SQS producer calls, emits message-send interactions.
aws-ssmAWS SSM Parameter Store calls, emits storage-access interactions against the parameter.
bigqueryBigQuery queries and table calls, emits storage-access interactions with the dataset as the scope.
bigquery-pythonBigQuery calls (Python): the statement a client or an Airflow hook is handed, read for the tables it touches, and the calls that say which table without writing SQL.
bigquery-rubygoogle-cloud-bigquery calls (Ruby): a call matches when its receiver follows back to a client the gem handed out, and the statement it was given is parsed for the tables it touches.
drizzleDrizzle ORM query-builder and relational-query calls, emits storage-access interactions with SQL table names.
gcsGoogle Cloud Storage calls, emits storage-access interactions.
mongooseMongoose model calls, emits storage-access interactions against the collection a model's .model(...) call declares.
nodeNode.js runtime primitives, scheduling, the process surface (incl. process.env.X config-read interactions), module-loading globals, emitted as interaction effects.
pgnode-postgres queries, emits storage-access interactions with the tables each statement touches.
pg-rubypg gem calls (Ruby): a call matches when its receiver follows back to a connection the gem handed out, and the statement it was given is parsed for the tables it touches.
prismaPrisma client calls, emits storage-access interactions per read / write.
redisRedis, Valkey and node-redis commands, emits storage-access interactions.
sqlalchemySQLAlchemy calls (Python): says which types a query comes back as and which methods write, and the adapter matches a call chain by resolving through a project's own base class to what the method behind it says it returns.
sqlmodelSQLModel calls (Python): says which types a query comes back as and which methods write, under the modules SQLModel exports them from, and includes the SQLAlchemy patterns a SQLModel project also reaches.
zustandzustand stores: setState writes and getState reads against the store as a client-side container.

Contract sources

These are not packs. A contract source reads something the project already declares and writes the same summaries the extractor writes, and you reach it through suss contract --from <name>. Contract sources has a command and the output for each one.

Reader--fromWhat it readsCoverage
@suss/contract-openapiopenapiAn OpenAPI 3.x document, JSON or YAML.
@suss/contract-graphqlgraphql, graphql-documentsA GraphQL SDL file becomes one resolver-kind summary per Query, Mutation and Subscription field. Committed .graphql and .gql operation documents become one client-kind summary per operation, with fragment spreads inlined, so a repo that keeps its queries in files pairs against its resolvers without any call site being traced.
@suss/contract-cloudformationcloudformationCloudFormation and SAM templates. It delegates to the OpenAPI and API Gateway readers, and handles SQS event-source mappings and a function's Environment itself.
@suss/contract-serverlessserverlessA Serverless Framework service file. The reader restates the functions block in SAM's forms and hands it to the CloudFormation reader, so a route, a queue consumer or an environment contract comes out the same whichever manifest language declared it. ${self:} resolves against the document, and a deploy-time reference keeps its token.
@suss/contract-terraformterraformA .tf file or the directory a module lives in. The AWS and Google Cloud provider vocabularies both load.
@suss/contract-wranglerwranglerA Cloudflare Worker's wrangler.toml or wrangler.jsonc. The Worker comes out as a deployable with the configuration it is given, values included, so a store addressed through a variable resolves, plus a summary per KV namespace, R2 bucket, D1 database and Queues channel it is bound to.
@suss/contract-appsyncappsyncAn AppSync GraphQL schema and its resolver mapping templates.
@suss/contract-prismaprismaA schema.prisma file, one storage provider summary per model.
@suss/contract-storybookstorybookStorybook CSF3 stories, one component contract summary per story.
@suss/contract-aws-apigateway(through the readers above)API Gateway resource semantics for REST and HTTP APIs, including the transitions the platform injects. The CloudFormation, Serverless and Terraform readers all delegate to it.
@suss/contract-intent(through check --intent)Team-authored intent specs, *.intent and *.prd.

Asking for a pack

If the framework you use is not in a table above, open an issue with the library, a link to its docs, and ten or fifteen lines of code showing how your project registers a handler and returns a response. That is what a pack is written from, and a snippet from a project that actually uses the library settles questions the library's own docs leave open.

You do not have to wait for one. A pack is a data object of about a hundred lines, it lives in a package of your own, and -f @your-scope/your-pack loads it with nothing else to configure. Write a pack builds one start to finish.

If a pack exists and comes back with nothing, that is a different problem: Fix a run that found nothing.

Everything else in the box

The rest of what @suss/cli installs: the IR the summaries are written in, the language adapters, the checker, the shared machinery the packs run on.

combined

PackageWhat it isCoverage
@suss/ir-coreShared IR primitives, type shapes, boundary bindings + constructors, source locations, confidence. Base for behavioral-ir and intent-ir.
@suss/behavioral-irzod schemas, types, parsers, and generated JSON Schema. Install this to consume summaries.
@suss/intent-irTeam-authored intent: system intent (what a boundary should do) + PRD outcome intent, paired against derived summaries.
@suss/datalogSmall semi-naive Datalog evaluator with stratified negation; the rules engine behind derived program facts.
@suss/resolutionDatalog rules for following a value back to the function it resolves to: a factory's argument, a re-exported wrapper, a closure three levels down. Language-neutral, so an adapter supplies facts and inherits the rules.
@suss/valuesBounded evaluator over an abstract value domain: strings as pieces with named holes, sequences, records. An adapter supplies a lowering of its AST and a row table for its operators and library methods, and readers ask what an expression is worth instead of matching one spelling at a time.
@suss/extractorAssembly engine. It converts raw extracted structure into BehavioralSummary.
@suss/recognizeWrite a pack as data: a chain of named links, compiled to the recognizer hooks, run by any adapter that implements the executor ops.
@suss/packsEvery pack, one subpath each, so @suss/packs/express reaches the Express pack. The CLI resolves -f names to these on its own.tested through each pack
@suss/adapter-typescriptTypeScript language adapter via ts-morph.
@suss/adapter-pythonPython language adapter: tree-sitter (WASM) parsing, a lexical binder, repo-scoped module resolution. v0, no path-engine work yet.
@suss/adapter-rubyRuby language adapter: tree-sitter (WASM) parsing, a lexical binder over class/module nesting, Rails' constant-to-path convention for mutation: / resolver: wiring and controller discovery. v0, graphql-ruby and rails, no path-engine work yet.
@suss/checkerPairwise cross-boundary checker (behavioral).
@suss/checker-intentPairs team-authored intent against derived code; emits IntentFinding coverage.
@suss/cliCLI wrapper.
@suss/mcpAn MCP server over the CLI, so a coding agent can ask about a boundary while it works. Keeps its summaries current as files change.
@suss/sqlReads what a SQL statement touches, for packs that meet a raw query.
@suss/manifest-awsParses CloudFormation and SAM templates into a shared facts layer that the contract readers and the manifest-driven framework packs both read.
@suss/terraform-awsWhat AWS's Terraform provider declares, as data for that reader.
@suss/terraform-gcpWhat Google Cloud's Terraform provider declares, as data for that reader.

Released under the Apache-2.0 License.