@ddtcorex/dsh-maestro-review 0.11.1 → 0.12.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 +2 -3
- package/lib/client.js +10 -1
- package/lib/config-store.d.ts +0 -8
- package/lib/config-store.d.ts.map +1 -1
- package/lib/config-store.js +0 -3
- package/lib/config-store.js.map +1 -1
- package/lib/hyva-theme-inspect-tool.js.map +1 -1
- package/lib/layout-xml-tool.d.ts.map +1 -1
- package/lib/layout-xml-tool.js +0 -1
- package/lib/layout-xml-tool.js.map +1 -1
- package/lib/module-check-tool.d.ts.map +1 -1
- package/lib/module-check-tool.js +0 -1
- package/lib/module-check-tool.js.map +1 -1
- package/lib/notify.d.ts +0 -1
- package/lib/notify.d.ts.map +1 -1
- package/lib/notify.js +0 -3
- package/lib/notify.js.map +1 -1
- package/lib/orchestrator.d.ts +1 -9
- package/lib/orchestrator.d.ts.map +1 -1
- package/lib/orchestrator.js +1 -14
- package/lib/orchestrator.js.map +1 -1
- package/lib/phtml-escape-scan-tool.d.ts.map +1 -1
- package/lib/phtml-escape-scan-tool.js +0 -4
- package/lib/phtml-escape-scan-tool.js.map +1 -1
- package/lib/providers/gitlab.d.ts +0 -2
- package/lib/providers/gitlab.d.ts.map +1 -1
- package/lib/providers/gitlab.js +0 -34
- package/lib/providers/gitlab.js.map +1 -1
- package/lib/scope-split-tool.d.ts.map +1 -1
- package/lib/scope-split-tool.js +0 -1
- package/lib/scope-split-tool.js.map +1 -1
- package/lib/settings-rpc.d.ts.map +1 -1
- package/lib/settings-rpc.js.map +1 -1
- package/lib/types/client/BrandMark.d.ts +0 -3
- package/lib/types/client/BrandMark.d.ts.map +1 -1
- package/lib/types/client/review/styles.d.ts +1 -1
- package/lib/types/client/review/styles.d.ts.map +1 -1
- package/package.json +3 -4
- package/presets/maestro-auditor.patch.yml +6 -6
- package/presets/maestro-coder/agent.cordis.yml +5 -8
- package/presets/maestro-reviewer.patch.yml +6 -6
- package/skills/dsh-native-tools/SKILL.md +0 -3
- package/src/client/BrandMark.tsx +1 -1
- package/src/client/review/styles.ts +10 -1
- package/src/host/config-store.ts +0 -4
- package/src/host/hyva-theme-inspect-tool.ts +1 -1
- package/src/host/layout-xml-tool.ts +1 -2
- package/src/host/module-check-tool.ts +1 -2
- package/src/host/notify.ts +0 -4
- package/src/host/orchestrator.ts +1 -17
- package/src/host/phtml-escape-scan-tool.ts +0 -5
- package/src/host/providers/gitlab.ts +0 -35
- package/src/host/scope-split-tool.ts +0 -1
- package/src/host/settings-rpc.ts +0 -1
- package/client/settings-card.tsx +0 -4
- package/lib/git-worktree-tool.d.ts +0 -11
- package/lib/git-worktree-tool.d.ts.map +0 -1
- package/lib/git-worktree-tool.js +0 -162
- package/lib/git-worktree-tool.js.map +0 -1
- package/lib/plan-track-tool.d.ts +0 -11
- package/lib/plan-track-tool.d.ts.map +0 -1
- package/lib/plan-track-tool.js +0 -143
- package/lib/plan-track-tool.js.map +0 -1
- package/lib/providers/github.stub.d.ts +0 -3
- package/lib/providers/github.stub.d.ts.map +0 -1
- package/lib/providers/github.stub.js +0 -10
- package/lib/providers/github.stub.js.map +0 -1
- package/lib/providers/interface.d.ts +0 -12
- package/lib/providers/interface.d.ts.map +0 -1
- package/lib/providers/interface.js +0 -2
- package/lib/providers/interface.js.map +0 -1
- package/lib/tdd-evidence-tool.d.ts +0 -11
- package/lib/tdd-evidence-tool.d.ts.map +0 -1
- package/lib/tdd-evidence-tool.js +0 -114
- package/lib/tdd-evidence-tool.js.map +0 -1
- package/lib/webhook-secret.d.ts +0 -31
- package/lib/webhook-secret.d.ts.map +0 -1
- package/lib/webhook-secret.js +0 -38
- package/lib/webhook-secret.js.map +0 -1
- package/src/host/git-worktree-tool.ts +0 -130
- package/src/host/plan-track-tool.ts +0 -118
- package/src/host/providers/github.stub.ts +0 -11
- package/src/host/providers/interface.ts +0 -2
- package/src/host/tdd-evidence-tool.ts +0 -85
- package/src/host/webhook-secret.ts +0 -43
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ddtcorex/dsh-maestro-review",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.
|
|
5
|
-
"description": "Maestro Review
|
|
4
|
+
"version": "0.12.0",
|
|
5
|
+
"description": "Maestro Review: GitLab review pipeline + orchestrator for automated MR review",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -46,7 +46,6 @@
|
|
|
46
46
|
"@deepseek-ai/dsh-agent": "0.2.0-rc.2",
|
|
47
47
|
"@deepseek-ai/dsh-agent-default-model": "0.2.0-rc.2",
|
|
48
48
|
"@deepseek-ai/dsh-agent-preset-registry": "0.2.0-rc.2",
|
|
49
|
-
"@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
|
|
50
49
|
"@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
|
|
51
50
|
"@deepseek-ai/dsh-llm": "0.2.0-rc.2",
|
|
52
51
|
"@deepseek-ai/dsh-session": "0.2.0-rc.2",
|
|
@@ -86,6 +85,6 @@
|
|
|
86
85
|
"build": "tsc -p tsconfig.json && tsc -p tsconfig.client.json && node scripts/build-client.mjs",
|
|
87
86
|
"test": "NODE_ENV=test vitest run",
|
|
88
87
|
"verify": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit",
|
|
89
|
-
"docker:build": "docker build -f docker/Dockerfile -t ddtcorex/maestro-reviewer:0.
|
|
88
|
+
"docker:build": "docker build -f docker/Dockerfile -t ddtcorex/maestro-reviewer:0.12.0 -t ddtcorex/maestro-reviewer:latest ."
|
|
90
89
|
}
|
|
91
90
|
}
|
|
@@ -17,10 +17,12 @@
|
|
|
17
17
|
- id: persona
|
|
18
18
|
name: '@deepseek-ai/dsh-persona'
|
|
19
19
|
config:
|
|
20
|
-
# The
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
|
|
20
|
+
# The prefix is the model-stable part of the prompt that stays
|
|
21
|
+
# cacheable. DSH 0.2.1-alpha.x removed the loop's built-in cwd
|
|
22
|
+
# prompt variable (an unresolved reference fails before a model
|
|
23
|
+
# request); the working-directory service supplies the execution
|
|
24
|
+
# directory as required user context instead, so no directory
|
|
25
|
+
# clause is stated here.
|
|
24
26
|
prefix: |
|
|
25
27
|
You are Maestro Auditor, a Performance Architect. Workflow:
|
|
26
28
|
1. Use the bash tool to run `govard env up` in the working directory and bring up the merge request's Magento 2 environment.
|
|
@@ -42,7 +44,6 @@
|
|
|
42
44
|
config:
|
|
43
45
|
provider: codex
|
|
44
46
|
toolName: subagent_codex
|
|
45
|
-
backgroundMode: one-shot
|
|
46
47
|
maxDepth: provider-managed
|
|
47
48
|
|
|
48
49
|
- id: tool-subagent-claude-code
|
|
@@ -50,5 +51,4 @@
|
|
|
50
51
|
config:
|
|
51
52
|
provider: claude-code
|
|
52
53
|
toolName: subagent_claude_code
|
|
53
|
-
backgroundMode: one-shot
|
|
54
54
|
maxDepth: provider-managed
|
|
@@ -141,14 +141,12 @@
|
|
|
141
141
|
provider: spawn
|
|
142
142
|
toolName: subagent
|
|
143
143
|
modelSelectionSettings: true
|
|
144
|
-
backgroundMode: continuable
|
|
145
144
|
|
|
146
145
|
- id: tool-subagent-fork
|
|
147
146
|
name: '@deepseek-ai/dsh-tool-subagent'
|
|
148
147
|
config:
|
|
149
148
|
provider: fork
|
|
150
149
|
toolName: subagent_fork
|
|
151
|
-
backgroundMode: continuable
|
|
152
150
|
|
|
153
151
|
# Production dsh does not install these optional providers. Install the
|
|
154
152
|
# matching Bundle in this Profile and restart the Host, then copy this
|
|
@@ -160,7 +158,6 @@
|
|
|
160
158
|
config:
|
|
161
159
|
provider: codex
|
|
162
160
|
toolName: subagent_codex
|
|
163
|
-
backgroundMode: one-shot
|
|
164
161
|
maxDepth: provider-managed
|
|
165
162
|
|
|
166
163
|
- id: tool-subagent-claude-code
|
|
@@ -169,7 +166,6 @@
|
|
|
169
166
|
config:
|
|
170
167
|
provider: claude-code
|
|
171
168
|
toolName: subagent_claude_code
|
|
172
|
-
backgroundMode: one-shot
|
|
173
169
|
maxDepth: provider-managed
|
|
174
170
|
|
|
175
171
|
- id: workflow-ptc
|
|
@@ -207,10 +203,11 @@
|
|
|
207
203
|
- id: persona
|
|
208
204
|
name: '@deepseek-ai/dsh-persona'
|
|
209
205
|
config:
|
|
210
|
-
# The
|
|
211
|
-
#
|
|
212
|
-
#
|
|
213
|
-
|
|
206
|
+
# The prefix is the model-stable part of the prompt that stays cacheable.
|
|
207
|
+
# DSH 0.2.1-alpha.x removed the loop's built-in cwd prompt variable
|
|
208
|
+
# (an unresolved reference fails before a model request); the
|
|
209
|
+
# working-directory service supplies the execution directory as required
|
|
210
|
+
# user context instead, so no directory clause is stated here.
|
|
214
211
|
prefix: |
|
|
215
212
|
You are Maestro Coder, a strictly-compliant Pair Programming Assistant.
|
|
216
213
|
MANDATORY WORKFLOW:
|
|
@@ -17,10 +17,12 @@
|
|
|
17
17
|
- id: persona
|
|
18
18
|
name: '@deepseek-ai/dsh-persona'
|
|
19
19
|
config:
|
|
20
|
-
# The
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
|
|
20
|
+
# The prefix is the model-stable part of the prompt that stays
|
|
21
|
+
# cacheable. DSH 0.2.1-alpha.x removed the loop's built-in cwd
|
|
22
|
+
# prompt variable (an unresolved reference fails before a model
|
|
23
|
+
# request); the working-directory service supplies the execution
|
|
24
|
+
# directory as required user context instead, so no directory
|
|
25
|
+
# clause is stated here.
|
|
24
26
|
prefix: |
|
|
25
27
|
You are Maestro Reviewer, an AI Tech Lead. Workflow:
|
|
26
28
|
1. If the review request names a profile, call maestro_load_review_profile with that profile before inspecting code — it fails closed if the required skill set is incomplete. For a diff-only review with no local checkout or Magento environment, skip this step: there is no profile to load, and the diff is all the context you need.
|
|
@@ -43,7 +45,6 @@
|
|
|
43
45
|
config:
|
|
44
46
|
provider: codex
|
|
45
47
|
toolName: subagent_codex
|
|
46
|
-
backgroundMode: one-shot
|
|
47
48
|
maxDepth: provider-managed
|
|
48
49
|
|
|
49
50
|
- id: tool-subagent-claude-code
|
|
@@ -51,5 +52,4 @@
|
|
|
51
52
|
config:
|
|
52
53
|
provider: claude-code
|
|
53
54
|
toolName: subagent_claude_code
|
|
54
|
-
backgroundMode: one-shot
|
|
55
55
|
maxDepth: provider-managed
|
|
@@ -36,9 +36,6 @@ harness-neutral words — announce, dispatch a subagent, ask your partner. On DS
|
|
|
36
36
|
| Run shell commands, tests, git | `bash`; background via `run_in_background: true`, collect with `job_output`, stop with `job_kill` |
|
|
37
37
|
| Search the web | `web_search` |
|
|
38
38
|
| Look at an image file | `read_image` |
|
|
39
|
-
| Ensure an isolated workspace | `git_worktree {op:'inspect', worktreePath}` → {exists,branch,headSha,isClean,isWorktree} (`worktreePath` is required on every op) |
|
|
40
|
-
| Create a worktree | `git_worktree {op:'create', worktreePath, branch, base?}` → {created,headSha} |
|
|
41
|
-
| Clean up a worktree | `git_worktree {op:'remove', worktreePath}` → {removed,dirtyFiles} |
|
|
42
39
|
|
|
43
40
|
## Native capability tools
|
|
44
41
|
|
package/src/client/BrandMark.tsx
CHANGED
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
MAESTRO_MARK_VIEWBOX,
|
|
15
15
|
} from './maestro-mark.js'
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
function MaestroMark(props: { size?: number }) {
|
|
18
18
|
const s = props.size ?? 16
|
|
19
19
|
return h('svg', { width: s, height: s, viewBox: MAESTRO_MARK_VIEWBOX, fill: 'none', 'aria-hidden': 'true' } as any,
|
|
20
20
|
h('path', { d: MAESTRO_MARK_PATH, stroke: 'currentColor', strokeWidth: MAESTRO_MARK_STROKE_WIDTH, strokeLinecap: 'round', strokeLinejoin: 'round' } as any),
|
|
@@ -102,7 +102,16 @@ export const REVIEW_CSS = `
|
|
|
102
102
|
and a wrapped one reads as a third column. */
|
|
103
103
|
[data-review-row] { flex-direction: column; align-items: stretch; gap: 8px; }
|
|
104
104
|
[data-review-row-text] { padding-right: 0; }
|
|
105
|
-
|
|
105
|
+
/* Every field takes the full row width, with or without a Save button: the
|
|
106
|
+
button stays on the same row and the input takes the rest. */
|
|
107
|
+
[data-review-control] { justify-content: flex-start; width: 100%; }
|
|
108
|
+
[data-review-control] input[type="text"], [data-review-control] input[type="password"], [data-review-control] select { flex: 1 1 auto; min-width: 0; width: 100%; }
|
|
109
|
+
[data-review-secret-group] { width: 100%; min-width: 0; }
|
|
110
|
+
/* A checkbox row does not stack: label and hint stay left, the box is held
|
|
111
|
+
right as a 44px tap target on the same line. Stacked, it left a lone 16px
|
|
112
|
+
box on a line of its own under the label. */
|
|
113
|
+
[data-review-row]:has(> [data-review-control] > input[type="checkbox"]:only-child) { flex-direction: row; align-items: center; gap: 12px; }
|
|
114
|
+
[data-review-row]:has(> [data-review-control] > input[type="checkbox"]:only-child) [data-review-control] { flex: none; width: auto; min-width: 44px; min-height: 44px; justify-content: center; }
|
|
106
115
|
}
|
|
107
116
|
|
|
108
117
|
@media (max-width: 480px) {
|
package/src/host/config-store.ts
CHANGED
|
@@ -93,10 +93,6 @@ const REVIEW_OWNED_KEYS = [
|
|
|
93
93
|
* Machine runtime state (RUNTIME_KEYS) never enters settings — it stays in this
|
|
94
94
|
* package's own sidecar so a settings edit can never silently flip tunnel state.
|
|
95
95
|
*/
|
|
96
|
-
export function configStorePath(dshHome?: string): string {
|
|
97
|
-
return join(resolveDshHome(dshHome), 'dsh-maestro-config', 'settings.json')
|
|
98
|
-
}
|
|
99
|
-
|
|
100
96
|
function runtimeStatePath(dshHome?: string): string {
|
|
101
97
|
return join(resolveDshHome(dshHome), 'dsh-maestro-review', 'runtime.json')
|
|
102
98
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join, resolve, sep
|
|
1
|
+
import { join, resolve, sep } from 'node:path'
|
|
2
2
|
import { readFile, readdir, realpath, stat } from 'node:fs/promises'
|
|
3
3
|
import type { Context } from '@deepseek-ai/cordis'
|
|
4
4
|
import z from '@deepseek-ai/schemastery'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join, resolve, sep, basename
|
|
1
|
+
import { join, resolve, sep, basename } from 'node:path'
|
|
2
2
|
import { readFile, readdir, realpath, stat } from 'node:fs/promises'
|
|
3
3
|
import type { Context } from '@deepseek-ai/cordis'
|
|
4
4
|
import z from '@deepseek-ai/schemastery'
|
|
@@ -22,7 +22,6 @@ async function isInsideRoot(root:string, target:string):Promise<boolean>{
|
|
|
22
22
|
const MAX_FILE_BYTES=1024*1024
|
|
23
23
|
const MAX_FILES=2000
|
|
24
24
|
const SKIP_DIRS=new Set(['.git','node_modules','vendor','pub/static'])
|
|
25
|
-
const LAYOUT_RE = /\/layout\//
|
|
26
25
|
|
|
27
26
|
// tiny helpers
|
|
28
27
|
function parseAttrs(s:string):Record<string,string>{
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join, resolve, sep
|
|
1
|
+
import { join, resolve, sep } from 'node:path'
|
|
2
2
|
import { readFile, readdir, realpath, stat } from 'node:fs/promises'
|
|
3
3
|
import type { Context } from '@deepseek-ai/cordis'
|
|
4
4
|
import z from '@deepseek-ai/schemastery'
|
|
@@ -63,7 +63,6 @@ export function apply(ctx:Context, config:{rootPath?:string}={}):void{
|
|
|
63
63
|
if(rawPath!==undefined && !(await isInsideRoot(root, rawPath))) return {text:`Path "${rawPath}" escapes the workspace root.`, truncated:false} as never
|
|
64
64
|
let candidates:string[]=[]
|
|
65
65
|
if(rawPath!==undefined){
|
|
66
|
-
const abs=resolve(root, rawPath)
|
|
67
66
|
// must contain registration.php or etc/module.xml to be considered a module; otherwise empty
|
|
68
67
|
candidates=[rawPath]
|
|
69
68
|
} else {
|
package/src/host/notify.ts
CHANGED
|
@@ -76,7 +76,3 @@ export function reviewDigestText(notification: {
|
|
|
76
76
|
|
|
77
77
|
return `<b>🤖 Maestro Review</b> — <code>${escapeHtml(notification.projectPath)}</code> ${mrLink}\n<b>Status:</b> ${statusLabel}${metaLine}${findingsLine}${summaryBlock}${footerLink}`
|
|
78
78
|
}
|
|
79
|
-
|
|
80
|
-
export function pinRotationText(pin: string): string {
|
|
81
|
-
return `DSH public access PIN was rotated\nNew PIN: ${pin}`
|
|
82
|
-
}
|
package/src/host/orchestrator.ts
CHANGED
|
@@ -36,28 +36,12 @@ import { buildIncrementalBlock, fetchCompare, fetchMrDetailHeadSha } from './inc
|
|
|
36
36
|
import { createReviewSignals } from './review-signals.js'
|
|
37
37
|
import { reviewDigestText, type NotifierLike } from './notify.js'
|
|
38
38
|
import { loadedReviewProfile, type ReviewSkillProfile } from './skills-tool.js'
|
|
39
|
-
import type { ReviewProvider } from './providers/interface.js'
|
|
40
|
-
import { gitlabProvider } from './providers/gitlab.js'
|
|
41
39
|
import { REVIEW_SOURCE_KIND } from './source.js'
|
|
42
40
|
import './events.js'
|
|
43
41
|
import { gitlabAuthHeaders } from './gitlab-auth.js'
|
|
44
42
|
import { reviewMarker, resolveFlow, type ReviewFlow } from './review-marker.js'
|
|
45
43
|
import { cloneSourceRepo, defaultRun } from './ci-clone.js'
|
|
46
44
|
|
|
47
|
-
// Provider-aware wrapper — orchestrator can run reviews via any ReviewProvider.
|
|
48
|
-
// This keeps the GitLab-specific flow intact while allowing Phase C to add GitHub/Jira without modifying core logic.
|
|
49
|
-
export async function runReviewWithProvider(provider: ReviewProvider, request: { provider: string; projectPath: string; mrId: string; profile: string }): Promise<void> {
|
|
50
|
-
// Currently delegates to GitLab flow; Phase C will branch on provider.id
|
|
51
|
-
if (provider.id === 'gitlab') {
|
|
52
|
-
// Orchestrator already handles GitLab via 'maestro/review-request' event
|
|
53
|
-
// This wrapper exists to prove provider pluggability; real dispatch is via ctx.emit
|
|
54
|
-
void gitlabProvider
|
|
55
|
-
}
|
|
56
|
-
void request
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export { gitlabProvider }
|
|
60
|
-
|
|
61
45
|
const execFileAsync = promisify(execFile)
|
|
62
46
|
const GIT_TIMEOUT_MS = 60_000
|
|
63
47
|
|
|
@@ -1268,7 +1252,7 @@ export function apply(ctx: Context, config: Config): void {
|
|
|
1268
1252
|
projectId: payload.projectId,
|
|
1269
1253
|
mrIid: payload.mrIid,
|
|
1270
1254
|
}
|
|
1271
|
-
for (const
|
|
1255
|
+
for (const finding of capturedFindings) {
|
|
1272
1256
|
try {
|
|
1273
1257
|
await postReviewFindings([finding], findingPoster)
|
|
1274
1258
|
if (finding.status === 'new') postedNew++
|
|
@@ -26,11 +26,6 @@ async function* walkPhtml(dir:string, budget:{files:number}):AsyncGenerator<stri
|
|
|
26
26
|
budget.files-=1; yield join(dir,e.name)
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
-
function isSafeLine(line:string):boolean{
|
|
30
|
-
return /\$escaper\s*->\s*escape/.test(line) || /\$block\s*->\s*escape/.test(line) || /->\s*get\w*Html\s*\(/.test(line) || /escapeHtmlAttr/.test(line) && /title=/.test(line) ? true : false
|
|
31
|
-
// second case handled more precisely below
|
|
32
|
-
}
|
|
33
|
-
|
|
34
29
|
export function apply(ctx:Context, config:{rootPath?:string}={}):void{
|
|
35
30
|
const configuredRoot=config.rootPath
|
|
36
31
|
ctx.effect(()=>ctx.tools.register(defineTool({
|
|
@@ -5,7 +5,6 @@ import { loadUserConfig } from '../config-store.js'
|
|
|
5
5
|
import { secretsMatch } from '../secure-compare.js'
|
|
6
6
|
import type { MrOpenedPayload, ReviewRequest as OrchestratorReviewRequest } from '../events.js'
|
|
7
7
|
import { describeDrop, routeGitlabReviewRequest } from '../review-intake.js'
|
|
8
|
-
import type { ReviewProvider, ReviewRequest } from './interface.js'
|
|
9
8
|
|
|
10
9
|
export const name = 'maestro-review-webhook'
|
|
11
10
|
export const inject = ['webServer'] as const
|
|
@@ -66,40 +65,6 @@ function hasValidGitlabMrIdentity(value: unknown): boolean {
|
|
|
66
65
|
&& typeof source?.iid === 'number' && typeof source.source_branch === 'string'
|
|
67
66
|
}
|
|
68
67
|
|
|
69
|
-
// ReviewProvider implementation — pluggable interface for orchestrator
|
|
70
|
-
export const gitlabProvider: ReviewProvider = {
|
|
71
|
-
id: 'gitlab',
|
|
72
|
-
async intake(req: Request): Promise<ReviewRequest> {
|
|
73
|
-
// Try to parse the request body as GitLab webhook JSON
|
|
74
|
-
let body: unknown
|
|
75
|
-
try {
|
|
76
|
-
body = await req.clone().json()
|
|
77
|
-
} catch {
|
|
78
|
-
// Fallback/STUB: return generic empty request (keeps interface working without GitLab)
|
|
79
|
-
return { provider: 'gitlab', projectPath: '', mrId: '', profile: 'generic' }
|
|
80
|
-
}
|
|
81
|
-
// If body looks like a GitLab MR webhook, map to ReviewRequest
|
|
82
|
-
if (typeof body === 'object' && body !== null) {
|
|
83
|
-
const b = body as Record<string, unknown>
|
|
84
|
-
const project = b.project as Record<string, unknown> | undefined
|
|
85
|
-
const attrs = b.object_attributes as Record<string, unknown> | undefined
|
|
86
|
-
const mr = b.merge_request as Record<string, unknown> | undefined
|
|
87
|
-
const source = b.object_kind === 'note' ? mr : attrs
|
|
88
|
-
const projectPath = typeof project?.path_with_namespace === 'string' ? project.path_with_namespace : ''
|
|
89
|
-
const mrId = typeof source?.iid === 'number' ? String(source.iid) : ''
|
|
90
|
-
if (projectPath && mrId) {
|
|
91
|
-
return { provider: 'gitlab', projectPath, mrId, profile: 'generic' }
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// Fallback stub
|
|
95
|
-
return { provider: 'gitlab', projectPath: '', mrId: '', profile: 'generic' }
|
|
96
|
-
},
|
|
97
|
-
async postFindings(_findings: any[]): Promise<void> {
|
|
98
|
-
// Real posting is handled by orchestrator's GitLab API flow (postReviewFindings)
|
|
99
|
-
// Keep interface compliant — no-op here; orchestrator will call postReviewFindings separately
|
|
100
|
-
},
|
|
101
|
-
}
|
|
102
|
-
|
|
103
68
|
export function apply(ctx: Context, config: Config): void {
|
|
104
69
|
let warnedUnconfigured = false
|
|
105
70
|
async function requestAuthorized(headerValue: string | string[] | undefined): Promise<boolean> {
|
|
@@ -6,7 +6,6 @@ export const name='maestro-scope-split-tool'
|
|
|
6
6
|
export const inject=['tools']
|
|
7
7
|
export const Config:z<{rootPath?:string}>=z.object({rootPath:z.string()})
|
|
8
8
|
|
|
9
|
-
const QUICK_EXTS=new Set(['.phtml','.html','.js','.ts','.less','.css','.xml','.csv','.json'])
|
|
10
9
|
const DEEP_EXTS=new Set(['.php'])
|
|
11
10
|
const QUICK_PATH_HINTS=/^(view\/frontend|view\/adminhtml|i18n)\//
|
|
12
11
|
const DEEP_PATH_HINTS=/(Plugin\/|Observer\/|Controller\/|Setup\/|Model\/|etc\/(di|acl|webapi)\.xml|composer\.json|registration\.php)/
|
package/src/host/settings-rpc.ts
CHANGED
|
@@ -4,7 +4,6 @@ import type { RpcErrorDetailsMap, RpcResult } from '@deepseek-ai/dsh-client-conn
|
|
|
4
4
|
import { existsSync, statSync } from 'node:fs'
|
|
5
5
|
import { loadUserConfig, saveUserConfig, type MaestroUserConfig } from './config-store.js'
|
|
6
6
|
import { listReviews } from './review-history.js'
|
|
7
|
-
import { type NotifierLike } from './notify.js'
|
|
8
7
|
|
|
9
8
|
export const name = 'maestro-settings-rpc'
|
|
10
9
|
/**
|
package/client/settings-card.tsx
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
-
import z from '@deepseek-ai/schemastery';
|
|
3
|
-
export declare const name = "maestro-git-worktree-tool";
|
|
4
|
-
export declare const inject: string[];
|
|
5
|
-
export declare const Config: z<{
|
|
6
|
-
rootPath?: string;
|
|
7
|
-
}>;
|
|
8
|
-
export declare function apply(ctx: Context, config?: {
|
|
9
|
-
rootPath?: string;
|
|
10
|
-
}): void;
|
|
11
|
-
//# sourceMappingURL=git-worktree-tool.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-worktree-tool.d.ts","sourceRoot":"","sources":["../src/host/git-worktree-tool.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,eAAO,MAAM,IAAI,8BAA4B,CAAA;AAC7C,eAAO,MAAM,MAAM,UAAU,CAAA;AAC7B,eAAO,MAAM,MAAM,EAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAC,MAAM,CAAA;CAAC,CAAmC,CAAA;AAuB3E,wBAAgB,KAAK,CAAC,GAAG,EAAC,OAAO,EAAE,MAAM,GAAC;IAAC,QAAQ,CAAC,EAAC,MAAM,CAAA;CAAI,GAAE,IAAI,CAgGpE"}
|
package/lib/git-worktree-tool.js
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { resolve, sep } from 'node:path';
|
|
2
|
-
import { stat, realpath } from 'node:fs/promises';
|
|
3
|
-
import { execFile } from 'node:child_process';
|
|
4
|
-
import { promisify } from 'node:util';
|
|
5
|
-
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
6
|
-
import z from '@deepseek-ai/schemastery';
|
|
7
|
-
export const name = 'maestro-git-worktree-tool';
|
|
8
|
-
export const inject = ['tools'];
|
|
9
|
-
export const Config = z.object({ rootPath: z.string() });
|
|
10
|
-
function workspaceRootFor(c, e) { if (c !== undefined)
|
|
11
|
-
return c; const cwd = e?.agent?.session?.header?.cwd; return typeof cwd === 'string' && cwd !== '' ? cwd : process.cwd(); }
|
|
12
|
-
async function isInsideRoot(r, t) {
|
|
13
|
-
const ar = resolve(r);
|
|
14
|
-
const rs = resolve(ar, t);
|
|
15
|
-
if (rs !== ar && !rs.startsWith(ar + sep))
|
|
16
|
-
return false;
|
|
17
|
-
// For non-existent targets (create), realpath fails — allow if string prefix passes and parent is inside
|
|
18
|
-
try {
|
|
19
|
-
const rr = await realpath(ar);
|
|
20
|
-
const rt = await realpath(rs);
|
|
21
|
-
return rt === rr || rt.startsWith(rr + sep);
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
try {
|
|
25
|
-
const rr = await realpath(ar);
|
|
26
|
-
const parent = resolve(rs, '..');
|
|
27
|
-
const rp = await realpath(parent);
|
|
28
|
-
return rp === rr || rp.startsWith(rr + sep);
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return rs === ar || rs.startsWith(ar + sep);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
const SAFE_BRANCH = /^[A-Za-z0-9._\/-]+$/;
|
|
36
|
-
const execFileAsync = promisify(execFile);
|
|
37
|
-
async function runGit(cwd, args) {
|
|
38
|
-
try {
|
|
39
|
-
const { stdout, stderr } = await execFileAsync('git', args, { cwd, timeout: 10000 });
|
|
40
|
-
return { code: 0, stdout: String(stdout), stderr: String(stderr) };
|
|
41
|
-
}
|
|
42
|
-
catch (e) {
|
|
43
|
-
return { code: e.code ?? 1, stdout: e.stdout ?? '', stderr: e.stderr ?? String(e.message) };
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
async function exists(p) { try {
|
|
47
|
-
await stat(p);
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
return false;
|
|
52
|
-
} }
|
|
53
|
-
export function apply(ctx, config = {}) {
|
|
54
|
-
const configuredRoot = config.rootPath;
|
|
55
|
-
ctx.effect(() => ctx.tools.register(defineTool({
|
|
56
|
-
name: 'git_worktree',
|
|
57
|
-
description: 'Inspect/create/remove git worktrees deterministically (isolated workspace, branch, submodule guard).',
|
|
58
|
-
parameters: {
|
|
59
|
-
op: { type: 'string', enum: ['inspect', 'create', 'remove'], required: true },
|
|
60
|
-
worktreePath: { type: 'string', required: true },
|
|
61
|
-
branch: { type: 'string' },
|
|
62
|
-
base: { type: 'string' },
|
|
63
|
-
},
|
|
64
|
-
output: {
|
|
65
|
-
schema: {
|
|
66
|
-
type: 'object', additionalProperties: true,
|
|
67
|
-
properties: {
|
|
68
|
-
op: { type: 'string', required: true },
|
|
69
|
-
exists: { type: 'boolean' },
|
|
70
|
-
isWorktree: { type: 'boolean' },
|
|
71
|
-
created: { type: 'boolean' },
|
|
72
|
-
reason: { type: 'string' },
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
render: (_a, v) => [{ type: 'text', text: JSON.stringify(v, null, 2) }],
|
|
76
|
-
},
|
|
77
|
-
async execute(args, exec) {
|
|
78
|
-
const op = args.op;
|
|
79
|
-
const rawPath = args.worktreePath;
|
|
80
|
-
const root = workspaceRootFor(configuredRoot, exec);
|
|
81
|
-
if (!(await isInsideRoot(root, rawPath)))
|
|
82
|
-
return { text: `Path "${rawPath}" escapes the workspace root.`, truncated: false };
|
|
83
|
-
const worktreePath = resolve(root, rawPath);
|
|
84
|
-
if (op === 'inspect') {
|
|
85
|
-
const ex = await exists(worktreePath);
|
|
86
|
-
let isWorktree = false, branch = null, headSha = null, isClean = true, gitDir = null, gitCommonDir = null;
|
|
87
|
-
if (ex) {
|
|
88
|
-
// try git rev-parse
|
|
89
|
-
const r1 = await runGit(worktreePath, ['rev-parse', '--git-dir']);
|
|
90
|
-
const r2 = await runGit(worktreePath, ['rev-parse', '--git-common-dir']);
|
|
91
|
-
const r3 = await runGit(worktreePath, ['branch', '--show-current']);
|
|
92
|
-
const r4 = await runGit(worktreePath, ['rev-parse', 'HEAD']);
|
|
93
|
-
const r5 = await runGit(worktreePath, ['status', '--porcelain']);
|
|
94
|
-
if (r1.code === 0)
|
|
95
|
-
gitDir = r1.stdout.trim();
|
|
96
|
-
if (r2.code === 0)
|
|
97
|
-
gitCommonDir = r2.stdout.trim();
|
|
98
|
-
if (r3.code === 0)
|
|
99
|
-
branch = r3.stdout.trim() || null;
|
|
100
|
-
if (r4.code === 0)
|
|
101
|
-
headSha = r4.stdout.trim() || null;
|
|
102
|
-
isClean = r5.stdout.trim() === '';
|
|
103
|
-
// isWorktree if gitDir is file and gitCommonDir differs
|
|
104
|
-
if (gitDir && gitCommonDir && gitDir !== gitCommonDir)
|
|
105
|
-
isWorktree = true;
|
|
106
|
-
// fallback: if worktreePath contains .worktrees
|
|
107
|
-
if (worktreePath.includes('/.worktrees/'))
|
|
108
|
-
isWorktree = true;
|
|
109
|
-
}
|
|
110
|
-
return { op: 'inspect', exists: ex, branch, headSha, isClean, isWorktree, gitDir, gitCommonDir, untrackedFiles: [], truncated: false, ignored: null };
|
|
111
|
-
}
|
|
112
|
-
if (op === 'create') {
|
|
113
|
-
const branch = args.branch;
|
|
114
|
-
const base = args.base ?? 'HEAD';
|
|
115
|
-
if (!branch)
|
|
116
|
-
return { text: 'branch required for create', truncated: false };
|
|
117
|
-
if (!SAFE_BRANCH.test(branch) || branch.startsWith('-') || branch.includes('..'))
|
|
118
|
-
return { text: `invalid branch name "${branch}" — must match ${SAFE_BRANCH.source}`, truncated: false };
|
|
119
|
-
if (branch.includes('--'))
|
|
120
|
-
return { text: `invalid branch name "${branch}"`, truncated: false };
|
|
121
|
-
// base validate
|
|
122
|
-
if (base && !SAFE_BRANCH.test(base) && !/^[0-9a-f]{7,40}$/.test(base))
|
|
123
|
-
return { text: `invalid base "${base}"`, truncated: false };
|
|
124
|
-
// .gitignore guard: check if worktreePath is ignored
|
|
125
|
-
const check = await runGit(root, ['check-ignore', '-q', worktreePath]);
|
|
126
|
-
const isIgnored = check.code === 0;
|
|
127
|
-
if (!isIgnored) {
|
|
128
|
-
return { op: 'create', created: false, worktreePath, branch, headSha: '', alreadyExisted: false, reason: 'not ignored — add .worktrees to .gitignore' };
|
|
129
|
-
}
|
|
130
|
-
if (await exists(worktreePath)) {
|
|
131
|
-
return { op: 'create', created: false, worktreePath, branch, headSha: '', alreadyExisted: true, reason: 'already exists' };
|
|
132
|
-
}
|
|
133
|
-
const res = await runGit(root, ['worktree', 'add', '-b', branch, '--', worktreePath, base]);
|
|
134
|
-
if (res.code !== 0) {
|
|
135
|
-
if (res.stderr.includes('permission denied') || res.stderr.includes('EACCES')) {
|
|
136
|
-
return { op: 'create', created: false, worktreePath, branch, headSha: '', alreadyExisted: false, reason: 'blocked by sandbox — working in place' };
|
|
137
|
-
}
|
|
138
|
-
return { op: 'create', created: false, worktreePath, branch, headSha: '', alreadyExisted: false, reason: res.stderr.slice(0, 500) };
|
|
139
|
-
}
|
|
140
|
-
const head = await runGit(worktreePath, ['rev-parse', 'HEAD']);
|
|
141
|
-
return { op: 'create', created: true, worktreePath, branch, headSha: head.stdout.trim(), alreadyExisted: false, reason: null };
|
|
142
|
-
}
|
|
143
|
-
if (op === 'remove') {
|
|
144
|
-
const ex = await exists(worktreePath);
|
|
145
|
-
if (!ex)
|
|
146
|
-
return { op: 'remove', removed: false, pruned: false, reason: 'not exists', dirtyFiles: [] };
|
|
147
|
-
const status = await runGit(worktreePath, ['status', '--porcelain']);
|
|
148
|
-
const dirtyFiles = status.stdout.trim() ? status.stdout.trim().split('\n').slice(0, 20) : [];
|
|
149
|
-
if (dirtyFiles.length > 0) {
|
|
150
|
-
return { op: 'remove', removed: false, pruned: false, reason: 'contains modified or untracked files', dirtyFiles };
|
|
151
|
-
}
|
|
152
|
-
const res = await runGit(root, ['worktree', 'remove', '--', worktreePath]);
|
|
153
|
-
if (res.code !== 0)
|
|
154
|
-
return { op: 'remove', removed: false, pruned: false, reason: res.stderr.slice(0, 500), dirtyFiles };
|
|
155
|
-
const prune = await runGit(root, ['worktree', 'prune']);
|
|
156
|
-
return { op: 'remove', removed: true, pruned: prune.code === 0, reason: null, dirtyFiles: [] };
|
|
157
|
-
}
|
|
158
|
-
return { text: `unknown op ${op}`, truncated: false };
|
|
159
|
-
}
|
|
160
|
-
}), 'git worktree'));
|
|
161
|
-
}
|
|
162
|
-
//# sourceMappingURL=git-worktree-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-worktree-tool.js","sourceRoot":"","sources":["../src/host/git-worktree-tool.ts"],"names":[],"mappings":"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"}
|
package/lib/plan-track-tool.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
-
import z from '@deepseek-ai/schemastery';
|
|
3
|
-
export declare const name = "maestro-plan-track-tool";
|
|
4
|
-
export declare const inject: string[];
|
|
5
|
-
export declare const Config: z<{
|
|
6
|
-
rootPath?: string;
|
|
7
|
-
}>;
|
|
8
|
-
export declare function apply(ctx: Context, config?: {
|
|
9
|
-
rootPath?: string;
|
|
10
|
-
}): void;
|
|
11
|
-
//# sourceMappingURL=plan-track-tool.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan-track-tool.d.ts","sourceRoot":"","sources":["../src/host/plan-track-tool.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,eAAO,MAAM,IAAI,4BAA0B,CAAA;AAC3C,eAAO,MAAM,MAAM,UAAU,CAAA;AAC7B,eAAO,MAAM,MAAM,EAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAC,MAAM,CAAA;CAAC,CAAmC,CAAA;AAiC3E,wBAAgB,KAAK,CAAC,GAAG,EAAC,OAAO,EAAE,MAAM,GAAC;IAAC,QAAQ,CAAC,EAAC,MAAM,CAAA;CAAI,GAAE,IAAI,CA4EpE"}
|