Skip to content
Content
Skill

/preflight

Webiny-only. Run all checks required before packages are ready for publish: deps, build, lint, format, tests.

BOOST
From plugin
webiny-js
8k76 skills3 MCP
Install
$ npx -y skills add webiny/webiny-js --skill preflight --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/preflight

Context preview

The summary Claude sees to decide when to auto-load this skill.

Webiny-only. Run all checks required before packages are ready for publish: deps, build, lint, format, tests.

SKILL.md

preflight.SKILL.md
name: preflight
description: "Webiny-only. Run all checks required before packages are ready for publish: deps, build, lint, format, tests."

Preflight

Webiny-only skill. Run all checks required before packages are ready for publish.

Important

  • Run steps in order.
  • If any step fails, diagnose and fix the issue, then restart from step 1.
  • Never run tests in parallel. Run each package sequentially.
  • Before running tests for each package, count active test cases and shard at 32 tests per shard.
  • To count active tests: `rg "^\s*(it|test|it\.each|test\.each)\s*\(" packages/<name>/__tests__ -t ts --count-matches | awk -F: '{s+=$2} END {print s}'`
  • Calculate shards: `shards = ceil(count / 32)`. If shards is 1, no `--shard` flag needed.
  • Suppress noisy output: redirect stdout to `/dev/null` or pipe through `tail` as needed.

Steps

1. Install dependencies

yarn > /dev/null 2>&1

2. Generate `webiny` package

yarn webiny-scripts generate-webiny-package

3. Sync dependency versions

yarn webiny sync-dependencies

Verify `packages/cli/files/duplicates.json` is an empty array (`[]`). If it contains entries, there are duplicate dependency versions that must be resolved before continuing.

4. Generate tsconfig files

node scripts/generateTsConfigsInPackages.js

5. Check package node_modules

node scripts/checkPackageNodeModules.js

6. Verify package.json dependencies match source imports

yarn adio

Must output "All dependencies in order!" to pass.

7. Format code

yarn format:fix > /dev/null 2>&1

This auto-fixes formatting issues. No manual intervention needed.

8. Lint

yarn eslint

This only checks — it does not auto-fix. If eslint reports errors, fix them manually, then restart from step 1.

9. Full clean build

yarn build --no-cache 2>&1 | tail -10

10. Check dist paths

node scripts/checkDistPaths.js

Verifies no `src/` paths remain in built output.

11. Run DDB tests

Run `yarn test` for each package below, sequentially. Count active tests first and shard at 32.

**Packages that need `yarn test`:**

  • `api`
  • `api-aco`
  • `api-audit-logs`
  • `api-core`
  • `api-file-manager`
  • `api-file-manager-aco`
  • `api-headless-cms`
  • `api-headless-cms-aco`
  • `api-headless-cms-bulk-actions`
  • `api-headless-cms-ddb`
  • `api-headless-cms-import-export`
  • `api-headless-cms-scheduler`
  • `api-headless-cms-tasks`
  • `api-headless-cms-workflows`
  • `api-mailer`
  • `api-record-locking`
  • `api-scheduler`
  • `api-sync-system`
  • `api-website-builder`
  • `api-website-builder-scheduler`
  • `api-websockets`
  • `api-workflows`
  • `app-admin`
  • `cognito`
  • `db-dynamodb`
  • `form`
  • `handler`
  • `handler-aws`
  • `api-graphql`
  • `lexical-converter`
  • `plugins`
  • `react-composition`
  • `react-properties`
  • `react-rich-text-lexical-renderer`
  • `tasks`
  • `utils`
# 1. Count active tests
count=$(rg "^\s*(it|test|it\.each|test\.each)\s*\(" packages/<name>/__tests__ -t ts --count-matches | awk -F: '{s+=$2} END {print s}')
shards=$(( (count + 31) / 32 ))

# 2a. If shards <= 1, run without sharding
yarn test packages/<name> 2>&1 | grep "Test Files"

# 2b. If shards > 1, run each shard sequentially
yarn test packages/<name> --shard=1/$shards 2>&1 | grep "Test Files"
yarn test packages/<name> --shard=2/$shards 2>&1 | grep "Test Files"
# ... etc

12. Run OpenSearch tests

Run `yarn test:os` for each package below, sequentially. Count active tests first and shard at 32.

**Packages that need BOTH `yarn test` (step 11) AND `yarn test:os`:**

  • `api-aco`
  • `api-audit-logs`
  • `api-file-manager`
  • `api-file-manager-aco`
  • `api-headless-cms`
  • `api-headless-cms-aco`
  • `api-headless-cms-bulk-actions`
  • `api-headless-cms-import-export`
  • `api-mailer`
  • `api-scheduler`
  • `api-workflows`
  • `tasks`

**Packages that need ONLY `yarn test:os` (not in step 11):**

  • `api-dynamodb-to-elasticsearch`
  • `api-elasticsearch-tasks`
  • `api-headless-cms-ddb-es`
  • `api-headless-cms-es-tasks`
  • `api-opensearch`
yarn test:os packages/<name> 2>&1 | grep "Test Files"

13. Check for uncommitted changes

git status

Report any unexpected uncommitted changes from the steps above.

Keeping the package lists up to date

If the lists seem stale, re-derive them:

# All testable packages (have vitest.config.ts)
find packages -maxdepth 2 -name "vitest.config.ts" | sed 's|packages/||;s|/vitest.config.ts||' | sort

# Packages with ddb-os support
grep -rl "ddb-os" --include="ci.config.json" packages/ | sed 's|packages/||;s|/ci.config.json||' | sort

# Check if a package has standalone ddb tests too
grep -o '"ddb"' packages/<name>/ci.config.json
Read more
Ships withwebiny-js

Open-source content platform. Self-hosted on AWS serverless. Built as a TypeScript framework you extend with code, not a closed product you configure through a UI. Runs on Lambda, DynamoDB, S3, and CloudFront inside your own AWS account. Scales automatically.

Get the whole plugin
Stats
8,048
Stars
682
Forks
Active
Maintenance
TypeScript
Language
2h ago
Last commit
8y ago
Created
9h ago
Added

Repo: webiny/webiny-js

Other skills on webiny-js.