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.
- package/README.md +27 -9
- package/dist/book/commitments.d.ts +38 -10
- package/dist/book/commitments.js +61 -17
- package/dist/book/commitments.js.map +1 -1
- package/dist/book/convert.d.ts +36 -0
- package/dist/book/convert.js +156 -0
- package/dist/book/convert.js.map +1 -0
- package/dist/book/parse.d.ts +50 -13
- package/dist/book/parse.js +132 -45
- package/dist/book/parse.js.map +1 -1
- package/dist/book/references.d.ts +12 -4
- package/dist/book/references.js +34 -9
- package/dist/book/references.js.map +1 -1
- package/dist/book/write.d.ts +42 -0
- package/dist/book/write.js +74 -0
- package/dist/book/write.js.map +1 -0
- package/dist/browser/browser.d.ts +122 -12
- package/dist/browser/browser.js +372 -21
- package/dist/browser/browser.js.map +1 -1
- package/dist/browser/recording.d.ts +3 -3
- package/dist/browser/recording.js +5 -5
- package/dist/browser/recording.js.map +1 -1
- package/dist/chats/chat-book.d.ts +105 -0
- package/dist/chats/chat-book.js +180 -0
- package/dist/chats/chat-book.js.map +1 -0
- package/dist/chats/conversation.d.ts +54 -0
- package/dist/chats/conversation.js +188 -0
- package/dist/chats/conversation.js.map +1 -0
- package/dist/chats/local.d.ts +46 -0
- package/dist/chats/local.js +184 -0
- package/dist/chats/local.js.map +1 -0
- package/dist/chats/migration.d.ts +12 -0
- package/dist/chats/migration.js +62 -0
- package/dist/chats/migration.js.map +1 -0
- package/dist/chats/service.d.ts +81 -0
- package/dist/chats/service.js +122 -0
- package/dist/chats/service.js.map +1 -0
- package/dist/chats/store.d.ts +132 -0
- package/dist/chats/store.js +181 -0
- package/dist/chats/store.js.map +1 -0
- package/dist/chats/task-chats.d.ts +52 -0
- package/dist/chats/task-chats.js +96 -0
- package/dist/chats/task-chats.js.map +1 -0
- package/dist/cli/chats.d.ts +45 -0
- package/dist/cli/chats.js +108 -0
- package/dist/cli/chats.js.map +1 -0
- package/dist/cli/commands/add.js +32 -22
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/answer.d.ts +2 -1
- package/dist/cli/commands/answer.js +35 -41
- package/dist/cli/commands/answer.js.map +1 -1
- package/dist/cli/commands/ask.d.ts +7 -0
- package/dist/cli/commands/ask.js +37 -0
- package/dist/cli/commands/ask.js.map +1 -0
- package/dist/cli/commands/boilerplates.js +14 -3
- package/dist/cli/commands/boilerplates.js.map +1 -1
- package/dist/cli/commands/chat.d.ts +9 -0
- package/dist/cli/commands/chat.js +89 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +3 -1
- package/dist/cli/commands/dashboard.js +41 -3
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/find.js +6 -8
- package/dist/cli/commands/find.js.map +1 -1
- package/dist/cli/commands/fix.js +4 -6
- package/dist/cli/commands/fix.js.map +1 -1
- package/dist/cli/commands/init.d.ts +0 -1
- package/dist/cli/commands/init.js +38 -38
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/lint.js +16 -2
- package/dist/cli/commands/lint.js.map +1 -1
- package/dist/cli/commands/list.js +21 -13
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/migrate.d.ts +2 -1
- package/dist/cli/commands/migrate.js +70 -24
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands/pause.d.ts +8 -0
- package/dist/cli/commands/pause.js +40 -0
- package/dist/cli/commands/pause.js.map +1 -0
- package/dist/cli/commands/plan.js +6 -9
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/recover.js +7 -3
- package/dist/cli/commands/recover.js.map +1 -1
- package/dist/cli/commands/restart.d.ts +3 -1
- package/dist/cli/commands/restart.js +74 -18
- package/dist/cli/commands/restart.js.map +1 -1
- package/dist/cli/commands/resume.d.ts +8 -0
- package/dist/cli/commands/resume.js +15 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/run.js +6 -9
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/start.js +40 -36
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts +2 -1
- package/dist/cli/commands/status.js +5 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +3 -1
- package/dist/cli/commands/stop.js +18 -8
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/commands/verify.js +7 -7
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/common.d.ts +13 -0
- package/dist/cli/common.js +22 -0
- package/dist/cli/common.js.map +1 -1
- package/dist/cli/engine-delegation.d.ts +14 -0
- package/dist/cli/engine-delegation.js +46 -0
- package/dist/cli/engine-delegation.js.map +1 -0
- package/dist/cli/lifecycle.d.ts +40 -0
- package/dist/cli/lifecycle.js +71 -0
- package/dist/cli/lifecycle.js.map +1 -0
- package/dist/cli/registry.js +113 -31
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/service-view.d.ts +14 -2
- package/dist/cli/service-view.js +46 -5
- package/dist/cli/service-view.js.map +1 -1
- package/dist/cli/sources.js +5 -8
- package/dist/cli/sources.js.map +1 -1
- package/dist/cli/spec.js +1 -1
- package/dist/cli/spec.js.map +1 -1
- package/dist/common/app-data.d.ts +9 -0
- package/dist/common/app-data.js +20 -0
- package/dist/common/app-data.js.map +1 -0
- package/dist/common/errors.d.ts +2 -0
- package/dist/common/errors.js.map +1 -1
- package/dist/common/time.d.ts +6 -0
- package/dist/common/time.js +9 -0
- package/dist/common/time.js.map +1 -1
- package/dist/engine/agenda.d.ts +213 -43
- package/dist/engine/agenda.js +846 -260
- package/dist/engine/agenda.js.map +1 -1
- package/dist/engine/executor.d.ts +23 -7
- package/dist/engine/executor.js +131 -84
- package/dist/engine/executor.js.map +1 -1
- package/dist/engine/generated.d.ts +21 -1
- package/dist/engine/generated.js +36 -21
- package/dist/engine/generated.js.map +1 -1
- package/dist/engine/preview.js +10 -10
- package/dist/engine/preview.js.map +1 -1
- package/dist/engine/prompt.d.ts +16 -4
- package/dist/engine/prompt.js +22 -4
- package/dist/engine/prompt.js.map +1 -1
- package/dist/engine/routing.js +28 -4
- package/dist/engine/routing.js.map +1 -1
- package/dist/engine/snapshot.d.ts +178 -29
- package/dist/engine/state.d.ts +40 -13
- package/dist/engine/state.js +20 -5
- package/dist/engine/state.js.map +1 -1
- package/dist/engine/task-trace.d.ts +35 -7
- package/dist/engine/task-trace.js +74 -15
- package/dist/engine/task-trace.js.map +1 -1
- package/dist/engine/team.d.ts +20 -7
- package/dist/engine/team.js +30 -24
- package/dist/engine/team.js.map +1 -1
- package/dist/engine/traces.d.ts +1 -1
- package/dist/engine/traces.js +1 -1
- package/dist/expert/_main.md +67 -52
- package/dist/expert/agents/_index.md +11 -13
- package/dist/expert/agents/chatter.md +31 -0
- package/dist/expert/agents/consistency.md +6 -11
- package/dist/expert/agents/core-agents.md +9 -7
- package/dist/expert/agents/expert.md +2 -2
- package/dist/expert/agents/fixer.md +24 -0
- package/dist/expert/agents/learning.md +1 -1
- package/dist/expert/agents/non-agents.md +6 -4
- package/dist/expert/agents/teacher.md +1 -1
- package/dist/expert/agents/visual-identity.md +4 -4
- package/dist/expert/book-language/_index.md +9 -8
- package/dist/expert/book-language/commitments/_index.md +23 -3
- package/dist/expert/book-language/commitments/agent.md +11 -0
- package/dist/expert/book-language/commitments/chat-member.md +7 -0
- package/dist/expert/book-language/commitments/chat-message.md +11 -0
- package/dist/expert/book-language/commitments/chat-status.md +7 -0
- package/dist/expert/book-language/commitments/chat.md +11 -0
- package/dist/expert/book-language/commitments/entity.md +9 -0
- package/dist/expert/book-language/commitments/from.md +1 -1
- package/dist/expert/book-language/commitments/goal.md +6 -2
- package/dist/expert/book-language/commitments/link.md +9 -0
- package/dist/expert/book-language/commitments/task-depends-on.md +1 -1
- package/dist/expert/book-language/commitments/task-parent.md +1 -1
- package/dist/expert/book-language/commitments/task.md +7 -3
- package/dist/expert/book-language/commitments/team.md +1 -1
- package/dist/expert/book-language/inheritance.md +2 -2
- package/dist/expert/book-language/references.md +20 -24
- package/dist/expert/book-language/syntax.md +54 -11
- package/dist/expert/cli/acceptance.md +59 -24
- package/dist/expert/cli/api.md +23 -9
- package/dist/expert/cli/authoring.md +6 -4
- package/dist/expert/cli/autonomous-operation.md +3 -3
- package/dist/expert/cli/browser.md +29 -18
- package/dist/expert/cli/channels.md +5 -7
- package/dist/expert/cli/chat-ui.md +32 -0
- package/dist/expert/cli/chats.md +59 -0
- package/dist/expert/cli/cli.md +44 -26
- package/dist/expert/cli/configuration.md +3 -3
- package/dist/expert/cli/controls.md +13 -7
- package/dist/expert/cli/dashboard-details.md +23 -0
- package/dist/expert/cli/dashboard-layout.md +19 -12
- package/dist/expert/cli/dashboard.md +12 -8
- package/dist/expert/cli/execution.md +8 -6
- package/dist/expert/cli/first-task.md +4 -4
- package/dist/expert/cli/generated-names.md +44 -0
- package/dist/expert/cli/git-persistence.md +19 -17
- package/dist/expert/cli/global-dashboard.md +33 -0
- package/dist/expert/cli/goal-discovery.md +1 -1
- package/dist/expert/cli/help.md +1 -1
- package/dist/expert/cli/initialization-ui.md +2 -0
- package/dist/expert/cli/initialization.md +9 -7
- package/dist/expert/cli/interactive-ui.md +9 -5
- package/dist/expert/cli/locking.md +21 -0
- package/dist/expert/cli/migration.md +22 -6
- package/dist/expert/cli/process-modes.md +21 -13
- package/dist/expert/cli/recovery.md +8 -6
- package/dist/expert/cli/recurrence.md +1 -1
- package/dist/expert/cli/rich-input.md +2 -2
- package/dist/expert/cli/service-lifecycle.md +57 -0
- package/dist/expert/cli/start.md +2 -2
- package/dist/expert/cli/status-view.md +16 -12
- package/dist/expert/cli/task-books.md +11 -15
- package/dist/expert/cli/task-identity.md +8 -10
- package/dist/expert/cli/task-markdown.md +6 -10
- package/dist/expert/cli/task-origins.md +3 -1
- package/dist/expert/cli/task-relationships.md +5 -9
- package/dist/expert/cli/team.md +17 -7
- package/dist/expert/cli/terminal.md +20 -12
- package/dist/expert/cli/trace-configuration.md +1 -1
- package/dist/expert/cli/traces.md +19 -23
- package/dist/expert/cli/user-interactions.md +14 -26
- package/dist/expert/cli/workspace.md +15 -9
- package/dist/expert/concepts/engine-and-project.md +11 -0
- package/dist/expert/concepts/project-model.md +39 -0
- package/dist/expert/dictionary.md +21 -15
- package/dist/harness/plugins/claude-code/index.js +1 -0
- package/dist/harness/plugins/claude-code/index.js.map +1 -1
- package/dist/harness/plugins/cline/index.js +1 -0
- package/dist/harness/plugins/cline/index.js.map +1 -1
- package/dist/harness/plugins/openai-codex/index.js +1 -0
- package/dist/harness/plugins/openai-codex/index.js.map +1 -1
- package/dist/harness/plugins/opencode/index.js +1 -0
- package/dist/harness/plugins/opencode/index.js.map +1 -1
- package/dist/harness/types.d.ts +3 -1
- package/dist/project/agents.d.ts +29 -81
- package/dist/project/agents.js +48 -267
- package/dist/project/agents.js.map +1 -1
- package/dist/project/books.d.ts +150 -0
- package/dist/project/books.js +253 -0
- package/dist/project/books.js.map +1 -0
- package/dist/project/config.js +2 -2
- package/dist/project/config.js.map +1 -1
- package/dist/project/defaults.d.ts +35 -6
- package/dist/project/defaults.js +73 -40
- package/dist/project/defaults.js.map +1 -1
- package/dist/project/expert.js +18 -10
- package/dist/project/expert.js.map +1 -1
- package/dist/project/git.d.ts +4 -3
- package/dist/project/git.js +16 -5
- package/dist/project/git.js.map +1 -1
- package/dist/project/setup.d.ts +4 -1
- package/dist/project/setup.js +26 -6
- package/dist/project/setup.js.map +1 -1
- package/dist/service/actions.d.ts +34 -10
- package/dist/service/actions.js +51 -19
- package/dist/service/actions.js.map +1 -1
- package/dist/service/control.d.ts +53 -1
- package/dist/service/control.js +64 -4
- package/dist/service/control.js.map +1 -1
- package/dist/service/discovery.d.ts +133 -0
- package/dist/service/discovery.js +138 -0
- package/dist/service/discovery.js.map +1 -0
- package/dist/service/host.d.ts +8 -1
- package/dist/service/host.js +65 -18
- package/dist/service/host.js.map +1 -1
- package/dist/service/http.d.ts +3 -0
- package/dist/service/http.js +26 -6
- package/dist/service/http.js.map +1 -1
- package/dist/service/launcher.d.ts +66 -13
- package/dist/service/launcher.js +78 -18
- package/dist/service/launcher.js.map +1 -1
- package/dist/service/records.d.ts +12 -2
- package/dist/service/records.js +19 -5
- package/dist/service/records.js.map +1 -1
- package/dist/service/spa/app.css +83 -2
- package/dist/service/spa/app.js +393 -72
- package/dist/service/supervisor.js +7 -1
- package/dist/service/supervisor.js.map +1 -1
- package/dist/service/worker.js +14 -5
- package/dist/service/worker.js.map +1 -1
- package/dist/tasks/authoring.d.ts +3 -5
- package/dist/tasks/authoring.js +6 -7
- package/dist/tasks/authoring.js.map +1 -1
- package/dist/tasks/book-task.d.ts +18 -10
- package/dist/tasks/book-task.js +27 -23
- package/dist/tasks/book-task.js.map +1 -1
- package/dist/tasks/eligibility.d.ts +15 -7
- package/dist/tasks/eligibility.js +41 -14
- package/dist/tasks/eligibility.js.map +1 -1
- package/dist/tasks/identity.d.ts +41 -15
- package/dist/tasks/identity.js +100 -31
- package/dist/tasks/identity.js.map +1 -1
- package/dist/tasks/markdown.d.ts +7 -14
- package/dist/tasks/markdown.js +15 -29
- package/dist/tasks/markdown.js.map +1 -1
- package/dist/tasks/model.d.ts +20 -4
- package/dist/tasks/model.js +17 -0
- package/dist/tasks/model.js.map +1 -1
- package/dist/tasks/sources.d.ts +7 -2
- package/dist/tasks/sources.js +46 -35
- package/dist/tasks/sources.js.map +1 -1
- package/dist/ui/chat-client.d.ts +70 -0
- package/dist/ui/chat-client.js +209 -0
- package/dist/ui/chat-client.js.map +1 -0
- package/dist/ui/dashboard.d.ts +8 -5
- package/dist/ui/dashboard.js +227 -86
- package/dist/ui/dashboard.js.map +1 -1
- package/dist/ui/details.d.ts +64 -0
- package/dist/ui/details.js +175 -0
- package/dist/ui/details.js.map +1 -0
- package/dist/ui/global-dashboard.d.ts +59 -0
- package/dist/ui/global-dashboard.js +307 -0
- package/dist/ui/global-dashboard.js.map +1 -0
- package/dist/ui/status-view.d.ts +7 -0
- package/dist/ui/status-view.js +94 -36
- package/dist/ui/status-view.js.map +1 -1
- package/package.json +1 -1
- package/dist/engine/requests.d.ts +0 -111
- package/dist/engine/requests.js +0 -173
- package/dist/engine/requests.js.map +0 -1
- package/dist/expert/book-language/commitments/task-id.md +0 -9
- package/dist/tasks/prepare.d.ts +0 -33
- package/dist/tasks/prepare.js +0 -90
- package/dist/tasks/prepare.js.map +0 -1
package/dist/book/parse.js
CHANGED
|
@@ -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
|
-
*
|
|
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
|
-
*
|
|
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,
|
|
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
|
|
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(
|
|
87
|
+
current.continuation.push(content);
|
|
94
88
|
else
|
|
95
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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 (
|
|
106
|
-
diagnostics.push({ line: commitment.startLine + 1, message:
|
|
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,
|
|
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.
|
package/dist/book/parse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/book/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAA6B,MAAM,kBAAkB,CAAC;
|
|
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
|
|
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
|
|
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
|
|
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;
|
package/dist/book/references.js
CHANGED
|
@@ -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
|
|
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
|
|
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,
|
|
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[
|
|
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[
|
|
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[
|
|
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
|
|
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 /^[
|
|
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":"AAOA;;GAEG;AACH,MAAM,uBAAuB,GAAsC,IAAI,GAAG,CAAC;IACvE,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,QAAQ,EAAE,QAAQ,CAAC;CACvB,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC3C,OAAO,IAAI;SACN,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,UAAkB;IACzC,OAAO,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACnD,CAAC;AAkBD;;GAEG;AACH,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAElD
|
|
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":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AAErE;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA4D,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAE3I;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;AAClH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACrC,OAAO,IAAI;SACN,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;SACvB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAe;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,GAAG,OAAO,IAAI,KAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,CAAC,KAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,KAAM,CAAC,KAAK,SAAS,IAAI,sBAAsB,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC;IACnJ,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IACtG,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAgB,EAAE,IAAY;IAC5D,MAAM,IAAI,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;IACrE,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,UAAU,IAAI,KAAK,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChK,OAAO,IAAI,CAAC;AAChB,CAAC"}
|