abelworkflow 1.2.3 → 1.3.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 +26 -25
- package/extensions/gpt-responses-compat.ts +166 -27
- package/lib/cli/main.mjs +18 -86
- package/lib/cli/pi.mjs +43 -0
- package/lib/cli/prompts.mjs +3 -3
- package/lib/installer/assets.mjs +35 -31
- package/lib/installer/install.mjs +29 -9
- package/lib/installer/links.mjs +97 -84
- package/lib/paths.mjs +0 -2
- package/lib/providers/claude.mjs +14 -3
- package/lib/providers/codex.mjs +14 -9
- package/lib/providers/pi.mjs +61 -68
- package/lib/providers/skills.mjs +22 -22
- package/lib/providers/url.mjs +32 -1
- package/lib/templates/codex/agents/default.toml +16 -54
- package/lib/templates/codex/agents/explorer.toml +25 -52
- package/lib/templates/codex/agents/planner.toml +23 -77
- package/lib/templates/codex/agents/reviewer.toml +16 -62
- package/lib/templates/codex/agents/worker.toml +30 -64
- package/lib/templates/codex/config-base.toml +0 -6
- package/lib/templates/{workflow/gitignore.template → gitignore.template} +0 -3
- package/lib/tools/cli-installer.mjs +40 -12
- package/package.json +13 -18
- package/lib/templates/workflow/AGENTS.md +0 -50
- package/lib/templates/workflow/commands/abel-design.md +0 -175
- package/lib/templates/workflow/commands/abel-diagnose.md +0 -63
- package/lib/templates/workflow/commands/abel-implement.md +0 -170
- package/lib/templates/workflow/commands/abel-init.md +0 -25
- package/skills/dev-browser/SKILL.md +0 -281
- package/skills/dev-browser/dist/scripts/start.d.ts +0 -1
- package/skills/dev-browser/dist/scripts/start.js +0 -90
- package/skills/dev-browser/dist/src/client.d.ts +0 -92
- package/skills/dev-browser/dist/src/client.js +0 -310
- package/skills/dev-browser/dist/src/entrypoint.d.ts +0 -29
- package/skills/dev-browser/dist/src/entrypoint.js +0 -113
- package/skills/dev-browser/dist/src/index.d.ts +0 -3
- package/skills/dev-browser/dist/src/index.js +0 -1
- package/skills/dev-browser/dist/src/page-api.d.ts +0 -24
- package/skills/dev-browser/dist/src/page-api.js +0 -103
- package/skills/dev-browser/dist/src/relay.d.ts +0 -26
- package/skills/dev-browser/dist/src/relay.js +0 -567
- package/skills/dev-browser/dist/src/runtime.d.ts +0 -34
- package/skills/dev-browser/dist/src/runtime.js +0 -44
- package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts +0 -22
- package/skills/dev-browser/dist/src/snapshot/browser-script.js +0 -868
- package/skills/dev-browser/dist/src/snapshot/index.d.ts +0 -13
- package/skills/dev-browser/dist/src/snapshot/index.js +0 -13
- package/skills/dev-browser/dist/src/snapshot/inject.d.ts +0 -12
- package/skills/dev-browser/dist/src/snapshot/inject.js +0 -12
- package/skills/dev-browser/dist/src/standalone.d.ts +0 -31
- package/skills/dev-browser/dist/src/standalone.js +0 -173
- package/skills/dev-browser/dist/src/startup.d.ts +0 -46
- package/skills/dev-browser/dist/src/startup.js +0 -77
- package/skills/dev-browser/dist/src/target-registry.d.ts +0 -28
- package/skills/dev-browser/dist/src/target-registry.js +0 -134
- package/skills/dev-browser/dist/src/types.d.ts +0 -26
- package/skills/dev-browser/dist/src/types.js +0 -1
- package/skills/dev-browser/package-lock.json +0 -1545
- package/skills/dev-browser/package.json +0 -35
- package/skills/dev-browser/references/scraping.md +0 -144
- package/skills/git-commit/SKILL.md +0 -124
- package/skills/time/SKILL.md +0 -119
- package/skills/time/scripts/time_cli.py +0 -143
package/lib/providers/pi.mjs
CHANGED
|
@@ -5,7 +5,11 @@ import {
|
|
|
5
5
|
readJsoncFileSafe,
|
|
6
6
|
withFileTransaction
|
|
7
7
|
} from "../config/store.mjs";
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
normalizeOpenAiBaseUrl,
|
|
10
|
+
promptBaseUrlOptions,
|
|
11
|
+
resolvePromptedBaseUrl
|
|
12
|
+
} from "./url.mjs";
|
|
9
13
|
import { stripJsonComments } from "../config/jsonc.mjs";
|
|
10
14
|
|
|
11
15
|
const piProviderId = "abelworkflow";
|
|
@@ -349,83 +353,72 @@ async function persistPiConfiguration(paths, intent, operations = {}) {
|
|
|
349
353
|
});
|
|
350
354
|
}
|
|
351
355
|
|
|
352
|
-
async function
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
selectOrCancel
|
|
363
|
-
} = promptApi;
|
|
364
|
-
const { auth, models, settings } = await readExistingPiConfiguration(paths);
|
|
365
|
-
const existing = resolveExistingPiApiConfig(models, settings, auth);
|
|
366
|
-
const providerLabel = `Pi ${piProviderId}`;
|
|
367
|
-
|
|
368
|
-
const baseUrlInput = await text({
|
|
369
|
-
message: `${providerLabel} Base URL`,
|
|
370
|
-
initialValue: existing.baseUrl || undefined,
|
|
371
|
-
validate: (value) => {
|
|
372
|
-
try {
|
|
373
|
-
normalizeOpenAiBaseUrl(value);
|
|
374
|
-
} catch (error) {
|
|
375
|
-
return error.message;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
});
|
|
379
|
-
assertNotCancelled(baseUrlInput);
|
|
380
|
-
const inferredApi = inferPiApiFromBaseUrl(baseUrlInput);
|
|
381
|
-
const baseUrl = normalizeOpenAiBaseUrl(baseUrlInput);
|
|
356
|
+
async function promptPiConfiguration(paths, promptApi, runtime = {}) {
|
|
357
|
+
const text = runtime.text ?? p.text;
|
|
358
|
+
const {
|
|
359
|
+
assertNotCancelled,
|
|
360
|
+
passwordOrExisting,
|
|
361
|
+
selectOrCancel
|
|
362
|
+
} = promptApi;
|
|
363
|
+
const { auth, models, settings } = await readExistingPiConfiguration(paths);
|
|
364
|
+
const existing = resolveExistingPiApiConfig(models, settings, auth);
|
|
365
|
+
const providerLabel = `Pi ${piProviderId}`;
|
|
382
366
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
message: `${providerLabel} API Key`,
|
|
394
|
-
existingValue: existing.apiKey
|
|
395
|
-
});
|
|
367
|
+
const baseUrlPrompt = {
|
|
368
|
+
message: `${providerLabel} Base URL`,
|
|
369
|
+
existingValue: existing.baseUrl,
|
|
370
|
+
placeholder: "https://api.openai.com/v1",
|
|
371
|
+
normalize: normalizeOpenAiBaseUrl
|
|
372
|
+
};
|
|
373
|
+
const baseUrlInput = await text(promptBaseUrlOptions(baseUrlPrompt));
|
|
374
|
+
assertNotCancelled(baseUrlInput);
|
|
375
|
+
const inferredApi = inferPiApiFromBaseUrl(baseUrlInput);
|
|
376
|
+
const baseUrl = resolvePromptedBaseUrl(baseUrlInput, baseUrlPrompt);
|
|
396
377
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
});
|
|
411
|
-
assertNotCancelled(defaultModel);
|
|
378
|
+
const apiOptions = getPiApiPromptOptions();
|
|
379
|
+
const initialApi = apiOptions.some((option) => option.value === existing.api)
|
|
380
|
+
? existing.api
|
|
381
|
+
: undefined;
|
|
382
|
+
const api = inferredApi || await selectOrCancel({
|
|
383
|
+
message: `${providerLabel} API 类型`,
|
|
384
|
+
options: apiOptions,
|
|
385
|
+
...(initialApi ? { initialValue: initialApi } : {})
|
|
386
|
+
});
|
|
387
|
+
const apiKey = await passwordOrExisting({
|
|
388
|
+
message: `${providerLabel} API Key`,
|
|
389
|
+
existingValue: existing.apiKey
|
|
390
|
+
});
|
|
412
391
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
392
|
+
const modelIdsText = await text({
|
|
393
|
+
message: `${providerLabel} 模型 ID(多个用逗号分隔)`,
|
|
394
|
+
initialValue: existing.modelIds.join(",") || undefined,
|
|
395
|
+
validate: (value) => parsePiModelIds(value).length ? undefined : "至少需要一个模型 ID"
|
|
396
|
+
});
|
|
397
|
+
assertNotCancelled(modelIdsText);
|
|
398
|
+
const modelIds = parsePiModelIds(modelIdsText);
|
|
399
|
+
const defaultModel = await text({
|
|
400
|
+
message: "Pi 默认模型",
|
|
401
|
+
initialValue: modelIds.includes(existing.defaultModel) ? existing.defaultModel : modelIds[0],
|
|
402
|
+
validate: (value) => modelIds.includes(String(value || "").trim())
|
|
403
|
+
? undefined
|
|
404
|
+
: "默认模型必须在模型 ID 列表中"
|
|
421
405
|
});
|
|
406
|
+
assertNotCancelled(defaultModel);
|
|
407
|
+
|
|
408
|
+
return {
|
|
409
|
+
apiKey,
|
|
410
|
+
baseUrl,
|
|
411
|
+
api,
|
|
412
|
+
modelIds,
|
|
413
|
+
defaultModel: String(defaultModel).trim()
|
|
414
|
+
};
|
|
422
415
|
}
|
|
423
416
|
|
|
424
417
|
export {
|
|
425
418
|
buildPiAuthConfig,
|
|
426
419
|
buildPiModelsConfig,
|
|
427
420
|
buildPiSettingsConfig,
|
|
428
|
-
|
|
421
|
+
promptPiConfiguration,
|
|
429
422
|
getPiApiPromptOptions,
|
|
430
423
|
inferPiApiFromBaseUrl,
|
|
431
424
|
normalizeOpenAiBaseUrl,
|
package/lib/providers/skills.mjs
CHANGED
|
@@ -3,7 +3,11 @@ import { join } from "node:path";
|
|
|
3
3
|
import * as p from "@clack/prompts";
|
|
4
4
|
import { readDotenvFile, updateDotenvFile } from "../config/store.mjs";
|
|
5
5
|
import { pathToLabel } from "../paths.mjs";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
normalizeHttpBaseUrl,
|
|
8
|
+
promptBaseUrlOptions,
|
|
9
|
+
resolvePromptedBaseUrl
|
|
10
|
+
} from "./url.mjs";
|
|
7
11
|
|
|
8
12
|
const grokDefaults = Object.freeze(JSON.parse(readFileSync(
|
|
9
13
|
new URL("../../skills/grok-search/defaults.json", import.meta.url),
|
|
@@ -18,14 +22,6 @@ async function updateSkillEnvFile(path, updates, safeRoot) {
|
|
|
18
22
|
return updateDotenvFile(path, updates, { safeRoot, sensitive: true });
|
|
19
23
|
}
|
|
20
24
|
|
|
21
|
-
function validateHttpBaseUrl(value) {
|
|
22
|
-
try {
|
|
23
|
-
normalizeHttpBaseUrl(value);
|
|
24
|
-
} catch (error) {
|
|
25
|
-
return error.message;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
25
|
async function configureGrokSearchEnv(paths, withSkillPresent, promptApi, runtime = {}) {
|
|
30
26
|
const {
|
|
31
27
|
assertNotCancelled,
|
|
@@ -39,13 +35,21 @@ async function configureGrokSearchEnv(paths, withSkillPresent, promptApi, runtim
|
|
|
39
35
|
await guard();
|
|
40
36
|
const envPath = join(paths.agentsDir, "skills", "grok-search", ".env");
|
|
41
37
|
const existing = await readSkillEnvFile(envPath, paths.agentsDir);
|
|
42
|
-
const
|
|
38
|
+
const grokApiUrlPrompt = {
|
|
43
39
|
message: "Grok API URL",
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
existingValue: existing.GROK_API_URL,
|
|
41
|
+
placeholder: "https://api.x.ai/v1",
|
|
42
|
+
normalize: normalizeHttpBaseUrl
|
|
43
|
+
};
|
|
44
|
+
const tavilyApiUrlPrompt = {
|
|
45
|
+
message: "Tavily API URL",
|
|
46
|
+
existingValue: existing.TAVILY_API_URL,
|
|
47
|
+
placeholder: "https://api.tavily.com",
|
|
48
|
+
normalize: normalizeHttpBaseUrl
|
|
49
|
+
};
|
|
50
|
+
const baseUrlInput = await text(promptBaseUrlOptions(grokApiUrlPrompt));
|
|
47
51
|
assertNotCancelled(baseUrlInput);
|
|
48
|
-
const baseUrl =
|
|
52
|
+
const baseUrl = resolvePromptedBaseUrl(baseUrlInput, grokApiUrlPrompt);
|
|
49
53
|
|
|
50
54
|
const finalApiKey = await passwordOrExisting({
|
|
51
55
|
message: "Grok API Key",
|
|
@@ -65,15 +69,11 @@ async function configureGrokSearchEnv(paths, withSkillPresent, promptApi, runtim
|
|
|
65
69
|
initialValue: Boolean(existing.TAVILY_API_KEY)
|
|
66
70
|
});
|
|
67
71
|
|
|
68
|
-
const tavilyUrl = useTavily
|
|
69
|
-
? await text({
|
|
70
|
-
message: "Tavily API URL",
|
|
71
|
-
initialValue: existing.TAVILY_API_URL || "https://api.tavily.com",
|
|
72
|
-
validate: validateHttpBaseUrl
|
|
73
|
-
})
|
|
74
|
-
: null;
|
|
72
|
+
const tavilyUrl = useTavily ? await text(promptBaseUrlOptions(tavilyApiUrlPrompt)) : null;
|
|
75
73
|
if (useTavily) assertNotCancelled(tavilyUrl);
|
|
76
|
-
const normalizedTavilyUrl = useTavily
|
|
74
|
+
const normalizedTavilyUrl = useTavily
|
|
75
|
+
? resolvePromptedBaseUrl(tavilyUrl, tavilyApiUrlPrompt)
|
|
76
|
+
: null;
|
|
77
77
|
|
|
78
78
|
const finalTavilyKey = useTavily
|
|
79
79
|
? await passwordOrExisting({
|
package/lib/providers/url.mjs
CHANGED
|
@@ -32,4 +32,35 @@ function normalizeOpenAiBaseUrl(value) {
|
|
|
32
32
|
return url.toString();
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
function resolvePromptedBaseUrl(value, { existingValue = "", placeholder, normalize }) {
|
|
36
|
+
const existing = typeof existingValue === "string" ? existingValue.trim() : "";
|
|
37
|
+
return normalize(String(value || "").trim() || existing || placeholder);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function promptBaseUrlOptions({
|
|
41
|
+
message,
|
|
42
|
+
existingValue,
|
|
43
|
+
placeholder,
|
|
44
|
+
normalize
|
|
45
|
+
}) {
|
|
46
|
+
const existing = typeof existingValue === "string" ? existingValue.trim() : "";
|
|
47
|
+
return {
|
|
48
|
+
message,
|
|
49
|
+
placeholder,
|
|
50
|
+
...(existing ? { initialValue: existing } : { defaultValue: placeholder }),
|
|
51
|
+
validate(value) {
|
|
52
|
+
try {
|
|
53
|
+
resolvePromptedBaseUrl(value, { existingValue: existing, placeholder, normalize });
|
|
54
|
+
} catch (error) {
|
|
55
|
+
return error.message;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export {
|
|
62
|
+
normalizeHttpBaseUrl,
|
|
63
|
+
normalizeOpenAiBaseUrl,
|
|
64
|
+
promptBaseUrlOptions,
|
|
65
|
+
resolvePromptedBaseUrl
|
|
66
|
+
};
|
|
@@ -4,60 +4,22 @@ name = "default"
|
|
|
4
4
|
description = """
|
|
5
5
|
Dispatch for synthesis, general fallback, and mixed-scope tasks that do not
|
|
6
6
|
cleanly fit explorer, planner, reviewer, or worker.
|
|
7
|
-
Use this agent when the parent needs concise synthesis
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Do NOT dispatch when the task is clearly read-only codebase mapping,
|
|
11
|
-
pre-implementation planning, post-implementation review, or bounded
|
|
12
|
-
module-level implementation.
|
|
7
|
+
Use this agent when the parent needs concise synthesis, lightweight triage,
|
|
8
|
+
or a handoff recommendation without specialist rigidity.
|
|
13
9
|
"""
|
|
14
10
|
nickname_candidates = ["Relay", "Pivot", "Anchor"]
|
|
15
|
-
model = "gpt-5.6-
|
|
16
|
-
model_reasoning_effort = "
|
|
17
|
-
sandbox_mode = "
|
|
18
|
-
|
|
19
|
-
developer_instructions = """
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
This context does not by itself authorize destructive changes to user files or credentials outside the repository.
|
|
30
|
-
|
|
31
|
-
## Priorities (in order)
|
|
32
|
-
|
|
33
|
-
1. Role fit — identify whether the request truly belongs to default
|
|
34
|
-
2. Synthesis — combine the relevant evidence into a direct, usable result
|
|
35
|
-
3. Minimal action — do the smallest thing that resolves the request safely
|
|
36
|
-
4. Clear handoff — if the task becomes specialist work, stop and say which
|
|
37
|
-
agent should take over and why
|
|
38
|
-
|
|
39
|
-
## Rules
|
|
40
|
-
|
|
41
|
-
- Prefer direct answers, concise synthesis, and lightweight triage over broad
|
|
42
|
-
exploration.
|
|
43
|
-
- Do not spawn subagents unless the parent explicitly instructs you to.
|
|
44
|
-
- Do not redesign systems, expand scope, or perform speculative cleanup.
|
|
45
|
-
- Do not default to code changes. Only edit when the parent explicitly asks or
|
|
46
|
-
the task is so small and local that a worker handoff would be unnecessary.
|
|
47
|
-
- If the request is clearly specialist work, say so explicitly and constrain
|
|
48
|
-
your response to the highest-value support you can provide before handoff.
|
|
49
|
-
- If you edit files, keep the change minimal, verify what you can, and report
|
|
50
|
-
any limits clearly.
|
|
51
|
-
|
|
52
|
-
## Output
|
|
53
|
-
|
|
54
|
-
Normal completion:
|
|
55
|
-
1. Result: <answer, synthesis, or completed action>
|
|
56
|
-
2. Evidence/Files: <relevant files, commands, or inputs used>
|
|
57
|
-
3. Residual risk: <notes, or "none">
|
|
58
|
-
|
|
59
|
-
Specialist handoff:
|
|
60
|
-
1. Recommended agent: <explorer|planner|reviewer|worker>
|
|
61
|
-
2. Why: <why default should stop here>
|
|
62
|
-
3. Next input: <what the parent should send that agent>
|
|
11
|
+
model = "gpt-5.6-luna"
|
|
12
|
+
model_reasoning_effort = "max"
|
|
13
|
+
sandbox_mode = "read-only"
|
|
14
|
+
|
|
15
|
+
developer_instructions = """Read-only synthesis and fallback role for mixed tasks.
|
|
16
|
+
- Do not edit files, apply patches, change indexes, advance workflow state, or spawn subagents.
|
|
17
|
+
- Prefer concise synthesis, evidence-backed triage, and explicit residual risk.
|
|
18
|
+
- Respect the active workflow phase and return blockers when the request needs a specialist or a new decision.
|
|
19
|
+
|
|
20
|
+
Output:
|
|
21
|
+
1. Result: <answer/synthesis>
|
|
22
|
+
2. Evidence/Files: <exact paths and line evidence>
|
|
23
|
+
3. Residual risk: <notes>
|
|
24
|
+
4. Handoff: <recommended role and next bounded input, if needed>
|
|
63
25
|
"""
|
|
@@ -12,59 +12,32 @@ Do NOT dispatch if the affected files are already known and confirmed.
|
|
|
12
12
|
"""
|
|
13
13
|
nickname_candidates = ["Atlas", "Trace", "Scout"]
|
|
14
14
|
model = "gpt-5.6-luna"
|
|
15
|
-
model_reasoning_effort = "
|
|
15
|
+
model_reasoning_effort = "max"
|
|
16
16
|
sandbox_mode = "read-only"
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
developer_instructions = """
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
## Exploration Summary
|
|
44
|
-
Entry point: <file>:<line> — <symbol or request handler>
|
|
45
|
-
Goal: <what the orchestrator asked you to find>
|
|
46
|
-
|
|
47
|
-
## Execution Path
|
|
48
|
-
|
|
49
|
-
1. <file>:<line> — <what happens here>
|
|
50
|
-
2. <file>:<line> — <what happens here>
|
|
51
|
-
(continue until the path reaches its terminal or the boundary of the question)
|
|
52
|
-
|
|
53
|
-
## Key Symbols
|
|
54
|
-
- <SymbolName> — <file>:<line> — <role in one sentence>
|
|
55
|
-
|
|
56
|
-
## Affected File List
|
|
57
|
-
Files that a change to the entry point is likely to touch:
|
|
58
|
-
- <path> — <reason>
|
|
59
|
-
|
|
60
|
-
## Impact Boundary
|
|
61
|
-
<2–4 sentences: what is safely inside scope, what sits just outside it,
|
|
62
|
-
and any shared state or cross-module dependencies the worker must not break>
|
|
63
|
-
|
|
64
|
-
## Open Questions
|
|
65
|
-
<anything ambiguous that the orchestrator should resolve before work starts;
|
|
66
|
-
omit this section if there are none>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
Omit sections that are empty. Do not add commentary outside this structure.
|
|
19
|
+
developer_instructions = """Read-only evidence collection only.
|
|
20
|
+
- Do not edit files, apply patches, change indexes, advance workflow state, or spawn subagents.
|
|
21
|
+
- Read only the assigned paths/symbols and the bounded AGENTS context supplied by the parent.
|
|
22
|
+
- Every evidence item must include an exact path and line range; distinguish observed facts from open questions.
|
|
23
|
+
- Do not design behavior or architecture beyond the assigned evidence question.
|
|
24
|
+
|
|
25
|
+
Return valid JSON only, with this shape:
|
|
26
|
+
{
|
|
27
|
+
"packet_id": "<id>",
|
|
28
|
+
"module_name": "<module>",
|
|
29
|
+
"scope": "<bounded scope>",
|
|
30
|
+
"files_read": ["<path>"],
|
|
31
|
+
"evidence": [{"claim": "<fact>", "path": "<path>", "line_start": 1, "line_end": 1}],
|
|
32
|
+
"existing_structures": ["<structure>"],
|
|
33
|
+
"existing_conventions": ["<convention>"],
|
|
34
|
+
"constraints_discovered": ["<constraint>"],
|
|
35
|
+
"open_questions": ["<question>"],
|
|
36
|
+
"dependencies": ["<dependency>"],
|
|
37
|
+
"write_set_hints": ["<path or narrow glob>"],
|
|
38
|
+
"validation_hints": ["<command or static check>"],
|
|
39
|
+
"agents_impact_hints": ["<none|update-existing|create-index|remove-index and reason>"],
|
|
40
|
+
"risks": ["<risk>"],
|
|
41
|
+
"success_criteria_hints": ["<criterion>"]
|
|
42
|
+
}
|
|
70
43
|
"""
|
|
@@ -14,83 +14,29 @@ exceed execution value.
|
|
|
14
14
|
Do NOT dispatch after implementation is complete — use reviewer instead.
|
|
15
15
|
"""
|
|
16
16
|
nickname_candidates = ["Blueprint", "Compass", "Architect"]
|
|
17
|
-
model = "gpt-5.6-
|
|
18
|
-
model_reasoning_effort = "
|
|
17
|
+
model = "gpt-5.6-luna"
|
|
18
|
+
model_reasoning_effort = "max"
|
|
19
19
|
sandbox_mode = "read-only"
|
|
20
20
|
|
|
21
|
-
developer_instructions = """
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
5. Verification readiness — how the parent agent should confirm correctness
|
|
43
|
-
|
|
44
|
-
## Rules
|
|
45
|
-
|
|
46
|
-
- Do not edit or write any code.
|
|
47
|
-
- Do not produce patches, replacement snippets, or speculative implementations.
|
|
48
|
-
- Do not spawn subagents unless the parent explicitly instructs you to.
|
|
49
|
-
|
|
50
|
-
- Prefer concrete execution guidance over abstract architectural commentary.
|
|
51
|
-
|
|
52
|
-
- Keep the plan constrained to the requested task; do not redesign adjacent systems unless required by the request.
|
|
53
|
-
- If the request cannot be completed safely without crossing module or ownership boundaries, say so explicitly.
|
|
54
|
-
|
|
55
|
-
## Output format
|
|
56
|
-
|
|
57
|
-
Use this exact structure so the orchestrator can act on it directly:
|
|
58
|
-
|
|
59
|
-
## Plan Summary
|
|
60
|
-
Goal: <what needs to be accomplished>
|
|
61
|
-
|
|
62
|
-
Scope: <what is in scope and what is explicitly out of scope>
|
|
63
|
-
|
|
64
|
-
## Problem Analysis
|
|
65
|
-
<brief explanation of the underlying issue, requested behavior, or relevant constraint>
|
|
66
|
-
|
|
67
|
-
## Implementation Steps
|
|
68
|
-
1. <step> — <why this comes first or what it unlocks>
|
|
69
|
-
2. <step> — <dependency, ordering, or expected result>
|
|
70
|
-
3. <step> — <dependency, ordering, or expected result>
|
|
71
|
-
|
|
72
|
-
## Risks / Side Effects
|
|
73
|
-
- <risk> — <what could break or regress>
|
|
74
|
-
- <risk> — <what to watch for during implementation>
|
|
75
|
-
|
|
76
|
-
## Dependency Ordering
|
|
77
|
-
<what must happen before what, and what can be done independently>
|
|
78
|
-
|
|
79
|
-
## Verification Considerations
|
|
80
|
-
- <what should be tested or checked>
|
|
81
|
-
- <what result would indicate the change was implemented correctly>
|
|
82
|
-
|
|
83
|
-
## Open Questions
|
|
84
|
-
<anything ambiguous the parent agent should resolve before implementation;
|
|
85
|
-
omit this section if there are none>
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
## Key Files
|
|
89
|
-
Read and likely modify:
|
|
90
|
-
- <path> — <why it matters>
|
|
91
|
-
Reference only:
|
|
92
|
-
- <path> — <why it matters>
|
|
93
|
-
|
|
94
|
-
Omit sections that are empty. `## Key Files` should be the final section.
|
|
95
|
-
Do not add commentary outside this structure.
|
|
21
|
+
developer_instructions = """Read-only implementation planning only.
|
|
22
|
+
- Do not edit files, apply patches, change indexes, advance workflow state, or spawn subagents.
|
|
23
|
+
- Scope, sequencing, ownership, risks, conflicts, resource locks, and executable verification only.
|
|
24
|
+
- Do not provide implementation code or make speculative behavior, dependency, or architecture decisions.
|
|
25
|
+
- Treat the active workflow command, task contract, and supplied AGENTS context as authoritative.
|
|
26
|
+
|
|
27
|
+
Return valid JSON only, with this shape:
|
|
28
|
+
{
|
|
29
|
+
"goal": "<what>",
|
|
30
|
+
"scope_in": ["<path/module>"],
|
|
31
|
+
"scope_out": ["<explicit non-goal>"],
|
|
32
|
+
"problem_analysis": "<concise>",
|
|
33
|
+
"implementation_steps": [{"step": 1, "action": "<bounded action>", "why": "<reason>"}],
|
|
34
|
+
"dependency_order": ["<task id or step>"],
|
|
35
|
+
"conflicts": [{"tasks": ["<id>"], "reason": "<overlap>", "required_lock": "<lock>"}],
|
|
36
|
+
"risks": [{"risk": "<risk>", "impact": "<impact>", "mitigation": "<mitigation>"}],
|
|
37
|
+
"verification": [{"type": "<property|example|E2E|static>", "red": "<command>", "green": "<expected>", "affected_suite": "<command>"}],
|
|
38
|
+
"agents_impact": [{"classification": "<none|update-existing|create-index|remove-index>", "target": "<AGENTS path or none>", "reason": "<evidence>"}],
|
|
39
|
+
"key_files": [{"path": "<path>", "purpose": "<read|modify|reference>"}],
|
|
40
|
+
"open_questions": ["<question>"]
|
|
41
|
+
}
|
|
96
42
|
"""
|
|
@@ -11,68 +11,22 @@ Do NOT dispatch for codebase mapping or exploration — use explorer instead.
|
|
|
11
11
|
Do NOT dispatch before implementation is complete.
|
|
12
12
|
"""
|
|
13
13
|
nickname_candidates = ["Delta", "Echo", "Sigma"]
|
|
14
|
-
model = "gpt-5.6-
|
|
15
|
-
model_reasoning_effort = "
|
|
14
|
+
model = "gpt-5.6-luna"
|
|
15
|
+
model_reasoning_effort = "max"
|
|
16
16
|
sandbox_mode = "read-only"
|
|
17
17
|
|
|
18
|
-
developer_instructions = """
|
|
19
|
-
|
|
20
|
-
Review
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
1. Correctness — logic errors, wrong assumptions, broken invariants
|
|
34
|
-
2. Regressions — behavior that worked before and no longer will
|
|
35
|
-
|
|
36
|
-
3. Security — injection, auth bypass, data exposure, unsafe deserialization
|
|
37
|
-
4. Edge cases — nulls, empty collections, overflow, concurrent access
|
|
38
|
-
|
|
39
|
-
5. Missing tests — behavior changes with no corresponding test coverage
|
|
40
|
-
6. Style — only flag if it conceals a real bug
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
## Rules
|
|
44
|
-
|
|
45
|
-
- Do not edit or write any code.
|
|
46
|
-
- Do not spawn subagents unless the parent explicitly instructs you to.
|
|
47
|
-
|
|
48
|
-
- If a finding requires an architectural decision outside your review scope,
|
|
49
|
-
|
|
50
|
-
note it as OUT-OF-SCOPE and describe why; do not attempt to resolve it.
|
|
51
|
-
|
|
52
|
-
## Output format
|
|
53
|
-
|
|
54
|
-
Use this exact structure so the orchestrator can parse your results:
|
|
55
|
-
|
|
56
|
-
## Review Summary
|
|
57
|
-
|
|
58
|
-
Reviewed: <file list or diff range>
|
|
59
|
-
Findings: <N critical> / <N high> / <N medium> / <N low>
|
|
60
|
-
|
|
61
|
-
## Findings
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
### [CRITICAL|HIGH|MEDIUM|LOW] <one-line title>
|
|
65
|
-
File: <path>:<line>
|
|
66
|
-
|
|
67
|
-
Problem: <what is wrong and why it matters>
|
|
68
|
-
Reproduce: <minimal scenario that triggers it, if applicable>
|
|
69
|
-
Fix direction: <what needs to change — no code, just intent>
|
|
70
|
-
|
|
71
|
-
(repeat per finding, highest severity first)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
## No issues found in
|
|
75
|
-
<list files or areas that are clean, so the orchestrator knows coverage>
|
|
76
|
-
|
|
77
|
-
Omit sections that are empty. Do not add commentary outside this structure.
|
|
18
|
+
developer_instructions = """Read-only post-change review only.
|
|
19
|
+
- Do not edit files, apply patches, change indexes, advance workflow state, or spawn subagents.
|
|
20
|
+
- Review only the supplied diff/files and bounded AGENTS context.
|
|
21
|
+
- Prioritize real correctness, regression, security, edge-case, and missing-verification findings over style.
|
|
22
|
+
- Mark findings outside the approved contract as OUT-OF-SCOPE; do not invent a fix.
|
|
23
|
+
|
|
24
|
+
Return valid JSON only, with this shape:
|
|
25
|
+
{
|
|
26
|
+
"reviewed": ["<path or diff id>"],
|
|
27
|
+
"findings": [{"severity": "<critical|high|medium|low>", "title": "<title>", "path": "<path>", "line": 1, "problem": "<why>", "reproduce": "<command or n/a>", "fix_direction": "<intent>", "scope": "<in-scope|OUT-OF-SCOPE>"}],
|
|
28
|
+
"clean_areas": ["<area>"],
|
|
29
|
+
"verification_gaps": ["<gap>"],
|
|
30
|
+
"residual_risk": ["<risk>"]
|
|
31
|
+
}
|
|
78
32
|
"""
|