@kitsi/action 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 (46) hide show
  1. package/action.yml +61 -0
  2. package/dist/capabilities/annotations.d.ts +15 -0
  3. package/dist/capabilities/annotations.d.ts.map +1 -0
  4. package/dist/capabilities/annotations.js +28 -0
  5. package/dist/capabilities/annotations.js.map +1 -0
  6. package/dist/capabilities/artifacts.d.ts +7 -0
  7. package/dist/capabilities/artifacts.d.ts.map +1 -0
  8. package/dist/capabilities/artifacts.js +36 -0
  9. package/dist/capabilities/artifacts.js.map +1 -0
  10. package/dist/capabilities/cache.d.ts +18 -0
  11. package/dist/capabilities/cache.d.ts.map +1 -0
  12. package/dist/capabilities/cache.js +75 -0
  13. package/dist/capabilities/cache.js.map +1 -0
  14. package/dist/capabilities/index.d.ts +22 -0
  15. package/dist/capabilities/index.d.ts.map +1 -0
  16. package/dist/capabilities/index.js +24 -0
  17. package/dist/capabilities/index.js.map +1 -0
  18. package/dist/capabilities/reports.d.ts +30 -0
  19. package/dist/capabilities/reports.d.ts.map +1 -0
  20. package/dist/capabilities/reports.js +155 -0
  21. package/dist/capabilities/reports.js.map +1 -0
  22. package/dist/capabilities/secrets.d.ts +8 -0
  23. package/dist/capabilities/secrets.d.ts.map +1 -0
  24. package/dist/capabilities/secrets.js +13 -0
  25. package/dist/capabilities/secrets.js.map +1 -0
  26. package/dist/capabilities/summary.d.ts +23 -0
  27. package/dist/capabilities/summary.d.ts.map +1 -0
  28. package/dist/capabilities/summary.js +52 -0
  29. package/dist/capabilities/summary.js.map +1 -0
  30. package/dist/groups.d.ts +12 -0
  31. package/dist/groups.d.ts.map +1 -0
  32. package/dist/groups.js +41 -0
  33. package/dist/groups.js.map +1 -0
  34. package/dist/index.d.ts +2 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +104576 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/post.d.ts +2 -0
  39. package/dist/post.d.ts.map +1 -0
  40. package/dist/post.js +57407 -0
  41. package/dist/post.js.map +1 -0
  42. package/dist/runner.d.ts +19 -0
  43. package/dist/runner.d.ts.map +1 -0
  44. package/dist/runner.js +135 -0
  45. package/dist/runner.js.map +1 -0
  46. package/package.json +38 -0
package/action.yml ADDED
@@ -0,0 +1,61 @@
1
+ name: 'Kitsi'
2
+ description: 'Run Kitsi pipelines with native GitHub integration'
3
+ author: 'Kitsi'
4
+ branding:
5
+ icon: 'play-circle'
6
+ color: 'blue'
7
+
8
+ inputs:
9
+ plan:
10
+ description: 'Plan name to execute'
11
+ required: true
12
+ file:
13
+ description: 'Pipeline file path'
14
+ required: false
15
+ default: '.kitsi/pipeline.ts'
16
+ task:
17
+ description: 'Run specific task only'
18
+ required: false
19
+ timeout:
20
+ description: 'Execution timeout (e.g., 10m, 1h)'
21
+ required: false
22
+ default: '30m'
23
+ fail-fast:
24
+ description: 'Stop on first task failure'
25
+ required: false
26
+ default: 'true'
27
+ working-directory:
28
+ description: 'Working directory for execution'
29
+ required: false
30
+ default: '.'
31
+
32
+ outputs:
33
+ status:
34
+ description: 'Execution status (success/failed)'
35
+ duration:
36
+ description: 'Total duration in seconds'
37
+ tasks:
38
+ description: 'JSON object with per-task results'
39
+
40
+ runs:
41
+ using: 'composite'
42
+ steps:
43
+ - name: Setup Bun
44
+ uses: oven-sh/setup-bun@v1
45
+ with:
46
+ bun-version: '1.3.5'
47
+ - name: Run Kitsi
48
+ shell: bash
49
+ working-directory: ${{ github.workspace }}
50
+ run: bun "$GITHUB_ACTION_PATH/dist/index.js"
51
+ env:
52
+ INPUT_PLAN: ${{ inputs.plan }}
53
+ INPUT_FILE: ${{ inputs.file }}
54
+ INPUT_TASK: ${{ inputs.task }}
55
+ INPUT_TIMEOUT: ${{ inputs.timeout }}
56
+ INPUT_FAIL-FAST: ${{ inputs.fail-fast }}
57
+ INPUT_WORKING-DIRECTORY: ${{ inputs.working-directory }}
58
+ - name: Post Kitsi
59
+ if: ${{ always() }}
60
+ shell: bash
61
+ run: bun "$GITHUB_ACTION_PATH/dist/post.js"
@@ -0,0 +1,15 @@
1
+ export interface AnnotateLocation {
2
+ file: string;
3
+ line?: number;
4
+ col?: number;
5
+ }
6
+ export interface AnnotateOp {
7
+ kind: 'annotate';
8
+ level: 'error' | 'warning' | 'info';
9
+ message: string;
10
+ location?: AnnotateLocation;
11
+ }
12
+ export declare class GitHubAnnotationCapability {
13
+ emit(op: AnnotateOp): void;
14
+ }
15
+ //# sourceMappingURL=annotations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/capabilities/annotations.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,qBAAa,0BAA0B;IACrC,IAAI,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI;CA0B3B"}
@@ -0,0 +1,28 @@
1
+ import * as core from '@actions/core';
2
+ export class GitHubAnnotationCapability {
3
+ emit(op) {
4
+ const properties = {};
5
+ if (op.location) {
6
+ properties.file = op.location.file;
7
+ if (op.location.line) {
8
+ properties.startLine = op.location.line;
9
+ properties.endLine = op.location.line;
10
+ }
11
+ if (op.location.col) {
12
+ properties.startColumn = op.location.col;
13
+ }
14
+ }
15
+ switch (op.level) {
16
+ case 'error':
17
+ core.error(op.message, properties);
18
+ break;
19
+ case 'warning':
20
+ core.warning(op.message, properties);
21
+ break;
22
+ case 'info':
23
+ core.notice(op.message, properties);
24
+ break;
25
+ }
26
+ }
27
+ }
28
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/capabilities/annotations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAetC,MAAM,OAAO,0BAA0B;IACrC,IAAI,CAAC,EAAc;QACjB,MAAM,UAAU,GAA8B,EAAE,CAAC;QAEjD,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACrB,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxC,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YACxC,CAAC;YACD,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;gBACpB,UAAU,CAAC,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBACpC,MAAM;QACV,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { ArtifactDownloadOp, ArtifactUploadOp } from '@kitsi/cli';
2
+ export declare class GitHubArtifactCapability {
3
+ private client;
4
+ upload(op: ArtifactUploadOp, workdir: string): Promise<void>;
5
+ download(op: ArtifactDownloadOp): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/capabilities/artifacts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAUvE,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAwC;IAEhD,MAAM,CAAC,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB5D,QAAQ,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAQtD"}
@@ -0,0 +1,36 @@
1
+ import * as artifact from '@actions/artifact';
2
+ import * as glob from '@actions/glob';
3
+ function formatBytes(bytes) {
4
+ if (bytes === 0)
5
+ return '0 B';
6
+ const k = 1024;
7
+ const sizes = ['B', 'KB', 'MB', 'GB'];
8
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
9
+ return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
10
+ }
11
+ export class GitHubArtifactCapability {
12
+ client = new artifact.DefaultArtifactClient();
13
+ async upload(op, workdir) {
14
+ const globber = await glob.create(op.patterns.join('\n'), {
15
+ matchDirectories: false,
16
+ });
17
+ const files = await globber.glob();
18
+ if (files.length === 0) {
19
+ throw new Error(`No files matched patterns: ${op.patterns.join(', ')}`);
20
+ }
21
+ const { size } = await this.client.uploadArtifact(op.name, files, workdir, {
22
+ compressionLevel: 6,
23
+ });
24
+ const normalizedSize = Number(size ?? 0);
25
+ const sizeBytes = Number.isFinite(normalizedSize) ? normalizedSize : 0;
26
+ console.log(`Uploaded artifact "${op.name}": ${files.length} files, ${formatBytes(sizeBytes)}`);
27
+ }
28
+ async download(op) {
29
+ const { artifact } = await this.client.getArtifact(op.name);
30
+ const { downloadPath } = await this.client.downloadArtifact(artifact.id, {
31
+ path: op.destination,
32
+ });
33
+ console.log(`Downloaded artifact "${op.name}" to ${downloadPath}`);
34
+ }
35
+ }
36
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/capabilities/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAGtC,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,OAAO,wBAAwB;IAC3B,MAAM,GAAG,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IAEtD,KAAK,CAAC,MAAM,CAAC,EAAoB,EAAE,OAAe;QAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACxD,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;YACzE,gBAAgB,EAAE,CAAC;SACpB,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvE,OAAO,CAAC,GAAG,CACT,sBAAsB,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,MAAM,WAAW,WAAW,CAAC,SAAS,CAAC,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAsB;QACnC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE;YACvE,IAAI,EAAE,EAAE,CAAC,WAAW;SACrB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,IAAI,QAAQ,YAAY,EAAE,CAAC,CAAC;IACrE,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { CacheRef } from '@kitsi/cli';
2
+ interface PendingCache {
3
+ paths: string[];
4
+ key: string;
5
+ restoredKey: string | undefined;
6
+ }
7
+ export declare class GitHubCacheCapability {
8
+ private pendingCaches;
9
+ mount(ref: CacheRef): Promise<boolean>;
10
+ private computeKey;
11
+ private hashFiles;
12
+ private hashEnv;
13
+ private hashValue;
14
+ private computeRestoreKeys;
15
+ getPendingCaches(): PendingCache[];
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/capabilities/cache.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAOD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAsB;IAErC,KAAK,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YAyB9B,UAAU;YAsBV,SAAS;IAavB,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,kBAAkB;IAI1B,gBAAgB,IAAI,YAAY,EAAE;CAGnC"}
@@ -0,0 +1,75 @@
1
+ import * as cache from '@actions/cache';
2
+ import * as core from '@actions/core';
3
+ import * as glob from '@actions/glob';
4
+ import { readFile } from 'node:fs/promises';
5
+ import { createHash } from 'node:crypto';
6
+ export class GitHubCacheCapability {
7
+ pendingCaches = [];
8
+ async mount(ref) {
9
+ const path = ref.mountPath;
10
+ if (!path) {
11
+ throw new Error(`Cache "${ref.name}" has no mount path`);
12
+ }
13
+ const key = await this.computeKey(ref);
14
+ const restoreKeys = this.computeRestoreKeys(ref);
15
+ const restoredKey = await cache.restoreCache([path], key, restoreKeys);
16
+ const hit = restoredKey !== undefined;
17
+ if (hit) {
18
+ core.info(`Cache hit: ${restoredKey}`);
19
+ }
20
+ else {
21
+ core.info(`Cache miss, will save as: ${key}`);
22
+ }
23
+ // Track for post-run save
24
+ this.pendingCaches.push({ paths: [path], key, restoredKey });
25
+ process.env.KITSI_PENDING_CACHES = JSON.stringify(this.pendingCaches);
26
+ return hit;
27
+ }
28
+ async computeKey(ref) {
29
+ const parts = [process.env.RUNNER_OS ?? 'unknown', ref.name];
30
+ const key = ref.key;
31
+ if (key?.files && key.files.length > 0) {
32
+ const hash = await this.hashFiles(key.files);
33
+ parts.push(hash.slice(0, 16));
34
+ }
35
+ if (key?.env && key.env.length > 0) {
36
+ const hash = this.hashEnv(key.env);
37
+ parts.push(hash.slice(0, 16));
38
+ }
39
+ if (key?.value) {
40
+ const hash = this.hashValue(key.value);
41
+ parts.push(hash.slice(0, 16));
42
+ }
43
+ return parts.join('-');
44
+ }
45
+ async hashFiles(patterns) {
46
+ const globber = await glob.create(patterns.join('\n'));
47
+ const files = await globber.glob();
48
+ const hash = createHash('sha256');
49
+ for (const file of files.sort()) {
50
+ const contents = await readFile(file);
51
+ hash.update(file);
52
+ hash.update(contents);
53
+ }
54
+ return hash.digest('hex');
55
+ }
56
+ hashEnv(names) {
57
+ const hash = createHash('sha256');
58
+ for (const name of names.sort()) {
59
+ hash.update(name);
60
+ hash.update('=');
61
+ hash.update(process.env[name] ?? '__unset__');
62
+ }
63
+ return hash.digest('hex');
64
+ }
65
+ hashValue(value) {
66
+ return createHash('sha256').update(value).digest('hex');
67
+ }
68
+ computeRestoreKeys(ref) {
69
+ return [`${process.env.RUNNER_OS ?? 'unknown'}-${ref.name}-`];
70
+ }
71
+ getPendingCaches() {
72
+ return this.pendingCaches;
73
+ }
74
+ }
75
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/capabilities/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { GitHubAnnotationCapability } from './annotations.js';
2
+ import { GitHubArtifactCapability } from './artifacts.js';
3
+ import { GitHubCacheCapability } from './cache.js';
4
+ import { GitHubReportCapability } from './reports.js';
5
+ import { GitHubSecretsCapability } from './secrets.js';
6
+ import { GitHubSummaryCapability } from './summary.js';
7
+ export declare class GitHubCapabilities {
8
+ readonly artifacts: GitHubArtifactCapability;
9
+ readonly cache: GitHubCacheCapability;
10
+ readonly summary: GitHubSummaryCapability;
11
+ readonly annotations: GitHubAnnotationCapability;
12
+ readonly secrets: GitHubSecretsCapability;
13
+ readonly reports: GitHubReportCapability;
14
+ constructor();
15
+ }
16
+ export { GitHubAnnotationCapability } from './annotations.js';
17
+ export { GitHubArtifactCapability } from './artifacts.js';
18
+ export { GitHubCacheCapability } from './cache.js';
19
+ export { GitHubReportCapability } from './reports.js';
20
+ export { GitHubSecretsCapability } from './secrets.js';
21
+ export { GitHubSummaryCapability } from './summary.js';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,SAAS,2BAAkC;IACpD,QAAQ,CAAC,KAAK,wBAA+B;IAC7C,QAAQ,CAAC,OAAO,0BAAiC;IACjD,QAAQ,CAAC,WAAW,6BAAoC;IACxD,QAAQ,CAAC,OAAO,0BAAiC;IACjD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;;CAK1C;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { GitHubAnnotationCapability } from './annotations.js';
2
+ import { GitHubArtifactCapability } from './artifacts.js';
3
+ import { GitHubCacheCapability } from './cache.js';
4
+ import { GitHubReportCapability } from './reports.js';
5
+ import { GitHubSecretsCapability } from './secrets.js';
6
+ import { GitHubSummaryCapability } from './summary.js';
7
+ export class GitHubCapabilities {
8
+ artifacts = new GitHubArtifactCapability();
9
+ cache = new GitHubCacheCapability();
10
+ summary = new GitHubSummaryCapability();
11
+ annotations = new GitHubAnnotationCapability();
12
+ secrets = new GitHubSecretsCapability();
13
+ reports;
14
+ constructor() {
15
+ this.reports = new GitHubReportCapability(this.summary, this.annotations);
16
+ }
17
+ }
18
+ export { GitHubAnnotationCapability } from './annotations.js';
19
+ export { GitHubArtifactCapability } from './artifacts.js';
20
+ export { GitHubCacheCapability } from './cache.js';
21
+ export { GitHubReportCapability } from './reports.js';
22
+ export { GitHubSecretsCapability } from './secrets.js';
23
+ export { GitHubSummaryCapability } from './summary.js';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,OAAO,kBAAkB;IACpB,SAAS,GAAG,IAAI,wBAAwB,EAAE,CAAC;IAC3C,KAAK,GAAG,IAAI,qBAAqB,EAAE,CAAC;IACpC,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAC;IACxC,WAAW,GAAG,IAAI,0BAA0B,EAAE,CAAC;IAC/C,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAC;IACxC,OAAO,CAAyB;IAEzC;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5E,CAAC;CACF;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { GitHubAnnotationCapability } from './annotations.js';
2
+ import type { GitHubSummaryCapability } from './summary.js';
3
+ export interface ReportOp {
4
+ kind: 'report';
5
+ reportType: 'junit' | 'coverage';
6
+ path: string;
7
+ }
8
+ export interface JUnitFailure {
9
+ testName: string;
10
+ message: string;
11
+ file?: string;
12
+ line?: number;
13
+ }
14
+ export interface JUnitResult {
15
+ total: number;
16
+ passed: number;
17
+ skipped: number;
18
+ duration: number;
19
+ failures: JUnitFailure[];
20
+ }
21
+ export declare function parseJUnit(content: string): JUnitResult;
22
+ export declare class GitHubReportCapability {
23
+ private summary;
24
+ private annotations;
25
+ constructor(summary: GitHubSummaryCapability, annotations: GitHubAnnotationCapability);
26
+ process(op: ReportOp, taskName: string): Promise<void>;
27
+ private processJUnit;
28
+ private processCoverage;
29
+ }
30
+ //# sourceMappingURL=reports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/capabilities/reports.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAqFD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAwCvD;AAED,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;gBADX,OAAO,EAAE,uBAAuB,EAChC,WAAW,EAAE,0BAA0B;IAG3C,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAW9C,YAAY;YAiCZ,eAAe;CAuB9B"}
@@ -0,0 +1,155 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import { XMLParser } from 'fast-xml-parser';
3
+ function toNumber(value) {
4
+ if (value === undefined)
5
+ return 0;
6
+ if (typeof value === 'number')
7
+ return value;
8
+ return Number.parseInt(value, 10) || 0;
9
+ }
10
+ function toFloat(value) {
11
+ if (value === undefined)
12
+ return 0;
13
+ if (typeof value === 'number')
14
+ return value;
15
+ return Number.parseFloat(value) || 0;
16
+ }
17
+ function extractFailureMessage(failure) {
18
+ if (!failure)
19
+ return 'Unknown failure';
20
+ if (typeof failure === 'string')
21
+ return failure;
22
+ return failure['@_message'] || failure['#text'] || 'Unknown failure';
23
+ }
24
+ function processTestCase(testcase, failures) {
25
+ const testName = testcase['@_name'] || 'Unknown test';
26
+ if (testcase.failure) {
27
+ failures.push({
28
+ testName,
29
+ message: extractFailureMessage(testcase.failure),
30
+ });
31
+ }
32
+ if (testcase.error) {
33
+ failures.push({
34
+ testName,
35
+ message: extractFailureMessage(testcase.error),
36
+ });
37
+ }
38
+ }
39
+ function processTestSuite(suite, result) {
40
+ result.total += toNumber(suite['@_tests']);
41
+ result.skipped += toNumber(suite['@_skipped']);
42
+ result.duration += toFloat(suite['@_time']);
43
+ const testcases = suite.testcase;
44
+ if (!testcases)
45
+ return;
46
+ const cases = Array.isArray(testcases) ? testcases : [testcases];
47
+ for (const testcase of cases) {
48
+ processTestCase(testcase, result.failures);
49
+ }
50
+ }
51
+ export function parseJUnit(content) {
52
+ const parser = new XMLParser({
53
+ ignoreAttributes: false,
54
+ attributeNamePrefix: '@_',
55
+ });
56
+ const doc = parser.parse(content);
57
+ const result = {
58
+ total: 0,
59
+ passed: 0,
60
+ skipped: 0,
61
+ duration: 0,
62
+ failures: [],
63
+ };
64
+ // Handle <testsuites> wrapper
65
+ if (doc.testsuites) {
66
+ const suites = doc.testsuites.testsuite;
67
+ if (suites) {
68
+ const suiteArray = Array.isArray(suites) ? suites : [suites];
69
+ for (const suite of suiteArray) {
70
+ processTestSuite(suite, result);
71
+ }
72
+ }
73
+ // Use aggregate counts if available
74
+ if (doc.testsuites['@_tests']) {
75
+ result.total = toNumber(doc.testsuites['@_tests']);
76
+ result.skipped = toNumber(doc.testsuites['@_skipped']);
77
+ result.duration = toFloat(doc.testsuites['@_time']);
78
+ }
79
+ }
80
+ // Handle single <testsuite> at root
81
+ else if (doc.testsuite) {
82
+ processTestSuite(doc.testsuite, result);
83
+ }
84
+ // Calculate passed count
85
+ result.passed = result.total - result.failures.length - result.skipped;
86
+ return result;
87
+ }
88
+ export class GitHubReportCapability {
89
+ summary;
90
+ annotations;
91
+ constructor(summary, annotations) {
92
+ this.summary = summary;
93
+ this.annotations = annotations;
94
+ }
95
+ async process(op, taskName) {
96
+ switch (op.reportType) {
97
+ case 'junit':
98
+ await this.processJUnit(op.path, taskName);
99
+ break;
100
+ case 'coverage':
101
+ await this.processCoverage(op.path, taskName);
102
+ break;
103
+ }
104
+ }
105
+ async processJUnit(path, taskName) {
106
+ const content = await fs.readFile(path, 'utf-8');
107
+ const result = parseJUnit(content);
108
+ // Create annotations for failures
109
+ for (const failure of result.failures) {
110
+ this.annotations.emit({
111
+ kind: 'annotate',
112
+ level: 'error',
113
+ message: `${failure.testName}: ${failure.message}`,
114
+ location: failure.file ? { file: failure.file, line: failure.line } : undefined,
115
+ });
116
+ }
117
+ // Add to summary
118
+ const icon = result.failures.length === 0 ? '\u2705' : '\u274C';
119
+ let md = `#### Test Results ${icon}\n\n`;
120
+ md += `- **Total:** ${result.total}\n`;
121
+ md += `- **Passed:** ${result.passed}\n`;
122
+ md += `- **Failed:** ${result.failures.length}\n`;
123
+ md += `- **Skipped:** ${result.skipped}\n`;
124
+ md += `- **Duration:** ${result.duration}s\n`;
125
+ if (result.failures.length > 0) {
126
+ md += '\n**Failures:**\n';
127
+ for (const f of result.failures) {
128
+ md += `- \`${f.testName}\`: ${f.message}\n`;
129
+ }
130
+ }
131
+ this.summary.writeTaskSummary(taskName, md);
132
+ }
133
+ async processCoverage(path, taskName) {
134
+ // Try to parse coverage summary
135
+ try {
136
+ const content = await fs.readFile(path, 'utf-8');
137
+ // Try JSON format (lcov-summary or similar)
138
+ if (path.endsWith('.json')) {
139
+ const data = JSON.parse(content);
140
+ let md = '#### Coverage Report\n\n';
141
+ if (data.total) {
142
+ md += `- **Lines:** ${data.total.lines?.pct ?? 'N/A'}%\n`;
143
+ md += `- **Branches:** ${data.total.branches?.pct ?? 'N/A'}%\n`;
144
+ md += `- **Functions:** ${data.total.functions?.pct ?? 'N/A'}%\n`;
145
+ md += `- **Statements:** ${data.total.statements?.pct ?? 'N/A'}%\n`;
146
+ }
147
+ this.summary.writeTaskSummary(taskName, md);
148
+ }
149
+ }
150
+ catch {
151
+ // Silently ignore coverage parsing errors
152
+ }
153
+ }
154
+ }
155
+ //# sourceMappingURL=reports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/capabilities/reports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface SecretRef {
2
+ kind: 'secret';
3
+ name: string;
4
+ }
5
+ export declare class GitHubSecretsCapability {
6
+ resolve(ref: SecretRef): string;
7
+ }
8
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/capabilities/secrets.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM;CAchC"}
@@ -0,0 +1,13 @@
1
+ import * as core from '@actions/core';
2
+ export class GitHubSecretsCapability {
3
+ resolve(ref) {
4
+ const value = process.env[ref.name];
5
+ if (value === undefined) {
6
+ throw new Error(`Secret "${ref.name}" not found. Ensure it's defined in repository secrets and passed via env in the workflow.`);
7
+ }
8
+ // Register for redaction in logs
9
+ core.setSecret(value);
10
+ return value;
11
+ }
12
+ }
13
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/capabilities/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAOtC,MAAM,OAAO,uBAAuB;IAClC,OAAO,CAAC,GAAc;QACpB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,WAAW,GAAG,CAAC,IAAI,4FAA4F,CAChH,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEtB,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ interface SummaryOp {
2
+ kind: 'summary';
3
+ content: string;
4
+ }
5
+ interface TaskResult {
6
+ status: 'success' | 'failed';
7
+ duration: number;
8
+ summaries: SummaryOp[];
9
+ }
10
+ export interface PlanResult {
11
+ plan: string;
12
+ duration: number;
13
+ tasks: Record<string, TaskResult>;
14
+ }
15
+ export declare class GitHubSummaryCapability {
16
+ private taskSummaries;
17
+ writePlanSummary(planName: string, result: PlanResult, totalDuration: number): Promise<void>;
18
+ private buildTaskSummaries;
19
+ private buildBufferedSummaries;
20
+ writeTaskSummary(taskName: string, content: string): void;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/capabilities/summary.ts"],"names":[],"mappings":"AAEA,UAAU,SAAS;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,SAAS,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACnC;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,aAAa,CAAoC;IAEnD,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAsBhB,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,sBAAsB;IAa9B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CAM1D"}
@@ -0,0 +1,52 @@
1
+ import * as core from '@actions/core';
2
+ export class GitHubSummaryCapability {
3
+ taskSummaries = new Map();
4
+ async writePlanSummary(planName, result, totalDuration) {
5
+ const status = Object.values(result.tasks).some((t) => t.status === 'failed')
6
+ ? 'failed'
7
+ : 'success';
8
+ const statusIcon = status === 'success' ? '\u2705' : '\u274C';
9
+ let md = `## ${statusIcon} Kitsi: ${planName}\n\n`;
10
+ md += `**Duration:** ${totalDuration.toFixed(1)}s\n\n`;
11
+ md += '| Task | Status | Duration |\n';
12
+ md += '|------|--------|----------|\n';
13
+ for (const [taskName, taskResult] of Object.entries(result.tasks)) {
14
+ const icon = taskResult.status === 'success' ? '\u2713' : '\u2717';
15
+ md += `| ${taskName} | ${icon} | ${taskResult.duration.toFixed(1)}s |\n`;
16
+ }
17
+ md += this.buildTaskSummaries(result);
18
+ md += this.buildBufferedSummaries();
19
+ await core.summary.addRaw(md).write();
20
+ }
21
+ buildTaskSummaries(result) {
22
+ let output = '';
23
+ for (const [taskName, taskResult] of Object.entries(result.tasks)) {
24
+ if (taskResult.summaries && taskResult.summaries.length > 0) {
25
+ output += `\n### ${taskName}\n\n`;
26
+ for (const summary of taskResult.summaries) {
27
+ output += `${summary.content}\n\n`;
28
+ }
29
+ }
30
+ }
31
+ return output;
32
+ }
33
+ buildBufferedSummaries() {
34
+ let output = '';
35
+ for (const [taskName, summaries] of this.taskSummaries.entries()) {
36
+ if (summaries.length > 0) {
37
+ output += `\n### ${taskName}\n\n`;
38
+ for (const summary of summaries) {
39
+ output += `${summary}\n\n`;
40
+ }
41
+ }
42
+ }
43
+ return output;
44
+ }
45
+ writeTaskSummary(taskName, content) {
46
+ // Buffer task summaries for inclusion in plan summary
47
+ const existing = this.taskSummaries.get(taskName) ?? [];
48
+ existing.push(content);
49
+ this.taskSummaries.set(taskName, existing);
50
+ }
51
+ }
52
+ //# sourceMappingURL=summary.js.map