putitoutthere 0.0.1

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 (79) hide show
  1. package/README.md +10 -0
  2. package/action.yml +24 -0
  3. package/dist/action.d.ts +9 -0
  4. package/dist/action.d.ts.map +1 -0
  5. package/dist/action.js +19 -0
  6. package/dist/action.js.map +1 -0
  7. package/dist/cascade.d.ts +30 -0
  8. package/dist/cascade.d.ts.map +1 -0
  9. package/dist/cascade.js +92 -0
  10. package/dist/cascade.js.map +1 -0
  11. package/dist/cli.d.ts +10 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +57 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/completeness.d.ts +34 -0
  16. package/dist/completeness.d.ts.map +1 -0
  17. package/dist/completeness.js +121 -0
  18. package/dist/completeness.js.map +1 -0
  19. package/dist/config.d.ts +132 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +128 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/git.d.ts +35 -0
  24. package/dist/git.d.ts.map +1 -0
  25. package/dist/git.js +98 -0
  26. package/dist/git.js.map +1 -0
  27. package/dist/glob.d.ts +15 -0
  28. package/dist/glob.d.ts.map +1 -0
  29. package/dist/glob.js +29 -0
  30. package/dist/glob.js.map +1 -0
  31. package/dist/handlers/crates.d.ts +8 -0
  32. package/dist/handlers/crates.d.ts.map +1 -0
  33. package/dist/handlers/crates.js +19 -0
  34. package/dist/handlers/crates.js.map +1 -0
  35. package/dist/handlers/index.d.ts +7 -0
  36. package/dist/handlers/index.d.ts.map +1 -0
  37. package/dist/handlers/index.js +22 -0
  38. package/dist/handlers/index.js.map +1 -0
  39. package/dist/handlers/npm.d.ts +7 -0
  40. package/dist/handlers/npm.d.ts.map +1 -0
  41. package/dist/handlers/npm.js +18 -0
  42. package/dist/handlers/npm.js.map +1 -0
  43. package/dist/handlers/pypi.d.ts +6 -0
  44. package/dist/handlers/pypi.d.ts.map +1 -0
  45. package/dist/handlers/pypi.js +17 -0
  46. package/dist/handlers/pypi.js.map +1 -0
  47. package/dist/index.d.ts +10 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +9 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/log.d.ts +31 -0
  52. package/dist/log.d.ts.map +1 -0
  53. package/dist/log.js +81 -0
  54. package/dist/log.js.map +1 -0
  55. package/dist/preflight.d.ts +30 -0
  56. package/dist/preflight.d.ts.map +1 -0
  57. package/dist/preflight.js +55 -0
  58. package/dist/preflight.js.map +1 -0
  59. package/dist/retry.d.ts +26 -0
  60. package/dist/retry.d.ts.map +1 -0
  61. package/dist/retry.js +91 -0
  62. package/dist/retry.js.map +1 -0
  63. package/dist/trailer.d.ts +26 -0
  64. package/dist/trailer.d.ts.map +1 -0
  65. package/dist/trailer.js +84 -0
  66. package/dist/trailer.js.map +1 -0
  67. package/dist/types.d.ts +73 -0
  68. package/dist/types.d.ts.map +1 -0
  69. package/dist/types.js +17 -0
  70. package/dist/types.js.map +1 -0
  71. package/dist/verbose.d.ts +47 -0
  72. package/dist/verbose.d.ts.map +1 -0
  73. package/dist/verbose.js +84 -0
  74. package/dist/verbose.js.map +1 -0
  75. package/dist/version.d.ts +27 -0
  76. package/dist/version.d.ts.map +1 -0
  77. package/dist/version.js +51 -0
  78. package/dist/version.js.map +1 -0
  79. package/package.json +58 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Pre-flight auth check. Runs before any publish side effect to verify
3
+ * every cascaded package has usable credentials.
4
+ *
5
+ * Per plan.md §16.3: each handler accepts OIDC (detected by
6
+ * `ACTIONS_ID_TOKEN_REQUEST_TOKEN`) or a specific long-lived env var.
7
+ * OIDC-capable handlers fall back on the env var when OIDC is not
8
+ * available.
9
+ *
10
+ * This module reports; callers decide whether to throw. `requireAuth`
11
+ * is the common case (publish). `pilot doctor` uses `checkAuth`
12
+ * directly so it can show a table instead of aborting.
13
+ *
14
+ * Issue #14.
15
+ */
16
+ import type { Package } from './config.js';
17
+ import type { Kind } from './types.js';
18
+ export interface AuthResult {
19
+ package: string;
20
+ kind: Kind;
21
+ via: 'oidc' | 'token' | 'missing';
22
+ envVar: string;
23
+ }
24
+ export interface AuthStatus {
25
+ ok: boolean;
26
+ results: AuthResult[];
27
+ }
28
+ export declare function checkAuth(packages: readonly Package[]): AuthStatus;
29
+ export declare function requireAuth(packages: readonly Package[]): void;
30
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAWvC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,UAAU,CAclE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAiB9D"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Pre-flight auth check. Runs before any publish side effect to verify
3
+ * every cascaded package has usable credentials.
4
+ *
5
+ * Per plan.md §16.3: each handler accepts OIDC (detected by
6
+ * `ACTIONS_ID_TOKEN_REQUEST_TOKEN`) or a specific long-lived env var.
7
+ * OIDC-capable handlers fall back on the env var when OIDC is not
8
+ * available.
9
+ *
10
+ * This module reports; callers decide whether to throw. `requireAuth`
11
+ * is the common case (publish). `pilot doctor` uses `checkAuth`
12
+ * directly so it can show a table instead of aborting.
13
+ *
14
+ * Issue #14.
15
+ */
16
+ const TOKEN_ENV = {
17
+ crates: 'CARGO_REGISTRY_TOKEN',
18
+ pypi: 'PYPI_API_TOKEN',
19
+ npm: 'NODE_AUTH_TOKEN',
20
+ };
21
+ const OIDC_ENV = 'ACTIONS_ID_TOKEN_REQUEST_TOKEN';
22
+ const DOCS_POINTER = 'plan.md §16.4';
23
+ export function checkAuth(packages) {
24
+ const hasOidc = nonEmpty(process.env[OIDC_ENV]);
25
+ const results = packages.map((p) => {
26
+ const envVar = TOKEN_ENV[p.kind];
27
+ if (hasOidc) {
28
+ return { package: p.name, kind: p.kind, via: 'oidc', envVar };
29
+ }
30
+ if (nonEmpty(process.env[envVar])) {
31
+ return { package: p.name, kind: p.kind, via: 'token', envVar };
32
+ }
33
+ return { package: p.name, kind: p.kind, via: 'missing', envVar };
34
+ });
35
+ const ok = results.every((r) => r.via !== 'missing');
36
+ return { ok, results };
37
+ }
38
+ export function requireAuth(packages) {
39
+ const status = checkAuth(packages);
40
+ if (status.ok)
41
+ return;
42
+ const missing = status.results.filter((r) => r.via === 'missing');
43
+ const lines = missing.map((r) => ` - ${r.package} (${r.kind}) needs ${r.envVar} (or OIDC via ${OIDC_ENV})`);
44
+ throw new Error([
45
+ 'Pre-flight auth check failed:',
46
+ ...lines,
47
+ '',
48
+ `Wire the missing env vars in .github/workflows/release.yml under the publish job.`,
49
+ `See ${DOCS_POINTER}.`,
50
+ ].join('\n'));
51
+ }
52
+ function nonEmpty(v) {
53
+ return typeof v === 'string' && v.trim().length > 0;
54
+ }
55
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,MAAM,SAAS,GAAyB;IACtC,MAAM,EAAE,sBAAsB;IAC9B,IAAI,EAAE,gBAAgB;IACtB,GAAG,EAAE,iBAAiB;CACvB,CAAC;AAEF,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AAClD,MAAM,YAAY,GAAG,eAAe,CAAC;AAcrC,MAAM,UAAU,SAAS,CAAC,QAA4B;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,MAAM,OAAO,GAAiB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAChE,CAAC;QACD,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IACrD,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAA4B;IACtD,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,EAAE;QAAE,OAAO;IACtB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CACvB,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,MAAM,iBAAiB,QAAQ,GAAG,CAC7E,CAAC;IACF,MAAM,IAAI,KAAK,CACb;QACE,+BAA+B;QAC/B,GAAG,KAAK;QACR,EAAE;QACF,mFAAmF;QACnF,OAAO,YAAY,GAAG;KACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,CAAqB;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Retry with exponential backoff + jitter.
3
+ *
4
+ * Applied uniformly by the orchestrator rather than per-handler (plan.md
5
+ * §13.3 / §7.3):
6
+ *
7
+ * retries: 3
8
+ * initial_delay: 1s
9
+ * multiplier: 2 (1s, 2s, 4s)
10
+ * jitter: ±25%
11
+ * retry_on: TransientError, fetch 5xx, ECONNRESET, ETIMEDOUT, 429
12
+ * no_retry_on: AuthError, other errors, 4xx (except 429)
13
+ *
14
+ * 429 honors the error's `retryAfter` hint (seconds) when present, so
15
+ * registries asking us to back off get respected.
16
+ *
17
+ * Issue #10.
18
+ */
19
+ export interface RetryOptions {
20
+ retries?: number;
21
+ initialDelayMs?: number;
22
+ multiplier?: number;
23
+ jitter?: number;
24
+ }
25
+ export declare function withRetry<T>(fn: () => Promise<T>, opts?: RetryOptions): Promise<T>;
26
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,CAAC,CAAC,CAuBZ"}
package/dist/retry.js ADDED
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Retry with exponential backoff + jitter.
3
+ *
4
+ * Applied uniformly by the orchestrator rather than per-handler (plan.md
5
+ * §13.3 / §7.3):
6
+ *
7
+ * retries: 3
8
+ * initial_delay: 1s
9
+ * multiplier: 2 (1s, 2s, 4s)
10
+ * jitter: ±25%
11
+ * retry_on: TransientError, fetch 5xx, ECONNRESET, ETIMEDOUT, 429
12
+ * no_retry_on: AuthError, other errors, 4xx (except 429)
13
+ *
14
+ * 429 honors the error's `retryAfter` hint (seconds) when present, so
15
+ * registries asking us to back off get respected.
16
+ *
17
+ * Issue #10.
18
+ */
19
+ import { AuthError, TransientError } from './types.js';
20
+ const DEFAULTS = {
21
+ retries: 3,
22
+ initialDelayMs: 1000,
23
+ multiplier: 2,
24
+ jitter: 0.25,
25
+ };
26
+ export async function withRetry(fn, opts = {}) {
27
+ const { retries, initialDelayMs, multiplier, jitter } = { ...DEFAULTS, ...opts };
28
+ let attempt = 0;
29
+ let lastErr;
30
+ while (attempt < retries) {
31
+ try {
32
+ return await fn();
33
+ }
34
+ catch (err) {
35
+ lastErr = err;
36
+ attempt++;
37
+ if (attempt >= retries || !isRetryable(err)) {
38
+ throw err;
39
+ }
40
+ const baseDelay = initialDelayMs * Math.pow(multiplier, attempt - 1);
41
+ const hinted = retryAfterMs(err);
42
+ const delay = Math.max(baseDelay, hinted) + jitterOffset(baseDelay, jitter);
43
+ await sleep(delay);
44
+ }
45
+ }
46
+ // Unreachable: loop either returns or throws. TypeScript can't infer that.
47
+ /* v8 ignore next 2 */
48
+ throw lastErr;
49
+ }
50
+ function isRetryable(err) {
51
+ if (err instanceof AuthError)
52
+ return false;
53
+ if (err instanceof TransientError)
54
+ return true;
55
+ // Network-ish error codes used by Node's net/http stack.
56
+ const code = extractProp(err, 'code');
57
+ if (code === 'ECONNRESET' || code === 'ETIMEDOUT')
58
+ return true;
59
+ // HTTP-status-tagged errors: retry 5xx and 429.
60
+ const status = extractProp(err, 'status');
61
+ if (typeof status === 'number') {
62
+ if (status === 429)
63
+ return true;
64
+ if (status >= 500 && status < 600)
65
+ return true;
66
+ }
67
+ return false;
68
+ }
69
+ function retryAfterMs(err) {
70
+ const ra = extractProp(err, 'retryAfter');
71
+ if (typeof ra === 'number' && ra > 0)
72
+ return ra * 1000;
73
+ return 0;
74
+ }
75
+ function extractProp(err, key) {
76
+ if (err && typeof err === 'object' && key in err) {
77
+ return err[key];
78
+ }
79
+ return undefined;
80
+ }
81
+ function jitterOffset(baseDelay, fraction) {
82
+ if (fraction <= 0)
83
+ return 0;
84
+ // ±fraction of the base delay.
85
+ const amp = baseDelay * fraction;
86
+ return (Math.random() * 2 - 1) * amp;
87
+ }
88
+ function sleep(ms) {
89
+ return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));
90
+ }
91
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Release trailer parser.
3
+ *
4
+ * Grammar (plan.md §10.3):
5
+ * trailer = "release:" WS value [ WS packages ]
6
+ * value = "patch" | "minor" | "major" | "skip"
7
+ * packages = "[" package-list "]"
8
+ * package-list = package-name *( "," WS package-name )
9
+ *
10
+ * Semantics (§10.6): case-insensitive key match; only the LAST `release:`
11
+ * line wins.
12
+ *
13
+ * Pure TypeScript implementation. A `git interpret-trailers`-backed
14
+ * variant may be added later for edge cases the RFC 822 trailer spec
15
+ * handles (folded continuations, etc.), but the pure parser covers
16
+ * every message shape putitoutthere actually sees.
17
+ *
18
+ * Issue #6.
19
+ */
20
+ import type { Bump } from './types.js';
21
+ export interface Trailer {
22
+ bump: Bump | 'skip';
23
+ packages: string[];
24
+ }
25
+ export declare function parseTrailer(commitBody: string): Trailer | null;
26
+ //# sourceMappingURL=trailer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailer.d.ts","sourceRoot":"","sources":["../src/trailer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAcD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAe/D"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Release trailer parser.
3
+ *
4
+ * Grammar (plan.md §10.3):
5
+ * trailer = "release:" WS value [ WS packages ]
6
+ * value = "patch" | "minor" | "major" | "skip"
7
+ * packages = "[" package-list "]"
8
+ * package-list = package-name *( "," WS package-name )
9
+ *
10
+ * Semantics (§10.6): case-insensitive key match; only the LAST `release:`
11
+ * line wins.
12
+ *
13
+ * Pure TypeScript implementation. A `git interpret-trailers`-backed
14
+ * variant may be added later for edge cases the RFC 822 trailer spec
15
+ * handles (folded continuations, etc.), but the pure parser covers
16
+ * every message shape putitoutthere actually sees.
17
+ *
18
+ * Issue #6.
19
+ */
20
+ const VALID_VALUES = new Set(['patch', 'minor', 'major', 'skip']);
21
+ // `release:` key, case-insensitive. Captures the remainder of the line.
22
+ // Anchored with `^\s*` so indented trailers still count (§10 is silent on
23
+ // indentation; real commit bodies rarely indent trailers, be lenient).
24
+ const TRAILER_LINE = /^\s*release\s*:\s*(.*?)\s*$/i;
25
+ // Package names: letters, digits, hyphen, underscore, dot. Matches what
26
+ // npm / crates.io / PyPI themselves accept in identifiers.
27
+ const PACKAGE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
28
+ export function parseTrailer(commitBody) {
29
+ const lines = commitBody.split(/\r?\n/);
30
+ // Scan in reverse; first hit = last occurrence.
31
+ for (let i = lines.length - 1; i >= 0; i--) {
32
+ const line = lines[i];
33
+ const match = TRAILER_LINE.exec(line);
34
+ if (!match)
35
+ continue;
36
+ const payload = match[1];
37
+ if (payload === undefined || payload === '') {
38
+ // `release:` with no value — malformed.
39
+ return null;
40
+ }
41
+ return parsePayload(payload);
42
+ }
43
+ return null;
44
+ }
45
+ function parsePayload(payload) {
46
+ // The payload is `<value>` or `<value> [pkg, pkg, ...]`.
47
+ const bracketIdx = payload.indexOf('[');
48
+ const valueText = (bracketIdx === -1 ? payload : payload.slice(0, bracketIdx)).trim();
49
+ if (!isValidValue(valueText)) {
50
+ return null;
51
+ }
52
+ if (bracketIdx === -1) {
53
+ return { bump: valueText, packages: [] };
54
+ }
55
+ const listText = payload.slice(bracketIdx);
56
+ const packages = parsePackageList(listText);
57
+ if (packages === null)
58
+ return null;
59
+ return { bump: valueText, packages };
60
+ }
61
+ function isValidValue(s) {
62
+ return VALID_VALUES.has(s);
63
+ }
64
+ function parsePackageList(s) {
65
+ // Must open with `[` and close with `]`; nothing after the close.
66
+ if (!s.startsWith('['))
67
+ return null;
68
+ const closeIdx = s.indexOf(']');
69
+ if (closeIdx === -1)
70
+ return null;
71
+ const tail = s.slice(closeIdx + 1).trim();
72
+ if (tail.length > 0)
73
+ return null; // stray text after list
74
+ const inner = s.slice(1, closeIdx).trim();
75
+ if (inner === '')
76
+ return []; // `release: minor []` → no packages
77
+ const parts = inner.split(',').map((p) => p.trim());
78
+ for (const name of parts) {
79
+ if (name === '' || !PACKAGE_NAME.test(name))
80
+ return null;
81
+ }
82
+ return parts;
83
+ }
84
+ //# sourceMappingURL=trailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailer.js","sourceRoot":"","sources":["../src/trailer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Public SDK + internal handler types.
3
+ *
4
+ * Full contract specified in plan.md §7.1. This file is the scaffolded
5
+ * surface; each field's implementation lands in its own issue:
6
+ * #5 (config), #7 (cascade), #11 (logger), #12 (handler dispatcher),
7
+ * #13 (completeness), #14 (pre-flight), #16–#19 (handlers).
8
+ */
9
+ export type Kind = 'crates' | 'pypi' | 'npm';
10
+ export type Bump = 'patch' | 'minor' | 'major';
11
+ /** Shape filled in by #5. */
12
+ export interface PackageConfig {
13
+ name: string;
14
+ kind: Kind;
15
+ path: string;
16
+ paths: string[];
17
+ depends_on?: string[];
18
+ first_version?: string;
19
+ smoke?: string;
20
+ [key: string]: unknown;
21
+ }
22
+ /** Shape filled in by #5. */
23
+ export interface Config {
24
+ version: 1;
25
+ cadence?: 'immediate' | 'scheduled';
26
+ agents_path?: string;
27
+ packages: PackageConfig[];
28
+ }
29
+ /** Runtime context passed to every handler call. */
30
+ export interface Ctx {
31
+ cwd: string;
32
+ dryRun: boolean;
33
+ log: Logger;
34
+ env: Record<string, string>;
35
+ artifacts: ArtifactStore;
36
+ }
37
+ export interface Logger {
38
+ debug(msg: string, fields?: Record<string, unknown>): void;
39
+ info(msg: string, fields?: Record<string, unknown>): void;
40
+ warn(msg: string, fields?: Record<string, unknown>): void;
41
+ error(msg: string, fields?: Record<string, unknown>): void;
42
+ }
43
+ export interface ArtifactStore {
44
+ /** Absolute path to the artifact tree for a given matrix artifact_name. */
45
+ get(artifactName: string): string;
46
+ /** True if the artifact_name exists and is non-empty. */
47
+ has(artifactName: string): boolean;
48
+ }
49
+ export interface PublishResult {
50
+ status: 'published' | 'already-published' | 'skipped';
51
+ url?: string;
52
+ bytes?: number;
53
+ }
54
+ export interface SmokeResult {
55
+ status: 'passed' | 'failed' | 'skipped';
56
+ output?: string;
57
+ }
58
+ export interface Handler {
59
+ kind: Kind;
60
+ isPublished(pkg: PackageConfig, version: string, ctx: Ctx): Promise<boolean>;
61
+ writeVersion(pkg: PackageConfig, version: string, ctx: Ctx): Promise<string[]>;
62
+ publish(pkg: PackageConfig, version: string, ctx: Ctx): Promise<PublishResult>;
63
+ smokeTest?(pkg: PackageConfig, version: string, ctx: Ctx): Promise<SmokeResult>;
64
+ }
65
+ /** Thrown on auth failure. Not retried. */
66
+ export declare class AuthError extends Error {
67
+ readonly name = "AuthError";
68
+ }
69
+ /** Thrown on 5xx / network / timeout. Retried per §13.3. */
70
+ export declare class TransientError extends Error {
71
+ readonly name = "TransientError";
72
+ }
73
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7C,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE/C,6BAA6B;AAC7B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,6BAA6B;AAC7B,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,oDAAoD;AACpD,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1D,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5D;AAED,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,yDAAyD;IACzD,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,GAAG,mBAAmB,GAAG,SAAS,CAAC;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/E,SAAS,CAAC,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACjF;AAED,2CAA2C;AAC3C,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAkB,IAAI,eAAe;CACtC;AAED,4DAA4D;AAC5D,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAkB,IAAI,oBAAoB;CAC3C"}
package/dist/types.js ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Public SDK + internal handler types.
3
+ *
4
+ * Full contract specified in plan.md §7.1. This file is the scaffolded
5
+ * surface; each field's implementation lands in its own issue:
6
+ * #5 (config), #7 (cascade), #11 (logger), #12 (handler dispatcher),
7
+ * #13 (completeness), #14 (pre-flight), #16–#19 (handlers).
8
+ */
9
+ /** Thrown on auth failure. Not retried. */
10
+ export class AuthError extends Error {
11
+ name = 'AuthError';
12
+ }
13
+ /** Thrown on 5xx / network / timeout. Retried per §13.3. */
14
+ export class TransientError extends Error {
15
+ name = 'TransientError';
16
+ }
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqEH,2CAA2C;AAC3C,MAAM,OAAO,SAAU,SAAQ,KAAK;IAChB,IAAI,GAAG,WAAW,CAAC;CACtC;AAED,4DAA4D;AAC5D,MAAM,OAAO,cAAe,SAAQ,KAAK;IACrB,IAAI,GAAG,gBAAgB,CAAC;CAC3C"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Verbose-on-failure dump.
3
+ *
4
+ * When a handler throws, this writes a rich diagnostic record to
5
+ * `$GITHUB_STEP_SUMMARY` (as markdown) and to the structured log
6
+ * stream (as a single error-level record). Both are passed through
7
+ * the logger's redactor so env-matched secrets never leak.
8
+ *
9
+ * Per plan.md §22.4. Auto-emitted on failure; never on success.
10
+ *
11
+ * Issue #15.
12
+ */
13
+ import type { Logger } from './types.js';
14
+ /**
15
+ * Everything the dump needs to describe the failure. Handlers build
16
+ * this from their own state (the command they ran, the subprocess
17
+ * output they captured, handler-specific extras like parsed wheel
18
+ * tags). Nothing in here is putitoutthere-specific -- a fresh handler
19
+ * can populate all fields from scratch.
20
+ */
21
+ export interface FailureContext {
22
+ /** Internal package name from pilot.toml. */
23
+ package: string;
24
+ /** Handler kind (crates | pypi | npm). */
25
+ handler: string;
26
+ /** The command that failed, argv-style. env values are redacted at emit. */
27
+ command: readonly string[];
28
+ /** stdout captured from the failing command. */
29
+ stdout: string;
30
+ /** stderr captured from the failing command. */
31
+ stderr: string;
32
+ /** Exit code (for child processes) or -1 when N/A. */
33
+ exitCode: number;
34
+ /** `{tool: "tool --version output"}`. Optional; handlers supply what's relevant. */
35
+ toolVersions?: Record<string, string>;
36
+ /**
37
+ * Handler-specific diagnostic extras. Arbitrary key/value; rendered
38
+ * verbatim in the summary. Examples from the plan: wheel platform
39
+ * tags, npm tarball contents, cargo package --list output.
40
+ */
41
+ extras?: Record<string, unknown>;
42
+ }
43
+ export interface DumpOptions {
44
+ log: Logger;
45
+ }
46
+ export declare function dumpFailure(err: Error, ctx: FailureContext, opts: DumpOptions): void;
47
+ //# sourceMappingURL=verbose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verbose.d.ts","sourceRoot":"","sources":["../src/verbose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAKD,wBAAgB,WAAW,CACzB,GAAG,EAAE,KAAK,EACV,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,WAAW,GAChB,IAAI,CAaN"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Verbose-on-failure dump.
3
+ *
4
+ * When a handler throws, this writes a rich diagnostic record to
5
+ * `$GITHUB_STEP_SUMMARY` (as markdown) and to the structured log
6
+ * stream (as a single error-level record). Both are passed through
7
+ * the logger's redactor so env-matched secrets never leak.
8
+ *
9
+ * Per plan.md §22.4. Auto-emitted on failure; never on success.
10
+ *
11
+ * Issue #15.
12
+ */
13
+ import { appendFileSync } from 'node:fs';
14
+ import { redact } from './log.js';
15
+ const SUMMARY_CAP = 4 * 1024 * 1024; // GHA job-summary ceiling: 1 MiB per step, 20 MiB total. Cap at 4 MiB to stay well under on a single failure.
16
+ const TRUNC_NOTE = '\n\n_… truncated. Run `gh run view --log` for the full log._\n';
17
+ export function dumpFailure(err, ctx, opts) {
18
+ const md = redact(renderMarkdown(err, ctx));
19
+ writeSummary(truncate(md));
20
+ // A single structured record pairs the summary so downstream log
21
+ // pipelines (JSON sinks, GHA log grep) can find the failure by
22
+ // package + handler + exitCode without parsing markdown.
23
+ opts.log.error(`${ctx.handler}/${ctx.package} failed: ${err.message}`, {
24
+ package: ctx.package,
25
+ handler: ctx.handler,
26
+ exitCode: ctx.exitCode,
27
+ command: ctx.command.join(' '),
28
+ });
29
+ }
30
+ function renderMarkdown(err, ctx) {
31
+ const lines = [];
32
+ lines.push(`## ❌ ${ctx.handler}/${ctx.package} failed`);
33
+ lines.push('');
34
+ lines.push(`**Error.** ${err.message}`);
35
+ lines.push(`**Exit code.** \`${ctx.exitCode}\``);
36
+ lines.push('');
37
+ lines.push('**Command**');
38
+ lines.push('```');
39
+ lines.push(ctx.command.join(' '));
40
+ lines.push('```');
41
+ if (ctx.toolVersions && Object.keys(ctx.toolVersions).length > 0) {
42
+ lines.push('');
43
+ lines.push('**Tool versions**');
44
+ lines.push('```');
45
+ for (const [k, v] of Object.entries(ctx.toolVersions)) {
46
+ lines.push(`${k}: ${v}`);
47
+ }
48
+ lines.push('```');
49
+ }
50
+ lines.push('');
51
+ lines.push('**stdout**');
52
+ lines.push('```');
53
+ lines.push(ctx.stdout || '(empty)');
54
+ lines.push('```');
55
+ lines.push('');
56
+ lines.push('**stderr**');
57
+ lines.push('```');
58
+ lines.push(ctx.stderr || '(empty)');
59
+ lines.push('```');
60
+ if (ctx.extras && Object.keys(ctx.extras).length > 0) {
61
+ lines.push('');
62
+ lines.push('**Handler extras**');
63
+ lines.push('```json');
64
+ lines.push(JSON.stringify(ctx.extras, null, 2));
65
+ lines.push('```');
66
+ }
67
+ lines.push('');
68
+ return lines.join('\n');
69
+ }
70
+ function truncate(md) {
71
+ if (md.length <= SUMMARY_CAP)
72
+ return md;
73
+ // Keep the head (error + command + versions) — the most useful
74
+ // bytes. Tail bytes are usually repeated noise at this size.
75
+ const head = md.slice(0, SUMMARY_CAP - TRUNC_NOTE.length);
76
+ return head + TRUNC_NOTE;
77
+ }
78
+ function writeSummary(md) {
79
+ const path = process.env.GITHUB_STEP_SUMMARY;
80
+ if (!path)
81
+ return; // local runs / non-GHA CI — summary is a no-op
82
+ appendFileSync(path, md, 'utf8');
83
+ }
84
+ //# sourceMappingURL=verbose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verbose.js","sourceRoot":"","sources":["../src/verbose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Version bumper.
3
+ *
4
+ * Strict semver — no pre-release suffixes in v0 (plan.md §26.2 defers
5
+ * `-rc` / `-beta` / `-alpha` to v0.2). Pre-1.0 does *not* use the
6
+ * "breaking minor bumps" convention; 0.1.5 + minor is 0.2.0, not 1.0.0.
7
+ *
8
+ * Issue #8. Plan: §14.3 (bump semantics), §14.4 (first version).
9
+ */
10
+ import type { Bump } from './types.js';
11
+ export interface Semver {
12
+ major: number;
13
+ minor: number;
14
+ patch: number;
15
+ }
16
+ export declare function parseSemver(s: string): Semver;
17
+ export declare function formatSemver(v: Semver): string;
18
+ export declare function bump(lastVersion: string, bumpType: Bump): string;
19
+ /**
20
+ * First-release version. Uses `package.first_version` when set, else
21
+ * the repo-wide default of `0.1.0`. Either way the value is validated
22
+ * against strict semver so typos fail loud before we tag.
23
+ */
24
+ export declare function firstVersion(pkg: {
25
+ first_version?: string;
26
+ }): string;
27
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAKD,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAU7C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,CAchE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAIpE"}