@geneverse/workctl 0.2.5
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.
- package/LICENSE +21 -0
- package/README.md +340 -0
- package/dist/packages/capabilities/assistant/src/commands.d.ts +10 -0
- package/dist/packages/capabilities/assistant/src/commands.js +33 -0
- package/dist/packages/capabilities/assistant/src/commands.js.map +1 -0
- package/dist/packages/capabilities/assistant/src/index.d.ts +2 -0
- package/dist/packages/capabilities/assistant/src/index.js +3 -0
- package/dist/packages/capabilities/assistant/src/index.js.map +1 -0
- package/dist/packages/capabilities/assistant/src/status.d.ts +18 -0
- package/dist/packages/capabilities/assistant/src/status.js +48 -0
- package/dist/packages/capabilities/assistant/src/status.js.map +1 -0
- package/dist/packages/capabilities/jenkins/src/commands.d.ts +9 -0
- package/dist/packages/capabilities/jenkins/src/commands.js +43 -0
- package/dist/packages/capabilities/jenkins/src/commands.js.map +1 -0
- package/dist/packages/capabilities/jenkins/src/definition.d.ts +10 -0
- package/dist/packages/capabilities/jenkins/src/definition.js +59 -0
- package/dist/packages/capabilities/jenkins/src/definition.js.map +1 -0
- package/dist/packages/capabilities/jenkins/src/index.d.ts +2 -0
- package/dist/packages/capabilities/jenkins/src/index.js +3 -0
- package/dist/packages/capabilities/jenkins/src/index.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/filesystem/config.store.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/adapters/filesystem/config.store.js +43 -0
- package/dist/packages/capabilities/jira/src/adapters/filesystem/config.store.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/filesystem/local.paths.d.ts +16 -0
- package/dist/packages/capabilities/jira/src/adapters/filesystem/local.paths.js +46 -0
- package/dist/packages/capabilities/jira/src/adapters/filesystem/local.paths.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/filesystem/sync-lock.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/adapters/filesystem/sync-lock.js +120 -0
- package/dist/packages/capabilities/jira/src/adapters/filesystem/sync-lock.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/jira/jira.client.d.ts +31 -0
- package/dist/packages/capabilities/jira/src/adapters/jira/jira.client.js +344 -0
- package/dist/packages/capabilities/jira/src/adapters/jira/jira.client.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/catalog.d.ts +9 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/catalog.js +17 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/catalog.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/orchestrator.d.ts +14 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/orchestrator.js +116 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/orchestrator.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/scraper.d.ts +32 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/scraper.js +2 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/scraper.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/detect.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/detect.js +45 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/detect.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/extract.d.ts +3 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/extract.js +115 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/extract.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/index.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/index.js +27 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/index.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/navigation.d.ts +3 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/navigation.js +104 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/navigation.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/ready.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/ready.js +47 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/ready.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/shared.d.ts +4 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/shared.js +5 -0
- package/dist/packages/capabilities/jira/src/adapters/kawari/v1/shared.js.map +1 -0
- package/dist/packages/capabilities/jira/src/adapters/terminal/node-cli.io.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/adapters/terminal/node-cli.io.js +40 -0
- package/dist/packages/capabilities/jira/src/adapters/terminal/node-cli.io.js.map +1 -0
- package/dist/packages/capabilities/jira/src/batch-interaction.d.ts +53 -0
- package/dist/packages/capabilities/jira/src/batch-interaction.js +201 -0
- package/dist/packages/capabilities/jira/src/batch-interaction.js.map +1 -0
- package/dist/packages/capabilities/jira/src/capability.d.ts +16 -0
- package/dist/packages/capabilities/jira/src/capability.js +56 -0
- package/dist/packages/capabilities/jira/src/capability.js.map +1 -0
- package/dist/packages/capabilities/jira/src/cli/contracts.d.ts +42 -0
- package/dist/packages/capabilities/jira/src/cli/contracts.js +2 -0
- package/dist/packages/capabilities/jira/src/cli/contracts.js.map +1 -0
- package/dist/packages/capabilities/jira/src/cli/errors.d.ts +3 -0
- package/dist/packages/capabilities/jira/src/cli/errors.js +7 -0
- package/dist/packages/capabilities/jira/src/cli/errors.js.map +1 -0
- package/dist/packages/capabilities/jira/src/cli/program.d.ts +6 -0
- package/dist/packages/capabilities/jira/src/cli/program.js +48 -0
- package/dist/packages/capabilities/jira/src/cli/program.js.map +1 -0
- package/dist/packages/capabilities/jira/src/cli/run-cli.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/cli/run-cli.js +72 -0
- package/dist/packages/capabilities/jira/src/cli/run-cli.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.command.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.command.js +165 -0
- package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.command.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.service.d.ts +30 -0
- package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.service.js +174 -0
- package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.service.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/command-context.d.ts +10 -0
- package/dist/packages/capabilities/jira/src/commands/command-context.js +2 -0
- package/dist/packages/capabilities/jira/src/commands/command-context.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/config-show/config-show.command.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/commands/config-show/config-show.command.js +26 -0
- package/dist/packages/capabilities/jira/src/commands/config-show/config-show.command.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/configure/configure.command.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/commands/configure/configure.command.js +26 -0
- package/dist/packages/capabilities/jira/src/commands/configure/configure.command.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/configure/configure.service.d.ts +42 -0
- package/dist/packages/capabilities/jira/src/commands/configure/configure.service.js +205 -0
- package/dist/packages/capabilities/jira/src/commands/configure/configure.service.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/doctor/doctor.command.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/commands/doctor/doctor.command.js +17 -0
- package/dist/packages/capabilities/jira/src/commands/doctor/doctor.command.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/doctor/doctor.service.d.ts +18 -0
- package/dist/packages/capabilities/jira/src/commands/doctor/doctor.service.js +84 -0
- package/dist/packages/capabilities/jira/src/commands/doctor/doctor.service.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/rollback/rollback.command.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/commands/rollback/rollback.command.js +198 -0
- package/dist/packages/capabilities/jira/src/commands/rollback/rollback.command.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/rollback/rollback.service.d.ts +37 -0
- package/dist/packages/capabilities/jira/src/commands/rollback/rollback.service.js +112 -0
- package/dist/packages/capabilities/jira/src/commands/rollback/rollback.service.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/sync/audit-export.service.d.ts +18 -0
- package/dist/packages/capabilities/jira/src/commands/sync/audit-export.service.js +96 -0
- package/dist/packages/capabilities/jira/src/commands/sync/audit-export.service.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/sync/preview.service.d.ts +23 -0
- package/dist/packages/capabilities/jira/src/commands/sync/preview.service.js +201 -0
- package/dist/packages/capabilities/jira/src/commands/sync/preview.service.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/sync/sync.command.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/commands/sync/sync.command.js +537 -0
- package/dist/packages/capabilities/jira/src/commands/sync/sync.command.js.map +1 -0
- package/dist/packages/capabilities/jira/src/commands/sync/verification.service.d.ts +34 -0
- package/dist/packages/capabilities/jira/src/commands/sync/verification.service.js +164 -0
- package/dist/packages/capabilities/jira/src/commands/sync/verification.service.js.map +1 -0
- package/dist/packages/capabilities/jira/src/config.d.ts +37 -0
- package/dist/packages/capabilities/jira/src/config.js +217 -0
- package/dist/packages/capabilities/jira/src/config.js.map +1 -0
- package/dist/packages/capabilities/jira/src/dependencies.d.ts +2 -0
- package/dist/packages/capabilities/jira/src/dependencies.js +92 -0
- package/dist/packages/capabilities/jira/src/dependencies.js.map +1 -0
- package/dist/packages/capabilities/jira/src/domain/date-range.d.ts +10 -0
- package/dist/packages/capabilities/jira/src/domain/date-range.js +63 -0
- package/dist/packages/capabilities/jira/src/domain/date-range.js.map +1 -0
- package/dist/packages/capabilities/jira/src/domain/marker.d.ts +20 -0
- package/dist/packages/capabilities/jira/src/domain/marker.js +100 -0
- package/dist/packages/capabilities/jira/src/domain/marker.js.map +1 -0
- package/dist/packages/capabilities/jira/src/domain/timesheet-entry.d.ts +45 -0
- package/dist/packages/capabilities/jira/src/domain/timesheet-entry.js +117 -0
- package/dist/packages/capabilities/jira/src/domain/timesheet-entry.js.map +1 -0
- package/dist/packages/capabilities/jira/src/index.d.ts +5 -0
- package/dist/packages/capabilities/jira/src/index.js +4 -0
- package/dist/packages/capabilities/jira/src/index.js.map +1 -0
- package/dist/packages/capabilities/jira/src/ports/jira.d.ts +49 -0
- package/dist/packages/capabilities/jira/src/ports/jira.js +11 -0
- package/dist/packages/capabilities/jira/src/ports/jira.js.map +1 -0
- package/dist/packages/capabilities/jira/src/ports/sync-lock.d.ts +6 -0
- package/dist/packages/capabilities/jira/src/ports/sync-lock.js +7 -0
- package/dist/packages/capabilities/jira/src/ports/sync-lock.js.map +1 -0
- package/dist/packages/capabilities/jira/src/ports/timesheet.d.ts +11 -0
- package/dist/packages/capabilities/jira/src/ports/timesheet.js +7 -0
- package/dist/packages/capabilities/jira/src/ports/timesheet.js.map +1 -0
- package/dist/packages/capabilities/jira/src/presentation.d.ts +37 -0
- package/dist/packages/capabilities/jira/src/presentation.js +111 -0
- package/dist/packages/capabilities/jira/src/presentation.js.map +1 -0
- package/dist/packages/cli/src/bin.d.ts +2 -0
- package/dist/packages/cli/src/bin.js +4 -0
- package/dist/packages/cli/src/bin.js.map +1 -0
- package/dist/packages/cli/src/commands/browsers/browsers.command.d.ts +7 -0
- package/dist/packages/cli/src/commands/browsers/browsers.command.js +22 -0
- package/dist/packages/cli/src/commands/browsers/browsers.command.js.map +1 -0
- package/dist/packages/cli/src/commands/browsers/browsers.service.d.ts +16 -0
- package/dist/packages/cli/src/commands/browsers/browsers.service.js +37 -0
- package/dist/packages/cli/src/commands/browsers/browsers.service.js.map +1 -0
- package/dist/packages/cli/src/commands/setup/setup.command.d.ts +4 -0
- package/dist/packages/cli/src/commands/setup/setup.command.js +41 -0
- package/dist/packages/cli/src/commands/setup/setup.command.js.map +1 -0
- package/dist/packages/cli/src/commands/setup/setup.service.d.ts +23 -0
- package/dist/packages/cli/src/commands/setup/setup.service.js +32 -0
- package/dist/packages/cli/src/commands/setup/setup.service.js.map +1 -0
- package/dist/packages/cli/src/commands/update/update.command.d.ts +7 -0
- package/dist/packages/cli/src/commands/update/update.command.js +34 -0
- package/dist/packages/cli/src/commands/update/update.command.js.map +1 -0
- package/dist/packages/cli/src/commands/update/update.service.d.ts +35 -0
- package/dist/packages/cli/src/commands/update/update.service.js +134 -0
- package/dist/packages/cli/src/commands/update/update.service.js.map +1 -0
- package/dist/packages/cli/src/index.d.ts +1 -0
- package/dist/packages/cli/src/index.js +2 -0
- package/dist/packages/cli/src/index.js.map +1 -0
- package/dist/packages/cli/src/program.d.ts +21 -0
- package/dist/packages/cli/src/program.js +74 -0
- package/dist/packages/cli/src/program.js.map +1 -0
- package/dist/packages/cli/src/release-version.d.ts +1 -0
- package/dist/packages/cli/src/release-version.js +2 -0
- package/package.json +57 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { TimesheetEntry } from "./timesheet-entry.js";
|
|
2
|
+
export declare const MARKER_PREFIX = "jlog:v1:";
|
|
3
|
+
export interface MarkerSnapshot {
|
|
4
|
+
sourceIdentity: string;
|
|
5
|
+
project: string;
|
|
6
|
+
description: string;
|
|
7
|
+
date: string;
|
|
8
|
+
duration: number;
|
|
9
|
+
jiraKey: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ParsedMarkers {
|
|
12
|
+
markers: MarkerSnapshot[];
|
|
13
|
+
errors: string[];
|
|
14
|
+
}
|
|
15
|
+
export declare function snapshotEntry(entry: TimesheetEntry): MarkerSnapshot;
|
|
16
|
+
export declare function encodeMarker(entry: TimesheetEntry): string;
|
|
17
|
+
export declare function parseMarkers(comment: unknown): ParsedMarkers;
|
|
18
|
+
export declare function snapshotsEqual(left: MarkerSnapshot, right: MarkerSnapshot): boolean;
|
|
19
|
+
export declare function markerIdentityMatchesEntry(marker: MarkerSnapshot, entry: TimesheetEntry, allowLegacySnapshotMatch?: boolean): boolean;
|
|
20
|
+
export declare function markerSnapshotMatchesEntry(marker: MarkerSnapshot, entry: TimesheetEntry, allowLegacySnapshotMatch?: boolean): boolean;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export const MARKER_PREFIX = "jlog:v1:";
|
|
2
|
+
const ANY_MARKER_PREFIX = "jlog:v";
|
|
3
|
+
export function snapshotEntry(entry) {
|
|
4
|
+
if (!entry.jiraKey)
|
|
5
|
+
throw new Error("Cannot create a Jira marker for an unmapped entry.");
|
|
6
|
+
return {
|
|
7
|
+
sourceIdentity: entry.sourceIdentity,
|
|
8
|
+
project: entry.project,
|
|
9
|
+
description: entry.description,
|
|
10
|
+
date: entry.date,
|
|
11
|
+
duration: entry.duration,
|
|
12
|
+
jiraKey: entry.jiraKey,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function encodeMarker(entry) {
|
|
16
|
+
return `${MARKER_PREFIX}${Buffer.from(JSON.stringify(snapshotEntry(entry)), "utf8").toString("base64url")}`;
|
|
17
|
+
}
|
|
18
|
+
function commentText(comment) {
|
|
19
|
+
if (typeof comment === "string")
|
|
20
|
+
return comment;
|
|
21
|
+
if (Array.isArray(comment))
|
|
22
|
+
return comment.map(commentText).join(" ");
|
|
23
|
+
if (typeof comment === "object" && comment !== null) {
|
|
24
|
+
const record = comment;
|
|
25
|
+
const ownText = typeof record.text === "string" ? record.text : "";
|
|
26
|
+
const contentText = "content" in record ? commentText(record.content) : "";
|
|
27
|
+
return [ownText, contentText].filter(Boolean).join(" ");
|
|
28
|
+
}
|
|
29
|
+
return "";
|
|
30
|
+
}
|
|
31
|
+
function isMarkerSnapshot(value) {
|
|
32
|
+
if (typeof value !== "object" || value === null)
|
|
33
|
+
return false;
|
|
34
|
+
const marker = value;
|
|
35
|
+
return (typeof marker.sourceIdentity === "string" &&
|
|
36
|
+
marker.sourceIdentity.length > 0 &&
|
|
37
|
+
typeof marker.project === "string" &&
|
|
38
|
+
typeof marker.description === "string" &&
|
|
39
|
+
/^\d{4}-\d{2}-\d{2}$/.test(String(marker.date)) &&
|
|
40
|
+
typeof marker.duration === "number" &&
|
|
41
|
+
Number.isFinite(marker.duration) &&
|
|
42
|
+
marker.duration > 0 &&
|
|
43
|
+
typeof marker.jiraKey === "string" &&
|
|
44
|
+
marker.jiraKey.length > 0);
|
|
45
|
+
}
|
|
46
|
+
export function parseMarkers(comment) {
|
|
47
|
+
const text = commentText(comment);
|
|
48
|
+
const candidates = text.split(/\s+/).filter((part) => part.startsWith(ANY_MARKER_PREFIX));
|
|
49
|
+
const markers = [];
|
|
50
|
+
const errors = [];
|
|
51
|
+
for (const candidate of candidates) {
|
|
52
|
+
if (!candidate.startsWith(MARKER_PREFIX)) {
|
|
53
|
+
errors.push("Unsupported jlog marker version.");
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const encoded = candidate.slice(MARKER_PREFIX.length);
|
|
58
|
+
const parsed = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
|
|
59
|
+
if (!isMarkerSnapshot(parsed))
|
|
60
|
+
throw new Error("invalid");
|
|
61
|
+
markers.push(parsed);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
errors.push("Malformed jlog marker.");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { markers, errors };
|
|
68
|
+
}
|
|
69
|
+
export function snapshotsEqual(left, right) {
|
|
70
|
+
return (left.sourceIdentity === right.sourceIdentity &&
|
|
71
|
+
left.project === right.project &&
|
|
72
|
+
left.description === right.description &&
|
|
73
|
+
left.date === right.date &&
|
|
74
|
+
left.duration === right.duration &&
|
|
75
|
+
left.jiraKey === right.jiraKey);
|
|
76
|
+
}
|
|
77
|
+
function snapshotValuesEqual(left, right) {
|
|
78
|
+
return (left.project === right.project &&
|
|
79
|
+
left.description === right.description &&
|
|
80
|
+
left.date === right.date &&
|
|
81
|
+
left.duration === right.duration &&
|
|
82
|
+
left.jiraKey === right.jiraKey);
|
|
83
|
+
}
|
|
84
|
+
export function markerIdentityMatchesEntry(marker, entry, allowLegacySnapshotMatch = false) {
|
|
85
|
+
if (marker.sourceIdentity === entry.sourceIdentity)
|
|
86
|
+
return true;
|
|
87
|
+
if (entry.compatibilitySourceIdentities?.includes(marker.sourceIdentity))
|
|
88
|
+
return true;
|
|
89
|
+
// Positional v1 markers predate persistent Kawari identities. Accept one only
|
|
90
|
+
// when the complete normalized snapshot still agrees, so a reordered,
|
|
91
|
+
// unchanged entry remains idempotent without guessing across changed entries.
|
|
92
|
+
return (allowLegacySnapshotMatch &&
|
|
93
|
+
marker.sourceIdentity.startsWith("kawari:v1:composite:") &&
|
|
94
|
+
snapshotValuesEqual(marker, snapshotEntry(entry)));
|
|
95
|
+
}
|
|
96
|
+
export function markerSnapshotMatchesEntry(marker, entry, allowLegacySnapshotMatch = false) {
|
|
97
|
+
return markerIdentityMatchesEntry(marker, entry, allowLegacySnapshotMatch) &&
|
|
98
|
+
snapshotValuesEqual(marker, snapshotEntry(entry));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.js","sourceRoot":"","sources":["../../../../../../packages/capabilities/jira/src/domain/marker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type DateRange } from "./date-range.js";
|
|
2
|
+
export interface TimesheetGrid {
|
|
3
|
+
dates: string[];
|
|
4
|
+
rows: Array<{
|
|
5
|
+
project?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
sourceId?: string;
|
|
8
|
+
durations: string[];
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export interface TimesheetEntry {
|
|
12
|
+
project: string;
|
|
13
|
+
description: string;
|
|
14
|
+
date: string;
|
|
15
|
+
duration: number;
|
|
16
|
+
sourceIdentity: string;
|
|
17
|
+
compatibilitySourceIdentities?: string[];
|
|
18
|
+
jiraKey?: string;
|
|
19
|
+
sourceId?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface BatchExcludedEntry extends TimesheetEntry {
|
|
22
|
+
jiraKey: string;
|
|
23
|
+
exclusionKind: "Missing Jira Issue" | "Ownership";
|
|
24
|
+
exclusionReason: string;
|
|
25
|
+
}
|
|
26
|
+
export interface InvalidEntry {
|
|
27
|
+
project?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
date?: string;
|
|
30
|
+
duration?: string;
|
|
31
|
+
reason: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ZeroDurationEntry {
|
|
34
|
+
project?: string;
|
|
35
|
+
description: string;
|
|
36
|
+
duration: 0;
|
|
37
|
+
jiraKey: string;
|
|
38
|
+
}
|
|
39
|
+
export interface ClassifiedEntries {
|
|
40
|
+
eligible: TimesheetEntry[];
|
|
41
|
+
unmapped: TimesheetEntry[];
|
|
42
|
+
zeroDuration: ZeroDurationEntry[];
|
|
43
|
+
invalid: InvalidEntry[];
|
|
44
|
+
}
|
|
45
|
+
export declare function classifyGrid(grid: TimesheetGrid, range: DateRange): ClassifiedEntries;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { isValidIsoDate } from "./date-range.js";
|
|
2
|
+
const JIRA_KEY = /(?<![A-Z0-9])[A-Z][A-Z0-9]*-\d+(?![A-Z0-9])/g;
|
|
3
|
+
export function classifyGrid(grid, range) {
|
|
4
|
+
const result = {
|
|
5
|
+
eligible: [],
|
|
6
|
+
unmapped: [],
|
|
7
|
+
zeroDuration: [],
|
|
8
|
+
invalid: [],
|
|
9
|
+
};
|
|
10
|
+
grid.rows.forEach((row, rowIndex) => {
|
|
11
|
+
const description = row.description?.trim() ?? "";
|
|
12
|
+
const rowKeys = [...new Set(description.match(JIRA_KEY) ?? [])];
|
|
13
|
+
const inRangeDurations = row.durations.flatMap((rawDuration, index) => {
|
|
14
|
+
const date = grid.dates[index];
|
|
15
|
+
if (date === undefined ||
|
|
16
|
+
!isValidIsoDate(date) ||
|
|
17
|
+
date < range.from ||
|
|
18
|
+
date > range.to ||
|
|
19
|
+
rawDuration.trim() === "") {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
return [Number(rawDuration.trim())];
|
|
23
|
+
});
|
|
24
|
+
if (rowKeys.length === 1 &&
|
|
25
|
+
inRangeDurations.some((duration) => duration === 0) &&
|
|
26
|
+
!inRangeDurations.some((duration) => duration > 0)) {
|
|
27
|
+
result.zeroDuration.push({
|
|
28
|
+
...(row.project?.trim() ? { project: row.project.trim() } : {}),
|
|
29
|
+
description,
|
|
30
|
+
duration: 0,
|
|
31
|
+
jiraKey: rowKeys[0],
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
row.durations.forEach((rawDuration, index) => {
|
|
35
|
+
const date = grid.dates[index];
|
|
36
|
+
const trimmedDuration = rawDuration.trim();
|
|
37
|
+
if (trimmedDuration === "")
|
|
38
|
+
return;
|
|
39
|
+
if (date !== undefined && isValidIsoDate(date) && (date < range.from || date > range.to)) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const duration = Number(trimmedDuration);
|
|
43
|
+
if (duration === 0)
|
|
44
|
+
return;
|
|
45
|
+
const base = {
|
|
46
|
+
...(row.project ? { project: row.project } : {}),
|
|
47
|
+
...(row.description ? { description: row.description } : {}),
|
|
48
|
+
...(date ? { date } : {}),
|
|
49
|
+
duration: rawDuration,
|
|
50
|
+
};
|
|
51
|
+
if (date === undefined || !isValidIsoDate(date)) {
|
|
52
|
+
result.invalid.push({ ...base, reason: "Date is missing or invalid." });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!Number.isFinite(duration) || duration <= 0) {
|
|
56
|
+
result.invalid.push({ ...base, reason: "Duration must be a positive number." });
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (!Number.isSafeInteger(duration * 60 * 60)) {
|
|
60
|
+
result.invalid.push({
|
|
61
|
+
...base,
|
|
62
|
+
reason: "Duration must convert to a whole number of seconds without rounding.",
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (!row.project?.trim() || !row.description?.trim()) {
|
|
67
|
+
result.invalid.push({ ...base, reason: "Project and description are required." });
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (row.sourceId !== undefined && row.sourceId.trim() === "") {
|
|
71
|
+
result.invalid.push({ ...base, reason: "Source identity is empty." });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const keys = [...new Set(row.description.match(JIRA_KEY) ?? [])];
|
|
75
|
+
if (keys.length > 1) {
|
|
76
|
+
result.invalid.push({ ...base, reason: "Description contains multiple Jira keys." });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const positionalIdentity = `kawari:v1:composite:${date.slice(0, 7)}:row:${rowIndex}:column:${index}`;
|
|
80
|
+
const sourceIdentity = row.sourceId === undefined
|
|
81
|
+
? positionalIdentity
|
|
82
|
+
: `kawari:v2:source:${Buffer.from(row.sourceId.trim(), "utf8").toString("base64url")}:date:${date}`;
|
|
83
|
+
const entry = {
|
|
84
|
+
project: row.project.trim(),
|
|
85
|
+
description: row.description.trim(),
|
|
86
|
+
date,
|
|
87
|
+
duration,
|
|
88
|
+
sourceIdentity,
|
|
89
|
+
...(row.sourceId ? { compatibilitySourceIdentities: [positionalIdentity] } : {}),
|
|
90
|
+
...(keys[0] ? { jiraKey: keys[0] } : {}),
|
|
91
|
+
...(row.sourceId ? { sourceId: row.sourceId } : {}),
|
|
92
|
+
};
|
|
93
|
+
(entry.jiraKey ? result.eligible : result.unmapped).push(entry);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
const entries = [...result.eligible, ...result.unmapped];
|
|
97
|
+
const identityCounts = new Map();
|
|
98
|
+
for (const entry of entries) {
|
|
99
|
+
identityCounts.set(entry.sourceIdentity, (identityCounts.get(entry.sourceIdentity) ?? 0) + 1);
|
|
100
|
+
}
|
|
101
|
+
const ambiguous = new Set([...identityCounts].filter(([, count]) => count > 1).map(([identity]) => identity));
|
|
102
|
+
if (ambiguous.size > 0) {
|
|
103
|
+
for (const entry of entries.filter(({ sourceIdentity }) => ambiguous.has(sourceIdentity))) {
|
|
104
|
+
result.invalid.push({
|
|
105
|
+
project: entry.project,
|
|
106
|
+
description: entry.description,
|
|
107
|
+
date: entry.date,
|
|
108
|
+
duration: String(entry.duration),
|
|
109
|
+
reason: "Source identity is ambiguous within the selected source data.",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
result.eligible = result.eligible.filter(({ sourceIdentity }) => !ambiguous.has(sourceIdentity));
|
|
113
|
+
result.unmapped = result.unmapped.filter(({ sourceIdentity }) => !ambiguous.has(sourceIdentity));
|
|
114
|
+
}
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=timesheet-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timesheet-entry.js","sourceRoot":"","sources":["../../../../../../packages/capabilities/jira/src/domain/timesheet-entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createProgram } from "./cli/program.js";
|
|
2
|
+
export { runCli } from "./cli/run-cli.js";
|
|
3
|
+
export { createNodeCliIO, createJiraCommandDependencies, registerJiraCommands, } from "./capability.js";
|
|
4
|
+
export type { JiraCommandDependencies } from "./capability.js";
|
|
5
|
+
export type { CliDependencies, CliIO } from "./cli/contracts.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/capabilities/jira/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface JiraWorklog {
|
|
2
|
+
id: string;
|
|
3
|
+
timeSpentSeconds: number;
|
|
4
|
+
started: string;
|
|
5
|
+
comment?: unknown;
|
|
6
|
+
authorAccountId?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface JiraIssueSnapshot {
|
|
9
|
+
key: string;
|
|
10
|
+
summary: string;
|
|
11
|
+
assigneeAccountId?: string;
|
|
12
|
+
assigneeDisplayName?: string;
|
|
13
|
+
assigneeStatus?: "assigned" | "unassigned" | "unverifiable";
|
|
14
|
+
worklogs: JiraWorklog[];
|
|
15
|
+
}
|
|
16
|
+
export interface JiraLinkedIssue {
|
|
17
|
+
key: string;
|
|
18
|
+
summary: string;
|
|
19
|
+
status: string;
|
|
20
|
+
}
|
|
21
|
+
export interface JiraIssueLink {
|
|
22
|
+
id: string;
|
|
23
|
+
type: string;
|
|
24
|
+
relationship: string;
|
|
25
|
+
direction: "inward" | "outward";
|
|
26
|
+
issue: JiraLinkedIssue;
|
|
27
|
+
}
|
|
28
|
+
export interface JiraLinkIssueSnapshot extends JiraLinkedIssue {
|
|
29
|
+
links: JiraIssueLink[];
|
|
30
|
+
}
|
|
31
|
+
export interface CreatedJiraWorklog {
|
|
32
|
+
id: string;
|
|
33
|
+
}
|
|
34
|
+
export interface JiraAccount {
|
|
35
|
+
accountId: string;
|
|
36
|
+
}
|
|
37
|
+
export interface JiraProject {
|
|
38
|
+
key: string;
|
|
39
|
+
name: string;
|
|
40
|
+
}
|
|
41
|
+
export interface JiraProjectStatus {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
}
|
|
45
|
+
export declare class JiraClientError extends Error {
|
|
46
|
+
readonly status?: number | undefined;
|
|
47
|
+
readonly issueKey?: string | undefined;
|
|
48
|
+
constructor(message: string, status?: number | undefined, issueKey?: string | undefined);
|
|
49
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira.js","sourceRoot":"","sources":["../../../../../../packages/capabilities/jira/src/ports/jira.ts"],"names":[],"mappings":"AAqDA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAG7B;IACA;IAHX,YACE,OAAe,EACN,MAAe,EACf,QAAiB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,WAAM,GAAN,MAAM,CAAS;QACf,aAAQ,GAAR,QAAQ,CAAS;QAG1B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-lock.js","sourceRoot":"","sources":["../../../../../../packages/capabilities/jira/src/ports/sync-lock.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TimesheetGrid } from "../domain/timesheet-entry.js";
|
|
2
|
+
export interface TimesheetInspection {
|
|
3
|
+
urlOrigin: string;
|
|
4
|
+
titlePresent: boolean;
|
|
5
|
+
taskInputCount: number;
|
|
6
|
+
durationInputCount: number;
|
|
7
|
+
grid: TimesheetGrid;
|
|
8
|
+
}
|
|
9
|
+
export declare class TimesheetBrowserError extends Error {
|
|
10
|
+
constructor(message: string);
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timesheet.js","sourceRoot":"","sources":["../../../../../../packages/capabilities/jira/src/ports/timesheet.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface PresentationOptions {
|
|
2
|
+
color?: boolean;
|
|
3
|
+
terminalWidth?: number;
|
|
4
|
+
}
|
|
5
|
+
export type Tone = "green" | "gray" | "yellow" | "red" | "cyan";
|
|
6
|
+
export declare function shouldUseColor(isTTY: boolean | undefined, env: NodeJS.ProcessEnv): boolean;
|
|
7
|
+
export declare function paint(text: string, tone: Tone, options?: PresentationOptions): string;
|
|
8
|
+
export declare function formatTable(headers: readonly string[], rows: readonly (readonly string[])[], options?: Pick<PresentationOptions, "terminalWidth">): string[];
|
|
9
|
+
export declare function formatHours(hours: number): string;
|
|
10
|
+
export declare function formatBatchHeader(command: string, from: string, to: string, entryCount: number, hours: number, options?: PresentationOptions): string;
|
|
11
|
+
export interface WorklogWriteResult {
|
|
12
|
+
status: "Succeeded" | "Failed";
|
|
13
|
+
date: string;
|
|
14
|
+
jiraKey: string;
|
|
15
|
+
hours: number;
|
|
16
|
+
detail: string;
|
|
17
|
+
}
|
|
18
|
+
export interface WorklogProgressCandidate {
|
|
19
|
+
date: string;
|
|
20
|
+
jiraKey: string;
|
|
21
|
+
hours: number;
|
|
22
|
+
}
|
|
23
|
+
export interface WorklogProgressTable {
|
|
24
|
+
topBorder: string;
|
|
25
|
+
header: string;
|
|
26
|
+
separator: string;
|
|
27
|
+
createdRows: readonly string[];
|
|
28
|
+
failedRows: readonly string[];
|
|
29
|
+
bottomBorder: string;
|
|
30
|
+
contentWidth: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function formatWorklogProgressTable(candidates: readonly WorklogProgressCandidate[]): WorklogProgressTable;
|
|
33
|
+
export declare function formatWorklogFailureDetail(detail: string, contentWidth: number): readonly string[];
|
|
34
|
+
export declare function formatWriteResults(results: readonly WorklogWriteResult[], options?: PresentationOptions, embedded?: boolean): {
|
|
35
|
+
stdout: string;
|
|
36
|
+
stderr: string;
|
|
37
|
+
};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
const ANSI = {
|
|
2
|
+
green: "\u001b[32m",
|
|
3
|
+
gray: "\u001b[90m",
|
|
4
|
+
yellow: "\u001b[33m",
|
|
5
|
+
red: "\u001b[31m",
|
|
6
|
+
cyan: "\u001b[36m",
|
|
7
|
+
};
|
|
8
|
+
const RESET = "\u001b[0m";
|
|
9
|
+
export function shouldUseColor(isTTY, env) {
|
|
10
|
+
return isTTY === true && env.NO_COLOR === undefined;
|
|
11
|
+
}
|
|
12
|
+
export function paint(text, tone, options = {}) {
|
|
13
|
+
return options.color ? `${ANSI[tone]}${text}${RESET}` : text;
|
|
14
|
+
}
|
|
15
|
+
function wrapCell(value, width) {
|
|
16
|
+
if (value.length <= width)
|
|
17
|
+
return [value];
|
|
18
|
+
const lines = [];
|
|
19
|
+
let remaining = value;
|
|
20
|
+
while (remaining.length > width) {
|
|
21
|
+
const candidate = remaining.slice(0, width + 1);
|
|
22
|
+
const breakAt = candidate.lastIndexOf(" ");
|
|
23
|
+
const end = breakAt > 0 ? breakAt : width;
|
|
24
|
+
lines.push(remaining.slice(0, end).trimEnd());
|
|
25
|
+
remaining = remaining.slice(end).trimStart();
|
|
26
|
+
}
|
|
27
|
+
lines.push(remaining);
|
|
28
|
+
return lines;
|
|
29
|
+
}
|
|
30
|
+
export function formatTable(headers, rows, options = {}) {
|
|
31
|
+
const widths = headers.map((header, column) => Math.max(header.length, ...rows.map((row) => row[column]?.length ?? 0)));
|
|
32
|
+
const finalColumn = headers.length - 1;
|
|
33
|
+
if (options.terminalWidth && finalColumn > 0) {
|
|
34
|
+
const fixedWidth = widths.slice(0, finalColumn).reduce((sum, width) => sum + width, 0);
|
|
35
|
+
const separators = finalColumn * 3;
|
|
36
|
+
widths[finalColumn] = Math.max(headers[finalColumn].length, 12, options.terminalWidth - fixedWidth - separators);
|
|
37
|
+
}
|
|
38
|
+
const formatRow = (row) => row.map((cell, column) => {
|
|
39
|
+
if (column === row.length - 1)
|
|
40
|
+
return cell;
|
|
41
|
+
return cell.padEnd(widths[column]);
|
|
42
|
+
}).join(" ").trimEnd();
|
|
43
|
+
const formattedRows = rows.flatMap((row) => {
|
|
44
|
+
const wrapped = wrapCell(row[finalColumn] ?? "", widths[finalColumn]);
|
|
45
|
+
return wrapped.map((line, index) => formatRow(row.map((cell, column) => column === finalColumn ? line : index === 0 ? cell : "")));
|
|
46
|
+
});
|
|
47
|
+
return [formatRow(headers), ...formattedRows];
|
|
48
|
+
}
|
|
49
|
+
export function formatHours(hours) {
|
|
50
|
+
return `${hours}h`;
|
|
51
|
+
}
|
|
52
|
+
export function formatBatchHeader(command, from, to, entryCount, hours, options = {}) {
|
|
53
|
+
const title = command[0].toUpperCase() + command.slice(1);
|
|
54
|
+
return [
|
|
55
|
+
paint(`Kawari → Jira ${title}`, "cyan", options),
|
|
56
|
+
`${from} → ${to} · ${entryCount} ${entryCount === 1 ? "entry" : "entries"} · ${formatHours(hours)}`,
|
|
57
|
+
"",
|
|
58
|
+
].join("\n");
|
|
59
|
+
}
|
|
60
|
+
export function formatWorklogProgressTable(candidates) {
|
|
61
|
+
const headers = ["PROGRESS", "DATE", "ISSUE", "TIME", "STATUS"];
|
|
62
|
+
const rows = (status) => candidates.map((candidate, index) => [
|
|
63
|
+
`${index + 1}/${candidates.length}`,
|
|
64
|
+
candidate.date,
|
|
65
|
+
candidate.jiraKey,
|
|
66
|
+
formatHours(candidate.hours),
|
|
67
|
+
status,
|
|
68
|
+
]);
|
|
69
|
+
const created = formatTable(headers, rows("Created"));
|
|
70
|
+
const failed = formatTable(headers, rows("Failed"));
|
|
71
|
+
const contentWidth = Math.max(...created.map((line) => line.length), ...failed.map((line) => line.length));
|
|
72
|
+
const framed = (line) => `│ ${line.padEnd(contentWidth)} │`;
|
|
73
|
+
return {
|
|
74
|
+
topBorder: `╭${"─".repeat(contentWidth + 2)}╮`,
|
|
75
|
+
header: framed(created[0]),
|
|
76
|
+
separator: `├${"─".repeat(contentWidth + 2)}┤`,
|
|
77
|
+
createdRows: created.slice(1).map(framed),
|
|
78
|
+
failedRows: failed.slice(1).map(framed),
|
|
79
|
+
bottomBorder: `╰${"─".repeat(contentWidth + 2)}╯`,
|
|
80
|
+
contentWidth,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function formatWorklogFailureDetail(detail, contentWidth) {
|
|
84
|
+
const indent = " ";
|
|
85
|
+
const detailWidth = Math.max(1, contentWidth - indent.length);
|
|
86
|
+
return wrapCell(detail, detailWidth).map((line) => `│ ${(indent + line).padEnd(contentWidth)} │`);
|
|
87
|
+
}
|
|
88
|
+
export function formatWriteResults(results, options = {}, embedded = false) {
|
|
89
|
+
const section = (status) => {
|
|
90
|
+
const matching = results.filter((result) => result.status === status);
|
|
91
|
+
if (matching.length === 0)
|
|
92
|
+
return "";
|
|
93
|
+
const tone = status === "Succeeded" ? "green" : "red";
|
|
94
|
+
const heading = status === "Succeeded" ? "CREATED" : "FAILED";
|
|
95
|
+
return [
|
|
96
|
+
...(embedded ? [] : [paint(`${heading} (${matching.length})`, tone, options)]),
|
|
97
|
+
...formatTable(["DATE", "ISSUE", "TIME", "RESULT"], matching.map((result) => [
|
|
98
|
+
result.date,
|
|
99
|
+
result.jiraKey,
|
|
100
|
+
formatHours(result.hours),
|
|
101
|
+
result.detail,
|
|
102
|
+
]), options),
|
|
103
|
+
"",
|
|
104
|
+
].join("\n");
|
|
105
|
+
};
|
|
106
|
+
return {
|
|
107
|
+
stdout: section("Succeeded"),
|
|
108
|
+
stderr: section("Failed"),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=presentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.js","sourceRoot":"","sources":["../../../../../packages/capabilities/jira/src/presentation.ts"],"names":[],"mappings":"AAOA,MAAM,IAAI,GAAyB;IACjC,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,YAAY;IACpB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;CACnB,CAAC;AAEF,MAAM,KAAK,GAAG,WAAW,CAAC;AAE1B,MAAM,UAAU,cAAc,CAAC,KAA0B,EAAE,GAAsB;IAC/E,OAAO,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,IAAU,EAAE,UAA+B,EAAE;IAC/E,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO,SAAS,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAC/C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAA0B,EAC1B,IAAoC,EACpC,UAAsD,EAAE;IAExD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAC5C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CACxE,CAAC;IACF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,aAAa,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,UAAU,GAAG,WAAW,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAC5B,OAAO,CAAC,WAAW,CAAE,CAAC,MAAM,EAC5B,EAAE,EACF,OAAO,CAAC,aAAa,GAAG,UAAU,GAAG,UAAU,CAChD,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,GAAsB,EAAE,EAAE,CAC3C,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QACvB,IAAI,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,WAAW,CAAE,CAAC,CAAC;QACvE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACjC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CACjC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACxD,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,GAAG,KAAK,GAAG,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,IAAY,EACZ,EAAU,EACV,UAAkB,EAClB,KAAa,EACb,UAA+B,EAAE;IAEjC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO;QACL,KAAK,CAAC,iBAAiB,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC;QAChD,GAAG,IAAI,MAAM,EAAE,MAAM,UAAU,IAAI,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE;QACnG,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AA0BD,MAAM,UAAU,0BAA0B,CACxC,UAA+C;IAE/C,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,CAAC,MAA4B,EAAE,EAAE,CAC5C,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;QACnC,GAAG,KAAK,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE;QACnC,SAAS,CAAC,IAAI;QACd,SAAS,CAAC,OAAO;QACjB,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC;QAC5B,MAAM;KACP,CAAC,CAAC;IACL,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EACrC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CACrC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;IACpE,OAAO;QACL,SAAS,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG;QAC9C,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;QAC3B,SAAS,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG;QAC9C,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QACzC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QACvC,YAAY,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG;QACjD,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAAc,EACd,YAAoB;IAEpB,MAAM,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9D,OAAO,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAChD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAC9C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAsC,EACtC,UAA+B,EAAE,EACjC,QAAQ,GAAG,KAAK;IAEhB,MAAM,OAAO,GAAG,CAAC,MAAoC,EAAE,EAAE;QACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACtE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,GAAS,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5D,MAAM,OAAO,GAAG,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC9D,OAAO;YACL,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,KAAK,QAAQ,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9E,GAAG,WAAW,CACZ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EACnC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI;gBACX,MAAM,CAAC,OAAO;gBACd,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;gBACzB,MAAM,CAAC,MAAM;aACd,CAAC,EACF,OAAO,CACR;YACD,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC;IACF,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC;QAC5B,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../../../packages/cli/src/bin.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,CAAC,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Command } from "commander";
|
|
2
|
+
import { type BrowserInstallDependencies, type BrowserInstallIO } from "./browsers.service.js";
|
|
3
|
+
export interface BrowsersCommandDependencies {
|
|
4
|
+
install(): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export declare function createBrowsersCommandDependencies(io: BrowserInstallIO, browserDependencies?: BrowserInstallDependencies): BrowsersCommandDependencies;
|
|
7
|
+
export declare function registerBrowsersCommand(program: Command, dependencies: BrowsersCommandDependencies): void;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CommanderError } from "commander";
|
|
2
|
+
import { defaultBrowserInstallDependencies, runBrowserInstall, } from "./browsers.service.js";
|
|
3
|
+
export function createBrowsersCommandDependencies(io, browserDependencies = defaultBrowserInstallDependencies()) {
|
|
4
|
+
return {
|
|
5
|
+
install: () => runBrowserInstall(io, browserDependencies),
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function registerBrowsersCommand(program, dependencies) {
|
|
9
|
+
const browsers = program.command("browsers")
|
|
10
|
+
.description("manage workctl browser dependencies");
|
|
11
|
+
browsers.command("install")
|
|
12
|
+
.description("install Playwright Chromium for workctl")
|
|
13
|
+
.action(async () => {
|
|
14
|
+
try {
|
|
15
|
+
await dependencies.install();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
throw new CommanderError(1, "browsers.install.failed", error instanceof Error ? error.message : "Browser installation failed.");
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=browsers.command.js.map
|