@ipul-labs/forge 1.16.7 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -21
- package/lib/bin/cli/analyze.d.ts +9 -0
- package/lib/bin/cli/analyze.d.ts.map +1 -0
- package/lib/bin/cli/analyze.js +491 -0
- package/lib/bin/cli/analyze.js.map +1 -0
- package/lib/bin/cli/apply.d.ts +2 -0
- package/lib/bin/cli/apply.d.ts.map +1 -0
- package/lib/bin/cli/apply.js +262 -0
- package/lib/bin/cli/apply.js.map +1 -0
- package/lib/bin/cli/cifix.d.ts +2 -0
- package/lib/bin/cli/cifix.d.ts.map +1 -0
- package/lib/bin/cli/cifix.js +310 -0
- package/lib/bin/cli/cifix.js.map +1 -0
- package/lib/bin/cli/close.d.ts +2 -0
- package/lib/bin/cli/close.d.ts.map +1 -0
- package/lib/bin/cli/close.js +113 -0
- package/lib/bin/cli/close.js.map +1 -0
- package/lib/bin/cli/createIssue.d.ts +2 -0
- package/lib/bin/cli/createIssue.d.ts.map +1 -0
- package/lib/bin/cli/createIssue.js +108 -0
- package/lib/bin/cli/createIssue.js.map +1 -0
- package/lib/bin/cli/doctor.d.ts +2 -0
- package/lib/bin/cli/doctor.d.ts.map +1 -0
- package/lib/bin/cli/doctor.js +145 -0
- package/lib/bin/cli/doctor.js.map +1 -0
- package/lib/bin/cli/init.d.ts +4 -0
- package/lib/bin/cli/init.d.ts.map +1 -0
- package/lib/bin/cli/init.js +288 -0
- package/lib/bin/cli/init.js.map +1 -0
- package/lib/bin/cli/ink.d.ts +23 -0
- package/lib/bin/cli/ink.d.ts.map +1 -0
- package/{bin → lib/bin}/cli/ink.js +18 -19
- package/lib/bin/cli/ink.js.map +1 -0
- package/lib/bin/cli/issue.d.ts +2 -0
- package/lib/bin/cli/issue.d.ts.map +1 -0
- package/lib/bin/cli/issue.js +114 -0
- package/lib/bin/cli/issue.js.map +1 -0
- package/lib/bin/cli/issues.d.ts +2 -0
- package/lib/bin/cli/issues.d.ts.map +1 -0
- package/lib/bin/cli/issues.js +149 -0
- package/lib/bin/cli/issues.js.map +1 -0
- package/lib/bin/cli/merge.d.ts +2 -0
- package/lib/bin/cli/merge.d.ts.map +1 -0
- package/lib/bin/cli/merge.js +162 -0
- package/lib/bin/cli/merge.js.map +1 -0
- package/lib/bin/cli/refine.d.ts +2 -0
- package/lib/bin/cli/refine.d.ts.map +1 -0
- package/lib/bin/cli/refine.js +249 -0
- package/lib/bin/cli/refine.js.map +1 -0
- package/lib/bin/cli/repl.d.ts +2 -0
- package/lib/bin/cli/repl.d.ts.map +1 -0
- package/lib/bin/cli/repl.js +309 -0
- package/lib/bin/cli/repl.js.map +1 -0
- package/lib/bin/cli/repos.d.ts +2 -0
- package/lib/bin/cli/repos.d.ts.map +1 -0
- package/lib/bin/cli/repos.js +86 -0
- package/lib/bin/cli/repos.js.map +1 -0
- package/lib/bin/cli/resolution.d.ts +2 -0
- package/lib/bin/cli/resolution.d.ts.map +1 -0
- package/lib/bin/cli/resolution.js +139 -0
- package/lib/bin/cli/resolution.js.map +1 -0
- package/lib/bin/cli/serverClient.d.ts +26 -0
- package/lib/bin/cli/serverClient.d.ts.map +1 -0
- package/lib/bin/cli/serverClient.js +111 -0
- package/lib/bin/cli/serverClient.js.map +1 -0
- package/lib/bin/cli/session.d.ts +8 -0
- package/lib/bin/cli/session.d.ts.map +1 -0
- package/lib/bin/cli/session.js +212 -0
- package/lib/bin/cli/session.js.map +1 -0
- package/lib/bin/cli/sessionStore.d.ts +69 -0
- package/lib/bin/cli/sessionStore.d.ts.map +1 -0
- package/lib/bin/cli/sessionStore.js +196 -0
- package/lib/bin/cli/sessionStore.js.map +1 -0
- package/lib/bin/cli/ship.d.ts +33 -0
- package/lib/bin/cli/ship.d.ts.map +1 -0
- package/lib/bin/cli/ship.js +737 -0
- package/lib/bin/cli/ship.js.map +1 -0
- package/lib/bin/cli/types.d.ts +59 -0
- package/lib/bin/cli/types.d.ts.map +1 -0
- package/lib/bin/cli/types.js +2 -0
- package/lib/bin/cli/types.js.map +1 -0
- package/lib/bin/cli/update.d.ts +2 -0
- package/lib/bin/cli/update.d.ts.map +1 -0
- package/lib/bin/cli/update.js +87 -0
- package/lib/bin/cli/update.js.map +1 -0
- package/lib/bin/cli/utils.d.ts +43 -0
- package/lib/bin/cli/utils.d.ts.map +1 -0
- package/lib/bin/cli/utils.js +171 -0
- package/lib/bin/cli/utils.js.map +1 -0
- package/lib/bin/cli/validate.d.ts +2 -0
- package/lib/bin/cli/validate.d.ts.map +1 -0
- package/lib/bin/cli/validate.js +283 -0
- package/lib/bin/cli/validate.js.map +1 -0
- package/lib/bin/cli/watch.d.ts +5 -0
- package/lib/bin/cli/watch.d.ts.map +1 -0
- package/lib/bin/cli/watch.js +263 -0
- package/lib/bin/cli/watch.js.map +1 -0
- package/lib/bin/forge-agent.d.ts +3 -0
- package/lib/bin/forge-agent.d.ts.map +1 -0
- package/{bin → lib/bin}/forge-agent.js +104 -105
- package/lib/bin/forge-agent.js.map +1 -0
- package/lib/server/forge/core/ForgeAgent.d.ts +260 -0
- package/lib/server/forge/core/ForgeAgent.d.ts.map +1 -0
- package/lib/server/forge/core/ForgeAgent.js +995 -0
- package/lib/server/forge/core/ForgeAgent.js.map +1 -0
- package/lib/server/forge/core/agentClient.d.ts +39 -0
- package/lib/server/forge/core/agentClient.d.ts.map +1 -0
- package/{server → lib/server}/forge/core/agentClient.js +7 -12
- package/lib/server/forge/core/agentClient.js.map +1 -0
- package/lib/server/forge/core/branchName.d.ts +20 -0
- package/lib/server/forge/core/branchName.d.ts.map +1 -0
- package/lib/server/forge/core/branchName.js +39 -0
- package/lib/server/forge/core/branchName.js.map +1 -0
- package/lib/server/forge/core/claudeClient.d.ts +60 -0
- package/lib/server/forge/core/claudeClient.d.ts.map +1 -0
- package/lib/server/forge/core/claudeClient.js +347 -0
- package/lib/server/forge/core/claudeClient.js.map +1 -0
- package/lib/server/forge/core/configStore.d.ts +76 -0
- package/lib/server/forge/core/configStore.d.ts.map +1 -0
- package/lib/server/forge/core/configStore.js +213 -0
- package/lib/server/forge/core/configStore.js.map +1 -0
- package/lib/server/forge/core/gitlabClient.d.ts +144 -0
- package/lib/server/forge/core/gitlabClient.d.ts.map +1 -0
- package/{server → lib/server}/forge/core/gitlabClient.js +98 -180
- package/lib/server/forge/core/gitlabClient.js.map +1 -0
- package/lib/server/forge/core/jobs.d.ts +67 -0
- package/lib/server/forge/core/jobs.d.ts.map +1 -0
- package/lib/server/forge/core/jobs.js +185 -0
- package/lib/server/forge/core/jobs.js.map +1 -0
- package/lib/server/forge/core/k8s.d.ts +18 -0
- package/lib/server/forge/core/k8s.d.ts.map +1 -0
- package/lib/server/forge/core/k8s.js +49 -0
- package/lib/server/forge/core/k8s.js.map +1 -0
- package/lib/server/forge/core/localRepo.d.ts +36 -0
- package/lib/server/forge/core/localRepo.d.ts.map +1 -0
- package/lib/server/forge/core/localRepo.js +165 -0
- package/lib/server/forge/core/localRepo.js.map +1 -0
- package/lib/server/forge/core/openclawClient.d.ts +61 -0
- package/lib/server/forge/core/openclawClient.d.ts.map +1 -0
- package/lib/server/forge/core/openclawClient.js +111 -0
- package/lib/server/forge/core/openclawClient.js.map +1 -0
- package/lib/server/forge/core/prompts.d.ts +96 -0
- package/lib/server/forge/core/prompts.d.ts.map +1 -0
- package/lib/server/forge/core/prompts.js +450 -0
- package/lib/server/forge/core/prompts.js.map +1 -0
- package/lib/server/forge/core/providers/azuredevops.d.ts +134 -0
- package/lib/server/forge/core/providers/azuredevops.d.ts.map +1 -0
- package/lib/server/forge/core/providers/azuredevops.js +360 -0
- package/lib/server/forge/core/providers/azuredevops.js.map +1 -0
- package/lib/server/forge/core/providers/base.d.ts +114 -0
- package/lib/server/forge/core/providers/base.d.ts.map +1 -0
- package/lib/server/forge/core/providers/base.js +98 -0
- package/lib/server/forge/core/providers/base.js.map +1 -0
- package/lib/server/forge/core/providers/github.d.ts +133 -0
- package/lib/server/forge/core/providers/github.d.ts.map +1 -0
- package/lib/server/forge/core/providers/github.js +307 -0
- package/lib/server/forge/core/providers/github.js.map +1 -0
- package/lib/server/forge/core/providers/gitlab.d.ts +144 -0
- package/lib/server/forge/core/providers/gitlab.d.ts.map +1 -0
- package/lib/server/forge/core/providers/gitlab.js +407 -0
- package/lib/server/forge/core/providers/gitlab.js.map +1 -0
- package/lib/server/forge/core/providers/index.d.ts +21 -0
- package/lib/server/forge/core/providers/index.d.ts.map +1 -0
- package/lib/server/forge/core/providers/index.js +43 -0
- package/lib/server/forge/core/providers/index.js.map +1 -0
- package/lib/server/forge/core/providers/types.d.ts +80 -0
- package/lib/server/forge/core/providers/types.d.ts.map +1 -0
- package/lib/server/forge/core/providers/types.js +2 -0
- package/lib/server/forge/core/providers/types.js.map +1 -0
- package/lib/server/forge/core/quotaClient.d.ts +48 -0
- package/lib/server/forge/core/quotaClient.d.ts.map +1 -0
- package/lib/server/forge/core/quotaClient.js +88 -0
- package/lib/server/forge/core/quotaClient.js.map +1 -0
- package/lib/server/forge/core/types.d.ts +160 -0
- package/lib/server/forge/core/types.d.ts.map +1 -0
- package/lib/server/forge/core/types.js +2 -0
- package/lib/server/forge/core/types.js.map +1 -0
- package/lib/server/forge/core/validator/attribute.d.ts +31 -0
- package/lib/server/forge/core/validator/attribute.d.ts.map +1 -0
- package/lib/server/forge/core/validator/attribute.js +82 -0
- package/lib/server/forge/core/validator/attribute.js.map +1 -0
- package/lib/server/forge/core/validator/clone.d.ts +14 -0
- package/lib/server/forge/core/validator/clone.d.ts.map +1 -0
- package/lib/server/forge/core/validator/clone.js +99 -0
- package/lib/server/forge/core/validator/clone.js.map +1 -0
- package/lib/server/forge/core/validator/cmd.d.ts +23 -0
- package/lib/server/forge/core/validator/cmd.d.ts.map +1 -0
- package/lib/server/forge/core/validator/cmd.js +87 -0
- package/lib/server/forge/core/validator/cmd.js.map +1 -0
- package/lib/server/forge/core/validator/fs.d.ts +5 -0
- package/lib/server/forge/core/validator/fs.d.ts.map +1 -0
- package/{server → lib/server}/forge/core/validator/fs.js +8 -3
- package/lib/server/forge/core/validator/fs.js.map +1 -0
- package/lib/server/forge/core/validator/overlay.d.ts +13 -0
- package/lib/server/forge/core/validator/overlay.d.ts.map +1 -0
- package/lib/server/forge/core/validator/overlay.js +53 -0
- package/lib/server/forge/core/validator/overlay.js.map +1 -0
- package/lib/server/forge/core/validator/projectType.d.ts +20 -0
- package/lib/server/forge/core/validator/projectType.d.ts.map +1 -0
- package/lib/server/forge/core/validator/projectType.js +94 -0
- package/lib/server/forge/core/validator/projectType.js.map +1 -0
- package/lib/server/forge/core/validator/runners/go.d.ts +21 -0
- package/lib/server/forge/core/validator/runners/go.d.ts.map +1 -0
- package/lib/server/forge/core/validator/runners/go.js +99 -0
- package/lib/server/forge/core/validator/runners/go.js.map +1 -0
- package/lib/server/forge/core/validator/runners/node.d.ts +12 -0
- package/lib/server/forge/core/validator/runners/node.d.ts.map +1 -0
- package/lib/server/forge/core/validator/runners/node.js +75 -0
- package/lib/server/forge/core/validator/runners/node.js.map +1 -0
- package/lib/server/forge/core/validator/tdd.d.ts +30 -0
- package/lib/server/forge/core/validator/tdd.d.ts.map +1 -0
- package/lib/server/forge/core/validator/tdd.js +96 -0
- package/lib/server/forge/core/validator/tdd.js.map +1 -0
- package/lib/server/forge/core/validator.d.ts +58 -0
- package/lib/server/forge/core/validator.d.ts.map +1 -0
- package/lib/server/forge/core/validator.js +150 -0
- package/lib/server/forge/core/validator.js.map +1 -0
- package/lib/server/forge/routes.d.ts +22 -0
- package/lib/server/forge/routes.d.ts.map +1 -0
- package/lib/server/forge/routes.js +984 -0
- package/lib/server/forge/routes.js.map +1 -0
- package/lib/server.d.ts +2 -0
- package/lib/server.d.ts.map +1 -0
- package/lib/server.js +52 -0
- package/lib/server.js.map +1 -0
- package/lib/shared/events.d.ts +12 -0
- package/lib/shared/events.d.ts.map +1 -0
- package/lib/shared/events.js +12 -0
- package/lib/shared/events.js.map +1 -0
- package/package.json +17 -13
- package/scripts/fix-shebang.cjs +10 -0
- package/bin/cli/analyze.js +0 -516
- package/bin/cli/apply.js +0 -264
- package/bin/cli/cifix.js +0 -300
- package/bin/cli/close.js +0 -125
- package/bin/cli/createIssue.js +0 -112
- package/bin/cli/doctor.js +0 -161
- package/bin/cli/init.js +0 -306
- package/bin/cli/issue.js +0 -116
- package/bin/cli/issues.js +0 -155
- package/bin/cli/merge.js +0 -175
- package/bin/cli/refine.js +0 -253
- package/bin/cli/repl.js +0 -301
- package/bin/cli/repos.js +0 -91
- package/bin/cli/resolution.js +0 -126
- package/bin/cli/session.js +0 -230
- package/bin/cli/sessionStore.js +0 -211
- package/bin/cli/ship.js +0 -762
- package/bin/cli/update.js +0 -95
- package/bin/cli/utils.js +0 -145
- package/bin/cli/validate.js +0 -280
- package/bin/cli/watch.js +0 -274
- package/server/forge/core/ForgeAgent.js +0 -1179
- package/server/forge/core/ForgeAgent.test.js +0 -179
- package/server/forge/core/branchName.js +0 -41
- package/server/forge/core/claudeClient.js +0 -378
- package/server/forge/core/configStore.js +0 -229
- package/server/forge/core/configStore.test.js +0 -89
- package/server/forge/core/jobs.js +0 -180
- package/server/forge/core/k8s.js +0 -54
- package/server/forge/core/localRepo.js +0 -153
- package/server/forge/core/openclawClient.js +0 -125
- package/server/forge/core/prompts.js +0 -483
- package/server/forge/core/prompts.test.js +0 -219
- package/server/forge/core/providers/azuredevops.js +0 -409
- package/server/forge/core/providers/base.js +0 -208
- package/server/forge/core/providers/github.js +0 -348
- package/server/forge/core/providers/gitlab.js +0 -529
- package/server/forge/core/providers/index.js +0 -47
- package/server/forge/core/quotaClient.js +0 -101
- package/server/forge/core/validator/attribute.js +0 -84
- package/server/forge/core/validator/clone.js +0 -105
- package/server/forge/core/validator/cmd.js +0 -98
- package/server/forge/core/validator/overlay.js +0 -52
- package/server/forge/core/validator/projectType.js +0 -87
- package/server/forge/core/validator/runners/go.js +0 -107
- package/server/forge/core/validator/runners/node.js +0 -84
- package/server/forge/core/validator/tdd.js +0 -105
- package/server/forge/core/validator.js +0 -167
- package/server/forge/routes.js +0 -1026
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* server/forge/core/validator.ts
|
|
3
|
+
*
|
|
4
|
+
* Pre-flight runner. Auto-attributes each proposed change to the repo whose
|
|
5
|
+
* working tree actually contains that file, then runs the right toolchain
|
|
6
|
+
* (Node npm scripts vs Go go-tool commands) on each repo with at least one
|
|
7
|
+
* attributed change.
|
|
8
|
+
*
|
|
9
|
+
* Composition:
|
|
10
|
+
*
|
|
11
|
+
* validator/cmd.js — child-process + step-event helpers
|
|
12
|
+
* validator/clone.js — cache + git clone management
|
|
13
|
+
* validator/attribute.js — file-existence-based repo auto-detection
|
|
14
|
+
* validator/overlay.js — overlay changes + readback after format
|
|
15
|
+
* validator/projectType.js — per-repo type resolution (config + auto-detect)
|
|
16
|
+
* validator/runners/node.js — npm ci + format/lint/typecheck/test
|
|
17
|
+
* validator/runners/go.js — go mod + go fmt/vet/build/test
|
|
18
|
+
*
|
|
19
|
+
* Scope (v1):
|
|
20
|
+
* - Validates only repos that actually own at least one change (1, both, or
|
|
21
|
+
* none — never a phantom block from a misrouted attribution).
|
|
22
|
+
* - GitLab HTTPS clone using GITLAB_TOKEN. GitHub / Azure DevOps raise a
|
|
23
|
+
* clear "not supported yet" error.
|
|
24
|
+
* - Step names per runner: format/lint/typecheck/test (Node) or
|
|
25
|
+
* fmt/vet/build/test (Go). Missing scripts (Node) are silently skipped.
|
|
26
|
+
*/
|
|
27
|
+
import type { ForgeChange, ForgeEvent } from "./types.ts";
|
|
28
|
+
import type { StepResult } from "./validator/cmd.ts";
|
|
29
|
+
interface AnalysisInput {
|
|
30
|
+
changes: ForgeChange[];
|
|
31
|
+
repos?: string[];
|
|
32
|
+
issue?: {
|
|
33
|
+
iid: number;
|
|
34
|
+
title?: string;
|
|
35
|
+
};
|
|
36
|
+
mrTitle?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @param {{ changes: Array<{repo?: string, file: string, action: string, proposed: string}>, repos?: string[], issue?: { iid: number } }} analysis
|
|
40
|
+
* @param {(event: object) => void} onEvent
|
|
41
|
+
*/
|
|
42
|
+
export declare function validate(analysis: AnalysisInput, onEvent?: (event: ForgeEvent) => void): Promise<{
|
|
43
|
+
repo: string;
|
|
44
|
+
branchName: string;
|
|
45
|
+
results: Record<string, StepResult> | {
|
|
46
|
+
[k: string]: Record<string, StepResult>;
|
|
47
|
+
};
|
|
48
|
+
allPassed: boolean;
|
|
49
|
+
perRepo: {
|
|
50
|
+
repo: string;
|
|
51
|
+
branchName: string;
|
|
52
|
+
projectType: string;
|
|
53
|
+
results: Record<string, StepResult>;
|
|
54
|
+
allPassed: boolean;
|
|
55
|
+
}[];
|
|
56
|
+
}>;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../../server/forge/core/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAmBrD,UAAU,aAAa;IACtB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAsDD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI;;;;;;;;;;;;;;GAqE5F"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* server/forge/core/validator.ts
|
|
3
|
+
*
|
|
4
|
+
* Pre-flight runner. Auto-attributes each proposed change to the repo whose
|
|
5
|
+
* working tree actually contains that file, then runs the right toolchain
|
|
6
|
+
* (Node npm scripts vs Go go-tool commands) on each repo with at least one
|
|
7
|
+
* attributed change.
|
|
8
|
+
*
|
|
9
|
+
* Composition:
|
|
10
|
+
*
|
|
11
|
+
* validator/cmd.js — child-process + step-event helpers
|
|
12
|
+
* validator/clone.js — cache + git clone management
|
|
13
|
+
* validator/attribute.js — file-existence-based repo auto-detection
|
|
14
|
+
* validator/overlay.js — overlay changes + readback after format
|
|
15
|
+
* validator/projectType.js — per-repo type resolution (config + auto-detect)
|
|
16
|
+
* validator/runners/node.js — npm ci + format/lint/typecheck/test
|
|
17
|
+
* validator/runners/go.js — go mod + go fmt/vet/build/test
|
|
18
|
+
*
|
|
19
|
+
* Scope (v1):
|
|
20
|
+
* - Validates only repos that actually own at least one change (1, both, or
|
|
21
|
+
* none — never a phantom block from a misrouted attribution).
|
|
22
|
+
* - GitLab HTTPS clone using GITLAB_TOKEN. GitHub / Azure DevOps raise a
|
|
23
|
+
* clear "not supported yet" error.
|
|
24
|
+
* - Step names per runner: format/lint/typecheck/test (Node) or
|
|
25
|
+
* fmt/vet/build/test (Go). Missing scripts (Node) are silently skipped.
|
|
26
|
+
*/
|
|
27
|
+
import { branchNameFor } from "./branchName.js";
|
|
28
|
+
import * as configStore from "./configStore.js";
|
|
29
|
+
import { attributeChanges } from "./validator/attribute.js";
|
|
30
|
+
import { ensureClone } from "./validator/clone.js";
|
|
31
|
+
import { overlayChanges } from "./validator/overlay.js";
|
|
32
|
+
import { resolveProjectType } from "./validator/projectType.js";
|
|
33
|
+
import * as goRunner from "./validator/runners/go.js";
|
|
34
|
+
import * as nodeRunner from "./validator/runners/node.js";
|
|
35
|
+
const RUNNERS = {
|
|
36
|
+
go: { run: goRunner.runGoRepo, stepOrder: goRunner.STEP_ORDER, fixableSteps: goRunner.FIXABLE_STEPS },
|
|
37
|
+
node: { run: nodeRunner.runNodeRepo, stepOrder: nodeRunner.STEP_ORDER, fixableSteps: nodeRunner.FIXABLE_STEPS },
|
|
38
|
+
};
|
|
39
|
+
async function validateRepo(repo, changes, branchName, emit) {
|
|
40
|
+
// Stamp every downstream event with the current repo so the frontend can
|
|
41
|
+
// route progress/log/step_result rows into the right per-repo block.
|
|
42
|
+
const repoEmit = (e) => emit({ ...e, repo });
|
|
43
|
+
const fileList = changes.map((c) => c.file).join(", ");
|
|
44
|
+
repoEmit({
|
|
45
|
+
type: "log",
|
|
46
|
+
message: `Validating ${changes.length} change(s) for ${repo} on ${branchName} — ${fileList}`,
|
|
47
|
+
});
|
|
48
|
+
// Idempotent — the candidate-clone phase already populated the cache, so
|
|
49
|
+
// this is essentially a fetch/reset that completes quickly and gives the
|
|
50
|
+
// UI its `clone` step events.
|
|
51
|
+
const dir = await ensureClone(repo, branchName, repoEmit);
|
|
52
|
+
const projectType = await resolveProjectType(repo, dir, changes);
|
|
53
|
+
const runner = RUNNERS[projectType] ?? RUNNERS.node;
|
|
54
|
+
// Send the runner's step contract up front so the UI can render rows in
|
|
55
|
+
// the runner's natural order (e.g. fmt/vet/build/test for Go) and gate
|
|
56
|
+
// the "Fix with AI" button on the right step keys.
|
|
57
|
+
repoEmit({
|
|
58
|
+
type: "repo_started",
|
|
59
|
+
projectType,
|
|
60
|
+
stepOrder: runner.stepOrder,
|
|
61
|
+
fixableSteps: runner.fixableSteps,
|
|
62
|
+
});
|
|
63
|
+
await overlayChanges(dir, changes, repoEmit);
|
|
64
|
+
const results = await runner.run(dir, changes, repoEmit);
|
|
65
|
+
const allPassed = Object.values(results).every((r) => r.passed);
|
|
66
|
+
repoEmit({
|
|
67
|
+
type: "repo_result",
|
|
68
|
+
projectType,
|
|
69
|
+
allPassed,
|
|
70
|
+
checkedAt: new Date().toISOString(),
|
|
71
|
+
});
|
|
72
|
+
return { repo, branchName, projectType, results, allPassed };
|
|
73
|
+
}
|
|
74
|
+
function resolveCandidates(analysis) {
|
|
75
|
+
const fromAnalysis = analysis.repos ?? [];
|
|
76
|
+
if (fromAnalysis.length)
|
|
77
|
+
return fromAnalysis;
|
|
78
|
+
const fromChange = analysis.changes?.[0]?.repo;
|
|
79
|
+
if (fromChange)
|
|
80
|
+
return [fromChange];
|
|
81
|
+
const primary = configStore.getPrimaryProject();
|
|
82
|
+
return primary ? [primary] : [];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* @param {{ changes: Array<{repo?: string, file: string, action: string, proposed: string}>, repos?: string[], issue?: { iid: number } }} analysis
|
|
86
|
+
* @param {(event: object) => void} onEvent
|
|
87
|
+
*/
|
|
88
|
+
export async function validate(analysis, onEvent) {
|
|
89
|
+
const emit = onEvent ?? (() => { });
|
|
90
|
+
try {
|
|
91
|
+
const candidates = resolveCandidates(analysis);
|
|
92
|
+
if (!candidates.length)
|
|
93
|
+
throw new Error("No repos to validate against.");
|
|
94
|
+
const branchName = analysis.issue?.iid
|
|
95
|
+
? branchNameFor(analysis.issue.iid, analysis)
|
|
96
|
+
: "forge/workspace";
|
|
97
|
+
// Step 1: attribute each change by querying the SCM API for file
|
|
98
|
+
// existence. No clones yet — we only clone repos we'll actually
|
|
99
|
+
// validate. The model's `c.repo` is advisory; we trust the API.
|
|
100
|
+
const { byRepo, unattributed } = await attributeChanges(analysis.changes, candidates, emit);
|
|
101
|
+
if (unattributed.length) {
|
|
102
|
+
for (const c of unattributed) {
|
|
103
|
+
emit({
|
|
104
|
+
type: "log",
|
|
105
|
+
message: `Dropping ${c.file} (${c.action}): not found in ${candidates.join(" or ")}.`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!byRepo.size) {
|
|
110
|
+
throw new Error(`No proposed changes match files in ${candidates.join(" or ")}. ` +
|
|
111
|
+
`The file paths in the proposal don't exist in those repos — likely a wrong path.`);
|
|
112
|
+
}
|
|
113
|
+
// Step 3: order chosen repos by the analysis's repos[] (primary first).
|
|
114
|
+
const ordered = candidates.filter((r) => byRepo.has(r));
|
|
115
|
+
emit({
|
|
116
|
+
type: "log",
|
|
117
|
+
message: `Plan: ${ordered.length} repo(s): ${ordered.map((r) => { const changes = byRepo.get(r) ?? []; return `${r} (${changes.length} change${changes.length === 1 ? "" : "s"})`; }).join(", ")}`,
|
|
118
|
+
});
|
|
119
|
+
const perRepo = [];
|
|
120
|
+
for (const repo of ordered) {
|
|
121
|
+
perRepo.push(await validateRepo(repo, byRepo.get(repo), branchName, emit));
|
|
122
|
+
}
|
|
123
|
+
const allPassed = perRepo.length > 0 && perRepo.every((r) => r.allPassed);
|
|
124
|
+
const repoLabel = perRepo.length === 1
|
|
125
|
+
? perRepo[0].repo
|
|
126
|
+
: perRepo.map((r) => r.repo).join(", ");
|
|
127
|
+
// Single-repo runs keep the original flat `results` shape; multi-repo
|
|
128
|
+
// runs nest by repo so older single-repo consumers still see something
|
|
129
|
+
// sensible at `results.<step>` for their own repo.
|
|
130
|
+
const results = perRepo.length === 1
|
|
131
|
+
? perRepo[0].results
|
|
132
|
+
: Object.fromEntries(perRepo.map((r) => [r.repo, r.results]));
|
|
133
|
+
emit({
|
|
134
|
+
type: "result",
|
|
135
|
+
data: {
|
|
136
|
+
repo: repoLabel,
|
|
137
|
+
branchName,
|
|
138
|
+
results,
|
|
139
|
+
allPassed,
|
|
140
|
+
checkedAt: new Date().toISOString(),
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
return { repo: repoLabel, branchName, results, allPassed, perRepo };
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
emit({ type: "error", message: (err instanceof Error ? err.message : null) ?? "Validation failed" });
|
|
147
|
+
throw err;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../../server/forge/core/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* server/forge/routes.js
|
|
3
|
+
*
|
|
4
|
+
* Express router for /api/forge/*.
|
|
5
|
+
*
|
|
6
|
+
* Required env vars:
|
|
7
|
+
* FORGE_TOKEN — dashboard password
|
|
8
|
+
*
|
|
9
|
+
* Project + token resolved via configStore (Settings UI) with env-var fallbacks.
|
|
10
|
+
*
|
|
11
|
+
* Multi-repo support
|
|
12
|
+
* ──────────────────
|
|
13
|
+
* Every endpoint accepts an optional `repo` param (primary, where the issue
|
|
14
|
+
* lives) and `secondaryRepos` param (additional repos that can participate in
|
|
15
|
+
* a full-stack fix). `secondaryRepos` may be sent as a comma-separated string
|
|
16
|
+
* in the query string, or as a JSON array in a POST body.
|
|
17
|
+
*/
|
|
18
|
+
declare const router: import("express-serve-static-core").Router;
|
|
19
|
+
declare function broadcast(event: Record<string, unknown>): void;
|
|
20
|
+
export { broadcast };
|
|
21
|
+
export default router;
|
|
22
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../server/forge/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAiBH,QAAA,MAAM,MAAM,4CAAW,CAAC;AA0hCxB,iBAAS,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKvD;AAoBD,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,eAAe,MAAM,CAAC"}
|