From T.L-AutoDevelop
Queue-aware interactive .NET development pipeline. Accepts a task text or a task file and orchestrates scheduler waves.
How this skill is triggered — by the user, by Claude, or both
Slash command
/T.L-AutoDevelop:developThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
CRITICAL: You are the Main-Claude orchestrator. You do not implement the requested code changes yourself.
CRITICAL: You are the Main-Claude orchestrator. You do not implement the requested code changes yourself.
Your job is to:
scheduler-agent for conservative wave planningAllowed before any worker pipe starts: Read, Glob, Grep, Bash.
Do not edit repository files directly in this skill.
Use one Bash call to verify:
git rev-parse --is-inside-work-tree returns trueIf the check fails, stop and explain the problem.
Find *.sln and *.slnx in the current directory and up to two parent directories.
From this point on, always work with the absolute solution path.
Find scheduler.ps1 from the installed plugin and derive:
scheduler.ps1claude-usage-gate.ps1If scheduler.ps1 cannot be found, stop.
Before doing any queue work, run the shared prepare check:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "<scheduler.ps1>" -Mode prepare-environment -SolutionPath "<solution>"
Interpret the prepare result strictly:
status == "blocked": stop and explain the blocker before registering or planning anythingstatus == "ready" or status == "cleaned": continuestatus == "warning": continue, but tell the user what warnings remainAlways surface:
queueProgressSummaryqueueStallcircuitBreakerInterpret $ARGUMENTS as follows:
Task-file mode rules:
[after: <task id or earlier task number>][priority: high|normal|low][serial]Semantics:
[after: ...] is a hard execution dependency, not just a planning hint.[after: ...] must run in a later wave and must not start in parallel with their dependency target.Each extracted task needs:
taskTextsourceCommand = "develop"sourceInputType = "file" or "inline"declaredDependenciesdeclaredPriorityserialOnlyUse Windows %TEMP%, not bash /tmp, for all PowerShell-facing paths.
Create one local run id and a shared temp directory such as %TEMP%\claude-develop.
For each new task create:
The prompt file must exist on disk before register-tasks is called.
The scheduler now rejects registrations with a missing, empty, or unreadable promptFile.
Write prompt markdown and registration JSON with explicit UTF-8 encoding.
Do not rely on PowerShell here-strings for JSON escaping; prefer object -> ConvertTo-Json -> UTF-8 file writes so arbitrary Unicode task text survives intact.
Do not inline multiline PowerShell prompt-writing logic inside bash-quoted -Command "..." strings. Write files with direct UTF-8 file writes instead.
After writing each prompt file, verify it is non-empty and still contains a readable task line before calling register-tasks.
Each task prompt file must contain:
## Task
<task text>
## Solution
<absolute solution path>
The registration JSON for each task should include:
taskTextsourceCommandsourceInputTypepromptFileresultFilesolutionPathallowNuget = falseRun the usage gate in probe mode with -ThresholdPercent 90.
Use this initial probe only to:
Interpret the initial probe strictly:
processStatus == "fatal": stop and show the error.ok == true: continue to queue planning.ok == false or the script is unavailable: continue to queue planning, but do not treat the gate as launchable until a later fresh probe succeeds.Important:
Launch-cost constant:
PIPE_USAGE_PERCENT = 8Call:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "<scheduler.ps1>" -Mode snapshot-queue -View Compact -SolutionPath "<solution>"
Read the returned JSON and keep:
startableTaskIdsnextMergeTaskIdmergePreparedTaskIdqueueStallplannerFeedbackSummaryusageProjectioncircuitBreakerunknownAutoBranchesIf unknown auto/* branches are reported, tell the user before proceeding.
Write the new task list to a JSON file and register it:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "<scheduler.ps1>" -Mode register-tasks -SolutionPath "<solution>" -TasksFile "<tasks.json>"
Then snapshot the queue again so the full active queue now includes:
manual_debug_needed tasksUse compact snapshots for routine orchestration reads. Only fall back to the full snapshot view when you need detailed run history or deep debug data.
scheduler-agentUse the scheduler-agent as a read-only subagent.
Give it:
plannerFeedbackSummaryCLAUDE.md, AGENTS.md, and README.md*.md files from relevant module or docs/ directoriesUse completedTaskBriefs only as advisory planning context for recently touched files, shared modules, and conflict risk. Do not treat them as hard dependency evidence when they are vague or failure-only.
Ask it for a conservative whole-queue execution plan in JSON with:
summarytasks[] containing taskId, waveNumber, blockedBy, plannerMetadatastartableTaskIdsSave that JSON to a plan file and apply it through the scheduler:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "<scheduler.ps1>" -Mode apply-plan -SolutionPath "<solution>" -PlanFile "<plan.json>"
Snapshot the queue again after applying the plan.
If that snapshot reports queueStall.status == "stalled", do one automatic stall-recovery cycle before any launch attempt:
scheduler-agent again on the latest snapshotapply-plansnapshot-queue againIf the same queueStall.signature is still stalled after that single recovery cycle, stop and report the stalled queue state instead of looping or silently doing nothing.
Before starting any task in startableTaskIds, run a fresh launch-gate check for this exact launch set.
Launch-gate procedure:
startableTaskIds, preserving order and excluding tasks already running.pipeCount = count(candidate launch set).pipeCount == 0, do not run the gate and do not start anything.probe mode with -ThresholdPercent 90.currentUsage = fiveHourUtilizationestimatedWaveCost = pipeCount * PIPE_USAGE_PERCENTprojectedUsage = currentUsage + estimatedWaveCostprojectedUsage < 90 -> launchprojectedUsage >= 90 -> ask the user whether this launch set may overrun the 5h budgetThe question must be about the current launch set only, not about the whole session. Always mention:
PIPE_USAGE_PERCENT% * pipeCount, currently 8% * pipeCount)For every task id in the candidate launch set, launch a background worker:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "<scheduler.ps1>" -Mode run-task -SolutionPath "<solution>" -TaskId "<task id>"
The scheduler resolves worker PowerShell in this order:
AUTODEV_POWERSHELL_COMMANDpwsh / pwsh.exepowershell.exeThese workers may run in parallel when they are in the same conservative wave.
Immediately after launching the current wave, hand queue waiting back to the scheduler:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "<scheduler.ps1>" -Mode wait-queue -SolutionPath "<solution>"
Interpret the wait result strictly:
status == "woke" and reason == "task_completed": snapshot the queue again and continue with section 11status == "woke" and reason == "merge_ready": snapshot the queue again and continue with section 11status == "woke" and reason == "breaker_opened": stop and report the breaker state plus the returned progress snapshotstatus == "woke" and reason == "queue_changed": snapshot the queue again, report the changed progress state, and continue conservatively with section 11status == "timeout": report the returned progress snapshot and stop cleanly without inventing your own shell sleep or re-entry loopDo not replace scheduler waiting with sleep, timeout, or ad hoc polling commands.
Tell the user:
manual_debug_neededusageProjectionqueueProgressSummaryrunningTaskProgressqueuedTaskProgressrecentQueueEventsIf circuitBreaker.status == "manual_override", report that the breaker is temporarily suppressed until manualOverrideUntil.
Do not reduce this to only "started" / "queued" lines when richer progress data is available.
Whenever wait-queue wakes or you are re-entered while tasks may have progressed, always do this in order:
queueStall.status == "stalled", do one automatic stall-recovery cycle:
scheduler-agent on the latest snapshotapply-plansnapshot-queue againqueueStall.signature is still stalled, report that the queue remains stalled and stop instead of loopingqueueProgressSummaryrunningTaskProgressqueuedTaskProgressmergeTaskProgressrecentQueueEventsnextMergeTaskId is present, call prepare-merge, then inspect the returned task record and its sourceCommand.prepare-merge.nextMergeTaskId may stay empty even when pendingMergeTaskIds is non-empty. This is expected while other tasks in the same wave are still queued or running. Detached worker retries no longer block merge turns for already finished wave work.
Per-task merge flow:
sourceCommand = "develop", it should be in waiting_user_test.mergePreparedPreview in the snapshot.commit, abort, discard, requeue.sourceCommand = "TLA-develop", resolve it with commit immediately instead of pausing for manual testing.Resolve it with:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "<scheduler.ps1>" -Mode resolve-merge -SolutionPath "<solution>" -TaskId "<task id>" -Decision <decision> -CommitMessage "<message when committing>"
Commit rules:
auto-develop text if you can describe the change concretely.Decision rules:
commit: finalize the prepared mergeabort: keep the task pending for another merge attempt laterdiscard: drop the task permanentlyrequeue: reschedule the task as another attempt if the retry budget allows itThe scheduler owns retries.
Treat these task states as retryable scheduled work:
If a task enters manual_debug_needed, do not treat it as an ordinary scheduled retry. Report that repeated inconclusive investigation produced no new evidence and that the task now waits for repo changes, replanning, or explicit requeue.
Each task gets at most 3 full attempts.
If a task is reported as retry_scheduled, do not treat it as done. It must stay in the queue and go back through planning.
If merge preparation fails after a worker already produced an accepted branch, the scheduler may preserve that branch and reschedule merge preparation separately instead of rerunning the whole worker immediately.
Run the scheduler-agent planning pass whenever the queue materially changes:
queueStall.status == "stalled"Do not rely on stale wave assignments once the queue changes. Do not rely on stale usage information either. Every launch decision must use a fresh usage probe plus projected wave cost.
Keep updates short and factual. Always report:
When progress fields are present, prefer structured status lines over generic text like "No output available."
npx claudepluginhub tleiott/t.l-marketplace4cctoolz --plugin T.L-AutoDevelopWorkflow optimizations for .NET developers using Claude Code: parallel git worktrees, plan mode, token budget discipline, and verification loops. Activates on productivity, context, or workflow mentions.
Plans, implements, and tests code features locally using agent teams with parallel git worktrees and autonomous execution. For build requests, bugs, improvements, or task files; no deploys.
Detects multiple dev tasks in one prompt, dispatches each to an isolated agent with scoped tools, and runs them in parallel or sequence based on dependencies. Opt into worktree mode for integration branches off protected base. Resolves Linear/Jira/GitHub/Notion tickets via MCP.