ptbk 0.119.0-16 → 0.119.0-21

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 (330) hide show
  1. package/README.md +27 -9
  2. package/dist/book/commitments.d.ts +38 -10
  3. package/dist/book/commitments.js +61 -17
  4. package/dist/book/commitments.js.map +1 -1
  5. package/dist/book/convert.d.ts +36 -0
  6. package/dist/book/convert.js +156 -0
  7. package/dist/book/convert.js.map +1 -0
  8. package/dist/book/parse.d.ts +50 -13
  9. package/dist/book/parse.js +132 -45
  10. package/dist/book/parse.js.map +1 -1
  11. package/dist/book/references.d.ts +12 -4
  12. package/dist/book/references.js +34 -9
  13. package/dist/book/references.js.map +1 -1
  14. package/dist/book/write.d.ts +42 -0
  15. package/dist/book/write.js +74 -0
  16. package/dist/book/write.js.map +1 -0
  17. package/dist/browser/browser.d.ts +122 -12
  18. package/dist/browser/browser.js +372 -21
  19. package/dist/browser/browser.js.map +1 -1
  20. package/dist/browser/recording.d.ts +3 -3
  21. package/dist/browser/recording.js +5 -5
  22. package/dist/browser/recording.js.map +1 -1
  23. package/dist/chats/chat-book.d.ts +105 -0
  24. package/dist/chats/chat-book.js +180 -0
  25. package/dist/chats/chat-book.js.map +1 -0
  26. package/dist/chats/conversation.d.ts +54 -0
  27. package/dist/chats/conversation.js +188 -0
  28. package/dist/chats/conversation.js.map +1 -0
  29. package/dist/chats/local.d.ts +46 -0
  30. package/dist/chats/local.js +184 -0
  31. package/dist/chats/local.js.map +1 -0
  32. package/dist/chats/migration.d.ts +12 -0
  33. package/dist/chats/migration.js +62 -0
  34. package/dist/chats/migration.js.map +1 -0
  35. package/dist/chats/service.d.ts +81 -0
  36. package/dist/chats/service.js +122 -0
  37. package/dist/chats/service.js.map +1 -0
  38. package/dist/chats/store.d.ts +132 -0
  39. package/dist/chats/store.js +181 -0
  40. package/dist/chats/store.js.map +1 -0
  41. package/dist/chats/task-chats.d.ts +52 -0
  42. package/dist/chats/task-chats.js +96 -0
  43. package/dist/chats/task-chats.js.map +1 -0
  44. package/dist/cli/chats.d.ts +45 -0
  45. package/dist/cli/chats.js +108 -0
  46. package/dist/cli/chats.js.map +1 -0
  47. package/dist/cli/commands/add.js +32 -22
  48. package/dist/cli/commands/add.js.map +1 -1
  49. package/dist/cli/commands/answer.d.ts +2 -1
  50. package/dist/cli/commands/answer.js +35 -41
  51. package/dist/cli/commands/answer.js.map +1 -1
  52. package/dist/cli/commands/ask.d.ts +7 -0
  53. package/dist/cli/commands/ask.js +37 -0
  54. package/dist/cli/commands/ask.js.map +1 -0
  55. package/dist/cli/commands/boilerplates.js +14 -3
  56. package/dist/cli/commands/boilerplates.js.map +1 -1
  57. package/dist/cli/commands/chat.d.ts +9 -0
  58. package/dist/cli/commands/chat.js +89 -0
  59. package/dist/cli/commands/chat.js.map +1 -0
  60. package/dist/cli/commands/dashboard.d.ts +3 -1
  61. package/dist/cli/commands/dashboard.js +41 -3
  62. package/dist/cli/commands/dashboard.js.map +1 -1
  63. package/dist/cli/commands/find.js +6 -8
  64. package/dist/cli/commands/find.js.map +1 -1
  65. package/dist/cli/commands/fix.js +4 -6
  66. package/dist/cli/commands/fix.js.map +1 -1
  67. package/dist/cli/commands/init.d.ts +0 -1
  68. package/dist/cli/commands/init.js +38 -38
  69. package/dist/cli/commands/init.js.map +1 -1
  70. package/dist/cli/commands/lint.js +16 -2
  71. package/dist/cli/commands/lint.js.map +1 -1
  72. package/dist/cli/commands/list.js +21 -13
  73. package/dist/cli/commands/list.js.map +1 -1
  74. package/dist/cli/commands/migrate.d.ts +2 -1
  75. package/dist/cli/commands/migrate.js +70 -24
  76. package/dist/cli/commands/migrate.js.map +1 -1
  77. package/dist/cli/commands/pause.d.ts +8 -0
  78. package/dist/cli/commands/pause.js +40 -0
  79. package/dist/cli/commands/pause.js.map +1 -0
  80. package/dist/cli/commands/plan.js +6 -9
  81. package/dist/cli/commands/plan.js.map +1 -1
  82. package/dist/cli/commands/recover.js +7 -3
  83. package/dist/cli/commands/recover.js.map +1 -1
  84. package/dist/cli/commands/restart.d.ts +3 -1
  85. package/dist/cli/commands/restart.js +74 -18
  86. package/dist/cli/commands/restart.js.map +1 -1
  87. package/dist/cli/commands/resume.d.ts +8 -0
  88. package/dist/cli/commands/resume.js +15 -0
  89. package/dist/cli/commands/resume.js.map +1 -0
  90. package/dist/cli/commands/run.js +6 -9
  91. package/dist/cli/commands/run.js.map +1 -1
  92. package/dist/cli/commands/start.js +40 -36
  93. package/dist/cli/commands/start.js.map +1 -1
  94. package/dist/cli/commands/status.d.ts +2 -1
  95. package/dist/cli/commands/status.js +5 -1
  96. package/dist/cli/commands/status.js.map +1 -1
  97. package/dist/cli/commands/stop.d.ts +3 -1
  98. package/dist/cli/commands/stop.js +18 -8
  99. package/dist/cli/commands/stop.js.map +1 -1
  100. package/dist/cli/commands/verify.js +7 -7
  101. package/dist/cli/commands/verify.js.map +1 -1
  102. package/dist/cli/common.d.ts +13 -0
  103. package/dist/cli/common.js +22 -0
  104. package/dist/cli/common.js.map +1 -1
  105. package/dist/cli/engine-delegation.d.ts +14 -0
  106. package/dist/cli/engine-delegation.js +46 -0
  107. package/dist/cli/engine-delegation.js.map +1 -0
  108. package/dist/cli/lifecycle.d.ts +40 -0
  109. package/dist/cli/lifecycle.js +71 -0
  110. package/dist/cli/lifecycle.js.map +1 -0
  111. package/dist/cli/registry.js +113 -31
  112. package/dist/cli/registry.js.map +1 -1
  113. package/dist/cli/service-view.d.ts +14 -2
  114. package/dist/cli/service-view.js +46 -5
  115. package/dist/cli/service-view.js.map +1 -1
  116. package/dist/cli/sources.js +5 -8
  117. package/dist/cli/sources.js.map +1 -1
  118. package/dist/cli/spec.js +1 -1
  119. package/dist/cli/spec.js.map +1 -1
  120. package/dist/common/app-data.d.ts +9 -0
  121. package/dist/common/app-data.js +20 -0
  122. package/dist/common/app-data.js.map +1 -0
  123. package/dist/common/errors.d.ts +2 -0
  124. package/dist/common/errors.js.map +1 -1
  125. package/dist/common/time.d.ts +6 -0
  126. package/dist/common/time.js +9 -0
  127. package/dist/common/time.js.map +1 -1
  128. package/dist/engine/agenda.d.ts +213 -43
  129. package/dist/engine/agenda.js +846 -260
  130. package/dist/engine/agenda.js.map +1 -1
  131. package/dist/engine/executor.d.ts +23 -7
  132. package/dist/engine/executor.js +131 -84
  133. package/dist/engine/executor.js.map +1 -1
  134. package/dist/engine/generated.d.ts +21 -1
  135. package/dist/engine/generated.js +36 -21
  136. package/dist/engine/generated.js.map +1 -1
  137. package/dist/engine/preview.js +10 -10
  138. package/dist/engine/preview.js.map +1 -1
  139. package/dist/engine/prompt.d.ts +16 -4
  140. package/dist/engine/prompt.js +22 -4
  141. package/dist/engine/prompt.js.map +1 -1
  142. package/dist/engine/routing.js +28 -4
  143. package/dist/engine/routing.js.map +1 -1
  144. package/dist/engine/snapshot.d.ts +178 -29
  145. package/dist/engine/state.d.ts +40 -13
  146. package/dist/engine/state.js +20 -5
  147. package/dist/engine/state.js.map +1 -1
  148. package/dist/engine/task-trace.d.ts +35 -7
  149. package/dist/engine/task-trace.js +74 -15
  150. package/dist/engine/task-trace.js.map +1 -1
  151. package/dist/engine/team.d.ts +20 -7
  152. package/dist/engine/team.js +30 -24
  153. package/dist/engine/team.js.map +1 -1
  154. package/dist/engine/traces.d.ts +1 -1
  155. package/dist/engine/traces.js +1 -1
  156. package/dist/expert/_main.md +67 -52
  157. package/dist/expert/agents/_index.md +11 -13
  158. package/dist/expert/agents/chatter.md +31 -0
  159. package/dist/expert/agents/consistency.md +6 -11
  160. package/dist/expert/agents/core-agents.md +9 -7
  161. package/dist/expert/agents/expert.md +2 -2
  162. package/dist/expert/agents/fixer.md +24 -0
  163. package/dist/expert/agents/learning.md +1 -1
  164. package/dist/expert/agents/non-agents.md +6 -4
  165. package/dist/expert/agents/teacher.md +1 -1
  166. package/dist/expert/agents/visual-identity.md +4 -4
  167. package/dist/expert/book-language/_index.md +9 -8
  168. package/dist/expert/book-language/commitments/_index.md +23 -3
  169. package/dist/expert/book-language/commitments/agent.md +11 -0
  170. package/dist/expert/book-language/commitments/chat-member.md +7 -0
  171. package/dist/expert/book-language/commitments/chat-message.md +11 -0
  172. package/dist/expert/book-language/commitments/chat-status.md +7 -0
  173. package/dist/expert/book-language/commitments/chat.md +11 -0
  174. package/dist/expert/book-language/commitments/entity.md +9 -0
  175. package/dist/expert/book-language/commitments/from.md +1 -1
  176. package/dist/expert/book-language/commitments/goal.md +6 -2
  177. package/dist/expert/book-language/commitments/link.md +9 -0
  178. package/dist/expert/book-language/commitments/task-depends-on.md +1 -1
  179. package/dist/expert/book-language/commitments/task-parent.md +1 -1
  180. package/dist/expert/book-language/commitments/task.md +7 -3
  181. package/dist/expert/book-language/commitments/team.md +1 -1
  182. package/dist/expert/book-language/inheritance.md +2 -2
  183. package/dist/expert/book-language/references.md +20 -24
  184. package/dist/expert/book-language/syntax.md +54 -11
  185. package/dist/expert/cli/acceptance.md +59 -24
  186. package/dist/expert/cli/api.md +23 -9
  187. package/dist/expert/cli/authoring.md +6 -4
  188. package/dist/expert/cli/autonomous-operation.md +3 -3
  189. package/dist/expert/cli/browser.md +29 -18
  190. package/dist/expert/cli/channels.md +5 -7
  191. package/dist/expert/cli/chat-ui.md +32 -0
  192. package/dist/expert/cli/chats.md +59 -0
  193. package/dist/expert/cli/cli.md +44 -26
  194. package/dist/expert/cli/configuration.md +3 -3
  195. package/dist/expert/cli/controls.md +13 -7
  196. package/dist/expert/cli/dashboard-details.md +23 -0
  197. package/dist/expert/cli/dashboard-layout.md +19 -12
  198. package/dist/expert/cli/dashboard.md +12 -8
  199. package/dist/expert/cli/execution.md +8 -6
  200. package/dist/expert/cli/first-task.md +4 -4
  201. package/dist/expert/cli/generated-names.md +44 -0
  202. package/dist/expert/cli/git-persistence.md +19 -17
  203. package/dist/expert/cli/global-dashboard.md +33 -0
  204. package/dist/expert/cli/goal-discovery.md +1 -1
  205. package/dist/expert/cli/help.md +1 -1
  206. package/dist/expert/cli/initialization-ui.md +2 -0
  207. package/dist/expert/cli/initialization.md +9 -7
  208. package/dist/expert/cli/interactive-ui.md +9 -5
  209. package/dist/expert/cli/locking.md +21 -0
  210. package/dist/expert/cli/migration.md +22 -6
  211. package/dist/expert/cli/process-modes.md +21 -13
  212. package/dist/expert/cli/recovery.md +8 -6
  213. package/dist/expert/cli/recurrence.md +1 -1
  214. package/dist/expert/cli/rich-input.md +2 -2
  215. package/dist/expert/cli/service-lifecycle.md +57 -0
  216. package/dist/expert/cli/start.md +2 -2
  217. package/dist/expert/cli/status-view.md +16 -12
  218. package/dist/expert/cli/task-books.md +11 -15
  219. package/dist/expert/cli/task-identity.md +8 -10
  220. package/dist/expert/cli/task-markdown.md +6 -10
  221. package/dist/expert/cli/task-origins.md +3 -1
  222. package/dist/expert/cli/task-relationships.md +5 -9
  223. package/dist/expert/cli/team.md +17 -7
  224. package/dist/expert/cli/terminal.md +20 -12
  225. package/dist/expert/cli/trace-configuration.md +1 -1
  226. package/dist/expert/cli/traces.md +19 -23
  227. package/dist/expert/cli/user-interactions.md +14 -26
  228. package/dist/expert/cli/workspace.md +15 -9
  229. package/dist/expert/concepts/engine-and-project.md +11 -0
  230. package/dist/expert/concepts/project-model.md +39 -0
  231. package/dist/expert/dictionary.md +21 -15
  232. package/dist/harness/plugins/claude-code/index.js +1 -0
  233. package/dist/harness/plugins/claude-code/index.js.map +1 -1
  234. package/dist/harness/plugins/cline/index.js +1 -0
  235. package/dist/harness/plugins/cline/index.js.map +1 -1
  236. package/dist/harness/plugins/openai-codex/index.js +1 -0
  237. package/dist/harness/plugins/openai-codex/index.js.map +1 -1
  238. package/dist/harness/plugins/opencode/index.js +1 -0
  239. package/dist/harness/plugins/opencode/index.js.map +1 -1
  240. package/dist/harness/types.d.ts +3 -1
  241. package/dist/project/agents.d.ts +29 -81
  242. package/dist/project/agents.js +48 -267
  243. package/dist/project/agents.js.map +1 -1
  244. package/dist/project/books.d.ts +150 -0
  245. package/dist/project/books.js +253 -0
  246. package/dist/project/books.js.map +1 -0
  247. package/dist/project/config.js +2 -2
  248. package/dist/project/config.js.map +1 -1
  249. package/dist/project/defaults.d.ts +35 -6
  250. package/dist/project/defaults.js +73 -40
  251. package/dist/project/defaults.js.map +1 -1
  252. package/dist/project/expert.js +18 -10
  253. package/dist/project/expert.js.map +1 -1
  254. package/dist/project/git.d.ts +4 -3
  255. package/dist/project/git.js +16 -5
  256. package/dist/project/git.js.map +1 -1
  257. package/dist/project/setup.d.ts +4 -1
  258. package/dist/project/setup.js +26 -6
  259. package/dist/project/setup.js.map +1 -1
  260. package/dist/service/actions.d.ts +34 -10
  261. package/dist/service/actions.js +51 -19
  262. package/dist/service/actions.js.map +1 -1
  263. package/dist/service/control.d.ts +53 -1
  264. package/dist/service/control.js +64 -4
  265. package/dist/service/control.js.map +1 -1
  266. package/dist/service/discovery.d.ts +133 -0
  267. package/dist/service/discovery.js +138 -0
  268. package/dist/service/discovery.js.map +1 -0
  269. package/dist/service/host.d.ts +8 -1
  270. package/dist/service/host.js +65 -18
  271. package/dist/service/host.js.map +1 -1
  272. package/dist/service/http.d.ts +3 -0
  273. package/dist/service/http.js +26 -6
  274. package/dist/service/http.js.map +1 -1
  275. package/dist/service/launcher.d.ts +66 -13
  276. package/dist/service/launcher.js +78 -18
  277. package/dist/service/launcher.js.map +1 -1
  278. package/dist/service/records.d.ts +12 -2
  279. package/dist/service/records.js +19 -5
  280. package/dist/service/records.js.map +1 -1
  281. package/dist/service/spa/app.css +83 -2
  282. package/dist/service/spa/app.js +393 -72
  283. package/dist/service/supervisor.js +7 -1
  284. package/dist/service/supervisor.js.map +1 -1
  285. package/dist/service/worker.js +14 -5
  286. package/dist/service/worker.js.map +1 -1
  287. package/dist/tasks/authoring.d.ts +3 -5
  288. package/dist/tasks/authoring.js +6 -7
  289. package/dist/tasks/authoring.js.map +1 -1
  290. package/dist/tasks/book-task.d.ts +18 -10
  291. package/dist/tasks/book-task.js +27 -23
  292. package/dist/tasks/book-task.js.map +1 -1
  293. package/dist/tasks/eligibility.d.ts +15 -7
  294. package/dist/tasks/eligibility.js +41 -14
  295. package/dist/tasks/eligibility.js.map +1 -1
  296. package/dist/tasks/identity.d.ts +41 -15
  297. package/dist/tasks/identity.js +100 -31
  298. package/dist/tasks/identity.js.map +1 -1
  299. package/dist/tasks/markdown.d.ts +7 -14
  300. package/dist/tasks/markdown.js +15 -29
  301. package/dist/tasks/markdown.js.map +1 -1
  302. package/dist/tasks/model.d.ts +20 -4
  303. package/dist/tasks/model.js +17 -0
  304. package/dist/tasks/model.js.map +1 -1
  305. package/dist/tasks/sources.d.ts +7 -2
  306. package/dist/tasks/sources.js +46 -35
  307. package/dist/tasks/sources.js.map +1 -1
  308. package/dist/ui/chat-client.d.ts +70 -0
  309. package/dist/ui/chat-client.js +209 -0
  310. package/dist/ui/chat-client.js.map +1 -0
  311. package/dist/ui/dashboard.d.ts +8 -5
  312. package/dist/ui/dashboard.js +227 -86
  313. package/dist/ui/dashboard.js.map +1 -1
  314. package/dist/ui/details.d.ts +64 -0
  315. package/dist/ui/details.js +175 -0
  316. package/dist/ui/details.js.map +1 -0
  317. package/dist/ui/global-dashboard.d.ts +59 -0
  318. package/dist/ui/global-dashboard.js +307 -0
  319. package/dist/ui/global-dashboard.js.map +1 -0
  320. package/dist/ui/status-view.d.ts +7 -0
  321. package/dist/ui/status-view.js +94 -36
  322. package/dist/ui/status-view.js.map +1 -1
  323. package/package.json +1 -1
  324. package/dist/engine/requests.d.ts +0 -111
  325. package/dist/engine/requests.js +0 -173
  326. package/dist/engine/requests.js.map +0 -1
  327. package/dist/expert/book-language/commitments/task-id.md +0 -9
  328. package/dist/tasks/prepare.d.ts +0 -33
  329. package/dist/tasks/prepare.js +0 -90
  330. package/dist/tasks/prepare.js.map +0 -1
@@ -4,7 +4,8 @@ import { errorMessage } from '../common/errors.js';
4
4
  import { projectAt } from '../project/workspace.js';
5
5
  import { recordDiagnostic } from '../engine/traces.js';
6
6
  import { ServiceHost } from './host.js';
7
- import { readLaunchMetadata, restoreDiscoveryEnvironment, rotateServiceLog } from './records.js';
7
+ import { markIntentionalStop } from './launcher.js';
8
+ import { readLaunchMetadata, restoreDiscoveryEnvironment, RESTART_EXIT_CODE, rotateServiceLog } from './records.js';
8
9
  /**
9
10
  * Number of appended event lines between rotation checks.
10
11
  */
@@ -30,7 +31,8 @@ function appendServiceLog(path, line) {
30
31
  * Daemon worker entry: `node dist/service/worker.js <projectRoot>`.
31
32
  *
32
33
  * Restores the launching terminal's discovery paths before any Git or harness inspection, hosts the agenda and
33
- * exits 0 only on a requested stop (a crash exit lets the supervisor restart it).
34
+ * exits 0 only on a requested stop (a crash exit lets the supervisor restart it; a restart request exits with
35
+ * {@link RESTART_EXIT_CODE} after releasing ownership so the supervisor starts one replacement).
34
36
  */
35
37
  async function main() {
36
38
  const project = projectAt(process.argv[2] ?? '.');
@@ -57,21 +59,28 @@ async function main() {
57
59
  allowTunnelInstall: true,
58
60
  onEvent: (text, level) => appendServiceLog(eventLog, `${new Date().toISOString()} ${level.toUpperCase()} ${text}\n`),
59
61
  });
62
+ // A catchable OS termination request drains gracefully (the host may still kill the process after its own grace period).
60
63
  const stop = () => {
61
- host.agenda.requestStop({ cancelCurrent: true });
64
+ host.agenda.requestStop({ signal: true });
62
65
  };
63
66
  process.on('SIGTERM', stop);
64
67
  process.on('SIGINT', stop);
65
68
  process.on('SIGHUP', () => undefined);
66
69
  await host.start();
70
+ let outcome;
67
71
  try {
68
- await host.runAgenda();
72
+ outcome = (await host.runAgenda()).outcome;
69
73
  }
70
74
  finally {
71
75
  await host.shutdown();
72
76
  }
77
+ // An intentional user stop suppresses automatic startup until the next authorized start; restart and OS
78
+ // termination do not.
79
+ if (host.agenda.intentionalStop)
80
+ await markIntentionalStop(project).catch(() => undefined);
81
+ return outcome === 'restart' ? RESTART_EXIT_CODE : 0;
73
82
  }
74
- main().then(() => process.exit(0), async (error) => {
83
+ main().then((code) => process.exit(code), async (error) => {
75
84
  process.stderr.write(`${new Date().toISOString()} FATAL ${errorMessage(error)}\n${error?.stack ?? ''}\n`);
76
85
  await recordDiagnostic(projectAt(process.argv[2] ?? '.'), { phase: 'daemon worker', message: errorMessage(error), details: { stack: error?.stack } }).catch(() => undefined);
77
86
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/service/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/service/worker.ts"],"names":[],"mappings":"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"}
@@ -4,17 +4,15 @@
4
4
  * @private task authoring
5
5
  */
6
6
  export type NewTaskBook = {
7
- /** Human title (first line `TASK <title>`). */
7
+ /** Task name: the content of the opening `TASK` declaration and the task's identity (see `generatedName`). */
8
8
  readonly title: string;
9
- /** Natural-language description. */
9
+ /** Bounded work and intended result (written under GOAL, losslessly escaped). */
10
10
  readonly description?: string;
11
- /** Stable task ID (every new task gets one; see `generateTaskId`). */
12
- readonly id: string;
13
11
  /** Additional commitment lines, e.g. `['TASK AGENT @Developer', 'TASK PRIORITY 2']`. */
14
12
  readonly commitments?: readonly string[];
15
13
  };
16
14
  /**
17
- * Renders a task Book source.
15
+ * Renders a task Book in the canonical form: `TASK <name>`, the description under GOAL, then commitments.
18
16
  *
19
17
  * @private task authoring
20
18
  */
@@ -2,19 +2,18 @@ import { join } from 'node:path';
2
2
  import { pathExists } from '../common/fs.js';
3
3
  import { slugify } from '../common/ids.js';
4
4
  import { fileTimestamp } from '../common/time.js';
5
+ import { renderCommitment, renderDeclaration } from '../book/write.js';
5
6
  /**
6
- * Renders a task Book source.
7
+ * Renders a task Book in the canonical form: `TASK <name>`, the description under GOAL, then commitments.
7
8
  *
8
9
  * @private task authoring
9
10
  */
10
11
  export function renderTaskBook(task) {
11
- const title = task.title.replace(/\s+/g, ' ').trim();
12
- const lines = [`TASK ${title}`];
12
+ const lines = [renderDeclaration('task', task.title)];
13
13
  if (task.description?.trim())
14
- lines.push('', task.description.trim());
15
- const commitments = [`TASK ID ${task.id}`, ...(task.commitments ?? [])];
16
- if (commitments.length)
17
- lines.push('', ...commitments);
14
+ lines.push(...renderCommitment('GOAL', task.description));
15
+ if (task.commitments?.length)
16
+ lines.push(...task.commitments);
18
17
  return `${lines.join('\n')}\n`;
19
18
  }
20
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"authoring.js","sourceRoot":"","sources":["../../src/tasks/authoring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAkBlD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,CAAC,WAAW,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;IACxE,IAAI,WAAW,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC;IACvD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,cAAsB,EAAE,KAAa,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE,EAAE,QAAiB,EAAE,SAAS,GAAG,OAAO;IACrI,MAAM,IAAI,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;IACjE,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;QACnG,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;IACzD,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,WAAW,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChE,KAAK,GAAG,QAAQ,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;IAC5D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"authoring.js","sourceRoot":"","sources":["../../src/tasks/authoring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAgBvE;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC5C,MAAM,KAAK,GAAG,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACxF,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9D,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,cAAsB,EAAE,KAAa,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE,EAAE,QAAiB,EAAE,SAAS,GAAG,OAAO;IACrI,MAAM,IAAI,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;IACjE,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;QACnG,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;IACzD,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,WAAW,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChE,KAAK,GAAG,QAAQ,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;IAC5D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { Task } from './model.js';
1
+ import { type Task } from './model.js';
2
2
  /**
3
3
  * Splits a reference list (`#a, #b tasks/c.book`).
4
4
  *
@@ -6,19 +6,27 @@ import type { Task } from './model.js';
6
6
  */
7
7
  export declare function splitTaskReferences(value: string): string[];
8
8
  /**
9
- * Reads a task Book file into a task.
9
+ * Options of reading one task Book.
10
10
  *
11
- * Malformed control commitments are errors that keep the task from running.
11
+ * @private task Books
12
+ */
13
+ export type TaskBookOptions = {
14
+ readonly source: string;
15
+ readonly path: string;
16
+ readonly relativePath: string;
17
+ readonly order: number;
18
+ readonly timeZone: string;
19
+ };
20
+ /**
21
+ * Reads a task Book (`TASK <name>` declares the task and its name) into a task.
22
+ *
23
+ * Malformed control commitments and syntax errors keep the task from running. A source in the task folder written in
24
+ * former syntax (a plain name line) is listed as a blocked task with a conversion hint, never dispatched; Books that
25
+ * declare (or formerly declared) an agent or chat are not tasks wherever they are stored.
12
26
  *
13
27
  * @private task Books
14
28
  */
15
- export declare function readTaskBook(options: {
16
- source: string;
17
- path: string;
18
- relativePath: string;
19
- order: number;
20
- timeZone: string;
21
- }): Task | undefined;
29
+ export declare function readTaskBook(options: TaskBookOptions): Task | undefined;
22
30
  /**
23
31
  * Appends a completion stamp (`TASK DONE <timestamp with offset>`).
24
32
  *
@@ -4,14 +4,15 @@ import { formatIsoWithOffset, parseDateTime } from '../common/time.js';
4
4
  import { appendCommitment, setControlCommitment } from '../book/edit.js';
5
5
  import { commitmentsOf, parseBook, singleValue } from '../book/parse.js';
6
6
  import { THINKING_LEVELS } from '../project/config.js';
7
- import { taskIdProblem } from './identity.js';
7
+ import { nameKey, nameReference } from './model.js';
8
8
  import { parsePriority } from './priority.js';
9
9
  /**
10
10
  * Control commitments a task recognizes.
11
11
  */
12
12
  const TASK_CONTROLS = new Set([
13
- 'TASK',
14
13
  'TASK ID',
14
+ 'ENTITY',
15
+ 'LINK',
15
16
  'TASK AGENT',
16
17
  'TASK HARNESS',
17
18
  'TASK MODEL',
@@ -51,17 +52,21 @@ function runnerSelectors(value) {
51
52
  return ticks.length ? ticks : value.split(/\s+/).filter(Boolean);
52
53
  }
53
54
  /**
54
- * Reads a task Book file into a task.
55
+ * Reads a task Book (`TASK <name>` declares the task and its name) into a task.
55
56
  *
56
- * Malformed control commitments are errors that keep the task from running.
57
+ * Malformed control commitments and syntax errors keep the task from running. A source in the task folder written in
58
+ * former syntax (a plain name line) is listed as a blocked task with a conversion hint, never dispatched; Books that
59
+ * declare (or formerly declared) an agent or chat are not tasks wherever they are stored.
57
60
  *
58
61
  * @private task Books
59
62
  */
60
63
  export function readTaskBook(options) {
61
64
  const document = parseBook(options.source);
62
- if (document.kind !== 'task')
63
- return undefined;
64
- return taskFromDocument(document, options);
65
+ if (document.kind === 'task')
66
+ return taskFromDocument(document, options);
67
+ const legacyTask = document.kind === 'invalid' && document.name && !document.declaredKind && document.legacy && document.legacy.entity !== 'agent' && document.legacy.entity !== 'chat';
68
+ const uppercaseTask = document.kind === 'invalid' && document.legacy?.uppercaseName && /^TASK /.test(document.lines[document.headerLine] ?? '');
69
+ return legacyTask || uppercaseTask ? taskFromDocument(document, options) : undefined;
65
70
  }
66
71
  /**
67
72
  * Builds a task from a parsed task document.
@@ -81,22 +86,17 @@ function taskFromDocument(document, options) {
81
86
  return result.value;
82
87
  };
83
88
  for (const commitment of document.commitments) {
84
- if (commitment.keyword === 'TASK') {
85
- diagnostics.push({
86
- line: commitment.startLine + 1,
87
- message: `Unsupported task control \`TASK ${commitment.value.split(/\s+/)[0] ?? ''}\`; it cannot be ignored, so the task is blocked.`,
88
- severity: 'error',
89
- });
89
+ if (commitment.definition.unknown && /^TASK /.test(commitment.keyword)) {
90
+ diagnostics.push({ line: commitment.startLine + 1, message: `Unsupported task control \`${commitment.written}\`; it cannot be ignored, so the task is blocked.`, severity: 'error' });
90
91
  }
91
- else if (commitment.definition.scope === 'task' && !TASK_CONTROLS.has(commitment.keyword)) {
92
+ else if (commitment.definition.scope === 'task' && commitment.definition.kind !== 'declaration' && !TASK_CONTROLS.has(commitment.keyword)) {
92
93
  diagnostics.push({ line: commitment.startLine + 1, message: `Unsupported task control \`${commitment.written}\`.`, severity: 'error' });
93
94
  }
94
95
  }
95
- const declaredId = single('TASK ID');
96
- const idProblem = declaredId === undefined ? undefined : taskIdProblem(declaredId);
97
- if (idProblem)
98
- diagnostics.push({ line: 0, message: idProblem, severity: 'error' });
99
- const id = idProblem ? undefined : declaredId;
96
+ const legacyId = commitmentsOf(document, 'TASK ID')[0]?.value || undefined;
97
+ const key = nameKey(document.name);
98
+ if (!key)
99
+ diagnostics.push({ line: document.headerLine + 1, message: 'The task name is empty after normalization.', severity: 'error' });
100
100
  const thinking = single('TASK THINKING LEVEL');
101
101
  if (thinking !== undefined && !THINKING_LEVELS.includes(thinking)) {
102
102
  diagnostics.push({ line: 0, message: `TASK THINKING LEVEL "${thinking}" is not one of ${THINKING_LEVELS.join(', ')}.`, severity: 'error' });
@@ -146,12 +146,16 @@ function taskFromDocument(document, options) {
146
146
  if (status === 'todo' && doneStamps.length && repeatMs === undefined)
147
147
  status = 'done';
148
148
  const text = options.source;
149
- const placeholder = /@@@/.test(document.name) || /@@@/.test(document.intro);
149
+ const description = commitmentsOf(document, 'GOAL')
150
+ .map((goal) => goal.body)
151
+ .join('\n\n');
152
+ const placeholder = /@@@/.test(document.name) || /@@@/.test(description) || /@@@/.test(document.legacy?.introduction?.text ?? '');
150
153
  return {
151
- ref: id ? `#${id}` : options.relativePath,
152
- id,
154
+ ref: nameReference(document.name),
155
+ key,
156
+ legacyId,
153
157
  title: document.name,
154
- description: document.intro,
158
+ description: description || (document.legacy?.introduction?.text ?? ''),
155
159
  rules: commitmentsOf(document, 'RULE').map((rule) => rule.body),
156
160
  source: { kind: 'book', path: options.path, relativePath: options.relativePath, fileHash: sha256(options.source), order: options.order },
157
161
  status,
@@ -1 +1 @@
1
- {"version":3,"file":"book-task.js","sourceRoot":"","sources":["../../src/tasks/book-task.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"book-task.js","sourceRoot":"","sources":["../../src/tasks/book-task.ts"],"names":[],"mappings":"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"}
@@ -29,7 +29,7 @@ export type Readiness = {
29
29
  } | {
30
30
  readonly kind: 'awaiting-user';
31
31
  readonly reason: string;
32
- readonly requestId: string;
32
+ readonly chat: string;
33
33
  } | {
34
34
  readonly kind: 'blocked';
35
35
  readonly reason: string;
@@ -84,20 +84,22 @@ export type EligibilityContext = {
84
84
  readonly now: number;
85
85
  /** Time zone for display. */
86
86
  readonly timeZone: string;
87
- /** Reference of the task currently owning execution. */
88
- readonly activeRef?: string;
89
- /** Pending human requests per task reference. */
87
+ /** Normalized name of the task currently owning execution. */
88
+ readonly activeKey?: string;
89
+ /** Chat waiting for the user, per task name key. */
90
90
  readonly awaitingUser: ReadonlyMap<string, string>;
91
- /** Runtime recovery/failure blockers per task reference. */
91
+ /** Runtime recovery/failure blockers per task name key. */
92
92
  readonly recovery: ReadonlyMap<string, string>;
93
93
  /** Task source files that are not committed (only relevant with automatic commits). */
94
94
  readonly uncommittedSources: ReadonlySet<string>;
95
- /** Retained activation time (recurrence anchor) per task reference. */
95
+ /** Retained activation time (recurrence anchor) per task name key. */
96
96
  readonly activation: (task: Task) => number;
97
97
  /** Routing check. */
98
98
  readonly route: (task: Task) => Promise<RouteCheck>;
99
- /** Unfinished Manager assignment task per target reference. */
99
+ /** Unfinished Manager assignment task per target name key. */
100
100
  readonly assignmentFor: ReadonlyMap<string, string>;
101
+ /** Other task sources sharing a source's literal trace directory, per project-relative source path. */
102
+ readonly traceConflicts?: ReadonlyMap<string, readonly string[]>;
101
103
  };
102
104
  /**
103
105
  * Evaluates the readiness of one task.
@@ -120,6 +122,12 @@ export type EvaluatedTask = {
120
122
  * @private task eligibility
121
123
  */
122
124
  export declare function evaluateQueue(tasks: readonly Task[], context: EligibilityContext): Promise<EvaluatedTask[]>;
125
+ /**
126
+ * Task sources whose literal trace directories collide (different sources, same basename): each maps to the others.
127
+ *
128
+ * @private task eligibility
129
+ */
130
+ export declare function sourceTraceConflicts(tasks: readonly Task[]): Map<string, string[]>;
123
131
  /**
124
132
  * Whether a readiness counts as unfinished work (present or future), for goal discovery.
125
133
  *
@@ -1,4 +1,5 @@
1
1
  import { formatShortTime } from '../common/time.js';
2
+ import { traceBasenameOf, traceDirectoryConflicts } from './identity.js';
2
3
  import { hasBlockingDiagnostics, isRecurring } from './model.js';
3
4
  import { recurrenceState } from './recurrence.js';
4
5
  import { findTask } from './sources.js';
@@ -16,15 +17,15 @@ function isComplete(task) {
16
17
  function inDependencyCycle(start, tasks) {
17
18
  const visiting = new Set();
18
19
  const visit = (task) => {
19
- if (visiting.has(task.ref))
20
- return task.ref === start.ref;
21
- visiting.add(task.ref);
20
+ if (visiting.has(task.key))
21
+ return task.key === start.key;
22
+ visiting.add(task.key);
22
23
  for (const reference of task.dependsOn) {
23
24
  const found = findTask(tasks, reference).task;
24
25
  if (found && visit(found))
25
26
  return true;
26
27
  }
27
- visiting.delete(task.ref);
28
+ visiting.delete(task.key);
28
29
  return false;
29
30
  };
30
31
  return visit(start);
@@ -35,7 +36,10 @@ function inDependencyCycle(start, tasks) {
35
36
  * @private task eligibility
36
37
  */
37
38
  export async function evaluateTask(task, tasks, context) {
38
- if (context.activeRef === task.ref)
39
+ if (task.shadowedBy) {
40
+ return { kind: 'blocked', reason: `Shadowed: ${task.shadowedBy} wins the same name "${task.title}", so this copy is not a separate task.`, next: 'Rename one of them (Fixer can propose a correction).' };
41
+ }
42
+ if (context.activeKey === task.key)
39
43
  return { kind: 'active', reason: 'Currently executing.' };
40
44
  if (task.status === 'retired')
41
45
  return { kind: 'retired', reason: 'Recurring work retired.' };
@@ -53,25 +57,34 @@ export async function evaluateTask(task, tasks, context) {
53
57
  }
54
58
  if (task.placeholder)
55
59
  return { kind: 'placeholder', reason: 'Unwritten placeholder (@@@); write the task before it can run.' };
60
+ if (!traceBasenameOf(task.source.relativePath)) {
61
+ return { kind: 'blocked', reason: `The source filename ${task.source.relativePath} cannot name its trace directory.`, next: 'Rename the task source to a readable filename.' };
62
+ }
63
+ const sharing = context.traceConflicts?.get(task.source.relativePath);
64
+ if (sharing?.length) {
65
+ return {
66
+ kind: 'blocked',
67
+ reason: `Its evidence directory traces/${traceBasenameOf(task.source.relativePath)}/ would be shared with ${sharing.join(', ')} (same source basename).`,
68
+ next: 'Rename one of the task sources so each has its own trace directory.',
69
+ };
70
+ }
56
71
  if (task.status === 'not-ready')
57
72
  return { kind: 'not-ready', reason: 'Held as not ready.' };
58
73
  if (task.status === 'failed')
59
74
  return { kind: 'failed', reason: 'Marked as failed; use `ptbk recover` to retry or acknowledge.' };
60
75
  if (task.status === 'needs-recovery')
61
76
  return { kind: 'needs-recovery', reason: 'Interrupted work requires recovery (`ptbk recover`).' };
62
- const recovery = context.recovery.get(task.ref);
77
+ const recovery = context.recovery.get(task.key);
63
78
  if (recovery)
64
79
  return { kind: 'needs-recovery', reason: recovery };
65
- const request = context.awaitingUser.get(task.ref);
66
- if (request)
67
- return { kind: 'awaiting-user', reason: `Waiting for your answer to request ${request}.`, requestId: request };
80
+ const chat = context.awaitingUser.get(task.key);
81
+ if (chat)
82
+ return { kind: 'awaiting-user', reason: `Waiting for your reply in the chat {{${chat}}}.`, chat };
68
83
  const waitingOn = [];
69
84
  for (const reference of task.dependsOn) {
70
85
  const found = findTask(tasks, reference);
71
- if (found.ambiguous)
72
- return { kind: 'blocked', reason: `Dependency ${reference} is ambiguous (${found.ambiguous.map((item) => item.source.relativePath).join(', ')}).` };
73
86
  if (!found.task)
74
- return { kind: 'blocked', reason: `Dependency ${reference} was not found.`, next: 'Fix the TASK DEPENDS ON reference.' };
87
+ return { kind: 'blocked', reason: `Dependency ${reference} was not found.`, next: 'Fix the TASK DEPENDS ON reference (dependencies name tasks).' };
75
88
  if (!isComplete(found.task))
76
89
  waitingOn.push(found.task.ref);
77
90
  }
@@ -98,7 +111,7 @@ export async function evaluateTask(task, tasks, context) {
98
111
  next: 'Commit it (or create tasks with `ptbk add`, which commits automatically).',
99
112
  };
100
113
  }
101
- const assignment = context.assignmentFor.get(task.ref);
114
+ const assignment = context.assignmentFor.get(task.key);
102
115
  if (assignment)
103
116
  return { kind: 'assigning', reason: `Manager is assigning routing (${assignment}).`, via: assignment };
104
117
  const route = await context.route(task);
@@ -137,12 +150,26 @@ const KIND_RANK = {
137
150
  */
138
151
  export async function evaluateQueue(tasks, context) {
139
152
  const evaluated = [];
153
+ const withConflicts = { ...context, traceConflicts: context.traceConflicts ?? sourceTraceConflicts(tasks) };
140
154
  for (const task of tasks)
141
- evaluated.push({ task, readiness: await evaluateTask(task, tasks, context) });
155
+ evaluated.push({ task, readiness: await evaluateTask(task, tasks, withConflicts) });
142
156
  return evaluated.sort((a, b) => KIND_RANK[a.readiness.kind] - KIND_RANK[b.readiness.kind] ||
143
157
  b.task.priority.value - a.task.priority.value ||
144
158
  a.task.source.order - b.task.source.order);
145
159
  }
160
+ /**
161
+ * Task sources whose literal trace directories collide (different sources, same basename): each maps to the others.
162
+ *
163
+ * @private task eligibility
164
+ */
165
+ export function sourceTraceConflicts(tasks) {
166
+ const conflicts = new Map();
167
+ for (const sources of traceDirectoryConflicts(tasks.map((task) => task.source.relativePath)).values()) {
168
+ for (const source of sources)
169
+ conflicts.set(source, sources.filter((other) => other !== source));
170
+ }
171
+ return conflicts;
172
+ }
146
173
  /**
147
174
  * Whether a readiness counts as unfinished work (present or future), for goal discovery.
148
175
  *
@@ -1 +1 @@
1
- {"version":3,"file":"eligibility.js","sourceRoot":"","sources":["../../src/tasks/eligibility.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eligibility.js","sourceRoot":"","sources":["../../src/tasks/eligibility.ts"],"names":[],"mappings":"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"}
@@ -1,41 +1,67 @@
1
1
  /**
2
- * Explains why a task ID is not usable, or returns `undefined` for a valid ID.
2
+ * Deterministic, filesystem-safe directory name derived from a Book's **normalized** name.
3
3
  *
4
- * IDs must be single path-safe tokens: letters, digits, `.`, `_` or `-`, starting with a letter or digit, without
5
- * `..`, a trailing dot or a name reserved by Windows.
4
+ * Equivalent spellings (`{Improve CSV export}`, `@ImproveCsvExport`) map to the same key; it is a pure function of
5
+ * the normalized name, never an allocated ID. Letters/digits outside `[a-z0-9]` are hex-escaped so every script works.
6
6
  *
7
7
  * @private task identity
8
8
  */
9
- export declare function taskIdProblem(id: string): string | undefined;
9
+ export declare function nameKeyPath(name: string): string;
10
10
  /**
11
- * Key comparing task IDs on case-insensitive file systems (two IDs differing only by case would share a trace directory).
11
+ * Literal trace-directory component of a task source: its actual filename without the final `.book` (or legacy
12
+ * `.md`) extension, never derived from the declared TASK name, normalized, slugified, hashed or allocated.
13
+ *
14
+ * Returns `undefined` for a basename that cannot safely name a directory (empty, `.`/`..`, path separators).
15
+ *
16
+ * @private task identity
17
+ */
18
+ export declare function traceBasenameOf(sourcePath: string): string | undefined;
19
+ /**
20
+ * Project-relative POSIX directory of a task's audit evidence: `traces/<task-file-basename>`, copying the actual
21
+ * source filename literally without its final extension (a storage convention, not the task's logical identity).
12
22
  *
13
23
  * @private task identity
14
24
  */
15
- export declare function taskIdKey(id: string): string;
25
+ export declare function traceDirectoryOf(sourcePath: string): string;
16
26
  /**
17
- * Generates a new, readable and practically unique task ID (`improve-csv-export-k3x9qa`).
27
+ * Directory where engines before the source-filename convention stored a task's evidence (`traces/<name-key>`).
28
+ * It remains historical evidence and is only linked, never written to again.
18
29
  *
19
- * The ID never changes afterwards, even when the title does.
30
+ * @private task identity
31
+ */
32
+ export declare function legacyTraceDirectoryOf(taskName: string): string;
33
+ /**
34
+ * Groups task sources whose trace directories would collide (different sources, same literal basename, e.g.
35
+ * `tasks/a.book` and `prompts/a.md`). Such evidence destinations are ambiguous and must be resolved explicitly.
20
36
  *
21
37
  * @private task identity
22
38
  */
23
- export declare function generateTaskId(title: string): string;
39
+ export declare function traceDirectoryConflicts(sourcePaths: Iterable<string>): Map<string, string[]>;
24
40
  /**
25
- * Markdown metadata line carrying a section's task ID.
41
+ * Legacy Markdown metadata line that once carried a generated task ID (read as history only, never written).
26
42
  *
27
43
  * @private task identity
28
44
  */
29
- export declare const MARKDOWN_TASK_ID_LINE: RegExp;
45
+ export declare const MARKDOWN_LEGACY_ID_LINE: RegExp;
30
46
  /**
31
- * Renders the Markdown task ID metadata line.
47
+ * Picks a readable name that is distinct under normalization from the given taken keys (`Name`, `Name (2)`, …).
48
+ *
49
+ * The name is spelled so it can follow a declaration keyword; built-in names are never taken.
32
50
  *
33
51
  * @private task identity
34
52
  */
35
- export declare function markdownTaskIdLine(id: string): string;
53
+ export declare function distinctName(base: string, taken: ReadonlySet<string>): string;
36
54
  /**
37
- * Project-relative POSIX directory holding a task's audit evidence.
55
+ * The name of a newly created task or chat: a readable title plus its creation date and time
56
+ * (`Improve CSV export — 2026-10-18 01:25:00`), made distinct from every taken normalized name.
57
+ *
58
+ * Allocate it once per new entity; reopening, replying, retrying or recurring keeps the saved name. The date is
59
+ * ordinary name text, never parsed back.
38
60
  *
39
61
  * @private task identity
40
62
  */
41
- export declare function traceDirectoryOf(id: string): string;
63
+ export declare function generatedName(title: string, options: {
64
+ readonly taken: ReadonlySet<string>;
65
+ readonly timeZone: string;
66
+ readonly now?: number;
67
+ }): string;