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/tasks/identity.js
CHANGED
|
@@ -1,67 +1,136 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { PtbkError } from '../common/errors.js';
|
|
3
|
+
import { normalizeAgentName } from '../book/references.js';
|
|
4
|
+
import { declarationName } from '../book/write.js';
|
|
5
|
+
import { creationTimestamp } from '../common/time.js';
|
|
2
6
|
/**
|
|
3
|
-
*
|
|
7
|
+
* File names Windows reserves regardless of extension.
|
|
4
8
|
*/
|
|
5
|
-
const
|
|
9
|
+
const RESERVED_NAMES = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i;
|
|
6
10
|
/**
|
|
7
|
-
*
|
|
11
|
+
* Longest name key used verbatim as a directory name; longer keys are shortened with a hash suffix.
|
|
12
|
+
*/
|
|
13
|
+
const MAX_KEY_LENGTH = 80;
|
|
14
|
+
/**
|
|
15
|
+
* Deterministic, filesystem-safe directory name derived from a Book's **normalized** name.
|
|
16
|
+
*
|
|
17
|
+
* Equivalent spellings (`{Improve CSV export}`, `@ImproveCsvExport`) map to the same key; it is a pure function of
|
|
18
|
+
* the normalized name, never an allocated ID. Letters/digits outside `[a-z0-9]` are hex-escaped so every script works.
|
|
19
|
+
*
|
|
20
|
+
* @private task identity
|
|
8
21
|
*/
|
|
9
|
-
|
|
22
|
+
export function nameKeyPath(name) {
|
|
23
|
+
const normalized = normalizeAgentName(name);
|
|
24
|
+
let key = '';
|
|
25
|
+
for (const character of normalized)
|
|
26
|
+
key += /[a-z0-9]/.test(character) ? character : `_${character.codePointAt(0).toString(16)}`;
|
|
27
|
+
if (!key)
|
|
28
|
+
key = '_';
|
|
29
|
+
if (RESERVED_NAMES.test(key))
|
|
30
|
+
key = `${key}_`;
|
|
31
|
+
if (key.length > MAX_KEY_LENGTH)
|
|
32
|
+
key = `${key.slice(0, MAX_KEY_LENGTH - 13)}-${createHash('sha256').update(normalized).digest('hex').slice(0, 12)}`;
|
|
33
|
+
return key;
|
|
34
|
+
}
|
|
10
35
|
/**
|
|
11
|
-
*
|
|
36
|
+
* Literal trace-directory component of a task source: its actual filename without the final `.book` (or legacy
|
|
37
|
+
* `.md`) extension, never derived from the declared TASK name, normalized, slugified, hashed or allocated.
|
|
12
38
|
*
|
|
13
|
-
*
|
|
14
|
-
* `..`, a trailing dot or a name reserved by Windows.
|
|
39
|
+
* Returns `undefined` for a basename that cannot safely name a directory (empty, `.`/`..`, path separators).
|
|
15
40
|
*
|
|
16
41
|
* @private task identity
|
|
17
42
|
*/
|
|
18
|
-
export function
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (
|
|
22
|
-
return
|
|
23
|
-
|
|
24
|
-
return `TASK ID "${id}" is a reserved file name on Windows.`;
|
|
25
|
-
return undefined;
|
|
43
|
+
export function traceBasenameOf(sourcePath) {
|
|
44
|
+
const filename = sourcePath.replace(/\\/g, '/').split('/').pop() ?? '';
|
|
45
|
+
const basename = filename.replace(/\.(book|md)$/i, '');
|
|
46
|
+
if (!basename.trim() || basename === '.' || basename === '..' || /[\\/\0]/.test(basename))
|
|
47
|
+
return undefined;
|
|
48
|
+
return basename;
|
|
26
49
|
}
|
|
27
50
|
/**
|
|
28
|
-
*
|
|
51
|
+
* Project-relative POSIX directory of a task's audit evidence: `traces/<task-file-basename>`, copying the actual
|
|
52
|
+
* source filename literally without its final extension (a storage convention, not the task's logical identity).
|
|
29
53
|
*
|
|
30
54
|
* @private task identity
|
|
31
55
|
*/
|
|
32
|
-
export function
|
|
33
|
-
|
|
56
|
+
export function traceDirectoryOf(sourcePath) {
|
|
57
|
+
const basename = traceBasenameOf(sourcePath);
|
|
58
|
+
if (!basename)
|
|
59
|
+
throw new PtbkError(`The task source ${sourcePath} has no usable filename for its trace directory.`, { kind: 'configuration', next: ['Rename the task source to a readable `.book` filename.'] });
|
|
60
|
+
return `traces/${basename}`;
|
|
34
61
|
}
|
|
35
62
|
/**
|
|
36
|
-
*
|
|
63
|
+
* Directory where engines before the source-filename convention stored a task's evidence (`traces/<name-key>`).
|
|
64
|
+
* It remains historical evidence and is only linked, never written to again.
|
|
37
65
|
*
|
|
38
|
-
*
|
|
66
|
+
* @private task identity
|
|
67
|
+
*/
|
|
68
|
+
export function legacyTraceDirectoryOf(taskName) {
|
|
69
|
+
return `traces/${nameKeyPath(taskName)}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Groups task sources whose trace directories would collide (different sources, same literal basename, e.g.
|
|
73
|
+
* `tasks/a.book` and `prompts/a.md`). Such evidence destinations are ambiguous and must be resolved explicitly.
|
|
39
74
|
*
|
|
40
75
|
* @private task identity
|
|
41
76
|
*/
|
|
42
|
-
export function
|
|
43
|
-
|
|
77
|
+
export function traceDirectoryConflicts(sourcePaths) {
|
|
78
|
+
const bySlot = new Map();
|
|
79
|
+
for (const path of sourcePaths) {
|
|
80
|
+
const basename = traceBasenameOf(path);
|
|
81
|
+
if (!basename)
|
|
82
|
+
continue;
|
|
83
|
+
// Case-insensitive file systems would merge directories differing only by case.
|
|
84
|
+
const slot = basename.toLowerCase();
|
|
85
|
+
const sources = bySlot.get(slot) ?? new Set();
|
|
86
|
+
sources.add(path.replace(/\\/g, '/'));
|
|
87
|
+
bySlot.set(slot, sources);
|
|
88
|
+
}
|
|
89
|
+
const conflicts = new Map();
|
|
90
|
+
for (const [slot, sources] of bySlot)
|
|
91
|
+
if (sources.size > 1)
|
|
92
|
+
conflicts.set(slot, [...sources].sort());
|
|
93
|
+
return conflicts;
|
|
44
94
|
}
|
|
45
95
|
/**
|
|
46
|
-
* Markdown metadata line
|
|
96
|
+
* Legacy Markdown metadata line that once carried a generated task ID (read as history only, never written).
|
|
47
97
|
*
|
|
48
98
|
* @private task identity
|
|
49
99
|
*/
|
|
50
|
-
export const
|
|
100
|
+
export const MARKDOWN_LEGACY_ID_LINE = /^\s*<!--\s*ptbk-task-id:\s*(\S+?)\s*-->\s*$/;
|
|
51
101
|
/**
|
|
52
|
-
*
|
|
102
|
+
* Normalized names reserved by the engine's built-ins (never given to a generated Book).
|
|
103
|
+
*/
|
|
104
|
+
const RESERVED_KEYS = ['void', 'null', '0', 'user', 'expert'];
|
|
105
|
+
/**
|
|
106
|
+
* Picks a readable name that is distinct under normalization from the given taken keys (`Name`, `Name (2)`, …).
|
|
107
|
+
*
|
|
108
|
+
* The name is spelled so it can follow a declaration keyword; built-in names are never taken.
|
|
53
109
|
*
|
|
54
110
|
* @private task identity
|
|
55
111
|
*/
|
|
56
|
-
export function
|
|
57
|
-
|
|
112
|
+
export function distinctName(base, taken) {
|
|
113
|
+
const name = declarationName(base) || 'Untitled';
|
|
114
|
+
const occupied = (candidate) => taken.has(normalizeAgentName(candidate)) || RESERVED_KEYS.includes(normalizeAgentName(candidate));
|
|
115
|
+
if (!occupied(name))
|
|
116
|
+
return name;
|
|
117
|
+
for (let counter = 2;; counter++) {
|
|
118
|
+
const candidate = `${name} (${counter})`;
|
|
119
|
+
if (!occupied(candidate))
|
|
120
|
+
return candidate;
|
|
121
|
+
}
|
|
58
122
|
}
|
|
59
123
|
/**
|
|
60
|
-
*
|
|
124
|
+
* The name of a newly created task or chat: a readable title plus its creation date and time
|
|
125
|
+
* (`Improve CSV export — 2026-10-18 01:25:00`), made distinct from every taken normalized name.
|
|
126
|
+
*
|
|
127
|
+
* Allocate it once per new entity; reopening, replying, retrying or recurring keeps the saved name. The date is
|
|
128
|
+
* ordinary name text, never parsed back.
|
|
61
129
|
*
|
|
62
130
|
* @private task identity
|
|
63
131
|
*/
|
|
64
|
-
export function
|
|
65
|
-
|
|
132
|
+
export function generatedName(title, options) {
|
|
133
|
+
const readable = title.replace(/\s+/g, ' ').trim() || 'Untitled';
|
|
134
|
+
return distinctName(`${readable} — ${creationTimestamp(options.now ?? Date.now(), options.timeZone)}`, options.taken);
|
|
66
135
|
}
|
|
67
136
|
//# sourceMappingURL=identity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/tasks/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/tasks/identity.ts"],"names":[],"mappings":"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"}
|
package/dist/tasks/markdown.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Task } from './model.js';
|
|
2
2
|
/**
|
|
3
3
|
* One `---`-separated section of a Markdown task file.
|
|
4
4
|
*
|
|
@@ -25,11 +25,11 @@ export type MarkdownSection = {
|
|
|
25
25
|
readonly title?: string;
|
|
26
26
|
/** Description after the title. */
|
|
27
27
|
readonly description: string;
|
|
28
|
-
/**
|
|
29
|
-
readonly
|
|
30
|
-
/** Index (within `lines`) of
|
|
28
|
+
/** Legacy `<!-- ptbk-task-id: … -->` value (historical metadata only, never identity). */
|
|
29
|
+
readonly legacyId?: string;
|
|
30
|
+
/** Index (within `lines`) of that legacy metadata line. */
|
|
31
31
|
readonly idLine?: number;
|
|
32
|
-
/**
|
|
32
|
+
/** Revision hash: section content without its control and legacy metadata lines (locates the section for writes). */
|
|
33
33
|
readonly hash: string;
|
|
34
34
|
};
|
|
35
35
|
/**
|
|
@@ -57,22 +57,15 @@ export declare function readMarkdownTasks(options: {
|
|
|
57
57
|
timeZone: string;
|
|
58
58
|
}): Task[];
|
|
59
59
|
/**
|
|
60
|
-
* Locator of a Markdown task section: its
|
|
60
|
+
* Locator of a Markdown task section: its revision hash (the section number alone is never identity).
|
|
61
61
|
*
|
|
62
62
|
* @private Markdown tasks
|
|
63
63
|
*/
|
|
64
64
|
export type SectionLocator = {
|
|
65
|
-
readonly id?: string;
|
|
66
65
|
readonly hash?: string;
|
|
67
66
|
};
|
|
68
67
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
* @private Markdown tasks
|
|
72
|
-
*/
|
|
73
|
-
export declare function setMarkdownTaskId(source: string, sectionHash: string, id: string): string;
|
|
74
|
-
/**
|
|
75
|
-
* Rewrites the control line of the section identified by its task ID (or, without an ID, its identity hash).
|
|
68
|
+
* Rewrites the control line of the section identified by its revision hash.
|
|
76
69
|
*
|
|
77
70
|
* The section is located by identity (not by its number) so that a result is never attached to the wrong task.
|
|
78
71
|
*
|
package/dist/tasks/markdown.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { sha256 } from '../common/fs.js';
|
|
2
2
|
import { parseDateTime } from '../common/time.js';
|
|
3
3
|
import { PtbkError } from '../common/errors.js';
|
|
4
|
-
import {
|
|
4
|
+
import { MARKDOWN_LEGACY_ID_LINE } from './identity.js';
|
|
5
|
+
import { nameKey, nameReference } from './model.js';
|
|
5
6
|
/**
|
|
6
7
|
* Marker comment excluding a Markdown file from the queue.
|
|
7
8
|
*/
|
|
@@ -55,13 +56,13 @@ export function splitMarkdownSections(source) {
|
|
|
55
56
|
return sections;
|
|
56
57
|
}
|
|
57
58
|
/**
|
|
58
|
-
* Interprets one section's control line,
|
|
59
|
+
* Interprets one section's control line, title and description.
|
|
59
60
|
*
|
|
60
|
-
*
|
|
61
|
+
* A legacy task ID comment is historical metadata: it is neither the control line, the title nor the description.
|
|
61
62
|
*/
|
|
62
63
|
function analyzeSection(lines, index, startLine, endLine) {
|
|
63
|
-
const idLine = lines.findIndex((line) =>
|
|
64
|
-
const
|
|
64
|
+
const idLine = lines.findIndex((line) => MARKDOWN_LEGACY_ID_LINE.test(line));
|
|
65
|
+
const legacyId = idLine >= 0 ? MARKDOWN_LEGACY_ID_LINE.exec(lines[idLine])[1] : undefined;
|
|
65
66
|
const content = (line, lineIndex) => lineIndex !== idLine && line.trim() !== '';
|
|
66
67
|
let cursor = lines.findIndex(content);
|
|
67
68
|
let controlLine;
|
|
@@ -91,7 +92,7 @@ function analyzeSection(lines, index, startLine, endLine) {
|
|
|
91
92
|
titleLine,
|
|
92
93
|
title,
|
|
93
94
|
description,
|
|
94
|
-
|
|
95
|
+
legacyId,
|
|
95
96
|
idLine: idLine >= 0 ? idLine : undefined,
|
|
96
97
|
hash: sha256(identity).slice(0, 16),
|
|
97
98
|
};
|
|
@@ -158,13 +159,13 @@ export function readMarkdownTasks(options) {
|
|
|
158
159
|
}
|
|
159
160
|
const metadata = status === 'done' ? { priority: 0, selectors: [] } : parseControlMetadata(section.controlRest, options.timeZone, diagnostics, line);
|
|
160
161
|
const placeholder = /@@@/.test(section.title) || /@@@/.test(section.description);
|
|
161
|
-
const
|
|
162
|
-
if (
|
|
163
|
-
diagnostics.push({ line:
|
|
164
|
-
const id = idProblem ? undefined : section.id;
|
|
162
|
+
const key = nameKey(section.title);
|
|
163
|
+
if (!key)
|
|
164
|
+
diagnostics.push({ line, message: 'The task title is empty after normalization.', severity: 'error' });
|
|
165
165
|
tasks.push({
|
|
166
|
-
ref:
|
|
167
|
-
|
|
166
|
+
ref: nameReference(section.title),
|
|
167
|
+
key,
|
|
168
|
+
legacyId: section.legacyId,
|
|
168
169
|
title: section.title,
|
|
169
170
|
description: section.description,
|
|
170
171
|
rules: [],
|
|
@@ -197,7 +198,7 @@ export function readMarkdownTasks(options) {
|
|
|
197
198
|
*/
|
|
198
199
|
function locateSection(source, locator) {
|
|
199
200
|
const sections = splitMarkdownSections(source);
|
|
200
|
-
const matches = sections.filter((section) =>
|
|
201
|
+
const matches = sections.filter((section) => section.hash === locator.hash);
|
|
201
202
|
if (matches.length !== 1) {
|
|
202
203
|
throw new PtbkError(matches.length ? 'The Markdown task section is duplicated.' : 'The Markdown task section moved or disappeared.', {
|
|
203
204
|
kind: 'conflict',
|
|
@@ -208,22 +209,7 @@ function locateSection(source, locator) {
|
|
|
208
209
|
return matches[0];
|
|
209
210
|
}
|
|
210
211
|
/**
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
* @private Markdown tasks
|
|
214
|
-
*/
|
|
215
|
-
export function setMarkdownTaskId(source, sectionHash, id) {
|
|
216
|
-
const newline = source.includes('\r\n') ? '\r\n' : '\n';
|
|
217
|
-
const section = locateSection(source, { hash: sectionHash });
|
|
218
|
-
if (section.id !== undefined)
|
|
219
|
-
return source;
|
|
220
|
-
const lines = source.split(/\r?\n/);
|
|
221
|
-
const first = section.lines.findIndex((line) => line.trim() !== '');
|
|
222
|
-
lines.splice(section.startLine + Math.max(0, first), 0, markdownTaskIdLine(id));
|
|
223
|
-
return lines.join(newline);
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Rewrites the control line of the section identified by its task ID (or, without an ID, its identity hash).
|
|
212
|
+
* Rewrites the control line of the section identified by its revision hash.
|
|
227
213
|
*
|
|
228
214
|
* The section is located by identity (not by its number) so that a result is never attached to the wrong task.
|
|
229
215
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/tasks/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/tasks/markdown.ts"],"names":[],"mappings":"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"}
|
package/dist/tasks/model.d.ts
CHANGED
|
@@ -81,12 +81,16 @@ export type TaskRouting = {
|
|
|
81
81
|
* @private task model
|
|
82
82
|
*/
|
|
83
83
|
export type Task = {
|
|
84
|
-
/**
|
|
84
|
+
/** Reference to the task by its name (`{Improve CSV export}` or `@Name`). */
|
|
85
85
|
readonly ref: string;
|
|
86
|
-
/**
|
|
87
|
-
readonly
|
|
88
|
-
/**
|
|
86
|
+
/** Normalized name: the task's identity (no separate ID). */
|
|
87
|
+
readonly key: string;
|
|
88
|
+
/** Legacy `TASK ID` / Markdown `ptbk-task-id` value, kept only as historical metadata. */
|
|
89
|
+
readonly legacyId?: string;
|
|
90
|
+
/** Display name: the first nonempty line (not enforced unique; the resolver picks one winner). */
|
|
89
91
|
readonly title: string;
|
|
92
|
+
/** Name of the Book that wins the same normalized name, when this task is shadowed by it. */
|
|
93
|
+
readonly shadowedBy?: string;
|
|
90
94
|
/** Natural-language description. */
|
|
91
95
|
readonly description: string;
|
|
92
96
|
/** Task-local rules. */
|
|
@@ -144,3 +148,15 @@ export declare function isRecurring(task: Task): boolean;
|
|
|
144
148
|
* @private task model
|
|
145
149
|
*/
|
|
146
150
|
export declare function assignmentText(task: Task): string;
|
|
151
|
+
/**
|
|
152
|
+
* Reference to a named Book (`@Name` for one word, `{Name}` otherwise).
|
|
153
|
+
*
|
|
154
|
+
* @private task model
|
|
155
|
+
*/
|
|
156
|
+
export declare function nameReference(name: string): string;
|
|
157
|
+
/**
|
|
158
|
+
* Normalized name key of a task, agent or chat name (identity comparison).
|
|
159
|
+
*
|
|
160
|
+
* @private task model
|
|
161
|
+
*/
|
|
162
|
+
export declare function nameKey(name: string): string;
|
package/dist/tasks/model.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { formatAgentReference, normalizeAgentName } from '../book/references.js';
|
|
1
2
|
/**
|
|
2
3
|
* Whether a task's source has blocking diagnostics.
|
|
3
4
|
*
|
|
@@ -25,4 +26,20 @@ export function assignmentText(task) {
|
|
|
25
26
|
parts.push(task.rules.map((rule) => `RULE ${rule}`).join('\n'));
|
|
26
27
|
return parts.filter(Boolean).join('\n\n');
|
|
27
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Reference to a named Book (`@Name` for one word, `{Name}` otherwise).
|
|
31
|
+
*
|
|
32
|
+
* @private task model
|
|
33
|
+
*/
|
|
34
|
+
export function nameReference(name) {
|
|
35
|
+
return formatAgentReference(name);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Normalized name key of a task, agent or chat name (identity comparison).
|
|
39
|
+
*
|
|
40
|
+
* @private task model
|
|
41
|
+
*/
|
|
42
|
+
export function nameKey(name) {
|
|
43
|
+
return normalizeAgentName(name);
|
|
44
|
+
}
|
|
28
45
|
//# sourceMappingURL=model.js.map
|
package/dist/tasks/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/tasks/model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/tasks/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA6IjF;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAU;IAC7C,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAU;IACrC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACtC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAChC,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/tasks/sources.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { BookIndex } from '../project/books.js';
|
|
1
2
|
import type { Task } from './model.js';
|
|
2
3
|
/**
|
|
3
4
|
* Directory also scanned for Markdown tasks.
|
|
@@ -19,6 +20,8 @@ export type TaskSourceOptions = {
|
|
|
19
20
|
readonly explicit?: boolean;
|
|
20
21
|
/** Time zone for date interpretation. */
|
|
21
22
|
readonly timeZone: string;
|
|
23
|
+
/** The project's Book index: a same-name Book ranked earlier (e.g. an agent) shadows a queued task. */
|
|
24
|
+
readonly index?: BookIndex;
|
|
22
25
|
};
|
|
23
26
|
/**
|
|
24
27
|
* All tasks of a project plus source-level problems.
|
|
@@ -42,11 +45,13 @@ export type TaskQueue = {
|
|
|
42
45
|
*/
|
|
43
46
|
export declare function readTaskQueue(options: TaskSourceOptions): Promise<TaskQueue>;
|
|
44
47
|
/**
|
|
45
|
-
* Finds the
|
|
48
|
+
* Finds the task a reference names: `{Name}`, `@Name` or a bare name (by normalized name, the winning copy first),
|
|
49
|
+
* an explicit source path (`tasks/x.book`, `prompts/x.md#2`) for unambiguous source inspection, or a historical
|
|
50
|
+
* `#legacy-id`.
|
|
46
51
|
*
|
|
47
52
|
* @private task sources
|
|
48
53
|
*/
|
|
49
54
|
export declare function findTask(tasks: readonly Task[], reference: string): {
|
|
50
55
|
task?: Task;
|
|
51
|
-
|
|
56
|
+
shadowed?: Task[];
|
|
52
57
|
};
|
package/dist/tasks/sources.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import { join, resolve } from 'node:path';
|
|
2
|
+
import { join, resolve, sep } from 'node:path';
|
|
3
3
|
import { PtbkError } from '../common/errors.js';
|
|
4
4
|
import { isDirectory, listDirectory, toProjectRelative } from '../common/fs.js';
|
|
5
|
+
import { parseReferenceValue } from '../book/references.js';
|
|
5
6
|
import { readTaskBook } from './book-task.js';
|
|
6
|
-
import { taskIdKey } from './identity.js';
|
|
7
7
|
import { isIgnoredMarkdown, readMarkdownTasks } from './markdown.js';
|
|
8
8
|
/**
|
|
9
9
|
* Directory also scanned for Markdown tasks.
|
|
@@ -64,50 +64,61 @@ export async function readTaskQueue(options) {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
//
|
|
67
|
+
// A task's identity is its normalized name: same-name tasks are shadowed deterministically (never merged).
|
|
68
68
|
const problems = [];
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
69
|
+
// Same ordering as the shared resolver: tier (task source 2, elsewhere 3), depth, root order, path, section.
|
|
70
|
+
const rank = (task) => {
|
|
71
|
+
const inTasks = task.source.path.startsWith(`${tasksDirectory}${sep}`);
|
|
72
|
+
const depth = (inTasks ? task.source.path.slice(tasksDirectory.length + 1) : task.source.relativePath).split(/[\\/]/).length - 1;
|
|
73
|
+
return [inTasks ? 2 : 3, depth, inTasks ? 1 : 3, task.source.relativePath, task.source.section ?? 0];
|
|
74
|
+
};
|
|
75
|
+
const compare = (a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2] || (a[3] < b[3] ? -1 : a[3] > b[3] ? 1 : 0) || a[4] - b[4];
|
|
76
|
+
const before = (a, b) => compare(rank(a), rank(b)) < 0;
|
|
77
|
+
const winners = new Map();
|
|
78
|
+
for (const task of tasks) {
|
|
79
|
+
if (!task.key)
|
|
76
80
|
continue;
|
|
77
|
-
|
|
78
|
-
|
|
81
|
+
const current = winners.get(task.key);
|
|
82
|
+
if (!current || before(task, current))
|
|
83
|
+
winners.set(task.key, task);
|
|
79
84
|
}
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
const describe = (task) => `${task.source.relativePath}${task.source.section ? `#${task.source.section}` : ''}`;
|
|
86
|
+
const result = tasks.map((task) => {
|
|
87
|
+
const winner = task.key ? winners.get(task.key) : undefined;
|
|
88
|
+
if (winner && winner !== task) {
|
|
89
|
+
problems.push(`Task name "${task.title}" is used by ${describe(winner)} and ${describe(task)}; ${describe(winner)} wins and the other copy is shadowed (rename one of them).`);
|
|
90
|
+
return { ...task, shadowedBy: describe(winner) };
|
|
85
91
|
}
|
|
86
|
-
|
|
92
|
+
const other = options.index?.winnerOf(task.key);
|
|
93
|
+
const otherRank = other ? [other.tier, other.depth, other.root === 'agents' ? 0 : other.root === 'tasks' ? 1 : other.root === 'chats' ? 2 : 3, other.relativePath, 0] : undefined;
|
|
94
|
+
// A Book task is ranked by the index itself; a Markdown section is compared with the index winner explicitly.
|
|
95
|
+
if (other && otherRank && other.path !== task.source.path && (task.source.kind === 'book' || compare(otherRank, rank(task)) < 0)) {
|
|
96
|
+
problems.push(`Task name "${task.title}" is shadowed by the ${other.kind} ${other.relativePath}, which wins that name.`);
|
|
97
|
+
return { ...task, shadowedBy: other.relativePath };
|
|
98
|
+
}
|
|
99
|
+
return task;
|
|
100
|
+
});
|
|
87
101
|
return { tasks: result.sort((a, b) => a.source.order - b.source.order), problems, directories };
|
|
88
102
|
}
|
|
89
103
|
/**
|
|
90
|
-
* Finds the
|
|
104
|
+
* Finds the task a reference names: `{Name}`, `@Name` or a bare name (by normalized name, the winning copy first),
|
|
105
|
+
* an explicit source path (`tasks/x.book`, `prompts/x.md#2`) for unambiguous source inspection, or a historical
|
|
106
|
+
* `#legacy-id`.
|
|
91
107
|
*
|
|
92
108
|
* @private task sources
|
|
93
109
|
*/
|
|
94
110
|
export function findTask(tasks, reference) {
|
|
95
111
|
const text = reference.trim().replace(/\\/g, '/').replace(/^\.\//, '');
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
if (candidates.length === 1)
|
|
108
|
-
return { task: candidates[0] };
|
|
109
|
-
if (candidates.length > 1)
|
|
110
|
-
return { ambiguous: candidates };
|
|
111
|
-
return {};
|
|
112
|
+
const byPath = tasks.find((task) => (task.source.kind === 'book' && task.source.relativePath === text) || (task.source.kind === 'markdown' && `${task.source.relativePath}#${task.source.section}` === text));
|
|
113
|
+
if (byPath)
|
|
114
|
+
return { task: byPath };
|
|
115
|
+
const parsed = parseReferenceValue(text.replace(/^#/, ''));
|
|
116
|
+
const named = parsed ? tasks.filter((task) => task.key === parsed.normalized) : [];
|
|
117
|
+
const winner = named.find((task) => !task.shadowedBy) ?? named[0];
|
|
118
|
+
if (winner)
|
|
119
|
+
return { task: winner, shadowed: named.filter((task) => task !== winner) };
|
|
120
|
+
// Historical references written before names were the identity (`#legacy-id`) still locate their task.
|
|
121
|
+
const legacy = text.startsWith('#') ? tasks.find((task) => task.legacyId === text.slice(1)) : undefined;
|
|
122
|
+
return legacy ? { task: legacy } : {};
|
|
112
123
|
}
|
|
113
124
|
//# sourceMappingURL=sources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/tasks/sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/tasks/sources.ts"],"names":[],"mappings":"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"}
|