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
@@ -1,15 +1,36 @@
1
1
  import { matchCommitmentKeyword } from './commitments.js';
2
2
  /**
3
3
  * Detects a fence opener/closer (``` or ~~~).
4
+ *
5
+ * @private Book language
4
6
  */
5
- function fenceMarker(line) {
7
+ export function fenceMarker(line) {
6
8
  const match = /^\s{0,3}(`{3,}|~{3,})/.exec(line);
7
9
  return match?.[1];
8
10
  }
9
11
  /**
10
- * Reads a Book source: identifies the document kind and its commitments.
12
+ * Entity kinds by declaration keyword (and former ENTITY value).
13
+ */
14
+ const KIND_BY_KEYWORD = { AGENT: 'agent', TASK: 'task', CHAT: 'chat' };
15
+ /**
16
+ * Removes the literal escape (one leading backslash) of a content line outside fenced blocks.
17
+ */
18
+ function unescapeLine(line) {
19
+ return line.startsWith('\\') ? line.slice(1) : line;
20
+ }
21
+ /**
22
+ * Human label of a commitment scope.
23
+ */
24
+ function scopeLabel(scope) {
25
+ return scope === 'agent' ? 'an agent' : scope === 'task' ? 'a task' : scope === 'chat' ? 'a chat' : 'an agent/task';
26
+ }
27
+ /**
28
+ * Reads a Book: the opening `AGENT <name>`, `TASK <name>` or `CHAT <name>` declaration and the commitments after it.
11
29
  *
12
- * Fenced literal content is preserved as text and never interpreted as commitments.
30
+ * One grammar for every kind: a commitment starts at column zero with a complete uppercase keyword (at least three
31
+ * letters); its content continues until the next commitment. The location of the file never supplies the kind. Fenced
32
+ * blocks and lines escaped with a leading backslash are literal content. Former syntax (a plain name line, `ENTITY`,
33
+ * an introduction under the name) is diagnosed and recorded for explicit conversion, never silently accepted.
13
34
  *
14
35
  * @private Book language
15
36
  */
@@ -19,45 +40,23 @@ export function parseBook(source) {
19
40
  const lines = text.split(/\r?\n/);
20
41
  const diagnostics = [];
21
42
  const headerLine = lines.findIndex((line) => line.trim() !== '');
22
- if (headerLine < 0) {
23
- return { kind: 'empty', name: '', headerLine: -1, intro: '', commitments: [], diagnostics, lines, newline };
24
- }
25
- const header = lines[headerLine].trim();
26
- let kind;
27
- let name;
28
- const headerMatch = matchCommitmentKeyword(header);
29
- if (headerMatch && headerMatch.definition.keyword === 'TASK') {
30
- kind = 'task';
31
- name = headerMatch.content;
32
- if (!name) {
33
- kind = 'invalid';
34
- diagnostics.push({ line: headerLine + 1, message: 'A task needs a nonempty title after `TASK`.', severity: 'error' });
35
- }
36
- }
37
- else if (headerMatch && headerMatch.definition.scope !== 'agent' && headerMatch.definition.keyword.startsWith('TASK')) {
38
- kind = 'invalid';
39
- name = '';
40
- diagnostics.push({ line: headerLine + 1, message: `\`${headerMatch.written}\` cannot start a Book; a task starts with \`TASK <title>\`.`, severity: 'error' });
41
- }
42
- else {
43
- kind = 'agent';
44
- name = header;
45
- }
43
+ if (headerLine < 0)
44
+ return { kind: 'empty', name: '', headerLine: -1, commitments: [], diagnostics, lines, newline };
45
+ // Commitments after the opening line (fenced and escaped lines are content).
46
46
  const commitments = [];
47
- const introLines = [];
47
+ const introduction = [];
48
48
  let current;
49
49
  let fence;
50
50
  const close = (end) => {
51
51
  if (!current)
52
52
  return;
53
53
  const continuation = current.continuation.join('\n').trim();
54
- const body = [current.match.content, ...current.continuation].join('\n').trim();
55
54
  commitments.push({
56
55
  keyword: current.match.definition.keyword,
57
56
  written: current.match.written,
58
57
  definition: current.match.definition,
59
58
  value: current.match.content,
60
- body,
59
+ body: [current.match.content, ...current.continuation].join('\n').trim(),
61
60
  continuation,
62
61
  startLine: current.start,
63
62
  endLine: end,
@@ -67,6 +66,7 @@ export function parseBook(source) {
67
66
  for (let index = headerLine + 1; index < lines.length; index++) {
68
67
  const line = lines[index];
69
68
  const marker = fenceMarker(line);
69
+ let content = line;
70
70
  if (fence) {
71
71
  if (marker && marker[0] === fence[0] && marker.length >= fence.length && line.trim() === marker)
72
72
  fence = undefined;
@@ -79,34 +79,121 @@ export function parseBook(source) {
79
79
  if (match) {
80
80
  close(index);
81
81
  current = { match, start: index, continuation: [] };
82
- if (match.definition.keyword === 'TASK') {
83
- diagnostics.push({
84
- line: index + 1,
85
- message: 'A later `TASK` line does not declare another task; only the first nonempty line identifies the document.',
86
- severity: 'warning',
87
- });
88
- }
89
82
  continue;
90
83
  }
84
+ content = unescapeLine(line);
91
85
  }
92
86
  if (current)
93
- current.continuation.push(line);
87
+ current.continuation.push(content);
94
88
  else
95
- introLines.push(line);
89
+ introduction.push(index);
96
90
  }
97
91
  close(lines.length);
98
92
  if (fence)
99
93
  diagnostics.push({ line: lines.length, message: 'An unterminated fenced block runs to the end of the document.', severity: 'warning' });
94
+ // The opening declaration.
95
+ const header = lines[headerLine];
96
+ const opening = matchCommitmentKeyword(header);
97
+ let declaredKind;
98
+ let name = '';
99
+ let plainHeader = false;
100
+ let uppercaseName = false;
101
+ if (opening?.definition.kind === 'declaration') {
102
+ declaredKind = KIND_BY_KEYWORD[opening.definition.keyword];
103
+ name = opening.content;
104
+ if (!name)
105
+ diagnostics.push({ line: headerLine + 1, message: `\`${opening.written}\` needs the entity's name on the same line, e.g. \`${opening.written} Improve CSV export\`.`, severity: 'error' });
106
+ }
107
+ else if (opening?.definition.unknown && /^(AGENT|TASK|CHAT) /.test(opening.written)) {
108
+ // `TASK API cleanup`: the name's first word joins the keyword under the boundary rule.
109
+ const [keyword, ...rest] = opening.written.split(/\s+/);
110
+ name = [...rest, opening.content].filter(Boolean).join(' ');
111
+ uppercaseName = true;
112
+ diagnostics.push({
113
+ line: headerLine + 1,
114
+ message: `\`${opening.written}\` is not a declaration: the name's first word must not be all uppercase (for example \`${keyword} ${rest[0][0]}${rest[0].slice(1).toLowerCase()}${name.slice(rest[0].length)}\`).`,
115
+ severity: 'error',
116
+ });
117
+ }
118
+ else if (opening && !opening.definition.unknown) {
119
+ diagnostics.push({ line: headerLine + 1, message: `A Book must start with \`AGENT <name>\`, \`TASK <name>\` or \`CHAT <name>\`, not \`${opening.written}\`.`, severity: 'error' });
120
+ }
121
+ else {
122
+ // A plain first line: the former unprefixed name header (an all-uppercase name reads as an unknown keyword).
123
+ plainHeader = true;
124
+ uppercaseName = Boolean(opening);
125
+ name = header.trim();
126
+ }
127
+ if (/^\s/.test(header) && !plainHeader)
128
+ diagnostics.push({ line: headerLine + 1, message: 'The opening declaration must start at the beginning of the line.', severity: 'error' });
129
+ // Text under the opening line belongs to the name declaration, which is a single line.
130
+ const introductionLines = introduction.filter((index) => lines[index].trim() !== '');
131
+ const introductionText = introduction.length ? introduction.map((index) => unescapeLine(lines[index])).join('\n').trim() : '';
132
+ if (introductionLines.length && !plainHeader && declaredKind) {
133
+ diagnostics.push({
134
+ line: introductionLines[0] + 1,
135
+ message: `The ${declaredKind} name is a single line; put this text under a commitment such as ${declaredKind === 'task' ? 'GOAL' : declaredKind === 'agent' ? 'PERSONA, GOAL or NOTE' : 'NOTE'} (\`ptbk migrate\` converts it).`,
136
+ severity: 'error',
137
+ });
138
+ }
139
+ // Historical ENTITY lines and further declarations.
140
+ const entities = commitments.filter((commitment) => commitment.keyword === 'ENTITY');
141
+ // `ENTITY TASK` reads as one complete keyword; its second word is the former kind.
142
+ const entityValues = [...new Set(entities.map((commitment) => (commitment.written.split(/\s+/)[1] ?? commitment.value).trim().toUpperCase()))];
143
+ const entity = entityValues.length > 1 ? 'conflict' : entityValues.length ? (KIND_BY_KEYWORD[entityValues[0]] ?? 'unsupported') : undefined;
144
+ if (entities.length && declaredKind) {
145
+ const contradicts = entity !== declaredKind;
146
+ diagnostics.push({
147
+ line: entities[0].startLine + 1,
148
+ message: contradicts ? `ENTITY ${entities[0].value} contradicts the opening \`${opening.written}\` declaration and cannot override it.` : 'ENTITY is former syntax; the opening declaration already states the kind (remove this line).',
149
+ severity: contradicts ? 'error' : 'warning',
150
+ });
151
+ }
100
152
  for (const commitment of commitments) {
101
- const scope = commitment.definition.scope;
102
- if (kind === 'task' && scope === 'agent') {
103
- diagnostics.push({ line: commitment.startLine + 1, message: `\`${commitment.written}\` is an agent commitment and has no meaning in a task.`, severity: 'warning' });
153
+ if (commitment.definition.kind === 'declaration') {
154
+ diagnostics.push({ line: commitment.startLine + 1, message: `A Book defines exactly one entity; this second \`${commitment.written}\` declaration is invalid.`, severity: 'error' });
155
+ }
156
+ }
157
+ const legacyPresent = plainHeader || uppercaseName || entities.length > 0 || (introductionLines.length > 0 && Boolean(declaredKind));
158
+ const legacy = legacyPresent
159
+ ? {
160
+ plainHeader,
161
+ entity,
162
+ uppercaseName: uppercaseName || undefined,
163
+ introduction: introductionLines.length ? { start: introduction[0], end: introduction[introduction.length - 1] + 1, text: introductionText } : undefined,
164
+ }
165
+ : undefined;
166
+ if (plainHeader) {
167
+ diagnostics.push({
168
+ line: headerLine + 1,
169
+ message: `"${name}" starts with a plain name line (former syntax). Canonical Books start with \`AGENT <name>\`, \`TASK <name>\` or \`CHAT <name>\`; convert it explicitly with \`ptbk migrate\`.`,
170
+ severity: 'error',
171
+ });
172
+ }
173
+ const kind = declaredKind && name ? declaredKind : undefined;
174
+ for (const commitment of commitments) {
175
+ if (commitment.definition.kind === 'declaration' || commitment.keyword === 'ENTITY')
176
+ continue;
177
+ const singleLine = commitment.definition.kind === 'control' || commitment.definition.kind === 'repeatable-control' || commitment.definition.kind === 'flag';
178
+ if (singleLine && commitment.continuation && kind) {
179
+ diagnostics.push({
180
+ line: commitment.startLine + 2,
181
+ message: `\`${commitment.written}\` takes single-line content; the text below it belongs to no instruction (put it under a commitment such as ${kind === 'task' ? 'GOAL' : kind === 'agent' ? 'PERSONA or NOTE' : 'NOTE'}).`,
182
+ severity: 'warning',
183
+ });
104
184
  }
105
- if (kind === 'agent' && scope === 'task') {
106
- diagnostics.push({ line: commitment.startLine + 1, message: `\`${commitment.written}\` is a task commitment and has no meaning in an agent.`, severity: 'warning' });
185
+ if (commitment.definition.unknown) {
186
+ diagnostics.push({ line: commitment.startLine + 1, message: `Unknown commitment \`${commitment.written}\`; it is preserved but has no effect.`, severity: 'warning' });
187
+ continue;
107
188
  }
189
+ if (!kind)
190
+ continue;
191
+ const scope = commitment.definition.scope;
192
+ if (scope === 'any' || scope === kind || (scope === 'both' && kind !== 'chat'))
193
+ continue;
194
+ diagnostics.push({ line: commitment.startLine + 1, message: `\`${commitment.written}\` is ${scopeLabel(scope)} commitment and has no meaning in a ${kind}.`, severity: 'warning' });
108
195
  }
109
- return { kind, name, headerLine, intro: introLines.join('\n').trim(), commitments, diagnostics, lines, newline };
196
+ return { kind: kind ?? 'invalid', name, declaredKind, legacy, headerLine, commitments, diagnostics, lines, newline };
110
197
  }
111
198
  /**
112
199
  * Returns all commitments of a canonical keyword.
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/book/parse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/book/parse.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ export declare function nonAgentOf(normalized: string): NonAgentName | undefined
25
25
  * @private Book language
26
26
  */
27
27
  export type AgentReference = {
28
- /** Exact source text, e.g. `@Developer` or `{Frontend Developer}`. */
28
+ /** Exact source text, e.g. `@Developer`, `{{Frontend Developer}}` or the compatible `{Frontend Developer}`. */
29
29
  readonly raw: string;
30
30
  /** Name without reference syntax, e.g. `Frontend Developer`. */
31
31
  readonly name: string;
@@ -35,7 +35,8 @@ export type AgentReference = {
35
35
  readonly index: number;
36
36
  };
37
37
  /**
38
- * Parses a single dedicated reference field value (`@Name`, `{Name}` or a bare name, as in `FROM Adam`).
38
+ * Parses a single dedicated reference field value (`@Name`, `{{Name}}`, the compatible `{Name}` or a bare name, as in
39
+ * `FROM Adam`).
39
40
  *
40
41
  * Returns `undefined` for an empty or malformed value.
41
42
  *
@@ -43,7 +44,8 @@ export type AgentReference = {
43
44
  */
44
45
  export declare function parseReferenceValue(value: string): AgentReference | undefined;
45
46
  /**
46
- * Finds agent references (`@Token` and `{Name}`) in natural text, skipping fenced/inline code and email addresses.
47
+ * Finds references (`@Token`, `{{Name}}` and the compatible `{Name}`) in natural text, skipping fenced/inline code and
48
+ * email addresses.
47
49
  *
48
50
  * @private Book language
49
51
  */
@@ -55,8 +57,14 @@ export declare function findAgentReferences(text: string): AgentReference[];
55
57
  */
56
58
  export declare function maskCode(text: string): string;
57
59
  /**
58
- * Formats an agent name as a reference (`@Name` for single tokens, `{Name}` otherwise).
60
+ * Formats a name as a reference (`@Name` for a single word, `{{Name}}` otherwise).
59
61
  *
60
62
  * @private Book language
61
63
  */
62
64
  export declare function formatAgentReference(name: string): string;
65
+ /**
66
+ * The plain name of a reference (`@Developer`, `{{Frontend Developer}}`, `{Frontend Developer}` or a bare name).
67
+ *
68
+ * @private Book language
69
+ */
70
+ export declare function referenceName(value: string): string;
@@ -36,7 +36,8 @@ export function nonAgentOf(normalized) {
36
36
  */
37
37
  const TRAILING_PUNCTUATION = /[.,;:!?)\]}>"'`]+$/;
38
38
  /**
39
- * Parses a single dedicated reference field value (`@Name`, `{Name}` or a bare name, as in `FROM Adam`).
39
+ * Parses a single dedicated reference field value (`@Name`, `{{Name}}`, the compatible `{Name}` or a bare name, as in
40
+ * `FROM Adam`).
40
41
  *
41
42
  * Returns `undefined` for an empty or malformed value.
42
43
  *
@@ -47,7 +48,15 @@ export function parseReferenceValue(value) {
47
48
  if (!text)
48
49
  return undefined;
49
50
  let name;
50
- if (text.startsWith('{')) {
51
+ if (text.startsWith('{{')) {
52
+ const end = text.indexOf('}}');
53
+ if (end < 0)
54
+ return undefined;
55
+ name = text.slice(2, end).trim();
56
+ if (text.slice(end + 2).trim())
57
+ return undefined;
58
+ }
59
+ else if (text.startsWith('{')) {
51
60
  const end = text.indexOf('}');
52
61
  if (end < 0)
53
62
  return undefined;
@@ -69,29 +78,37 @@ export function parseReferenceValue(value) {
69
78
  return { raw: text, name, normalized, index: 0 };
70
79
  }
71
80
  /**
72
- * Finds agent references (`@Token` and `{Name}`) in natural text, skipping fenced/inline code and email addresses.
81
+ * Finds references (`@Token`, `{{Name}}` and the compatible `{Name}`) in natural text, skipping fenced/inline code and
82
+ * email addresses.
73
83
  *
74
84
  * @private Book language
75
85
  */
76
86
  export function findAgentReferences(text) {
77
87
  const references = [];
78
88
  const masked = maskCode(text);
79
- const pattern = /\{([^{}\n]{1,120})\}|@([^\s@{}()[\]<>,;:!?"'`]+)/g;
89
+ const pattern = /\{\{([^{}\n]{1,240})\}\}|\{([^{}\n]{1,240})\}|@([^\s@{}()[\]<>,;:!?"'`]+)/g;
80
90
  let match;
81
91
  while ((match = pattern.exec(masked)) !== null) {
82
92
  const index = match.index;
83
- if (match[2] !== undefined) {
93
+ if (match[1] !== undefined) {
94
+ const name = match[1].trim();
95
+ const normalized = normalizeAgentName(name);
96
+ if (normalized)
97
+ references.push({ raw: match[0], name, normalized, index });
98
+ continue;
99
+ }
100
+ if (match[3] !== undefined) {
84
101
  const previous = index > 0 ? masked[index - 1] : '';
85
102
  if (/[A-Za-z0-9._%+-]/.test(previous))
86
103
  continue; // e-mail address or similar
87
- const name = match[2].replace(TRAILING_PUNCTUATION, '');
104
+ const name = match[3].replace(TRAILING_PUNCTUATION, '');
88
105
  const normalized = normalizeAgentName(name);
89
106
  if (!normalized)
90
107
  continue;
91
108
  references.push({ raw: `@${name}`, name, normalized, index });
92
109
  }
93
110
  else {
94
- const name = match[1].trim();
111
+ const name = match[2].trim();
95
112
  // Braces around code-like or template content are not references.
96
113
  if (!name || /[=$%#|\\/]/.test(name) || /^\d+(,\d*)?$/.test(name))
97
114
  continue;
@@ -129,11 +146,19 @@ export function maskCode(text) {
129
146
  return result.slice(0, text.length);
130
147
  }
131
148
  /**
132
- * Formats an agent name as a reference (`@Name` for single tokens, `{Name}` otherwise).
149
+ * Formats a name as a reference (`@Name` for a single word, `{{Name}}` otherwise).
133
150
  *
134
151
  * @private Book language
135
152
  */
136
153
  export function formatAgentReference(name) {
137
- return /^[^\s{}@]+$/.test(name) ? `@${name}` : `{${name}}`;
154
+ return /^[\p{L}\p{N}][\p{L}\p{N}_-]*$/u.test(name) && !/[-_]$/.test(name) ? `@${name}` : `{{${name}}}`;
155
+ }
156
+ /**
157
+ * The plain name of a reference (`@Developer`, `{{Frontend Developer}}`, `{Frontend Developer}` or a bare name).
158
+ *
159
+ * @private Book language
160
+ */
161
+ export function referenceName(value) {
162
+ return parseReferenceValue(value)?.name ?? value.trim();
138
163
  }
139
164
  //# sourceMappingURL=references.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/book/references.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/book/references.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type EntityKind } from './parse.js';
2
+ /**
3
+ * Declaration keyword of each entity kind.
4
+ *
5
+ * @private Book language
6
+ */
7
+ export declare const DECLARATION_KEYWORD: Readonly<Record<EntityKind, 'AGENT' | 'TASK' | 'CHAT'>>;
8
+ /**
9
+ * Whether a content line must be escaped (leading backslash) so it stays literal: it would start a commitment, begin
10
+ * a fence or already starts with the escape character.
11
+ *
12
+ * @private Book language
13
+ */
14
+ export declare function needsLiteralEscape(line: string): boolean;
15
+ /**
16
+ * Escapes arbitrary text as commitment continuation lines (lossless: the parser removes exactly one backslash).
17
+ *
18
+ * @private Book language
19
+ */
20
+ export declare function literalLines(text: string): string[];
21
+ /**
22
+ * Renders one commitment with arbitrary multi-line content: the first line stays on the keyword line when it cannot
23
+ * be mistaken for part of the keyword, everything else is escaped literal continuation.
24
+ *
25
+ * @private Book language
26
+ */
27
+ export declare function renderCommitment(keyword: string, content: string): string[];
28
+ /**
29
+ * Representable single-line spelling of a declared name.
30
+ *
31
+ * Whitespace collapses to single spaces; an all-uppercase first word (which would join the keyword under the boundary
32
+ * rule) is recased (`API cleanup` → `Api cleanup`, `A plan` → `a plan`), which keeps the normalized identity.
33
+ *
34
+ * @private Book language
35
+ */
36
+ export declare function declarationName(name: string): string;
37
+ /**
38
+ * Renders the opening declaration of a Book (`AGENT <name>`, `TASK <name>`, `CHAT <name>`).
39
+ *
40
+ * @private Book language
41
+ */
42
+ export declare function renderDeclaration(kind: EntityKind, name: string): string;
@@ -0,0 +1,74 @@
1
+ import { matchCommitmentKeyword } from './commitments.js';
2
+ import { fenceMarker, parseBook } from './parse.js';
3
+ /**
4
+ * Declaration keyword of each entity kind.
5
+ *
6
+ * @private Book language
7
+ */
8
+ export const DECLARATION_KEYWORD = { agent: 'AGENT', task: 'TASK', chat: 'CHAT' };
9
+ /**
10
+ * Whether a content line must be escaped (leading backslash) so it stays literal: it would start a commitment, begin
11
+ * a fence or already starts with the escape character.
12
+ *
13
+ * @private Book language
14
+ */
15
+ export function needsLiteralEscape(line) {
16
+ return line.startsWith('\\') || fenceMarker(line) !== undefined || matchCommitmentKeyword(line) !== undefined;
17
+ }
18
+ /**
19
+ * Escapes arbitrary text as commitment continuation lines (lossless: the parser removes exactly one backslash).
20
+ *
21
+ * @private Book language
22
+ */
23
+ export function literalLines(text) {
24
+ return text
25
+ .replace(/\r\n?/g, '\n')
26
+ .split('\n')
27
+ .map((line) => (needsLiteralEscape(line) ? `\\${line}` : line));
28
+ }
29
+ /**
30
+ * Renders one commitment with arbitrary multi-line content: the first line stays on the keyword line when it cannot
31
+ * be mistaken for part of the keyword, everything else is escaped literal continuation.
32
+ *
33
+ * @private Book language
34
+ */
35
+ export function renderCommitment(keyword, content) {
36
+ const text = content.replace(/\r\n?/g, '\n').trim();
37
+ if (!text)
38
+ return [keyword];
39
+ const [first, ...rest] = text.split('\n');
40
+ const inline = `${keyword} ${first.trim()}`;
41
+ const fitsInline = !first.startsWith('\\') && fenceMarker(first) === undefined && matchCommitmentKeyword(inline)?.definition.keyword === keyword;
42
+ if (!fitsInline)
43
+ return [keyword, ...literalLines(text)];
44
+ return rest.length ? [inline, ...literalLines(rest.join('\n'))] : [inline];
45
+ }
46
+ /**
47
+ * Representable single-line spelling of a declared name.
48
+ *
49
+ * Whitespace collapses to single spaces; an all-uppercase first word (which would join the keyword under the boundary
50
+ * rule) is recased (`API cleanup` → `Api cleanup`, `A plan` → `a plan`), which keeps the normalized identity.
51
+ *
52
+ * @private Book language
53
+ */
54
+ export function declarationName(name) {
55
+ const single = name.replace(/\s+/g, ' ').trim();
56
+ const [first = '', ...rest] = single.split(' ');
57
+ if (!/^\p{Lu}[\p{Lu}\p{M}]*$/u.test(first))
58
+ return single;
59
+ const recased = first.length > 1 ? `${first[0]}${first.slice(1).toLowerCase()}` : first.toLowerCase();
60
+ return [recased, ...rest].join(' ');
61
+ }
62
+ /**
63
+ * Renders the opening declaration of a Book (`AGENT <name>`, `TASK <name>`, `CHAT <name>`).
64
+ *
65
+ * @private Book language
66
+ */
67
+ export function renderDeclaration(kind, name) {
68
+ const line = `${DECLARATION_KEYWORD[kind]} ${declarationName(name)}`;
69
+ const document = parseBook(line);
70
+ if (document.kind !== kind)
71
+ throw new Error(`Cannot declare "${name}" as a ${kind}: ${document.diagnostics.map((diagnostic) => diagnostic.message).join(' ')}`);
72
+ return line;
73
+ }
74
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/book/write.ts"],"names":[],"mappings":"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"}