vouchington-tooling 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +4 -0
  2. package/ast-grep/rules/backend-no-test-file-imports.yml +44 -0
  3. package/ast-grep/rules/force-dynamic-layout.yml +57 -0
  4. package/ast-grep/rules/force-dynamic-pages.yml +38 -0
  5. package/ast-grep/rules/no-dynamic-import-in-vitest-config.yml +30 -0
  6. package/ast-grep/rules/no-dynamic-server-components-tsx.yml +71 -0
  7. package/ast-grep/rules/no-dynamic-server-components.yml +71 -0
  8. package/ast-grep/rules/no-enable-indexscan-off-tsx.yml +33 -0
  9. package/ast-grep/rules/no-enable-indexscan-off.yml +41 -0
  10. package/ast-grep/rules/no-exports-in-tests-folder-tsx.yml +42 -0
  11. package/ast-grep/rules/no-exports-in-tests-folder.yml +43 -0
  12. package/ast-grep/rules/no-object-assign-new-error.yml +31 -0
  13. package/ast-grep/rules/no-runner-temp-nullish.yml +33 -0
  14. package/ast-grep/rules/no-self-comparison-assertion-tsx.yml +43 -0
  15. package/ast-grep/rules/no-self-comparison-assertion.yml +53 -0
  16. package/ast-grep/rules/no-sql-offset.yml +65 -0
  17. package/ast-grep/rules/no-sync-throw-assert-on-async-enqueue.yml +42 -0
  18. package/ast-grep/rules/no-tautological-literal-assertion-tsx.yml +31 -0
  19. package/ast-grep/rules/no-tautological-literal-assertion.yml +38 -0
  20. package/ast-grep/rules/no-test-max-lines-disable-tsx.yml +41 -0
  21. package/ast-grep/rules/no-test-max-lines-disable.yml +53 -0
  22. package/ast-grep/rules/no-three-sequential-awaits-tsx.yml +288 -0
  23. package/ast-grep/rules/no-three-sequential-awaits.yml +242 -0
  24. package/ast-grep/rules/nullable-options.yml +429 -0
  25. package/ast-grep/rules/pagination-no-exact-limit-has-next.yml +111 -0
  26. package/ast-grep/rules/playwright-no-bare-meta-press.yml +29 -0
  27. package/ast-grep/rules/storybook-no-webpack-final.yml +31 -0
  28. package/ast-grep/rules/web-class-component-needs-use-client.yml +175 -0
  29. package/ast-grep/rules/web-clickable-needs-pointer.yml +74 -0
  30. package/ast-grep/rules/web-dialog-content-description.yml +56 -0
  31. package/ast-grep/rules/web-icon-button-tooltip.yml +82 -0
  32. package/ast-grep/rules/web-no-inline-scrollbar-hide.yml +41 -0
  33. package/ast-grep/rules/web-no-window-open-navigation.yml +39 -0
  34. package/ast-grep/sgconfig.yml +9 -0
  35. package/dist/ast-grep-pack/index.d.mts +6 -0
  36. package/dist/ast-grep-pack/index.mjs +11 -0
  37. package/dist/cli/commands/ast-grep-pack.d.mts +2 -0
  38. package/dist/cli/commands/ast-grep-pack.mjs +11 -0
  39. package/dist/cli/index.mjs +3 -0
  40. package/dist/cli/parse-options.d.mts +1 -0
  41. package/dist/cli/parse-options.mjs +6 -0
  42. package/dist/cli/parse.d.mts +2 -0
  43. package/dist/cli/parse.mjs +3 -1
  44. package/dist/cli/usage.d.mts +1 -1
  45. package/dist/cli/usage.mjs +2 -0
  46. package/dist/index.d.mts +2 -0
  47. package/dist/index.mjs +1 -0
  48. package/package.json +8 -1
  49. package/skills/manifest.json +24 -18
  50. package/skills/stacked-prs/SKILL.md +43 -0
@@ -0,0 +1,11 @@
1
+ import { astGrepPackPaths } from '../../ast-grep-pack/index.mjs';
2
+ export function runAstGrepPackCommand(load = astGrepPackPaths) {
3
+ try {
4
+ process.stdout.write(`${JSON.stringify(load())}\n`);
5
+ return 0;
6
+ }
7
+ catch (error) {
8
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
9
+ return 1;
10
+ }
11
+ }
@@ -23,6 +23,7 @@ import { runAgentBlackboardCommand } from './commands/agent-blackboard.mjs';
23
23
  import { runWithHostLock } from './commands/with-host-lock.mjs';
24
24
  import { runRequireUpToDate } from './commands/require-up-to-date.mjs';
25
25
  import { runAstGrepExamplesCommand } from './commands/ast-grep-examples.mjs';
26
+ import { runAstGrepPackCommand } from './commands/ast-grep-pack.mjs';
26
27
  import { runGhaWorkspacePolicy } from './commands/gha-workspace-policy.mjs';
27
28
  import { parseCli } from './parse.mjs';
28
29
  import { packageScriptPath } from './script-path.mjs';
@@ -132,6 +133,8 @@ export function runCli(argv = process.argv) {
132
133
  ]);
133
134
  case 'ast-grep-examples':
134
135
  return runAstGrepExamplesCommand(parsed);
136
+ case 'ast-grep-pack':
137
+ return runAstGrepPackCommand();
135
138
  case 'gha-workspace-policy':
136
139
  return runGhaWorkspacePolicy(parsed);
137
140
  }
@@ -4,5 +4,6 @@ export declare function parseRunnerPortPolicy(args: readonly string[]): ParsedCl
4
4
  export declare function parseHttpOrigin(args: readonly string[]): ParsedCli;
5
5
  export declare function parseRequireUpToDate(args: readonly string[]): ParsedCli;
6
6
  export declare function parseGitleaksDirectoryScan(args: readonly string[]): ParsedCli;
7
+ export declare function parseAstGrepPack(args: readonly string[]): ParsedCli;
7
8
  export declare function parseAstGrepExamples(args: readonly string[]): ParsedCli;
8
9
  export declare function parseGhaWorkspacePolicy(args: readonly string[]): ParsedCli;
@@ -88,6 +88,12 @@ export function parseGitleaksDirectoryScan(args) {
88
88
  ...(directory === undefined ? {} : { directory }),
89
89
  };
90
90
  }
91
+ export function parseAstGrepPack(args) {
92
+ const options = parseOptions(args, [], 'ast-grep-pack', 'value');
93
+ if ('kind' in options)
94
+ return options;
95
+ return { kind: 'ast-grep-pack' };
96
+ }
91
97
  export function parseAstGrepExamples(args) {
92
98
  const options = parseOptions(args, ['rules', 'config'], 'ast-grep-examples', 'path');
93
99
  if ('kind' in options)
@@ -72,6 +72,8 @@ export type ParsedCli = {
72
72
  kind: 'ast-grep-examples';
73
73
  rules: string;
74
74
  config: string;
75
+ } | {
76
+ kind: 'ast-grep-pack';
75
77
  } | {
76
78
  kind: 'gha-workspace-policy';
77
79
  root?: string;
@@ -1,6 +1,6 @@
1
1
  import { parseGhaArtifactsCleanup, } from './parse-gha-artifacts-cleanup.mjs';
2
2
  import { parseGhaRuntimeAudit } from './parse-gha-runtime-audit.mjs';
3
- import { parseAstGrepExamples, parseGhaWorkspacePolicy, parseGitleaksDirectoryScan, parseHttpOrigin, parseLinkSkill, parseRequireUpToDate, parseRunnerPortPolicy, } from './parse-options.mjs';
3
+ import { parseAstGrepExamples, parseAstGrepPack, parseGhaWorkspacePolicy, parseGitleaksDirectoryScan, parseHttpOrigin, parseLinkSkill, parseRequireUpToDate, parseRunnerPortPolicy, } from './parse-options.mjs';
4
4
  const SCRIPT_COMMANDS = new Set([
5
5
  'gha-output',
6
6
  'gha-needs-results',
@@ -69,6 +69,8 @@ export function parseCli(argv) {
69
69
  return parseGitleaksDirectoryScan(rest);
70
70
  if (command === 'ast-grep-examples')
71
71
  return parseAstGrepExamples(rest);
72
+ if (command === 'ast-grep-pack')
73
+ return parseAstGrepPack(rest);
72
74
  if (command === 'gha-workspace-policy')
73
75
  return parseGhaWorkspacePolicy(rest);
74
76
  if (command === 'gha-artifacts-cleanup')
@@ -1,2 +1,2 @@
1
- export declare const USAGE = "Usage: vouchington <command> [options]\n\nCommands:\n runner-port-policy Print or validate a runner port policy\n with-host-lock Run a command under a host-wide lock\n gha-runtime-audit Audit successful GitHub Actions job runtimes\n require-up-to-date Require HEAD to include a fetched remote branch\n gitleaks-directory-scan Scan a directory with Gitleaks\n ast-grep-examples Run AST-grep rule examples\n gha-workspace-policy Check GitHub Actions workspace safety policy\n gha-output Write a collision-safe multiline GITHUB_OUTPUT record\n gha-needs-results Fail if required GitHub Actions job results failed\n download-with-diagnostics Download a URL and report HTTP status on failure\n download-optional-run-artifacts Download optional artifacts from the current run\n host-pressure-diagnostics Print a bounded host memory/OOM/PSI snapshot\n allocate-browser-safe-ports Allocate Fetch-safe localhost ports\n diagnose-port-collision Capture bounded localhost port diagnostics\n prepare-trivy-db Download the Trivy vulnerability database\n gha-artifacts-cleanup Delete classified GitHub Actions artifacts\n http-origin Validate an optional HTTP(S) origin\n vitest-blob-manifest Stamp a vitest-blob-manifest:v1 identity file\n vitest-report-attempt Write or read a Vitest report-attempt marker\n prepare-vitest-reports Validate and select Vitest report JSON files\n pnpm-install Install a pnpm workspace with retry and release-age fail-fast\n check-cache-size Measure a path and decide whether to save a GHA cache\n make-shard-matrix Emit a [1..N] GitHub Actions shard matrix\n load-runner-env Overlay a runner env file onto GITHUB_ENV with injection guards\n clean-workspace Reset a persistent-runner workspace with a fork-PR trust gate\n install-github-release Download a checksum-verified GitHub Release binary\n run-with-timeout Run a command with GNU timeout or a Perl fallback\n lint-links Two-pass lychee: internal links fail, external warn\n materialize-pr-context Dump PR title/body/files/diff/comments and #N crawl\n wait-for-apt-locks Wait until apt/dpkg lock files are free\n install-playwright-chromium-arm64 Install Playwright Chromium from browsers.json\n ghcr-package-retention Delete old GHCR package versions past KEEP_MIN\n harness-admission-lane Compute a GITHUB_RUN_ID admission lane for fleet fan-out\n harness-assert-gates Fail if any named HARNESS_*_ENABLED gate is enabled\n nuget-central-version Validate a Directory.Packages.props PackageVersion delta\n swift-semantic-equal Compare Swift sources ignoring comments and whitespace\n post-review Post one COMMENT review from a staged payload file\n stage-review-payload Validate a review payload file into a staging directory\n retrospective-transcript Format facts from Claude-compatible, Codex, or Grok transcripts\n link-skill Link one packaged skill into an explicit consumer directory\n retrospective-facts Gather immutable facts for a retrospective\n agent-blackboard Probe and journal an Agent Blackboard deployment\n\nOptions:\n -h, --help Show this help\n -v, --version Print the package version\n\nrunner-port-policy\n (no args) Print the shipped policy as JSON\n --file <path> Validate and print a policy file\n --reserved <port> Print true if the port is reserved\n\nwith-host-lock\n --name <family>\n [--slots <n>]\n --timeout-seconds <n>\n [--command-timeout-seconds <n>]\n [--failure-diagnostics <absolute-script>]\n [--on-acquire-timeout fail|run-unlocked]\n -- <command> [args...]\n\ngha-runtime-audit\n [--repository owner/name] Default GITHUB_REPOSITORY\n [--branch main]\n --pr-workflow <name|/regex/> Repeatable\n --push-workflow <name|/regex/> Repeatable\n\nrequire-up-to-date --remote <name> --branch <name>\ngitleaks-directory-scan --config <path> [--directory <path>]\nast-grep-examples --rules <directory> --config <path>\ngha-workspace-policy [--root <directory>] [--workflow-directory <directory>] [--action-directory <directory>]\n\ngha-output <name>\ngha-needs-results [label]\ndownload-with-diagnostics <url> <destination> [-- curl-args...]\ndownload-optional-run-artifacts (--name <name> | --pattern <pattern>) --dir <directory>\nhost-pressure-diagnostics\nallocate-browser-safe-ports [count] [--policy path] [--forbidden-ports path]\ndiagnose-port-collision [--ports \"2200 2216\"] [--output-dir PATH]\nprepare-trivy-db\ngha-artifacts-cleanup run --run-id <id> [--keep-pattern glob] [--delete-pattern glob] [--patterns-file json]\ngha-artifacts-cleanup sweep --older-than-hours <n> [--keep-pattern glob] [--delete-pattern glob] [--patterns-file json]\nhttp-origin [--field NAME] [value]\nvitest-blob-manifest <suite> [reports-directory]\nvitest-report-attempt <write DIRECTORY SUITE|read ROOT>\nprepare-vitest-reports [primary-directory] [fallback-directory] [output-directory]\npnpm-install --runner-lifecycle persistent|ephemeral|ephemeral-full --install-scripts true|false\ncheck-cache-size <path> <max-bytes> <label>\nmake-shard-matrix <total>\nload-runner-env\nclean-workspace\ninstall-github-release --repo owner/name --version X --asset 'name-{platform}.tar.gz' --bin name [--tag-prefix PREFIX] [--expected-sha256 SHA256] [--no-checksum] [--checksums-asset NAME] [--version-flag FLAG] [--bin-dir DIR]\nrun-with-timeout <timeout-seconds> <kill-after-seconds> <command...>\nlint-links [--offline] [--config PATH] [--glob PATTERN] [files...]\nmaterialize-pr-context\nwait-for-apt-locks\ninstall-playwright-chromium-arm64 [name:archive...]\nghcr-package-retention <url-encoded-package>...\nharness-admission-lane <lanes>\nharness-assert-gates <gate>...\nnuget-central-version <trusted-props> <candidate-props> <metadata-json> <output-props>\nswift-semantic-equal <base> <head> <file.swift>\npost-review\nstage-review-payload optional|required <source> <destination>\nretrospective-transcript [--session-id ID] [--jsonl PATH] [--projects-dir PATH] [--codex-sessions-dir PATH] [--grok-sessions-dir PATH]\nlink-skill <name> --source-root <skills-dir> --target-root <consumer-skills-dir> Link a packaged or repository-local skill\nretrospective-facts (--pr NUMBER | --branch NAME | --no-pr) [--repo OWNER/NAME] [--raw]\nagent-blackboard probe\nagent-blackboard journal append --session-id UUID --agent NAME --version VERSION --file PATH [--parent-session-id UUID] [--timestamp ISO8601]\nagent-blackboard journal entries --session-id UUID\nagent-blackboard snapshot partition --snapshot PATH --checksum SHA256 --counts '{\"sessions\":N,\"entries\":N,\"records\":N,\"bytes\":N}'\nagent-blackboard snapshot cleanup [--snapshot PATH] [--partition-directory PATH --receipt JSON]\n";
1
+ export declare const USAGE = "Usage: vouchington <command> [options]\n\nCommands:\n runner-port-policy Print or validate a runner port policy\n with-host-lock Run a command under a host-wide lock\n gha-runtime-audit Audit successful GitHub Actions job runtimes\n require-up-to-date Require HEAD to include a fetched remote branch\n gitleaks-directory-scan Scan a directory with Gitleaks\n ast-grep-examples Run AST-grep rule examples\n ast-grep-pack Print shipped unconditional AST-grep pack paths as JSON\n gha-workspace-policy Check GitHub Actions workspace safety policy\n gha-output Write a collision-safe multiline GITHUB_OUTPUT record\n gha-needs-results Fail if required GitHub Actions job results failed\n download-with-diagnostics Download a URL and report HTTP status on failure\n download-optional-run-artifacts Download optional artifacts from the current run\n host-pressure-diagnostics Print a bounded host memory/OOM/PSI snapshot\n allocate-browser-safe-ports Allocate Fetch-safe localhost ports\n diagnose-port-collision Capture bounded localhost port diagnostics\n prepare-trivy-db Download the Trivy vulnerability database\n gha-artifacts-cleanup Delete classified GitHub Actions artifacts\n http-origin Validate an optional HTTP(S) origin\n vitest-blob-manifest Stamp a vitest-blob-manifest:v1 identity file\n vitest-report-attempt Write or read a Vitest report-attempt marker\n prepare-vitest-reports Validate and select Vitest report JSON files\n pnpm-install Install a pnpm workspace with retry and release-age fail-fast\n check-cache-size Measure a path and decide whether to save a GHA cache\n make-shard-matrix Emit a [1..N] GitHub Actions shard matrix\n load-runner-env Overlay a runner env file onto GITHUB_ENV with injection guards\n clean-workspace Reset a persistent-runner workspace with a fork-PR trust gate\n install-github-release Download a checksum-verified GitHub Release binary\n run-with-timeout Run a command with GNU timeout or a Perl fallback\n lint-links Two-pass lychee: internal links fail, external warn\n materialize-pr-context Dump PR title/body/files/diff/comments and #N crawl\n wait-for-apt-locks Wait until apt/dpkg lock files are free\n install-playwright-chromium-arm64 Install Playwright Chromium from browsers.json\n ghcr-package-retention Delete old GHCR package versions past KEEP_MIN\n harness-admission-lane Compute a GITHUB_RUN_ID admission lane for fleet fan-out\n harness-assert-gates Fail if any named HARNESS_*_ENABLED gate is enabled\n nuget-central-version Validate a Directory.Packages.props PackageVersion delta\n swift-semantic-equal Compare Swift sources ignoring comments and whitespace\n post-review Post one COMMENT review from a staged payload file\n stage-review-payload Validate a review payload file into a staging directory\n retrospective-transcript Format facts from Claude-compatible, Codex, or Grok transcripts\n link-skill Link one packaged skill into an explicit consumer directory\n retrospective-facts Gather immutable facts for a retrospective\n agent-blackboard Probe and journal an Agent Blackboard deployment\n\nOptions:\n -h, --help Show this help\n -v, --version Print the package version\n\nrunner-port-policy\n (no args) Print the shipped policy as JSON\n --file <path> Validate and print a policy file\n --reserved <port> Print true if the port is reserved\n\nwith-host-lock\n --name <family>\n [--slots <n>]\n --timeout-seconds <n>\n [--command-timeout-seconds <n>]\n [--failure-diagnostics <absolute-script>]\n [--on-acquire-timeout fail|run-unlocked]\n -- <command> [args...]\n\ngha-runtime-audit\n [--repository owner/name] Default GITHUB_REPOSITORY\n [--branch main]\n --pr-workflow <name|/regex/> Repeatable\n --push-workflow <name|/regex/> Repeatable\n\nrequire-up-to-date --remote <name> --branch <name>\ngitleaks-directory-scan --config <path> [--directory <path>]\nast-grep-examples --rules <directory> --config <path>\nast-grep-pack\ngha-workspace-policy [--root <directory>] [--workflow-directory <directory>] [--action-directory <directory>]\n\ngha-output <name>\ngha-needs-results [label]\ndownload-with-diagnostics <url> <destination> [-- curl-args...]\ndownload-optional-run-artifacts (--name <name> | --pattern <pattern>) --dir <directory>\nhost-pressure-diagnostics\nallocate-browser-safe-ports [count] [--policy path] [--forbidden-ports path]\ndiagnose-port-collision [--ports \"2200 2216\"] [--output-dir PATH]\nprepare-trivy-db\ngha-artifacts-cleanup run --run-id <id> [--keep-pattern glob] [--delete-pattern glob] [--patterns-file json]\ngha-artifacts-cleanup sweep --older-than-hours <n> [--keep-pattern glob] [--delete-pattern glob] [--patterns-file json]\nhttp-origin [--field NAME] [value]\nvitest-blob-manifest <suite> [reports-directory]\nvitest-report-attempt <write DIRECTORY SUITE|read ROOT>\nprepare-vitest-reports [primary-directory] [fallback-directory] [output-directory]\npnpm-install --runner-lifecycle persistent|ephemeral|ephemeral-full --install-scripts true|false\ncheck-cache-size <path> <max-bytes> <label>\nmake-shard-matrix <total>\nload-runner-env\nclean-workspace\ninstall-github-release --repo owner/name --version X --asset 'name-{platform}.tar.gz' --bin name [--tag-prefix PREFIX] [--expected-sha256 SHA256] [--no-checksum] [--checksums-asset NAME] [--version-flag FLAG] [--bin-dir DIR]\nrun-with-timeout <timeout-seconds> <kill-after-seconds> <command...>\nlint-links [--offline] [--config PATH] [--glob PATTERN] [files...]\nmaterialize-pr-context\nwait-for-apt-locks\ninstall-playwright-chromium-arm64 [name:archive...]\nghcr-package-retention <url-encoded-package>...\nharness-admission-lane <lanes>\nharness-assert-gates <gate>...\nnuget-central-version <trusted-props> <candidate-props> <metadata-json> <output-props>\nswift-semantic-equal <base> <head> <file.swift>\npost-review\nstage-review-payload optional|required <source> <destination>\nretrospective-transcript [--session-id ID] [--jsonl PATH] [--projects-dir PATH] [--codex-sessions-dir PATH] [--grok-sessions-dir PATH]\nlink-skill <name> --source-root <skills-dir> --target-root <consumer-skills-dir> Link a packaged or repository-local skill\nretrospective-facts (--pr NUMBER | --branch NAME | --no-pr) [--repo OWNER/NAME] [--raw]\nagent-blackboard probe\nagent-blackboard journal append --session-id UUID --agent NAME --version VERSION --file PATH [--parent-session-id UUID] [--timestamp ISO8601]\nagent-blackboard journal entries --session-id UUID\nagent-blackboard snapshot partition --snapshot PATH --checksum SHA256 --counts '{\"sessions\":N,\"entries\":N,\"records\":N,\"bytes\":N}'\nagent-blackboard snapshot cleanup [--snapshot PATH] [--partition-directory PATH --receipt JSON]\n";
2
2
  export declare function printUsage(stream?: NodeJS.WritableStream): void;
@@ -7,6 +7,7 @@ Commands:
7
7
  require-up-to-date Require HEAD to include a fetched remote branch
8
8
  gitleaks-directory-scan Scan a directory with Gitleaks
9
9
  ast-grep-examples Run AST-grep rule examples
10
+ ast-grep-pack Print shipped unconditional AST-grep pack paths as JSON
10
11
  gha-workspace-policy Check GitHub Actions workspace safety policy
11
12
  gha-output Write a collision-safe multiline GITHUB_OUTPUT record
12
13
  gha-needs-results Fail if required GitHub Actions job results failed
@@ -71,6 +72,7 @@ gha-runtime-audit
71
72
  require-up-to-date --remote <name> --branch <name>
72
73
  gitleaks-directory-scan --config <path> [--directory <path>]
73
74
  ast-grep-examples --rules <directory> --config <path>
75
+ ast-grep-pack
74
76
  gha-workspace-policy [--root <directory>] [--workflow-directory <directory>] [--action-directory <directory>]
75
77
 
76
78
  gha-output <name>
package/dist/index.d.mts CHANGED
@@ -23,6 +23,8 @@ export { gitleaksDirectoryScanArguments, runGitleaksDirectoryScan, } from './git
23
23
  export type { DirectoryScanExecutor, GitleaksDirectoryScanOptions, } from './gitleaks-directory-scan/index.mts';
24
24
  export { astGrepExamplesArguments, runAstGrepExamples } from './ast-grep-examples/index.mts';
25
25
  export type { AstGrepExamplesExecutor, AstGrepExamplesOptions } from './ast-grep-examples/index.mts';
26
+ export { astGrepPackPaths, astGrepPackPathsFrom } from './ast-grep-pack/index.mts';
27
+ export type { AstGrepPackPaths } from './ast-grep-pack/index.mts';
26
28
  export { createVitestBlobManifest, createVitestReportAttempt, inspectVitestBlobBundle, parseVitestBlobManifest, parseVitestReportAttempt, readVitestReportAttempts, serializeVitestBlobManifest, serializeVitestReportAttempt, VITEST_BLOB_MANIFEST_FILENAME, VITEST_BLOB_MANIFEST_VERSION, VITEST_REPORT_ATTEMPT_PREFIX, VITEST_REPORT_ATTEMPT_VERSION, vitestBlobBundlePaths, writeVitestBlobManifest, writeVitestReportAttempt, } from './vitest-blob-manifest/index.mts';
27
29
  export type { InspectedVitestBlobBundle, VitestBlobIdentity, VitestBlobManifest, VitestReportAttempt, VitestReportAttemptIdentity, } from './vitest-blob-manifest/index.mts';
28
30
  export { prepareVitestReports } from './vitest-blob-manifest/reports.mts';
package/dist/index.mjs CHANGED
@@ -12,6 +12,7 @@ export { checkGhaWorkspacePolicy } from './gha-workspace-policy/index.mjs';
12
12
  export { requireUpToDate } from './require-up-to-date/index.mjs';
13
13
  export { gitleaksDirectoryScanArguments, runGitleaksDirectoryScan, } from './gitleaks-directory-scan/index.mjs';
14
14
  export { astGrepExamplesArguments, runAstGrepExamples } from './ast-grep-examples/index.mjs';
15
+ export { astGrepPackPaths, astGrepPackPathsFrom } from './ast-grep-pack/index.mjs';
15
16
  export { createVitestBlobManifest, createVitestReportAttempt, inspectVitestBlobBundle, parseVitestBlobManifest, parseVitestReportAttempt, readVitestReportAttempts, serializeVitestBlobManifest, serializeVitestReportAttempt, VITEST_BLOB_MANIFEST_FILENAME, VITEST_BLOB_MANIFEST_VERSION, VITEST_REPORT_ATTEMPT_PREFIX, VITEST_REPORT_ATTEMPT_VERSION, vitestBlobBundlePaths, writeVitestBlobManifest, writeVitestReportAttempt, } from './vitest-blob-manifest/index.mjs';
16
17
  export { prepareVitestReports } from './vitest-blob-manifest/reports.mjs';
17
18
  export { findWorkspaceLinkMismatches, formatReleaseAgeFailure, INSTALL_TERMINATION_FAILED, isReleaseAgeViolation, parseInstallOptions, parseReleaseAgeViolations, runInstallLifecycle, } from './pnpm-install/index.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vouchington-tooling",
3
- "version": "0.6.2",
3
+ "version": "0.7.0",
4
4
  "description": "Vouchington CLI and extractable tooling libraries.",
5
5
  "homepage": "https://github.com/vouchington/vouchington-tooling/tree/main/packages/vouchington-tooling#readme",
6
6
  "bugs": {
@@ -17,6 +17,7 @@
17
17
  "vouchington": "dist/cli/index.mjs"
18
18
  },
19
19
  "files": [
20
+ "ast-grep",
20
21
  "dist",
21
22
  "skills",
22
23
  "scripts",
@@ -96,6 +97,11 @@
96
97
  "import": "./dist/ast-grep-examples/index.mjs",
97
98
  "default": "./dist/ast-grep-examples/index.mjs"
98
99
  },
100
+ "./ast-grep-pack": {
101
+ "types": "./dist/ast-grep-pack/index.d.mts",
102
+ "import": "./dist/ast-grep-pack/index.mjs",
103
+ "default": "./dist/ast-grep-pack/index.mjs"
104
+ },
99
105
  "./vitest-blob-manifest": {
100
106
  "types": "./dist/vitest-blob-manifest/index.d.mts",
101
107
  "import": "./dist/vitest-blob-manifest/index.mjs",
@@ -274,6 +280,7 @@
274
280
  "yaml": "2.9.0"
275
281
  },
276
282
  "devDependencies": {
283
+ "@ast-grep/cli": "0.45.3",
277
284
  "@types/picomatch": "^4.0.3",
278
285
  "agent-blackboard": "^0.5.0"
279
286
  },
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "name": "agent-workflow",
6
6
  "plugin": "vouchington-workflow",
7
- "pluginVersion": "0.6.3",
7
+ "pluginVersion": "0.7.0",
8
8
  "path": "agent-workflow/SKILL.md"
9
9
  },
10
10
  {
@@ -17,13 +17,13 @@
17
17
  {
18
18
  "name": "blackboard",
19
19
  "plugin": "vouchington-workflow",
20
- "pluginVersion": "0.6.3",
20
+ "pluginVersion": "0.7.0",
21
21
  "path": "blackboard/SKILL.md"
22
22
  },
23
23
  {
24
24
  "name": "dependabot",
25
25
  "plugin": "vouchington-workflow",
26
- "pluginVersion": "0.6.3",
26
+ "pluginVersion": "0.7.0",
27
27
  "path": "dependabot/SKILL.md",
28
28
  "prerequisites": ["github-actions-checklist"]
29
29
  },
@@ -36,26 +36,26 @@
36
36
  {
37
37
  "name": "git-commit-checklist",
38
38
  "plugin": "vouchington-workflow",
39
- "pluginVersion": "0.6.3",
39
+ "pluginVersion": "0.7.0",
40
40
  "path": "git-commit-checklist/SKILL.md"
41
41
  },
42
42
  {
43
43
  "name": "github-actions-authoring",
44
44
  "plugin": "vouchington-workflow",
45
- "pluginVersion": "0.6.3",
45
+ "pluginVersion": "0.7.0",
46
46
  "path": "github-actions-authoring/SKILL.md",
47
47
  "prerequisites": ["github-actions-checklist"]
48
48
  },
49
49
  {
50
50
  "name": "github-actions-checklist",
51
51
  "plugin": "vouchington-workflow",
52
- "pluginVersion": "0.6.3",
52
+ "pluginVersion": "0.7.0",
53
53
  "path": "github-actions-checklist/SKILL.md"
54
54
  },
55
55
  {
56
56
  "name": "github-issue",
57
57
  "plugin": "vouchington-workflow",
58
- "pluginVersion": "0.6.3",
58
+ "pluginVersion": "0.7.0",
59
59
  "path": "github-issue/SKILL.md"
60
60
  },
61
61
  {
@@ -68,25 +68,25 @@
68
68
  {
69
69
  "name": "npm-publishing",
70
70
  "plugin": "vouchington-workflow",
71
- "pluginVersion": "0.6.3",
71
+ "pluginVersion": "0.7.0",
72
72
  "path": "npm-publishing/SKILL.md"
73
73
  },
74
74
  {
75
75
  "name": "organize-github-issues",
76
76
  "plugin": "vouchington-workflow",
77
- "pluginVersion": "0.6.3",
77
+ "pluginVersion": "0.7.0",
78
78
  "path": "organize-github-issues/SKILL.md"
79
79
  },
80
80
  {
81
81
  "name": "package-json-checklist",
82
82
  "plugin": "vouchington-workflow",
83
- "pluginVersion": "0.6.3",
83
+ "pluginVersion": "0.7.0",
84
84
  "path": "package-json-checklist/SKILL.md"
85
85
  },
86
86
  {
87
87
  "name": "planning",
88
88
  "plugin": "vouchington-workflow",
89
- "pluginVersion": "0.6.3",
89
+ "pluginVersion": "0.7.0",
90
90
  "path": "planning/SKILL.md"
91
91
  },
92
92
  {
@@ -110,43 +110,49 @@
110
110
  {
111
111
  "name": "pr-description",
112
112
  "plugin": "vouchington-workflow",
113
- "pluginVersion": "0.6.3",
113
+ "pluginVersion": "0.7.0",
114
114
  "path": "pr-description/SKILL.md"
115
115
  },
116
116
  {
117
117
  "name": "retrospective",
118
118
  "plugin": "vouchington-workflow",
119
- "pluginVersion": "0.6.3",
119
+ "pluginVersion": "0.7.0",
120
120
  "path": "retrospective/SKILL.md"
121
121
  },
122
122
  {
123
123
  "name": "retrospective-distill",
124
124
  "plugin": "vouchington-workflow",
125
- "pluginVersion": "0.6.3",
125
+ "pluginVersion": "0.7.0",
126
126
  "path": "retrospective-distill/SKILL.md"
127
127
  },
128
128
  {
129
129
  "name": "review-ci-logs",
130
130
  "plugin": "vouchington-workflow",
131
- "pluginVersion": "0.6.3",
131
+ "pluginVersion": "0.7.0",
132
132
  "path": "review-ci-logs/SKILL.md"
133
133
  },
134
134
  {
135
135
  "name": "review-github-issue-taxonomy",
136
136
  "plugin": "vouchington-workflow",
137
- "pluginVersion": "0.6.3",
137
+ "pluginVersion": "0.7.0",
138
138
  "path": "review-github-issue-taxonomy/SKILL.md"
139
139
  },
140
140
  {
141
141
  "name": "revisit-followups",
142
142
  "plugin": "vouchington-workflow",
143
- "pluginVersion": "0.6.3",
143
+ "pluginVersion": "0.7.0",
144
144
  "path": "revisit-followups/SKILL.md"
145
145
  },
146
+ {
147
+ "name": "stacked-prs",
148
+ "plugin": "vouchington-workflow",
149
+ "pluginVersion": "0.7.0",
150
+ "path": "stacked-prs/SKILL.md"
151
+ },
146
152
  {
147
153
  "name": "static-analysis-checklist",
148
154
  "plugin": "vouchington-workflow",
149
- "pluginVersion": "0.6.3",
155
+ "pluginVersion": "0.7.0",
150
156
  "path": "static-analysis-checklist/SKILL.md"
151
157
  },
152
158
  {
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: stacked-prs
3
+ description: Recognize a native GitHub stacked pull request and drain it from the bottom-most ready layer up, rather than waiting for the whole stack to be ready first.
4
+ ---
5
+
6
+ # Stacked pull requests
7
+
8
+ Use whenever a change is submitted as a chain of native GitHub stacked pull requests instead of a
9
+ single PR. Read local `AGENTS.md` and `CLAUDE.md` first: they own whether this repository adopts
10
+ stacking at all, the tooling used to create, rebase, and merge a stack, and who may authorize a
11
+ merge.
12
+
13
+ A stack is a sequence of branches, each submitted as its own pull request, where every PR but the
14
+ bottom-most one targets the PR below it as its base branch instead of targeting the default branch
15
+ directly. That parent-branch base is the hazard: a mid-stack PR's base ref is an unmerged branch,
16
+ not the default branch, so a generic "merge this PR" action taken on a mid-stack layer can land it
17
+ into that unmerged parent instead of where it needs to go. Before treating any merge action on a
18
+ stacked PR as safe, confirm its actual base branch, and treat a base that is not the default branch
19
+ as a sign the PR is mid-stack.
20
+
21
+ Drain a stack from the bottom, one layer at a time, merging each bottom-most layer as soon as it
22
+ becomes ready rather than waiting for every layer above it to be ready first. A stack should stay as
23
+ short as it can be: every layer that remains unmerged keeps accumulating rebase surface, CI cost,
24
+ and drift against the default branch, and that cost compounds for every layer still stacked above
25
+ it.
26
+
27
+ Only merging the bottom-most layer into the default branch actually drains anything: that merge
28
+ lands the bottom layer, and the parent-branch bases above it can now be retargeted onto the default
29
+ branch as that layer closes. Merging a higher layer instead lands it into its own parent branch, not
30
+ the default branch, and leaves every layer below it exactly as open and unmerged as before — no
31
+ progress toward the default branch has been made, even though a PR closed. So whatever merge
32
+ selector or target is used to drain the stack must name the bottom-most unmerged layer specifically,
33
+ not an arbitrary or more convenient one.
34
+
35
+ When a drain stalls — something on the stack needs human attention, or a layer closes without
36
+ merging — but the bottom-most layer is otherwise ready to merge, stop before yielding: report the
37
+ stack's current state layer by layer, and ask whether to merge that ready bottom layer before
38
+ continuing. Do not leave a ready bottom layer sitting under a blocked or stalled upper layer without
39
+ saying so.
40
+
41
+ Do not invent a default branch, a stacking tool or its command catalog, an exact merge-selector
42
+ syntax, or a merge-authorization policy. A consumer wrapper or local instruction file owns those
43
+ choices for this repository.