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.
Files changed (63) hide show
  1. package/README.md +26 -25
  2. package/extensions/gpt-responses-compat.ts +166 -27
  3. package/lib/cli/main.mjs +18 -86
  4. package/lib/cli/pi.mjs +43 -0
  5. package/lib/cli/prompts.mjs +3 -3
  6. package/lib/installer/assets.mjs +35 -31
  7. package/lib/installer/install.mjs +29 -9
  8. package/lib/installer/links.mjs +97 -84
  9. package/lib/paths.mjs +0 -2
  10. package/lib/providers/claude.mjs +14 -3
  11. package/lib/providers/codex.mjs +14 -9
  12. package/lib/providers/pi.mjs +61 -68
  13. package/lib/providers/skills.mjs +22 -22
  14. package/lib/providers/url.mjs +32 -1
  15. package/lib/templates/codex/agents/default.toml +16 -54
  16. package/lib/templates/codex/agents/explorer.toml +25 -52
  17. package/lib/templates/codex/agents/planner.toml +23 -77
  18. package/lib/templates/codex/agents/reviewer.toml +16 -62
  19. package/lib/templates/codex/agents/worker.toml +30 -64
  20. package/lib/templates/codex/config-base.toml +0 -6
  21. package/lib/templates/{workflow/gitignore.template → gitignore.template} +0 -3
  22. package/lib/tools/cli-installer.mjs +40 -12
  23. package/package.json +13 -18
  24. package/lib/templates/workflow/AGENTS.md +0 -50
  25. package/lib/templates/workflow/commands/abel-design.md +0 -175
  26. package/lib/templates/workflow/commands/abel-diagnose.md +0 -63
  27. package/lib/templates/workflow/commands/abel-implement.md +0 -170
  28. package/lib/templates/workflow/commands/abel-init.md +0 -25
  29. package/skills/dev-browser/SKILL.md +0 -281
  30. package/skills/dev-browser/dist/scripts/start.d.ts +0 -1
  31. package/skills/dev-browser/dist/scripts/start.js +0 -90
  32. package/skills/dev-browser/dist/src/client.d.ts +0 -92
  33. package/skills/dev-browser/dist/src/client.js +0 -310
  34. package/skills/dev-browser/dist/src/entrypoint.d.ts +0 -29
  35. package/skills/dev-browser/dist/src/entrypoint.js +0 -113
  36. package/skills/dev-browser/dist/src/index.d.ts +0 -3
  37. package/skills/dev-browser/dist/src/index.js +0 -1
  38. package/skills/dev-browser/dist/src/page-api.d.ts +0 -24
  39. package/skills/dev-browser/dist/src/page-api.js +0 -103
  40. package/skills/dev-browser/dist/src/relay.d.ts +0 -26
  41. package/skills/dev-browser/dist/src/relay.js +0 -567
  42. package/skills/dev-browser/dist/src/runtime.d.ts +0 -34
  43. package/skills/dev-browser/dist/src/runtime.js +0 -44
  44. package/skills/dev-browser/dist/src/snapshot/browser-script.d.ts +0 -22
  45. package/skills/dev-browser/dist/src/snapshot/browser-script.js +0 -868
  46. package/skills/dev-browser/dist/src/snapshot/index.d.ts +0 -13
  47. package/skills/dev-browser/dist/src/snapshot/index.js +0 -13
  48. package/skills/dev-browser/dist/src/snapshot/inject.d.ts +0 -12
  49. package/skills/dev-browser/dist/src/snapshot/inject.js +0 -12
  50. package/skills/dev-browser/dist/src/standalone.d.ts +0 -31
  51. package/skills/dev-browser/dist/src/standalone.js +0 -173
  52. package/skills/dev-browser/dist/src/startup.d.ts +0 -46
  53. package/skills/dev-browser/dist/src/startup.js +0 -77
  54. package/skills/dev-browser/dist/src/target-registry.d.ts +0 -28
  55. package/skills/dev-browser/dist/src/target-registry.js +0 -134
  56. package/skills/dev-browser/dist/src/types.d.ts +0 -26
  57. package/skills/dev-browser/dist/src/types.js +0 -1
  58. package/skills/dev-browser/package-lock.json +0 -1545
  59. package/skills/dev-browser/package.json +0 -35
  60. package/skills/dev-browser/references/scraping.md +0 -144
  61. package/skills/git-commit/SKILL.md +0 -124
  62. package/skills/time/SKILL.md +0 -119
  63. package/skills/time/scripts/time_cli.py +0 -143
@@ -5,7 +5,11 @@ import {
5
5
  readJsoncFileSafe,
6
6
  withFileTransaction
7
7
  } from "../config/store.mjs";
8
- import { normalizeOpenAiBaseUrl } from "./url.mjs";
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 configurePiApi(paths, withExtensionsPresent, promptApi, runtime = {}) {
353
- if (typeof withExtensionsPresent !== "function") {
354
- throw new TypeError("Expected a Pi Extensions deployment function");
355
- }
356
- return withExtensionsPresent(paths, async (guard) => {
357
- await guard();
358
- const text = runtime.text ?? p.text;
359
- const {
360
- assertNotCancelled,
361
- passwordOrExisting,
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
- const apiOptions = getPiApiPromptOptions();
384
- const initialApi = apiOptions.some((option) => option.value === existing.api)
385
- ? existing.api
386
- : undefined;
387
- const api = inferredApi || await selectOrCancel({
388
- message: `${providerLabel} API 类型`,
389
- options: apiOptions,
390
- ...(initialApi ? { initialValue: initialApi } : {})
391
- });
392
- const apiKey = await passwordOrExisting({
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
- const modelIdsText = await text({
398
- message: `${providerLabel} 模型 ID(多个用逗号分隔)`,
399
- initialValue: existing.modelIds.join(",") || undefined,
400
- validate: (value) => parsePiModelIds(value).length ? undefined : "至少需要一个模型 ID"
401
- });
402
- assertNotCancelled(modelIdsText);
403
- const modelIds = parsePiModelIds(modelIdsText);
404
- const defaultModel = await text({
405
- message: "Pi 默认模型",
406
- initialValue: modelIds.includes(existing.defaultModel) ? existing.defaultModel : modelIds[0],
407
- validate: (value) => modelIds.includes(String(value || "").trim())
408
- ? undefined
409
- : "默认模型必须在模型 ID 列表中"
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
- await guard();
414
- await persistPiConfiguration(paths, {
415
- apiKey,
416
- baseUrl,
417
- api,
418
- modelIds,
419
- defaultModel: String(defaultModel).trim()
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
- configurePiApi,
421
+ promptPiConfiguration,
429
422
  getPiApiPromptOptions,
430
423
  inferPiApiFromBaseUrl,
431
424
  normalizeOpenAiBaseUrl,
@@ -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 { normalizeHttpBaseUrl } from "./url.mjs";
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 baseUrlInput = await text({
38
+ const grokApiUrlPrompt = {
43
39
  message: "Grok API URL",
44
- initialValue: existing.GROK_API_URL || "https://api.x.ai/v1",
45
- validate: validateHttpBaseUrl
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 = normalizeHttpBaseUrl(baseUrlInput);
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 ? normalizeHttpBaseUrl(tavilyUrl) : null;
74
+ const normalizedTavilyUrl = useTavily
75
+ ? resolvePromptedBaseUrl(tavilyUrl, tavilyApiUrlPrompt)
76
+ : null;
77
77
 
78
78
  const finalTavilyKey = useTavily
79
79
  ? await passwordOrExisting({
@@ -32,4 +32,35 @@ function normalizeOpenAiBaseUrl(value) {
32
32
  return url.toString();
33
33
  }
34
34
 
35
- export { normalizeHttpBaseUrl, normalizeOpenAiBaseUrl };
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 across findings,
8
- lightweight triage, or a handoff recommendation without specialist rigidity.
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-sol"
16
- model_reasoning_effort = "high"
17
- sandbox_mode = "workspace-write"
18
-
19
- developer_instructions = """
20
- You are the general-purpose fallback sub-agent. Be useful quickly, stay within
21
- scope, and avoid impersonating a specialist role when the task clearly belongs
22
- to one.
23
-
24
- ## Development Context
25
-
26
- Development context: work is currently in the development phase, and this is a development repository.
27
- Do not retain runtime user state in the repository or shipped artifacts, and do not preserve compatibility layers for unreleased behavior.
28
- Prefer deleting obsolete code paths; keep code and prompts concise and avoid over-engineering.
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 = "high"
15
+ model_reasoning_effort = "max"
16
16
  sandbox_mode = "read-only"
17
17
 
18
18
 
19
- developer_instructions = """
20
- Your only job is to map. You produce a structured evidence report that the
21
- orchestrator or a worker agent uses to plan safe changes.
22
-
23
- ## Development Context
24
-
25
- Development context: work is currently in the development phase, and this is a development repository.
26
- Do not retain runtime user state in the repository or shipped artifacts, and do not preserve compatibility layers for unreleased behavior.
27
- Prefer deleting obsolete code paths; keep code and prompts concise and avoid over-engineering.
28
- This context does not by itself authorize destructive changes to user files or credentials outside the repository.
29
-
30
- ## Rules
31
-
32
- - Do not edit any file, ever.
33
- - Do not propose fixes or refactors unless the parent explicitly asks.
34
-
35
- - Do not spawn subagents unless the parent explicitly instructs you to.
36
- - Prefer targeted file reads and symbol searches over broad directory scans.
37
- - Every claim must cite an exact file and line number. No approximations.
38
-
39
- ## Output format
40
-
41
- Use this exact structure:
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-sol"
18
- model_reasoning_effort = "high"
17
+ model = "gpt-5.6-luna"
18
+ model_reasoning_effort = "max"
19
19
  sandbox_mode = "read-only"
20
20
 
21
- developer_instructions = """
22
- Plan like the engineer who will be responsible for getting the change shipped
23
- safely, not like someone writing a design essay.
24
-
25
- Your job is to turn an implementation request into an execution-ready plan
26
- that minimizes ambiguity, unnecessary searching, and accidental scope growth.
27
-
28
- ## Development Context
29
-
30
- Development context: work is currently in the development phase, and this is a development repository.
31
- Do not retain runtime user state in the repository or shipped artifacts, and do not preserve compatibility layers for unreleased behavior.
32
- Prefer deleting obsolete code paths; keep code and prompts concise and avoid over-engineering.
33
- This context does not by itself authorize destructive changes to user files or credentials outside the repository.
34
-
35
- ## Priorities (in order)
36
-
37
- 1. Scope clarity what is actually being changed and what is not
38
- 2. Safe sequencing what must happen first, and what depends on what
39
- 3. File targeting which files matter most for execution
40
-
41
- 4. Risk visibility — what could break, regress, or expand scope
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-sol"
15
- model_reasoning_effort = "xhigh"
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 code like an owner who will be on-call for what ships.
21
- Your job is to find real problems, not to demonstrate thoroughness.
22
-
23
- ## Development Context
24
-
25
- Development context: work is currently in the development phase, and this is a development repository.
26
- Do not retain runtime user state in the repository or shipped artifacts, and do not preserve compatibility layers for unreleased behavior.
27
- Prefer deleting obsolete code paths; keep code and prompts concise and avoid over-engineering.
28
- This context does not by itself authorize destructive changes to user files or credentials outside the repository.
29
-
30
-
31
- ## Priorities (in order)
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
  """