github-issue-tower-defence-management 1.96.0 → 1.97.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.
- package/CHANGELOG.md +14 -0
- package/README.md +11 -0
- package/bin/adapter/entry-points/console/ui-dist/assets/{index-CO3Vvzqr.css → index-CdQeHptu.css} +1 -1
- package/bin/adapter/entry-points/console/ui-dist/index.html +2 -2
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +18 -2
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
- package/bin/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.js +19 -0
- package/bin/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.js.map +1 -0
- package/bin/adapter/repositories/NodeTmuxSessionRepository.js +44 -0
- package/bin/adapter/repositories/NodeTmuxSessionRepository.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/TmuxSessionRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/TmuxSessionRepository.js.map +1 -0
- package/bin/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.js +41 -0
- package/bin/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.js.map +1 -0
- package/package.json +1 -1
- package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStoryActions.stories.tsx +63 -0
- package/src/adapter/entry-points/console/ui/src/index.css +5 -0
- package/src/adapter/entry-points/console/ui-dist/assets/{index-CO3Vvzqr.css → index-CdQeHptu.css} +1 -1
- package/src/adapter/entry-points/console/ui-dist/index.html +2 -2
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +17 -0
- package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.test.ts +123 -0
- package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.ts +29 -0
- package/src/adapter/repositories/NodeTmuxSessionRepository.test.ts +100 -0
- package/src/adapter/repositories/NodeTmuxSessionRepository.ts +53 -0
- package/src/domain/usecases/adapter-interfaces/TmuxSessionRepository.ts +9 -0
- package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.test.ts +186 -0
- package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.ts +75 -0
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
- package/types/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.d.ts +10 -0
- package/types/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.d.ts.map +1 -0
- package/types/adapter/repositories/NodeTmuxSessionRepository.d.ts +10 -0
- package/types/adapter/repositories/NodeTmuxSessionRepository.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/TmuxSessionRepository.d.ts +6 -0
- package/types/domain/usecases/adapter-interfaces/TmuxSessionRepository.d.ts.map +1 -0
- package/types/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.d.ts +19 -0
- package/types/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.d.ts.map +1 -0
- /package/bin/adapter/entry-points/console/ui-dist/assets/{index-B3F4E8LD.js → index-rqxspBmD.js} +0 -0
- /package/src/adapter/entry-points/console/ui-dist/assets/{index-B3F4E8LD.js → index-rqxspBmD.js} +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Issue } from '../../entities/Issue';
|
|
2
|
+
import { IN_TMUX_STATUS_NAME } from '../../entities/WorkflowStatus';
|
|
3
|
+
import { TmuxSessionRepository } from '../adapter-interfaces/TmuxSessionRepository';
|
|
4
|
+
|
|
5
|
+
export type InTmuxByHumanSessionReconcileInput = {
|
|
6
|
+
issues: Issue[];
|
|
7
|
+
assigneeLogin: string;
|
|
8
|
+
launcherCommand: string;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export type InTmuxByHumanSessionReconcileResult = {
|
|
12
|
+
launchedIssueUrls: string[];
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const toTmuxSessionName = (issueUrl: string): string =>
|
|
16
|
+
issueUrl.replace(/[^a-zA-Z0-9]/g, '_');
|
|
17
|
+
|
|
18
|
+
export class InTmuxByHumanSessionReconcileUseCase {
|
|
19
|
+
constructor(private readonly tmuxSessionRepository: TmuxSessionRepository) {}
|
|
20
|
+
|
|
21
|
+
run = async (
|
|
22
|
+
input: InTmuxByHumanSessionReconcileInput,
|
|
23
|
+
): Promise<InTmuxByHumanSessionReconcileResult> => {
|
|
24
|
+
const { issues, assigneeLogin, launcherCommand } = input;
|
|
25
|
+
|
|
26
|
+
const targetIssues = issues.filter((issue) =>
|
|
27
|
+
this.isInTmuxByHuman(issue, assigneeLogin),
|
|
28
|
+
);
|
|
29
|
+
if (targetIssues.length === 0) {
|
|
30
|
+
return { launchedIssueUrls: [] };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const liveSessionNames = new Set(
|
|
34
|
+
await this.tmuxSessionRepository.listLiveSessionNames(),
|
|
35
|
+
);
|
|
36
|
+
const processCommandLines =
|
|
37
|
+
await this.tmuxSessionRepository.listInteractiveProcessCommandLines();
|
|
38
|
+
|
|
39
|
+
const launchedIssueUrls: string[] = [];
|
|
40
|
+
for (const issue of targetIssues) {
|
|
41
|
+
if (
|
|
42
|
+
this.hasLiveSession(issue.url, liveSessionNames, processCommandLines)
|
|
43
|
+
) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
await this.tmuxSessionRepository.launchDetachedSession(
|
|
47
|
+
toTmuxSessionName(issue.url),
|
|
48
|
+
launcherCommand,
|
|
49
|
+
issue.url,
|
|
50
|
+
);
|
|
51
|
+
launchedIssueUrls.push(issue.url);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return { launchedIssueUrls };
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
private isInTmuxByHuman = (issue: Issue, assigneeLogin: string): boolean =>
|
|
58
|
+
issue.status === IN_TMUX_STATUS_NAME &&
|
|
59
|
+
issue.isClosed === false &&
|
|
60
|
+
issue.assignees.includes(assigneeLogin);
|
|
61
|
+
|
|
62
|
+
private hasLiveSession = (
|
|
63
|
+
issueUrl: string,
|
|
64
|
+
liveSessionNames: Set<string>,
|
|
65
|
+
processCommandLines: string[],
|
|
66
|
+
): boolean => {
|
|
67
|
+
const sessionName = toTmuxSessionName(issueUrl);
|
|
68
|
+
if (!liveSessionNames.has(sessionName)) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return processCommandLines.some((commandLine) =>
|
|
72
|
+
commandLine.includes(issueUrl),
|
|
73
|
+
);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HandleScheduledEventUseCaseHandler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AA8B3D,qBAAa,kCAAkC;IAC7C,MAAM,GACJ,gBAAgB,MAAM,EACtB,UAAU,OAAO,KAChB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,eAAe,EAAE,IAAI,EAAE,CAAC;KACzB,GAAG,IAAI,CAAC,CA4WP;CACH"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Issue } from '../../../domain/entities/Issue';
|
|
2
|
+
import { LocalCommandRunner } from '../../../domain/usecases/adapter-interfaces/LocalCommandRunner';
|
|
3
|
+
export type ReconcileInTmuxByHumanSessionsParams = {
|
|
4
|
+
inTmuxLauncherCommand: string | null;
|
|
5
|
+
assigneeLogin: string;
|
|
6
|
+
issues: Issue[];
|
|
7
|
+
localCommandRunner: LocalCommandRunner;
|
|
8
|
+
};
|
|
9
|
+
export declare const reconcileInTmuxByHumanSessions: (params: ReconcileInTmuxByHumanSessionsParams) => Promise<void>;
|
|
10
|
+
//# sourceMappingURL=inTmuxByHumanSessionReconciler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inTmuxByHumanSessionReconciler.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gEAAgE,CAAC;AAIpG,MAAM,MAAM,oCAAoC,GAAG;IACjD,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,kBAAkB,EAAE,kBAAkB,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,QAAQ,oCAAoC,KAC3C,OAAO,CAAC,IAAI,CAcd,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LocalCommandRunner } from '../../domain/usecases/adapter-interfaces/LocalCommandRunner';
|
|
2
|
+
import { TmuxSessionRepository } from '../../domain/usecases/adapter-interfaces/TmuxSessionRepository';
|
|
3
|
+
export declare class NodeTmuxSessionRepository implements TmuxSessionRepository {
|
|
4
|
+
private readonly localCommandRunner;
|
|
5
|
+
constructor(localCommandRunner: LocalCommandRunner);
|
|
6
|
+
listLiveSessionNames: () => Promise<string[]>;
|
|
7
|
+
listInteractiveProcessCommandLines: () => Promise<string[]>;
|
|
8
|
+
launchDetachedSession: (sessionName: string, launcherCommand: string, issueUrl: string) => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=NodeTmuxSessionRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeTmuxSessionRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/NodeTmuxSessionRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,gEAAgE,CAAC;AAEvG,qBAAa,yBAA0B,YAAW,qBAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAAlB,kBAAkB,EAAE,kBAAkB;IAEnE,oBAAoB,QAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAYhD;IAEF,kCAAkC,QAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAY9D;IAEF,qBAAqB,GACnB,aAAa,MAAM,EACnB,iBAAiB,MAAM,EACvB,UAAU,MAAM,KACf,OAAO,CAAC,IAAI,CAAC,CAad;CACH"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export interface TmuxSessionRepository {
|
|
2
|
+
listLiveSessionNames: () => Promise<string[]>;
|
|
3
|
+
listInteractiveProcessCommandLines: () => Promise<string[]>;
|
|
4
|
+
launchDetachedSession: (sessionName: string, launcherCommand: string, issueUrl: string) => Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=TmuxSessionRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TmuxSessionRepository.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/TmuxSessionRepository.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,oBAAoB,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,kCAAkC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,qBAAqB,EAAE,CACrB,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Issue } from '../../entities/Issue';
|
|
2
|
+
import { TmuxSessionRepository } from '../adapter-interfaces/TmuxSessionRepository';
|
|
3
|
+
export type InTmuxByHumanSessionReconcileInput = {
|
|
4
|
+
issues: Issue[];
|
|
5
|
+
assigneeLogin: string;
|
|
6
|
+
launcherCommand: string;
|
|
7
|
+
};
|
|
8
|
+
export type InTmuxByHumanSessionReconcileResult = {
|
|
9
|
+
launchedIssueUrls: string[];
|
|
10
|
+
};
|
|
11
|
+
export declare const toTmuxSessionName: (issueUrl: string) => string;
|
|
12
|
+
export declare class InTmuxByHumanSessionReconcileUseCase {
|
|
13
|
+
private readonly tmuxSessionRepository;
|
|
14
|
+
constructor(tmuxSessionRepository: TmuxSessionRepository);
|
|
15
|
+
run: (input: InTmuxByHumanSessionReconcileInput) => Promise<InTmuxByHumanSessionReconcileResult>;
|
|
16
|
+
private isInTmuxByHuman;
|
|
17
|
+
private hasLiveSession;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=InTmuxByHumanSessionReconcileUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InTmuxByHumanSessionReconcileUseCase.d.ts","sourceRoot":"","sources":["../../../../src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AAEpF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,KAAG,MACb,CAAC;AAEzC,qBAAa,oCAAoC;IACnC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAArB,qBAAqB,EAAE,qBAAqB;IAEzE,GAAG,GACD,OAAO,kCAAkC,KACxC,OAAO,CAAC,mCAAmC,CAAC,CAgC7C;IAEF,OAAO,CAAC,eAAe,CAGmB;IAE1C,OAAO,CAAC,cAAc,CAYpB;CACH"}
|
/package/bin/adapter/entry-points/console/ui-dist/assets/{index-B3F4E8LD.js → index-rqxspBmD.js}
RENAMED
|
File without changes
|
/package/src/adapter/entry-points/console/ui-dist/assets/{index-B3F4E8LD.js → index-rqxspBmD.js}
RENAMED
|
File without changes
|