add skills
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"run_id": "eval-3-without_skill",
|
||||
"expectations": [
|
||||
{"text": "Plan uses git worktree in a sibling directory", "passed": false, "evidence": "git checkout -b only, no worktree"},
|
||||
{"text": "Uses 2+ commits for the multi-file refactor", "passed": false, "evidence": "Single atomic commit: 'refactor: split delegate-task constants and category model requirements'"},
|
||||
{"text": "Maintains backward compatibility via barrel re-export", "passed": true, "evidence": "Re-exports from new files, zero consumer changes"},
|
||||
{"text": "Verification loop includes all 3 gates", "passed": false, "evidence": "Only mentions typecheck/test/build. No review-work or Cubic."},
|
||||
{"text": "References actual src/tools/delegate-task/constants.ts", "passed": true, "evidence": "654 lines, detailed responsibility breakdown, full import maps"}
|
||||
]
|
||||
}
|
||||
+342
@@ -0,0 +1,342 @@
|
||||
# Code Changes
|
||||
|
||||
## 1. NEW: `src/tools/delegate-task/default-categories.ts`
|
||||
|
||||
```typescript
|
||||
import type { CategoryConfig } from "../../config/schema"
|
||||
|
||||
export const DEFAULT_CATEGORIES: Record<string, CategoryConfig> = {
|
||||
"visual-engineering": { model: "google/gemini-3.1-pro", variant: "high" },
|
||||
ultrabrain: { model: "openai/gpt-5.4", variant: "xhigh" },
|
||||
deep: { model: "openai/gpt-5.3-codex", variant: "medium" },
|
||||
artistry: { model: "google/gemini-3.1-pro", variant: "high" },
|
||||
quick: { model: "anthropic/claude-haiku-4-5" },
|
||||
"unspecified-low": { model: "anthropic/claude-sonnet-4-6" },
|
||||
"unspecified-high": { model: "anthropic/claude-opus-4-6", variant: "max" },
|
||||
writing: { model: "kimi-for-coding/k2p5" },
|
||||
}
|
||||
```
|
||||
|
||||
## 2. NEW: `src/tools/delegate-task/category-descriptions.ts`
|
||||
|
||||
```typescript
|
||||
export const CATEGORY_DESCRIPTIONS: Record<string, string> = {
|
||||
"visual-engineering": "Frontend, UI/UX, design, styling, animation",
|
||||
ultrabrain: "Use ONLY for genuinely hard, logic-heavy tasks. Give clear goals only, not step-by-step instructions.",
|
||||
deep: "Goal-oriented autonomous problem-solving. Thorough research before action. For hairy problems requiring deep understanding.",
|
||||
artistry: "Complex problem-solving with unconventional, creative approaches - beyond standard patterns",
|
||||
quick: "Trivial tasks - single file changes, typo fixes, simple modifications",
|
||||
"unspecified-low": "Tasks that don't fit other categories, low effort required",
|
||||
"unspecified-high": "Tasks that don't fit other categories, high effort required",
|
||||
writing: "Documentation, prose, technical writing",
|
||||
}
|
||||
```
|
||||
|
||||
## 3. NEW: `src/tools/delegate-task/category-prompt-appends.ts`
|
||||
|
||||
```typescript
|
||||
export const VISUAL_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
||||
You are working on VISUAL/UI tasks.
|
||||
...
|
||||
</Category_Context>`
|
||||
|
||||
export const ULTRABRAIN_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
||||
You are working on DEEP LOGICAL REASONING / COMPLEX ARCHITECTURE tasks.
|
||||
...
|
||||
</Category_Context>`
|
||||
|
||||
export const ARTISTRY_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
||||
You are working on HIGHLY CREATIVE / ARTISTIC tasks.
|
||||
...
|
||||
</Category_Context>`
|
||||
|
||||
export const QUICK_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
||||
You are working on SMALL / QUICK tasks.
|
||||
...
|
||||
</Caller_Warning>`
|
||||
|
||||
export const UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
||||
You are working on tasks that don't fit specific categories but require moderate effort.
|
||||
...
|
||||
</Caller_Warning>`
|
||||
|
||||
export const UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
||||
You are working on tasks that don't fit specific categories but require substantial effort.
|
||||
...
|
||||
</Category_Context>`
|
||||
|
||||
export const WRITING_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
||||
You are working on WRITING / PROSE tasks.
|
||||
...
|
||||
</Category_Context>`
|
||||
|
||||
export const DEEP_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
||||
You are working on GOAL-ORIENTED AUTONOMOUS tasks.
|
||||
...
|
||||
</Category_Context>`
|
||||
|
||||
export const CATEGORY_PROMPT_APPENDS: Record<string, string> = {
|
||||
"visual-engineering": VISUAL_CATEGORY_PROMPT_APPEND,
|
||||
ultrabrain: ULTRABRAIN_CATEGORY_PROMPT_APPEND,
|
||||
deep: DEEP_CATEGORY_PROMPT_APPEND,
|
||||
artistry: ARTISTRY_CATEGORY_PROMPT_APPEND,
|
||||
quick: QUICK_CATEGORY_PROMPT_APPEND,
|
||||
"unspecified-low": UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND,
|
||||
"unspecified-high": UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND,
|
||||
writing: WRITING_CATEGORY_PROMPT_APPEND,
|
||||
}
|
||||
```
|
||||
|
||||
> Note: Each `*_CATEGORY_PROMPT_APPEND` contains the full template string from the original. Abbreviated with `...` here for readability. The actual code would contain the complete unmodified prompt text.
|
||||
|
||||
## 4. NEW: `src/tools/delegate-task/plan-agent-prompt.ts`
|
||||
|
||||
```typescript
|
||||
import type {
|
||||
AvailableCategory,
|
||||
AvailableSkill,
|
||||
} from "../../agents/dynamic-agent-prompt-builder"
|
||||
import { truncateDescription } from "../../shared/truncate-description"
|
||||
|
||||
export const PLAN_AGENT_SYSTEM_PREPEND_STATIC_BEFORE_SKILLS = `<system>
|
||||
BEFORE you begin planning, you MUST first understand the user's request deeply.
|
||||
...
|
||||
</CRITICAL_REQUIREMENT_DEPENDENCY_PARALLEL_EXECUTION_CATEGORY_SKILLS>
|
||||
|
||||
<FINAL_OUTPUT_FOR_CALLER>
|
||||
...
|
||||
</FINAL_OUTPUT_FOR_CALLER>
|
||||
|
||||
`
|
||||
|
||||
export const PLAN_AGENT_SYSTEM_PREPEND_STATIC_AFTER_SKILLS = `### REQUIRED OUTPUT FORMAT
|
||||
...
|
||||
`
|
||||
|
||||
function renderPlanAgentCategoryRows(categories: AvailableCategory[]): string[] {
|
||||
const sorted = [...categories].sort((a, b) => a.name.localeCompare(b.name))
|
||||
return sorted.map((category) => {
|
||||
const bestFor = category.description || category.name
|
||||
const model = category.model || ""
|
||||
return `| \`${category.name}\` | ${bestFor} | ${model} |`
|
||||
})
|
||||
}
|
||||
|
||||
function renderPlanAgentSkillRows(skills: AvailableSkill[]): string[] {
|
||||
const sorted = [...skills].sort((a, b) => a.name.localeCompare(b.name))
|
||||
return sorted.map((skill) => {
|
||||
const domain = truncateDescription(skill.description).trim() || skill.name
|
||||
return `| \`${skill.name}\` | ${domain} |`
|
||||
})
|
||||
}
|
||||
|
||||
export function buildPlanAgentSkillsSection(
|
||||
categories: AvailableCategory[] = [],
|
||||
skills: AvailableSkill[] = []
|
||||
): string {
|
||||
const categoryRows = renderPlanAgentCategoryRows(categories)
|
||||
const skillRows = renderPlanAgentSkillRows(skills)
|
||||
|
||||
return `### AVAILABLE CATEGORIES
|
||||
|
||||
| Category | Best For | Model |
|
||||
|----------|----------|-------|
|
||||
${categoryRows.join("\n")}
|
||||
|
||||
### AVAILABLE SKILLS (ALWAYS EVALUATE ALL)
|
||||
|
||||
Skills inject specialized expertise into the delegated agent.
|
||||
YOU MUST evaluate EVERY skill and justify inclusions/omissions.
|
||||
|
||||
| Skill | Domain |
|
||||
|-------|--------|
|
||||
${skillRows.join("\n")}`
|
||||
}
|
||||
|
||||
export function buildPlanAgentSystemPrepend(
|
||||
categories: AvailableCategory[] = [],
|
||||
skills: AvailableSkill[] = []
|
||||
): string {
|
||||
return [
|
||||
PLAN_AGENT_SYSTEM_PREPEND_STATIC_BEFORE_SKILLS,
|
||||
buildPlanAgentSkillsSection(categories, skills),
|
||||
PLAN_AGENT_SYSTEM_PREPEND_STATIC_AFTER_SKILLS,
|
||||
].join("\n\n")
|
||||
}
|
||||
```
|
||||
|
||||
> Note: Template strings abbreviated with `...`. Full unmodified content in the actual file.
|
||||
|
||||
## 5. NEW: `src/tools/delegate-task/plan-agent-identity.ts`
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* List of agent names that should be treated as plan agents (receive plan system prompt).
|
||||
* Case-insensitive matching is used.
|
||||
*/
|
||||
export const PLAN_AGENT_NAMES = ["plan"]
|
||||
|
||||
/**
|
||||
* Check if the given agent name is a plan agent (receives plan system prompt).
|
||||
*/
|
||||
export function isPlanAgent(agentName: string | undefined): boolean {
|
||||
if (!agentName) return false
|
||||
const lowerName = agentName.toLowerCase().trim()
|
||||
return PLAN_AGENT_NAMES.some(name => lowerName === name || lowerName.includes(name))
|
||||
}
|
||||
|
||||
/**
|
||||
* Plan family: plan + prometheus. Shares mutual delegation blocking and task tool permission.
|
||||
* Does NOT share system prompt (only isPlanAgent controls that).
|
||||
*/
|
||||
export const PLAN_FAMILY_NAMES = ["plan", "prometheus"]
|
||||
|
||||
/**
|
||||
* Check if the given agent belongs to the plan family (blocking + task permission).
|
||||
*/
|
||||
export function isPlanFamily(category: string): boolean
|
||||
export function isPlanFamily(category: string | undefined): boolean
|
||||
export function isPlanFamily(category: string | undefined): boolean {
|
||||
if (!category) return false
|
||||
const lowerCategory = category.toLowerCase().trim()
|
||||
return PLAN_FAMILY_NAMES.some(
|
||||
(name) => lowerCategory === name || lowerCategory.includes(name)
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
## 6. MODIFIED: `src/tools/delegate-task/constants.ts` (barrel re-export)
|
||||
|
||||
```typescript
|
||||
export { DEFAULT_CATEGORIES } from "./default-categories"
|
||||
export { CATEGORY_DESCRIPTIONS } from "./category-descriptions"
|
||||
export {
|
||||
VISUAL_CATEGORY_PROMPT_APPEND,
|
||||
ULTRABRAIN_CATEGORY_PROMPT_APPEND,
|
||||
ARTISTRY_CATEGORY_PROMPT_APPEND,
|
||||
QUICK_CATEGORY_PROMPT_APPEND,
|
||||
UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND,
|
||||
UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND,
|
||||
WRITING_CATEGORY_PROMPT_APPEND,
|
||||
DEEP_CATEGORY_PROMPT_APPEND,
|
||||
CATEGORY_PROMPT_APPENDS,
|
||||
} from "./category-prompt-appends"
|
||||
export {
|
||||
PLAN_AGENT_SYSTEM_PREPEND_STATIC_BEFORE_SKILLS,
|
||||
PLAN_AGENT_SYSTEM_PREPEND_STATIC_AFTER_SKILLS,
|
||||
buildPlanAgentSkillsSection,
|
||||
buildPlanAgentSystemPrepend,
|
||||
} from "./plan-agent-prompt"
|
||||
export {
|
||||
PLAN_AGENT_NAMES,
|
||||
isPlanAgent,
|
||||
PLAN_FAMILY_NAMES,
|
||||
isPlanFamily,
|
||||
} from "./plan-agent-identity"
|
||||
```
|
||||
|
||||
## 7. NEW: `src/shared/category-model-requirements.ts`
|
||||
|
||||
```typescript
|
||||
import type { ModelRequirement } from "./model-requirements"
|
||||
|
||||
export const CATEGORY_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
|
||||
"visual-engineering": {
|
||||
fallbackChain: [
|
||||
{
|
||||
providers: ["google", "github-copilot", "opencode"],
|
||||
model: "gemini-3.1-pro",
|
||||
variant: "high",
|
||||
},
|
||||
{ providers: ["zai-coding-plan", "opencode"], model: "glm-5" },
|
||||
{
|
||||
providers: ["anthropic", "github-copilot", "opencode"],
|
||||
model: "claude-opus-4-6",
|
||||
variant: "max",
|
||||
},
|
||||
{ providers: ["opencode-go"], model: "glm-5" },
|
||||
{ providers: ["kimi-for-coding"], model: "k2p5" },
|
||||
],
|
||||
},
|
||||
ultrabrain: {
|
||||
fallbackChain: [
|
||||
// ... full content from original
|
||||
],
|
||||
},
|
||||
deep: {
|
||||
fallbackChain: [
|
||||
// ... full content from original
|
||||
],
|
||||
requiresModel: "gpt-5.3-codex",
|
||||
},
|
||||
artistry: {
|
||||
fallbackChain: [
|
||||
// ... full content from original
|
||||
],
|
||||
requiresModel: "gemini-3.1-pro",
|
||||
},
|
||||
quick: {
|
||||
fallbackChain: [
|
||||
// ... full content from original
|
||||
],
|
||||
},
|
||||
"unspecified-low": {
|
||||
fallbackChain: [
|
||||
// ... full content from original
|
||||
],
|
||||
},
|
||||
"unspecified-high": {
|
||||
fallbackChain: [
|
||||
// ... full content from original
|
||||
],
|
||||
},
|
||||
writing: {
|
||||
fallbackChain: [
|
||||
// ... full content from original
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
> Note: Each category's `fallbackChain` contains the exact same entries as the original `model-requirements.ts`. Abbreviated here.
|
||||
|
||||
## 8. MODIFIED: `src/shared/model-requirements.ts`
|
||||
|
||||
**Remove** `CATEGORY_MODEL_REQUIREMENTS` from the file body. **Add** re-export at the end:
|
||||
|
||||
```typescript
|
||||
export type FallbackEntry = {
|
||||
providers: string[];
|
||||
model: string;
|
||||
variant?: string;
|
||||
};
|
||||
|
||||
export type ModelRequirement = {
|
||||
fallbackChain: FallbackEntry[];
|
||||
variant?: string;
|
||||
requiresModel?: string;
|
||||
requiresAnyModel?: boolean;
|
||||
requiresProvider?: string[];
|
||||
};
|
||||
|
||||
export const AGENT_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
|
||||
// ... unchanged, full agent entries stay here
|
||||
};
|
||||
|
||||
export { CATEGORY_MODEL_REQUIREMENTS } from "./category-model-requirements"
|
||||
```
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
| File | Lines Before | Lines After | Action |
|
||||
|------|-------------|-------------|--------|
|
||||
| `constants.ts` | 654 | ~25 | Rewrite as barrel re-export |
|
||||
| `default-categories.ts` | - | ~15 | **NEW** |
|
||||
| `category-descriptions.ts` | - | ~12 | **NEW** |
|
||||
| `category-prompt-appends.ts` | - | ~280 | **NEW** (mostly exempt prompt text) |
|
||||
| `plan-agent-prompt.ts` | - | ~270 | **NEW** (mostly exempt prompt text) |
|
||||
| `plan-agent-identity.ts` | - | ~35 | **NEW** |
|
||||
| `model-requirements.ts` | 311 | ~165 | Remove CATEGORY_MODEL_REQUIREMENTS |
|
||||
| `category-model-requirements.ts` | - | ~150 | **NEW** |
|
||||
|
||||
**Zero consumer files modified.** Backward compatibility maintained through barrel re-exports.
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
# Execution Plan: Refactor constants.ts
|
||||
|
||||
## Context
|
||||
|
||||
`src/tools/delegate-task/constants.ts` is **654 lines** with 6 distinct responsibilities. Violates the 200 LOC modular-code-enforcement rule. `CATEGORY_MODEL_REQUIREMENTS` is actually in `src/shared/model-requirements.ts` (311 lines, also violating 200 LOC), not in `constants.ts`.
|
||||
|
||||
## Pre-Flight Analysis
|
||||
|
||||
### Current `constants.ts` responsibilities:
|
||||
1. **Category prompt appends** (8 template strings, ~274 LOC prompt text)
|
||||
2. **DEFAULT_CATEGORIES** (Record<string, CategoryConfig>, ~10 LOC)
|
||||
3. **CATEGORY_PROMPT_APPENDS** (map of category->prompt, ~10 LOC)
|
||||
4. **CATEGORY_DESCRIPTIONS** (map of category->description, ~10 LOC)
|
||||
5. **Plan agent prompts** (2 template strings + 4 builder functions, ~250 LOC prompt text)
|
||||
6. **Plan agent identity utils** (`isPlanAgent`, `isPlanFamily`, ~30 LOC)
|
||||
|
||||
### Current `model-requirements.ts` responsibilities:
|
||||
1. Types (`FallbackEntry`, `ModelRequirement`)
|
||||
2. `AGENT_MODEL_REQUIREMENTS` (~146 LOC)
|
||||
3. `CATEGORY_MODEL_REQUIREMENTS` (~148 LOC)
|
||||
|
||||
### Import dependency map for `constants.ts`:
|
||||
|
||||
**Internal consumers (within delegate-task/):**
|
||||
| File | Imports |
|
||||
|------|---------|
|
||||
| `categories.ts` | `DEFAULT_CATEGORIES`, `CATEGORY_PROMPT_APPENDS` |
|
||||
| `tools.ts` | `CATEGORY_DESCRIPTIONS` |
|
||||
| `tools.test.ts` | `DEFAULT_CATEGORIES`, `CATEGORY_PROMPT_APPENDS`, `CATEGORY_DESCRIPTIONS`, `isPlanAgent`, `PLAN_AGENT_NAMES`, `isPlanFamily`, `PLAN_FAMILY_NAMES` |
|
||||
| `prompt-builder.ts` | `buildPlanAgentSystemPrepend`, `isPlanAgent` |
|
||||
| `subagent-resolver.ts` | `isPlanFamily` |
|
||||
| `sync-continuation.ts` | `isPlanFamily` |
|
||||
| `sync-prompt-sender.ts` | `isPlanFamily` |
|
||||
| `index.ts` | `export * from "./constants"` (barrel) |
|
||||
|
||||
**External consumers (import from `"../../tools/delegate-task/constants"`):**
|
||||
| File | Imports |
|
||||
|------|---------|
|
||||
| `agents/atlas/prompt-section-builder.ts` | `CATEGORY_DESCRIPTIONS` |
|
||||
| `agents/builtin-agents.ts` | `CATEGORY_DESCRIPTIONS` |
|
||||
| `plugin/available-categories.ts` | `CATEGORY_DESCRIPTIONS` |
|
||||
| `plugin-handlers/category-config-resolver.ts` | `DEFAULT_CATEGORIES` |
|
||||
| `shared/merge-categories.ts` | `DEFAULT_CATEGORIES` |
|
||||
| `shared/merge-categories.test.ts` | `DEFAULT_CATEGORIES` |
|
||||
|
||||
**External consumers of `CATEGORY_MODEL_REQUIREMENTS`:**
|
||||
| File | Import path |
|
||||
|------|-------------|
|
||||
| `tools/delegate-task/categories.ts` | `../../shared/model-requirements` |
|
||||
|
||||
## Step-by-Step Execution
|
||||
|
||||
### Step 1: Create branch
|
||||
```bash
|
||||
git checkout -b refactor/split-category-constants dev
|
||||
```
|
||||
|
||||
### Step 2: Split `constants.ts` into 5 focused files
|
||||
|
||||
#### 2a. Create `default-categories.ts`
|
||||
- Move `DEFAULT_CATEGORIES` record
|
||||
- Import `CategoryConfig` type from config schema
|
||||
- ~15 LOC
|
||||
|
||||
#### 2b. Create `category-descriptions.ts`
|
||||
- Move `CATEGORY_DESCRIPTIONS` record
|
||||
- No dependencies
|
||||
- ~12 LOC
|
||||
|
||||
#### 2c. Create `category-prompt-appends.ts`
|
||||
- Move all 8 `*_CATEGORY_PROMPT_APPEND` template string constants
|
||||
- Move `CATEGORY_PROMPT_APPENDS` mapping record
|
||||
- No dependencies (all self-contained template strings)
|
||||
- ~280 LOC (mostly prompt text, exempt from 200 LOC per modular-code-enforcement)
|
||||
|
||||
#### 2d. Create `plan-agent-prompt.ts`
|
||||
- Move `PLAN_AGENT_SYSTEM_PREPEND_STATIC_BEFORE_SKILLS`
|
||||
- Move `PLAN_AGENT_SYSTEM_PREPEND_STATIC_AFTER_SKILLS`
|
||||
- Move `renderPlanAgentCategoryRows()`, `renderPlanAgentSkillRows()`
|
||||
- Move `buildPlanAgentSkillsSection()`, `buildPlanAgentSystemPrepend()`
|
||||
- Imports: `AvailableCategory`, `AvailableSkill` from agents, `truncateDescription` from shared
|
||||
- ~270 LOC (mostly prompt text, exempt)
|
||||
|
||||
#### 2e. Create `plan-agent-identity.ts`
|
||||
- Move `PLAN_AGENT_NAMES`, `isPlanAgent()`
|
||||
- Move `PLAN_FAMILY_NAMES`, `isPlanFamily()`
|
||||
- No dependencies
|
||||
- ~35 LOC
|
||||
|
||||
### Step 3: Convert `constants.ts` to barrel re-export file
|
||||
Replace entire contents with re-exports from the 5 new files. This maintains 100% backward compatibility for all existing importers.
|
||||
|
||||
### Step 4: Split `model-requirements.ts`
|
||||
|
||||
#### 4a. Create `src/shared/category-model-requirements.ts`
|
||||
- Move `CATEGORY_MODEL_REQUIREMENTS` record
|
||||
- Import `ModelRequirement` type from `./model-requirements`
|
||||
- ~150 LOC
|
||||
|
||||
#### 4b. Update `model-requirements.ts`
|
||||
- Remove `CATEGORY_MODEL_REQUIREMENTS`
|
||||
- Add re-export: `export { CATEGORY_MODEL_REQUIREMENTS } from "./category-model-requirements"`
|
||||
- Keep types (`FallbackEntry`, `ModelRequirement`) and `AGENT_MODEL_REQUIREMENTS`
|
||||
- ~165 LOC (now under 200)
|
||||
|
||||
### Step 5: Verify no import breakage
|
||||
- Run `bun run typecheck` to confirm all imports resolve
|
||||
- Run `bun test` to confirm no behavioral regressions
|
||||
- Run `bun run build` to confirm build succeeds
|
||||
|
||||
### Step 6: Verify LSP diagnostics clean
|
||||
- Check `lsp_diagnostics` on all new and modified files
|
||||
|
||||
### Step 7: Commit and create PR
|
||||
- Single atomic commit: `refactor: split delegate-task constants and category model requirements into focused modules`
|
||||
- Create PR with description
|
||||
|
||||
## Files Modified
|
||||
|
||||
| File | Action |
|
||||
|------|--------|
|
||||
| `src/tools/delegate-task/constants.ts` | Rewrite as barrel re-export |
|
||||
| `src/tools/delegate-task/default-categories.ts` | **NEW** |
|
||||
| `src/tools/delegate-task/category-descriptions.ts` | **NEW** |
|
||||
| `src/tools/delegate-task/category-prompt-appends.ts` | **NEW** |
|
||||
| `src/tools/delegate-task/plan-agent-prompt.ts` | **NEW** |
|
||||
| `src/tools/delegate-task/plan-agent-identity.ts` | **NEW** |
|
||||
| `src/shared/model-requirements.ts` | Remove CATEGORY_MODEL_REQUIREMENTS, add re-export |
|
||||
| `src/shared/category-model-requirements.ts` | **NEW** |
|
||||
|
||||
**Zero changes to any consumer files.** All existing imports work via barrel re-exports.
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
## Summary
|
||||
|
||||
- Split `src/tools/delegate-task/constants.ts` (654 LOC, 6 responsibilities) into 5 focused modules: `default-categories.ts`, `category-descriptions.ts`, `category-prompt-appends.ts`, `plan-agent-prompt.ts`, `plan-agent-identity.ts`
|
||||
- Extract `CATEGORY_MODEL_REQUIREMENTS` from `src/shared/model-requirements.ts` (311 LOC) into `category-model-requirements.ts`, bringing both files under the 200 LOC limit
|
||||
- Convert original files to barrel re-exports for 100% backward compatibility (zero consumer changes)
|
||||
|
||||
## Motivation
|
||||
|
||||
Both files violate the project's 200 LOC modular-code-enforcement rule. `constants.ts` mixed 6 unrelated responsibilities (category configs, prompt templates, plan agent builders, identity utils). `model-requirements.ts` mixed agent and category model requirements.
|
||||
|
||||
## Changes
|
||||
|
||||
### `src/tools/delegate-task/`
|
||||
| New File | Responsibility |
|
||||
|----------|---------------|
|
||||
| `default-categories.ts` | `DEFAULT_CATEGORIES` record |
|
||||
| `category-descriptions.ts` | `CATEGORY_DESCRIPTIONS` record |
|
||||
| `category-prompt-appends.ts` | 8 prompt template constants + `CATEGORY_PROMPT_APPENDS` map |
|
||||
| `plan-agent-prompt.ts` | Plan agent system prompts + builder functions |
|
||||
| `plan-agent-identity.ts` | `isPlanAgent`, `isPlanFamily` + name lists |
|
||||
|
||||
`constants.ts` is now a barrel re-export file (~25 LOC).
|
||||
|
||||
### `src/shared/`
|
||||
| New File | Responsibility |
|
||||
|----------|---------------|
|
||||
| `category-model-requirements.ts` | `CATEGORY_MODEL_REQUIREMENTS` record |
|
||||
|
||||
`model-requirements.ts` retains types + `AGENT_MODEL_REQUIREMENTS` and re-exports `CATEGORY_MODEL_REQUIREMENTS`.
|
||||
|
||||
## Backward Compatibility
|
||||
|
||||
All existing import paths (`from "./constants"`, `from "../../tools/delegate-task/constants"`, `from "../../shared/model-requirements"`) continue to work unchanged. Zero consumer files modified.
|
||||
|
||||
## Testing
|
||||
|
||||
- `bun run typecheck` passes
|
||||
- `bun test` passes (existing `tools.test.ts` validates all re-exported symbols)
|
||||
- `bun run build` succeeds
|
||||
+128
@@ -0,0 +1,128 @@
|
||||
# Verification Strategy
|
||||
|
||||
## 1. Type Safety
|
||||
|
||||
### 1a. LSP diagnostics on all new files
|
||||
```
|
||||
lsp_diagnostics("src/tools/delegate-task/default-categories.ts")
|
||||
lsp_diagnostics("src/tools/delegate-task/category-descriptions.ts")
|
||||
lsp_diagnostics("src/tools/delegate-task/category-prompt-appends.ts")
|
||||
lsp_diagnostics("src/tools/delegate-task/plan-agent-prompt.ts")
|
||||
lsp_diagnostics("src/tools/delegate-task/plan-agent-identity.ts")
|
||||
lsp_diagnostics("src/shared/category-model-requirements.ts")
|
||||
```
|
||||
|
||||
### 1b. LSP diagnostics on modified files
|
||||
```
|
||||
lsp_diagnostics("src/tools/delegate-task/constants.ts")
|
||||
lsp_diagnostics("src/shared/model-requirements.ts")
|
||||
```
|
||||
|
||||
### 1c. Full typecheck
|
||||
```bash
|
||||
bun run typecheck
|
||||
```
|
||||
Expected: 0 errors. This confirms all 14 consumer files (8 internal + 6 external) resolve their imports correctly through the barrel re-exports.
|
||||
|
||||
## 2. Behavioral Regression
|
||||
|
||||
### 2a. Existing test suite
|
||||
```bash
|
||||
bun test src/tools/delegate-task/tools.test.ts
|
||||
```
|
||||
This test file imports `DEFAULT_CATEGORIES`, `CATEGORY_PROMPT_APPENDS`, `CATEGORY_DESCRIPTIONS`, `isPlanAgent`, `PLAN_AGENT_NAMES`, `isPlanFamily`, `PLAN_FAMILY_NAMES` from `./constants`. If the barrel re-export is correct, all these tests pass unchanged.
|
||||
|
||||
### 2b. Category resolver tests
|
||||
```bash
|
||||
bun test src/tools/delegate-task/category-resolver.test.ts
|
||||
```
|
||||
This exercises `resolveCategoryConfig()` which imports `DEFAULT_CATEGORIES` and `CATEGORY_PROMPT_APPENDS` from `./constants` and `CATEGORY_MODEL_REQUIREMENTS` from `../../shared/model-requirements`.
|
||||
|
||||
### 2c. Model selection tests
|
||||
```bash
|
||||
bun test src/tools/delegate-task/model-selection.test.ts
|
||||
```
|
||||
|
||||
### 2d. Merge categories tests
|
||||
```bash
|
||||
bun test src/shared/merge-categories.test.ts
|
||||
```
|
||||
Imports `DEFAULT_CATEGORIES` from `../tools/delegate-task/constants` (external path).
|
||||
|
||||
### 2e. Full test suite
|
||||
```bash
|
||||
bun test
|
||||
```
|
||||
|
||||
## 3. Build Verification
|
||||
|
||||
```bash
|
||||
bun run build
|
||||
```
|
||||
Confirms ESM bundle + declarations emit correctly with the new file structure.
|
||||
|
||||
## 4. Export Completeness Verification
|
||||
|
||||
### 4a. Verify `constants.ts` re-exports match original exports
|
||||
Cross-check that every symbol previously exported from `constants.ts` is still exported. The original file exported these symbols:
|
||||
- `VISUAL_CATEGORY_PROMPT_APPEND`
|
||||
- `ULTRABRAIN_CATEGORY_PROMPT_APPEND`
|
||||
- `ARTISTRY_CATEGORY_PROMPT_APPEND`
|
||||
- `QUICK_CATEGORY_PROMPT_APPEND`
|
||||
- `UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND`
|
||||
- `UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND`
|
||||
- `WRITING_CATEGORY_PROMPT_APPEND`
|
||||
- `DEEP_CATEGORY_PROMPT_APPEND`
|
||||
- `DEFAULT_CATEGORIES`
|
||||
- `CATEGORY_PROMPT_APPENDS`
|
||||
- `CATEGORY_DESCRIPTIONS`
|
||||
- `PLAN_AGENT_SYSTEM_PREPEND_STATIC_BEFORE_SKILLS`
|
||||
- `PLAN_AGENT_SYSTEM_PREPEND_STATIC_AFTER_SKILLS`
|
||||
- `buildPlanAgentSkillsSection`
|
||||
- `buildPlanAgentSystemPrepend`
|
||||
- `PLAN_AGENT_NAMES`
|
||||
- `isPlanAgent`
|
||||
- `PLAN_FAMILY_NAMES`
|
||||
- `isPlanFamily`
|
||||
|
||||
All 19 must be re-exported from the barrel.
|
||||
|
||||
### 4b. Verify `model-requirements.ts` re-exports match original exports
|
||||
Original exports: `FallbackEntry`, `ModelRequirement`, `AGENT_MODEL_REQUIREMENTS`, `CATEGORY_MODEL_REQUIREMENTS`. All 4 must still be available.
|
||||
|
||||
## 5. LOC Compliance Check
|
||||
|
||||
Verify each new file is under 200 LOC (excluding prompt template text per modular-code-enforcement rule):
|
||||
|
||||
| File | Expected Total LOC | Non-prompt LOC | Compliant? |
|
||||
|------|-------------------|----------------|------------|
|
||||
| `default-categories.ts` | ~15 | ~15 | Yes |
|
||||
| `category-descriptions.ts` | ~12 | ~12 | Yes |
|
||||
| `category-prompt-appends.ts` | ~280 | ~15 | Yes (prompt exempt) |
|
||||
| `plan-agent-prompt.ts` | ~270 | ~40 | Yes (prompt exempt) |
|
||||
| `plan-agent-identity.ts` | ~35 | ~35 | Yes |
|
||||
| `category-model-requirements.ts` | ~150 | ~150 | Yes |
|
||||
| `model-requirements.ts` (after) | ~165 | ~165 | Yes |
|
||||
| `constants.ts` (after) | ~25 | ~25 | Yes |
|
||||
|
||||
## 6. Consumer Impact Matrix
|
||||
|
||||
Verify zero consumer files need changes:
|
||||
|
||||
| Consumer File | Import Path | Should Still Work? |
|
||||
|--------------|-------------|-------------------|
|
||||
| `delegate-task/categories.ts` | `./constants` | Yes (barrel) |
|
||||
| `delegate-task/tools.ts` | `./constants` | Yes (barrel) |
|
||||
| `delegate-task/tools.test.ts` | `./constants` | Yes (barrel) |
|
||||
| `delegate-task/prompt-builder.ts` | `./constants` | Yes (barrel) |
|
||||
| `delegate-task/subagent-resolver.ts` | `./constants` | Yes (barrel) |
|
||||
| `delegate-task/sync-continuation.ts` | `./constants` | Yes (barrel) |
|
||||
| `delegate-task/sync-prompt-sender.ts` | `./constants` | Yes (barrel) |
|
||||
| `delegate-task/index.ts` | `./constants` | Yes (barrel) |
|
||||
| `agents/atlas/prompt-section-builder.ts` | `../../tools/delegate-task/constants` | Yes (barrel) |
|
||||
| `agents/builtin-agents.ts` | `../tools/delegate-task/constants` | Yes (barrel) |
|
||||
| `plugin/available-categories.ts` | `../tools/delegate-task/constants` | Yes (barrel) |
|
||||
| `plugin-handlers/category-config-resolver.ts` | `../tools/delegate-task/constants` | Yes (barrel) |
|
||||
| `shared/merge-categories.ts` | `../tools/delegate-task/constants` | Yes (barrel) |
|
||||
| `shared/merge-categories.test.ts` | `../tools/delegate-task/constants` | Yes (barrel) |
|
||||
| `delegate-task/categories.ts` | `../../shared/model-requirements` | Yes (re-export) |
|
||||
@@ -0,0 +1 @@
|
||||
{"total_tokens": null, "duration_ms": 229000, "total_duration_seconds": 229}
|
||||
Reference in New Issue
Block a user