@agent-plan/pi-adapter 0.2.19-next.21 → 0.2.19-next.23

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,iCAAiC,CAAC;AAgzBtF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmhH9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,iCAAiC,CAAC;AAgzBtF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0hH9D"}
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@
9
9
  * - inject context into prompts
10
10
  */
11
11
  import { Type } from "typebox";
12
- import { ExportService, PlanStore, setWriteBusyHook, setWriteNotifyHook, migrateToUuids, migrateToGlobalSequence, withFeatureLock, needsMotivation, findPhaseByRef, findTaskByRef, buildRecap, addChecklistItem, removeChecklistItem, toggleChecklistItem, buildPhaseContextBlock, recommendNextTask } from "@agent-plan/core";
12
+ import { ExportService, PlanStore, setWriteBusyHook, setWriteNotifyHook, migrateToUuids, migrateToGlobalSequence, withFeatureLock, needsMotivation, findPhaseByRef, findTaskByRef, buildRecap, addChecklistItem, removeChecklistItem, toggleChecklistItem, buildPhaseContextBlock, checkExplicitTaskStart, recommendNextTask } from "@agent-plan/core";
13
13
  import { createChecklistItemId, createFeatureId, createPhaseId, createShortId, createTaskId, clampSlug, normalizeSlug, formatPhaseRef, formatFeatureRef, featureNumberOfPhase, validateResolvedTarget } from "@agent-plan/core/naming";
14
14
  import { join, dirname } from "node:path";
15
15
  import { homedir } from "node:os";
@@ -4112,11 +4112,11 @@ export default function planPiExtension(pi) {
4112
4112
  if (task.status === "done")
4113
4113
  return { content: [{ type: "text", text: `Task ${task.id} is done. Use task_update to reopen.` }], details: task };
4114
4114
  const project = await st.loadProject();
4115
- const selection = recommendNextTask(features, await st.loadAllPhases(), project.workDeviations);
4116
- if (!selection.candidate || selection.candidate.task.id !== task.id) {
4117
- const recommended = selection.candidate ? ` Start ${selection.candidate.task.id} instead, or record a user-approved task_deviation first.` : "";
4118
- return { content: [{ type: "text", text: `Task start denied: ${selection.reason}.${recommended}` }], details: selection };
4119
- }
4115
+ const phases = await st.loadAllPhases();
4116
+ const eligibility = checkExplicitTaskStart(features, phases, task.id, project.workDeviations);
4117
+ if (!eligibility.eligible)
4118
+ return { content: [{ type: "text", text: `Task start denied: ${eligibility.reason}` }], details: eligibility };
4119
+ const selection = recommendNextTask(features, phases, project.workDeviations);
4120
4120
  // Assemble the mandatory parent context before changing task lifecycle state.
4121
4121
  // The output order is feature + its requirements, then phase + its requirements.
4122
4122
  const parentFeature = found.phase.featureId ? features.find((f) => f.id === found.phase.featureId) : undefined;
@@ -4125,6 +4125,13 @@ export default function planPiExtension(pi) {
4125
4125
  parentFeature ? st.linkedRequirementsForFeature(parentFeature.id) : Promise.resolve([]),
4126
4126
  ]);
4127
4127
  const phaseContext = buildPhaseContextBlock(phaseWithRequirements, parentFeature, phaseWithRequirements.linkedRequirements ?? [], featureRequirements);
4128
+ const advisory = selection.kind === "conflict"
4129
+ ? `\n\n⚠️ ${selection.reason} Explicit task request honored; reconcile active work before relying on automatic recommendations.`
4130
+ : selection.candidate && selection.candidate.task.id !== task.id
4131
+ ? selection.kind === "active"
4132
+ ? `\n\n⚠️ Active-task advisory: ${formatPhaseRef(selection.candidate.phase.number, featureNumberOfPhase(selection.candidate.phase, features))}/T${String(selection.candidate.task.number).padStart(3, "0")} is already in progress. Explicit task request honored.`
4133
+ : `\n\n⚠️ Priority advisory: ${formatPhaseRef(selection.candidate.phase.number, featureNumberOfPhase(selection.candidate.phase, features))}/T${String(selection.candidate.task.number).padStart(3, "0")} is the automatic recommendation. Explicit task request honored.`
4134
+ : "";
4128
4135
  const now = nowISO();
4129
4136
  let startedTask;
4130
4137
  await st.updatePhase(found.phase.id, (phase) => {
@@ -4138,13 +4145,13 @@ export default function planPiExtension(pi) {
4138
4145
  return phase;
4139
4146
  });
4140
4147
  await st.syncTaskStatusRollup(found.phase.id);
4141
- if (selection.deviation?.temporaryTaskId === task.id && selection.deviation.state === "approved") {
4142
- await st.setWorkDeviationState(selection.deviation.id, "active", now);
4143
- }
4148
+ const approvedDeviation = project.workDeviations.find((deviation) => deviation.temporaryTaskId === task.id && deviation.state === "approved");
4149
+ if (approvedDeviation)
4150
+ await st.setWorkDeviationState(approvedDeviation.id, "active", now);
4144
4151
  await st.writeGenerated();
4145
4152
  if (!startedTask)
4146
4153
  return { content: [{ type: "text", text: `Task not found: ${params.taskId}` }], details: {} };
4147
- return { content: [{ type: "text", text: `✅ Task started: ${startedTask.id} — ${startedTask.title} (in-progress)${phaseContext}` }], details: startedTask };
4154
+ return { content: [{ type: "text", text: `✅ Task started: ${formatPhaseRef(found.phase.number, featureNumberOfPhase(found.phase, features))}/T${String(startedTask.number).padStart(3, "0")} — ${startedTask.title} (in-progress)${startedTask.shortId ? ` · ${startedTask.shortId}` : ""}${phaseContext}${advisory}` }], details: startedTask };
4148
4155
  },
4149
4156
  });
4150
4157
  pi.registerTool({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-plan/pi-adapter",
3
- "version": "0.2.19-next.21",
3
+ "version": "0.2.19-next.23",
4
4
  "private": false,
5
5
  "description": "Pi agent extension for Agent Plan — structured project planning in .planner/",
6
6
  "keywords": [
@@ -28,8 +28,8 @@
28
28
  "dependencies": {
29
29
  "typebox": "^1.1.24",
30
30
  "zod": "^3.24.0",
31
- "@agent-plan/core": "0.2.19-next.21",
32
- "@agent-plan/server": "0.2.19-next.21"
31
+ "@agent-plan/server": "0.2.19-next.23",
32
+ "@agent-plan/core": "0.2.19-next.23"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@earendil-works/pi-coding-agent": "^0.74.0",