chore(plans): make kind=plan retirement consistent across MCP, REST, UI, skills
Audit of the plugin + MCP surface after milestone-as-plan (T3): every path that could still create a kind=plan task or describe the old plan-task model is now aligned with the hard-retire decision. - create_task (MCP + REST POST /api/tasks): reject kind=plan with a message pointing to start_planning. The 'plan' enum value stays valid so legacy plan-tasks remain readable; update paths never touch kind, so they round-trip. - create_task / get_task docstrings: 'plan' dropped from creatable kinds; get_task's rules-augmentation noted as legacy-only (get_milestone for new plans). - skills/writing-plans: rewritten for milestone-as-plan (body = design, steps = child tasks, get_milestone to read back). - skills/using-scribe: "plans live in milestones via start_planning", not kind=plan. - TaskEditorView Kind selector: offers Work/Issue; "Plan (legacy)" shown only when the loaded task is already kind=plan (display round-trip). - test: create_task rejects kind=plan. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -99,6 +99,15 @@ async def create_task_route():
|
||||
description = data.get("description")
|
||||
tags = data.get("tags", [])
|
||||
|
||||
# kind=plan is retired — plans are milestones now (see start_planning).
|
||||
# The 'plan' enum value stays valid for legacy tasks, but new ones can't
|
||||
# be created with it through any path.
|
||||
if data.get("kind") == "plan":
|
||||
return jsonify({
|
||||
"error": "kind=plan is retired — plans are milestones. "
|
||||
"Use POST /api/tasks/planning to start a plan."
|
||||
}), 400
|
||||
|
||||
due_date = parse_iso_date(data.get("due_date"), "due_date")
|
||||
if isinstance(due_date, tuple):
|
||||
return due_date
|
||||
|
||||
Reference in New Issue
Block a user