ptbk 0.119.0-17 → 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 +1 -1
- package/dist/expert/agents/fixer.md +24 -0
- package/dist/expert/agents/learning.md +1 -1
- package/dist/expert/agents/non-agents.md +2 -2
- 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/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/references.md +20 -83
- 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 +47 -266
- 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 +33 -5
- package/dist/project/defaults.js +67 -36
- package/dist/project/defaults.js.map +1 -1
- package/dist/project/expert.js +17 -9
- 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
|
@@ -5,7 +5,10 @@ import { ensureDirectory, pathExists, toProjectRelative } from '../../common/fs.
|
|
|
5
5
|
import { loadSettings, setting } from '../../project/config.js';
|
|
6
6
|
import { commitPaths, inspectGit } from '../../project/git.js';
|
|
7
7
|
import { newTaskPath } from '../../tasks/authoring.js';
|
|
8
|
-
import {
|
|
8
|
+
import { generatedName } from '../../tasks/identity.js';
|
|
9
|
+
import { parseBook } from '../../book/parse.js';
|
|
10
|
+
import { normalizeAgentName } from '../../book/references.js';
|
|
11
|
+
import { projectTakenNames, selectedProject, writableTasksDirectory } from '../common.js';
|
|
9
12
|
import { flag, option } from '../context.js';
|
|
10
13
|
/**
|
|
11
14
|
* `ptbk generate-boilerplates`: unfinished, non-runnable placeholders (`@@@`) to fill in later.
|
|
@@ -24,7 +27,7 @@ export default async function generateBoilerplates(context) {
|
|
|
24
27
|
if (files < 1 || sections < 1 || files > 100 || sections > 50)
|
|
25
28
|
throw usageError('--count must be between 1 and 100 files and 1 to 50 sections.', 'generate-boilerplates');
|
|
26
29
|
const templateName = option(context, 'template');
|
|
27
|
-
let template = 'TASK @@@\
|
|
30
|
+
let template = 'TASK @@@\nGOAL @@@\n';
|
|
28
31
|
if (templateName) {
|
|
29
32
|
const path = join(tasksDirectory, 'templates', templateName.endsWith('.book') ? templateName : `${templateName}.book`);
|
|
30
33
|
if (!(await pathExists(path)))
|
|
@@ -34,10 +37,18 @@ export default async function generateBoilerplates(context) {
|
|
|
34
37
|
await ensureDirectory(tasksDirectory);
|
|
35
38
|
const created = [];
|
|
36
39
|
const timeZone = setting(settings, 'timezone');
|
|
40
|
+
const taken = await projectTakenNames(project, settings);
|
|
37
41
|
for (let index = 0; index < files; index++) {
|
|
38
42
|
if (sections === 1) {
|
|
39
43
|
const path = await newTaskPath(tasksDirectory, `boilerplate ${index + 1}`, Date.now(), timeZone);
|
|
40
|
-
|
|
44
|
+
// Each placeholder gets its own generated name, so boilerplates never shadow each other.
|
|
45
|
+
const document = parseBook(template);
|
|
46
|
+
const base = document.kind === 'task' && document.name ? document.name : '@@@';
|
|
47
|
+
const name = generatedName(/@@@/.test(base) ? base : `@@@ ${base}`, { taken, timeZone });
|
|
48
|
+
taken.add(normalizeAgentName(name));
|
|
49
|
+
const lines = document.kind === 'task' ? [...document.lines] : ['', ...template.split(/\r?\n/)];
|
|
50
|
+
lines[document.kind === 'task' ? document.headerLine : 0] = `TASK ${name}`;
|
|
51
|
+
await writeFile(path, `${lines.join('\n').replace(/\n*$/, '')}\n`, { flag: 'wx' });
|
|
41
52
|
created.push(path);
|
|
42
53
|
}
|
|
43
54
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boilerplates.js","sourceRoot":"","sources":["../../../src/cli/commands/boilerplates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"boilerplates.js","sourceRoot":"","sources":["../../../src/cli/commands/boilerplates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type CommandContext } from '../context.js';
|
|
2
|
+
/**
|
|
3
|
+
* `ptbk chat`: directly open a new persistent conversation with one agent, reopen a named one, or list chats.
|
|
4
|
+
*
|
|
5
|
+
* No dashboard is required; Ctrl+C closes only this client (the service and the conversation stay).
|
|
6
|
+
*
|
|
7
|
+
* @private command
|
|
8
|
+
*/
|
|
9
|
+
export default function chat(context: CommandContext): Promise<number>;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { EXIT, PtbkError } from '../../common/errors.js';
|
|
2
|
+
import { renderChatList, runChatClient } from '../../ui/chat-client.js';
|
|
3
|
+
import { CANCELLED } from '../../ui/prompts.js';
|
|
4
|
+
import { defaultChatAgent } from '../../chats/service.js';
|
|
5
|
+
import { explicitChatAgent, openChatSource, pickChatAgent, waitForReply } from '../chats.js';
|
|
6
|
+
import { printJson, readStdin, selectedProject } from '../common.js';
|
|
7
|
+
import { flag, option } from '../context.js';
|
|
8
|
+
/**
|
|
9
|
+
* Longest wait for the agent's reply in noninteractive use.
|
|
10
|
+
*/
|
|
11
|
+
const REPLY_WAIT_MS = 10 * 60_000;
|
|
12
|
+
/**
|
|
13
|
+
* `ptbk chat`: directly open a new persistent conversation with one agent, reopen a named one, or list chats.
|
|
14
|
+
*
|
|
15
|
+
* No dashboard is required; Ctrl+C closes only this client (the service and the conversation stay).
|
|
16
|
+
*
|
|
17
|
+
* @private command
|
|
18
|
+
*/
|
|
19
|
+
export default async function chat(context) {
|
|
20
|
+
const { terminal } = context;
|
|
21
|
+
const project = await selectedProject(context);
|
|
22
|
+
let replyError;
|
|
23
|
+
const { source, service, local } = await openChatSource(context, project, { onReplyError: (error) => (replyError = error) });
|
|
24
|
+
if (flag(context, 'list')) {
|
|
25
|
+
const chats = await source.list();
|
|
26
|
+
if (flag(context, 'json'))
|
|
27
|
+
printJson(chats);
|
|
28
|
+
else
|
|
29
|
+
terminal.write(renderChatList(chats));
|
|
30
|
+
return EXIT.success;
|
|
31
|
+
}
|
|
32
|
+
let message = context.positionals.join(' ');
|
|
33
|
+
if (flag(context, 'stdin'))
|
|
34
|
+
message = (await readStdin()).replace(/\s+$/, '');
|
|
35
|
+
const open = option(context, 'open');
|
|
36
|
+
if (open !== undefined) {
|
|
37
|
+
const detail = await source.get(open);
|
|
38
|
+
if (terminal.interactive && !message && flag(context, 'json') !== true) {
|
|
39
|
+
await runChatClient(terminal, source, { kind: 'existing', name: detail.summary.name });
|
|
40
|
+
if (!service && local?.pendingReplies)
|
|
41
|
+
terminal.write(terminal.style.muted('Chat closed; saving the reply in progress before exiting (Ctrl+C abandons it, the service replies later).\n'));
|
|
42
|
+
return EXIT.success;
|
|
43
|
+
}
|
|
44
|
+
if (message) {
|
|
45
|
+
const sent = await source.send(detail.summary.name, message, detail.messages.length);
|
|
46
|
+
terminal.write(`Sent to {{${sent.name}}}${sent.commit ? ` (${sent.commit.slice(0, 8)})` : ''}.\n`);
|
|
47
|
+
return EXIT.success;
|
|
48
|
+
}
|
|
49
|
+
await source.read(detail.summary.name);
|
|
50
|
+
if (flag(context, 'json'))
|
|
51
|
+
printJson(detail);
|
|
52
|
+
else
|
|
53
|
+
terminal.write(`${detail.summary.name} (${detail.summary.status})\n${detail.messages.map((item) => `\n${item.sender} ${item.at}\n${item.text}${item.choices?.length ? `\n» ${item.choices.join('\n» ')}` : ''}`).join('\n')}\n`);
|
|
54
|
+
return EXIT.success;
|
|
55
|
+
}
|
|
56
|
+
const agents = await source.agents();
|
|
57
|
+
const agentOption = option(context, 'agent');
|
|
58
|
+
let agent;
|
|
59
|
+
if (agentOption)
|
|
60
|
+
agent = explicitChatAgent(agents, agentOption);
|
|
61
|
+
else if (terminal.interactive) {
|
|
62
|
+
const picked = await pickChatAgent(terminal, agents);
|
|
63
|
+
if (picked === CANCELLED) {
|
|
64
|
+
terminal.write('No chat was started.\n');
|
|
65
|
+
return EXIT.incomplete;
|
|
66
|
+
}
|
|
67
|
+
agent = picked;
|
|
68
|
+
}
|
|
69
|
+
else
|
|
70
|
+
agent = defaultChatAgent(agents);
|
|
71
|
+
const title = option(context, 'title');
|
|
72
|
+
if (terminal.interactive && !message) {
|
|
73
|
+
await runChatClient(terminal, source, { kind: 'new', agent, title });
|
|
74
|
+
if (!service && local?.pendingReplies)
|
|
75
|
+
terminal.write(terminal.style.muted('Chat closed; saving the reply in progress before exiting (Ctrl+C abandons it, the service replies later).\n'));
|
|
76
|
+
return EXIT.success;
|
|
77
|
+
}
|
|
78
|
+
if (!message)
|
|
79
|
+
throw new PtbkError('The first message is required without an interactive terminal.', { kind: 'usage', next: ['Pass it as an argument or use --stdin.'] });
|
|
80
|
+
const created = await source.create(agent.reference, message, title);
|
|
81
|
+
terminal.write(`Started the chat {{${created.name}}}${created.commit ? ` (${created.commit.slice(0, 8)})` : ''}.\n`);
|
|
82
|
+
const reply = await waitForReply(source, created.name, 1, REPLY_WAIT_MS, () => replyError);
|
|
83
|
+
if (reply)
|
|
84
|
+
terminal.write(`\n${reply.sender}:\n${reply.text}\n`);
|
|
85
|
+
else
|
|
86
|
+
terminal.write(`No reply yet${replyError ? `: ${replyError}` : ''}. Continue with \`ptbk chat --open "${created.name}"\`.\n`);
|
|
87
|
+
return EXIT.success;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type CommandContext } from '../context.js';
|
|
2
2
|
/**
|
|
3
|
-
* `ptbk dashboard`: attach a live view to the existing service (never starts or initializes anything)
|
|
3
|
+
* `ptbk dashboard`: attach a live view to the existing service (never starts or initializes anything); with
|
|
4
|
+
* `--global`, the host-wide overview of every running engine. A service of an incompatible ptbk version is shown by
|
|
5
|
+
* its own installation.
|
|
4
6
|
*
|
|
5
7
|
* @private command
|
|
6
8
|
*/
|
|
@@ -1,15 +1,51 @@
|
|
|
1
|
-
import { EXIT, PtbkError } from '../../common/errors.js';
|
|
1
|
+
import { EXIT, PtbkError, usageError } from '../../common/errors.js';
|
|
2
|
+
import { projectAt } from '../../project/workspace.js';
|
|
2
3
|
import { lookupService } from '../../service/control.js';
|
|
3
4
|
import { runDashboard } from '../../ui/dashboard.js';
|
|
5
|
+
import { runGlobalDashboard } from '../../ui/global-dashboard.js';
|
|
4
6
|
import { selectedProject } from '../common.js';
|
|
5
7
|
import { flag } from '../context.js';
|
|
8
|
+
import { delegateToEngine } from '../engine-delegation.js';
|
|
6
9
|
import { controlSource } from '../sources.js';
|
|
7
10
|
/**
|
|
8
|
-
* `ptbk dashboard`:
|
|
11
|
+
* `ptbk dashboard --global`: the host-wide live table of running engines, independent of the current directory. It
|
|
12
|
+
* never initializes or selects that directory, never starts a worker and never acquires a project lock; attaching
|
|
13
|
+
* opens the selected project's ordinary dashboard and returns to the table.
|
|
14
|
+
*/
|
|
15
|
+
async function globalDashboard(context) {
|
|
16
|
+
for (const name of ['path', 'tasks']) {
|
|
17
|
+
if (context.explicit.has(name))
|
|
18
|
+
throw usageError(`--global observes every project; --${name} would select one project.`, 'dashboard', 'Use `ptbk dashboard --path <dir>` for one project, or `ptbk dashboard --global` for all of them.');
|
|
19
|
+
}
|
|
20
|
+
const noQr = flag(context, 'qr') === false;
|
|
21
|
+
await runGlobalDashboard(context.terminal, async (row) => {
|
|
22
|
+
// Resolve the target from verified discovery information, never from the launch directory.
|
|
23
|
+
const project = projectAt(row.entry.projectRoot);
|
|
24
|
+
const lookup = await lookupService(project);
|
|
25
|
+
if (lookup.state !== 'running')
|
|
26
|
+
return `${row.entry.projectName} is no longer running${lookup.state === 'unreachable' ? ` (${lookup.reason})` : ''}; nothing was started.`;
|
|
27
|
+
if (lookup.record.instanceId !== row.entry.instanceId)
|
|
28
|
+
return `${row.entry.projectName} is now owned by another engine instance; select its new row to attach.`;
|
|
29
|
+
if (!lookup.engine.compatible) {
|
|
30
|
+
// Another engine version renders its own dashboard, so the view keeps that engine's version and shape.
|
|
31
|
+
await delegateToEngine(project, lookup, ['dashboard', '--path', project.root, ...(noQr ? ['--no-qr'] : [])], context.cwd, context.env);
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
await runDashboard(context.terminal, controlSource(lookup.client), { noQr });
|
|
35
|
+
return undefined;
|
|
36
|
+
}, context.env);
|
|
37
|
+
return EXIT.success;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* `ptbk dashboard`: attach a live view to the existing service (never starts or initializes anything); with
|
|
41
|
+
* `--global`, the host-wide overview of every running engine. A service of an incompatible ptbk version is shown by
|
|
42
|
+
* its own installation.
|
|
9
43
|
*
|
|
10
44
|
* @private command
|
|
11
45
|
*/
|
|
12
46
|
export default async function dashboard(context) {
|
|
47
|
+
if (flag(context, 'global'))
|
|
48
|
+
return await globalDashboard(context);
|
|
13
49
|
const project = await selectedProject(context);
|
|
14
50
|
const lookup = await lookupService(project);
|
|
15
51
|
if (lookup.state === 'stopped') {
|
|
@@ -17,12 +53,14 @@ export default async function dashboard(context) {
|
|
|
17
53
|
kind: 'not-found',
|
|
18
54
|
project: project.root,
|
|
19
55
|
effect: 'Nothing was started; the dashboard only attaches to an existing service.',
|
|
20
|
-
next: ['Start the agenda with `ptbk start`, then run `ptbk dashboard` again.'],
|
|
56
|
+
next: ['Start the agenda with `ptbk start`, then run `ptbk dashboard` again.', 'See every running project with `ptbk dashboard --global`.'],
|
|
21
57
|
});
|
|
22
58
|
}
|
|
23
59
|
if (lookup.state === 'unreachable') {
|
|
24
60
|
throw new PtbkError('The recorded ptbk service does not answer.', { kind: 'technical', project: project.root, reason: lookup.reason, next: ['Run `ptbk status` to inspect it, or `ptbk restart`.'] });
|
|
25
61
|
}
|
|
62
|
+
if (!lookup.engine.compatible)
|
|
63
|
+
return await delegateToEngine(project, lookup, context.argv, context.cwd, context.env);
|
|
26
64
|
await runDashboard(context.terminal, controlSource(lookup.client), { noQr: flag(context, 'qr') === false });
|
|
27
65
|
return EXIT.success;
|
|
28
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,8 @@ import { toProjectRelative } from '../../common/fs.js';
|
|
|
4
4
|
import { loadSettings, setting } from '../../project/config.js';
|
|
5
5
|
import { commitPaths, inspectGit, listProjectFiles } from '../../project/git.js';
|
|
6
6
|
import { newTaskPath, renderTaskBook } from '../../tasks/authoring.js';
|
|
7
|
-
import { generateTaskId } from '../../tasks/identity.js';
|
|
8
7
|
import { readTaskQueue } from '../../tasks/sources.js';
|
|
9
|
-
import { printJson, selectedProject, writableTasksDirectory } from '../common.js';
|
|
8
|
+
import { generatedTaskName, printJson, selectedProject, writableTasksDirectory } from '../common.js';
|
|
10
9
|
import { flag, option } from '../context.js';
|
|
11
10
|
/**
|
|
12
11
|
* `ptbk find-unwritten`: tasks still containing the `@@@` placeholder (read-only).
|
|
@@ -59,23 +58,22 @@ export async function findRefactorCandidates(context) {
|
|
|
59
58
|
if (flag(context, 'create-tasks') && top.length) {
|
|
60
59
|
const tasksDirectory = await writableTasksDirectory(context, project, settings);
|
|
61
60
|
const created = [];
|
|
62
|
-
const
|
|
61
|
+
const names = [];
|
|
63
62
|
for (const candidate of top) {
|
|
64
63
|
const path = await newTaskPath(tasksDirectory, `refactor ${candidate.path}`, Date.now(), setting(settings, 'timezone'));
|
|
65
|
-
const
|
|
64
|
+
const title = await generatedTaskName(project, settings, `Refactor ${candidate.path}`, names);
|
|
66
65
|
await writeFile(path, renderTaskBook({
|
|
67
|
-
title
|
|
66
|
+
title,
|
|
68
67
|
description: `\`${candidate.path}\` has ${candidate.lines} lines. Split it into cohesive, well-named units without changing behavior; keep tests passing.`,
|
|
69
|
-
id,
|
|
70
68
|
commitments: ['TASK PRIORITY 0', 'TASK ORIGIN refactor candidate'],
|
|
71
69
|
}), { flag: 'wx' });
|
|
72
70
|
created.push(path);
|
|
73
|
-
|
|
71
|
+
names.push(title);
|
|
74
72
|
}
|
|
75
73
|
const gitInfo = await inspectGit(project.root);
|
|
76
74
|
const commit = flag(context, 'commit') ?? setting(settings, 'execution.commit');
|
|
77
75
|
if (commit && gitInfo.state === 'repository')
|
|
78
|
-
await commitPaths({ projectRoot: project.root, repositoryRoot: gitInfo.root, paths: created, subject: `Add ${created.length} refactoring task(s)`, trailers: { 'Task-
|
|
76
|
+
await commitPaths({ projectRoot: project.root, repositoryRoot: gitInfo.root, paths: created, subject: `Add ${created.length} refactoring task(s)`, trailers: { 'Task-Name': names }, temporaryDirectory: project.runtime.temporary, env: context.env });
|
|
79
77
|
context.terminal.write(`Created ${created.length} refactoring task(s).\n`);
|
|
80
78
|
}
|
|
81
79
|
if (flag(context, 'json'))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../../src/cli/commands/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../../src/cli/commands/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACrG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAuB,MAAM,eAAe,CAAC;AAElE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAuB;IACvD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAS,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IACrL,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;QAAE,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;SACnI,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;;QAC1E,KAAK,MAAM,IAAI,IAAI,SAAS;YAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC1F,OAAO,IAAI,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAuB;IAChE,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,CAAS,OAAO,EAAE,WAAW,CAAC,IAAI,GAAG,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAS,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,UAAU,GAA2C,EAAE,CAAC;IAC9D,KAAK,MAAM,IAAI,IAAI,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,iFAAiF,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,2DAA2D,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACrL,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACD,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACL,SAAS;QACb,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACtC,IAAI,KAAK,IAAI,OAAO;YAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9C,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChF,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,GAAG,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,YAAY,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,CAAS,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;YAChI,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YAC9F,MAAM,SAAS,CACX,IAAI,EACJ,cAAc,CAAC;gBACX,KAAK;gBACL,WAAW,EAAE,KAAK,SAAS,CAAC,IAAI,UAAU,SAAS,CAAC,KAAK,iGAAiG;gBAC1J,WAAW,EAAE,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;aACrE,CAAC,EACF,EAAE,IAAI,EAAE,IAAI,EAAE,CACjB,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAU,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACzF,IAAI,MAAM,IAAI,OAAO,CAAC,KAAK,KAAK,YAAY;YAAE,MAAM,WAAW,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC,MAAM,sBAAsB,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,kBAAkB,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACtS,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,OAAO,CAAC,MAAM,yBAAyB,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;QAAE,SAAS,CAAC,GAAG,CAAC,CAAC;SACrC,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,4BAA4B,OAAO,mBAAmB,CAAC,CAAC;;QAChG,KAAK,MAAM,SAAS,IAAI,GAAG;YAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;IACxH,OAAO,IAAI,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,GAAG,wHAAwH,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAEjL;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAuB;IAC5D,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACD,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACL,SAAS;QACb,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAAE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,IAAI,EAAE;gBAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnK,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAS,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7G,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;QAAE,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;;QAChG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClF,OAAO,IAAI,CAAC,OAAO,CAAC;AACxB,CAAC"}
|
package/dist/cli/commands/fix.js
CHANGED
|
@@ -5,10 +5,9 @@ import { ensureDirectory } from '../../common/fs.js';
|
|
|
5
5
|
import { runCheck, validateCheckCommand } from '../../project/checks.js';
|
|
6
6
|
import { loadSettings, setting } from '../../project/config.js';
|
|
7
7
|
import { newTaskPath, renderTaskBook } from '../../tasks/authoring.js';
|
|
8
|
-
import { generateTaskId } from '../../tasks/identity.js';
|
|
9
8
|
import { lookupService } from '../../service/control.js';
|
|
10
9
|
import { ServiceHost } from '../../service/host.js';
|
|
11
|
-
import { selectedProject, settingOverrides, tasksOverride, writableTasksDirectory } from '../common.js';
|
|
10
|
+
import { generatedTaskName, selectedProject, settingOverrides, tasksOverride, writableTasksDirectory } from '../common.js';
|
|
12
11
|
import { flag, option } from '../context.js';
|
|
13
12
|
/**
|
|
14
13
|
* `ptbk fix`: run the project check; repair only failing validation (never the ordinary queue).
|
|
@@ -41,15 +40,14 @@ export default async function fix(context) {
|
|
|
41
40
|
await ensureDirectory(tasksDirectory);
|
|
42
41
|
const taskPath = await newTaskPath(tasksDirectory, 'repair failing project check', Date.now(), setting(settings, 'timezone'));
|
|
43
42
|
const agent = option(context, 'agent') ?? setting(settings, 'routing.defaultAgent');
|
|
44
|
-
const commitments = [`TASK AGENT ${agent.startsWith('@') || agent.startsWith('{') ? agent : `{${agent}}`}`, 'TASK ORIGIN maintenance: failing project check'];
|
|
43
|
+
const commitments = [`TASK AGENT ${agent.startsWith('@') || agent.startsWith('{') ? agent : `{{${agent}}}`}`, 'TASK ORIGIN maintenance: failing project check'];
|
|
45
44
|
if (option(context, 'harness'))
|
|
46
45
|
commitments.push(`TASK HARNESS ${option(context, 'harness')}`);
|
|
47
46
|
if (option(context, 'model'))
|
|
48
47
|
commitments.push(`TASK MODEL ${option(context, 'model')}`);
|
|
49
48
|
await writeFile(taskPath, renderTaskBook({
|
|
50
|
-
title: 'Repair the failing project check',
|
|
49
|
+
title: await generatedTaskName(project, settings, 'Repair the failing project check'),
|
|
51
50
|
description: `The project check \`${check}\` fails (exit ${String(result.exitCode)}). Fix the underlying defects without weakening validation: do not delete assertions, disable rules, lower thresholds or skip checks.\n\nCheck output (tail):\n\n\`\`\`\n${result.output.slice(-6000)}\n\`\`\``,
|
|
52
|
-
id: generateTaskId('repair failing project check'),
|
|
53
51
|
commitments,
|
|
54
52
|
}), { flag: 'wx' });
|
|
55
53
|
const harness = option(context, 'harness') ?? setting(settings, 'routing.harness') ?? Object.entries(settings.harnesses).find(([, value]) => value.enabled)?.[0];
|
|
@@ -63,7 +61,7 @@ export default async function fix(context) {
|
|
|
63
61
|
tasksDirectory: tasksOverride(context),
|
|
64
62
|
persistent: null,
|
|
65
63
|
allowTunnelInstall: false,
|
|
66
|
-
run: { selection: { agent: agent.startsWith('@') || agent.startsWith('{') ? agent : `{${agent}}`, harness, model: option(context, 'model') } },
|
|
64
|
+
run: { selection: { agent: agent.startsWith('@') || agent.startsWith('{') ? agent : `{{${agent}}}`, harness, model: option(context, 'model') } },
|
|
67
65
|
onEvent: (text, level) => terminal.write(`${clockTime()} ${level === 'info' ? '' : `${level.toUpperCase()}: `}${text}\n`),
|
|
68
66
|
});
|
|
69
67
|
await host.start();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../../src/cli/commands/fix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../../../src/cli/commands/fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
2
|
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
4
3
|
import { EXIT, PtbkError, errorMessage, usageError } from '../../common/errors.js';
|
|
5
4
|
import { ensureDirectory, isDirectory, pathExists, toProjectRelative } from '../../common/fs.js';
|
|
6
5
|
import { ENGINE_VERSION } from '../../common/version.js';
|
|
6
|
+
import { describeBrowserProfile, userChromeProfile } from '../../browser/browser.js';
|
|
7
|
+
import { BookIndex } from '../../project/books.js';
|
|
8
|
+
import { generatedName } from '../../tasks/identity.js';
|
|
7
9
|
import { checkCandidates, validateCheckCommand } from '../../project/checks.js';
|
|
8
10
|
import { enabledHarnesses, getPath, loadSettings, readProjectConfigFile, setting, updateProjectConfig } from '../../project/config.js';
|
|
9
11
|
import { INITIAL_ASSETS, INITIAL_SPECIFICATION, bootstrapTask, sampleReadme } from '../../project/defaults.js';
|
|
@@ -19,7 +21,6 @@ import { checkHarnessVersion, installHarness, loginHarness, updateHarness } from
|
|
|
19
21
|
import { lookupService } from '../../service/control.js';
|
|
20
22
|
import { launchDaemon } from '../../service/launcher.js';
|
|
21
23
|
import { newTaskPath, renderTaskBook } from '../../tasks/authoring.js';
|
|
22
|
-
import { generateTaskId } from '../../tasks/identity.js';
|
|
23
24
|
import { wrap } from '../../ui/ansi.js';
|
|
24
25
|
import { materializeAttachments, isImagePath } from '../../ui/attachments.js';
|
|
25
26
|
import { celebrate } from '../../ui/celebration.js';
|
|
@@ -28,6 +29,7 @@ import { CANCELLED, composeRich, confirm, inputLine, selectMany, selectOne, togg
|
|
|
28
29
|
import { symbols } from '../../ui/terminal.js';
|
|
29
30
|
import { readStdin, settingOverrides, tasksOverride, validateCombinations } from '../common.js';
|
|
30
31
|
import { flag, option } from '../context.js';
|
|
32
|
+
import { liveSnapshot } from '../service-view.js';
|
|
31
33
|
/**
|
|
32
34
|
* Raised when the user abandons the wizard (Ctrl+C); completed steps are kept, nothing further is applied.
|
|
33
35
|
*/
|
|
@@ -51,16 +53,6 @@ function answered(value) {
|
|
|
51
53
|
throw wasInterrupted() ? new WizardCancelled('cancelled') : new WizardBack('back');
|
|
52
54
|
return value;
|
|
53
55
|
}
|
|
54
|
-
/**
|
|
55
|
-
* Default Chrome user-data directory of this platform.
|
|
56
|
-
*/
|
|
57
|
-
function defaultChromeProfile() {
|
|
58
|
-
if (process.platform === 'darwin')
|
|
59
|
-
return join(homedir(), 'Library', 'Application Support', 'Google', 'Chrome');
|
|
60
|
-
if (process.platform === 'win32')
|
|
61
|
-
return join(process.env.LOCALAPPDATA ?? join(homedir(), 'AppData', 'Local'), 'Google', 'Chrome', 'User Data');
|
|
62
|
-
return join(homedir(), '.config', 'google-chrome');
|
|
63
|
-
}
|
|
64
56
|
/**
|
|
65
57
|
* Titles of the user-facing steps.
|
|
66
58
|
*/
|
|
@@ -441,22 +433,28 @@ export async function initializeProject(context, options = {}) {
|
|
|
441
433
|
shown.add('browser');
|
|
442
434
|
const choice = answered(await selectOne(terminal, {
|
|
443
435
|
frame: frame('browser', 'agents share one browser for websites'),
|
|
444
|
-
question: 'Which browser profile should agents
|
|
436
|
+
question: 'Which browser profile should agents use for websites in this project?',
|
|
445
437
|
choices: [
|
|
446
|
-
{ value: '
|
|
447
|
-
{ value: '
|
|
448
|
-
{ value: 'user', label: 'Your Chrome profile', description: 'reuses your logged-in sessions' },
|
|
438
|
+
{ value: 'global', label: 'Dedicated Promptbook profile', description: 'a separate Promptbook-only profile, reused by your other projects (one project at a time); not your Chrome profile' },
|
|
439
|
+
{ value: 'isolated', label: 'Isolated project profile', description: 'only this project, stored in .ptbk/ (Git-ignored)' },
|
|
440
|
+
{ value: 'user', label: 'Your Chrome profile', description: 'reuses your logged-in sessions; agents act as you' },
|
|
441
|
+
{ value: 'custom', label: 'Custom profile path', description: 'another existing browser profile directory' },
|
|
449
442
|
],
|
|
450
|
-
defaultValue: '
|
|
443
|
+
defaultValue: 'global',
|
|
451
444
|
}));
|
|
452
|
-
if (choice === '
|
|
453
|
-
state.browserProfile = answered(await inputLine(terminal, {
|
|
445
|
+
if (choice === 'custom') {
|
|
446
|
+
state.browserProfile = answered(await inputLine(terminal, {
|
|
447
|
+
frame: frame('browser'),
|
|
448
|
+
question: 'Path of the existing browser profile directory:',
|
|
449
|
+
validate: (value) => (!value.trim() ? 'Enter a path.' : ['global', 'isolated', 'user'].includes(value.trim()) ? 'Choose that option instead of typing its name.' : undefined),
|
|
450
|
+
})).trim();
|
|
451
|
+
}
|
|
454
452
|
else if (choice === 'user') {
|
|
455
|
-
const ok = answered(await confirm(terminal, { frame: frame('browser'), question: `Agents will act with every session in ${
|
|
456
|
-
state.browserProfile = ok ?
|
|
453
|
+
const ok = answered(await confirm(terminal, { frame: frame('browser'), question: `Agents will act with every session in ${userChromeProfile()} and their actions affect that profile; Chrome must be closed while they use it. Use it?`, defaultYes: false }));
|
|
454
|
+
state.browserProfile = ok ? 'user' : 'global';
|
|
457
455
|
}
|
|
458
456
|
else
|
|
459
|
-
state.browserProfile =
|
|
457
|
+
state.browserProfile = choice;
|
|
460
458
|
state.browserMode = answered(await selectOne(terminal, {
|
|
461
459
|
frame: frame('browser'),
|
|
462
460
|
question: 'Browser visibility:',
|
|
@@ -466,7 +464,7 @@ export async function initializeProject(context, options = {}) {
|
|
|
466
464
|
],
|
|
467
465
|
defaultValue: state.browserMode ?? 'headless',
|
|
468
466
|
}));
|
|
469
|
-
answers.set('browser', `Browser: ${state.browserProfile
|
|
467
|
+
answers.set('browser', `Browser: ${describeBrowserProfile(state.browserProfile ?? 'global')}, ${state.browserMode}`);
|
|
470
468
|
},
|
|
471
469
|
// 7. Trace recording and Git inclusion (three explicit project choices).
|
|
472
470
|
traces: async () => {
|
|
@@ -489,7 +487,7 @@ export async function initializeProject(context, options = {}) {
|
|
|
489
487
|
state.traces = answered(await toggleList(terminal, {
|
|
490
488
|
frame: frame('traces', 'every task keeps its own audit trail'),
|
|
491
489
|
question: 'Traces: how should task evidence be kept?',
|
|
492
|
-
intro: 'Each task records its harness output, events and (when enabled) browser video in traces/<task-
|
|
490
|
+
intro: 'Each task records its harness output, events and (when enabled) browser video in traces/<task-file-basename>/, linked to its commits by the Task-Name trailer. Traces can contain project data and page content; sign-in steps are not recorded.',
|
|
493
491
|
toggles: [
|
|
494
492
|
{ key: 'commit', label: 'Commit traces to Git', description: 'include each task’s traces in its result commit (shared with everyone who can read the repository); otherwise traces stay local and the whole traces/ folder is ignored' },
|
|
495
493
|
{ key: 'ignoreVideos', label: 'Ignore trace videos in Git', description: 'keep browser videos local even when traces are committed (videos are large and may show sensitive pages)' },
|
|
@@ -755,10 +753,11 @@ export async function initializeProject(context, options = {}) {
|
|
|
755
753
|
const traceIgnore = await ensureTraceIgnoreRules(root, savedPolicy && configBefore?.raw.traces ? savedPolicy : tracePolicy);
|
|
756
754
|
if (traceIgnore)
|
|
757
755
|
createdPaths.push(traceIgnore);
|
|
758
|
-
|
|
759
|
-
createdPaths.push(path);
|
|
756
|
+
// Default roles first: a missing Chatter's initial TEAM covers the completed role set.
|
|
760
757
|
for (const path of await ensureDefaultRoles(root, agentsDirectory))
|
|
761
758
|
createdPaths.push(path);
|
|
759
|
+
for (const path of await ensureCoreAgents(root, agentsDirectory))
|
|
760
|
+
createdPaths.push(path);
|
|
762
761
|
for (const path of await ensureTemplates(root, tasksDirectory))
|
|
763
762
|
createdPaths.push(path);
|
|
764
763
|
await ensureDirectory(join(root, tasksDirectory));
|
|
@@ -834,7 +833,7 @@ export async function initializeProject(context, options = {}) {
|
|
|
834
833
|
if (state.saveCheck !== undefined)
|
|
835
834
|
settingsChanges['execution.check'] = state.saveCheck;
|
|
836
835
|
if (!rawConfig.browser || option(context, 'browser-profile') !== undefined)
|
|
837
|
-
settingsChanges['browser.profile'] = state.browserProfile ?? '
|
|
836
|
+
settingsChanges['browser.profile'] = state.browserProfile ?? 'global';
|
|
838
837
|
if (!rawConfig.browser || option(context, 'browser-mode') !== undefined)
|
|
839
838
|
settingsChanges['browser.mode'] = state.browserMode ?? 'headless';
|
|
840
839
|
for (const [key, value] of [
|
|
@@ -859,21 +858,22 @@ export async function initializeProject(context, options = {}) {
|
|
|
859
858
|
const marker = ((await readProjectConfigFile(project)).raw.initialized ?? {});
|
|
860
859
|
let firstTask;
|
|
861
860
|
const tasksRoot = join(root, tasksDirectory);
|
|
862
|
-
if (newPurpose && !marker.starterTask && !(await hasFirstTask({ root, tasksDirectory, timeZone
|
|
861
|
+
if (newPurpose && !marker.starterTask && !(await hasFirstTask({ root, tasksDirectory, timeZone }))) {
|
|
863
862
|
const blank = blankIntent(state.intent?.segments ?? []);
|
|
864
863
|
const specification = join(root, INITIAL_SPECIFICATION);
|
|
865
864
|
const draftPath = await newTaskPath(tasksRoot, blank ? 'review initialized project' : 'transform project', Date.now(), timeZone);
|
|
866
865
|
const link = relative(dirname(draftPath), specification).split(sep).join('/');
|
|
867
866
|
const content = bootstrapTask({ blank, specificationLink: link });
|
|
868
|
-
|
|
869
|
-
|
|
867
|
+
// A generated name: the readable title plus creation date/time, distinct from every Book of the project.
|
|
868
|
+
const title = generatedName(content.title, { taken: (await BookIndex.load(root, { agents: agentsDirectory, tasks: tasksDirectory })).names(), timeZone });
|
|
869
|
+
await writeFile(draftPath, renderTaskBook({ title, description: content.description, commitments: ['TASK AGENT @Expert', 'TASK ORIGIN initialization'] }), { flag: 'wx' });
|
|
870
870
|
createdPaths.push(draftPath);
|
|
871
|
-
firstTask = {
|
|
871
|
+
firstTask = { title, path: draftPath };
|
|
872
872
|
}
|
|
873
873
|
const effectiveInstallation = installation === 'existing' ? (marker.installation ?? 'local') : installation;
|
|
874
874
|
if (firstTask || !marker.engineVersion || marker.installation !== effectiveInstallation) {
|
|
875
875
|
const raw = (await readProjectConfigFile(project)).raw;
|
|
876
|
-
raw.initialized = { ...raw.initialized, engineVersion: marker.engineVersion ?? ENGINE_VERSION, ...(firstTask ? { starterTask: firstTask.
|
|
876
|
+
raw.initialized = { ...raw.initialized, engineVersion: marker.engineVersion ?? ENGINE_VERSION, ...(firstTask ? { starterTask: firstTask.title } : {}), installation: effectiveInstallation };
|
|
877
877
|
await writeFile(project.configPath, `${JSON.stringify(raw, null, 4)}\n`);
|
|
878
878
|
createdPaths.push(project.configPath);
|
|
879
879
|
}
|
|
@@ -893,7 +893,7 @@ export async function initializeProject(context, options = {}) {
|
|
|
893
893
|
repositoryRoot: repository.repositoryRoot,
|
|
894
894
|
paths: uniquePaths,
|
|
895
895
|
subject: configBefore ? 'Update project setup' : 'Initialize project',
|
|
896
|
-
trailers: { 'Task-
|
|
896
|
+
trailers: { 'Task-Name': firstTask ? [firstTask.title] : [] },
|
|
897
897
|
temporaryDirectory: project.runtime.temporary,
|
|
898
898
|
env: context.env,
|
|
899
899
|
});
|
|
@@ -940,16 +940,16 @@ async function startService(context, project) {
|
|
|
940
940
|
const overrides = settingOverrides(context);
|
|
941
941
|
const existing = await lookupService(project);
|
|
942
942
|
if (existing.state === 'running') {
|
|
943
|
-
return { kind: 'reused', snapshot: await existing
|
|
943
|
+
return { kind: 'reused', snapshot: await liveSnapshot(project, existing), note: `The ${existing.record.mode} service (PID ${existing.record.pid}) was already running and keeps its configuration.` };
|
|
944
944
|
}
|
|
945
945
|
const settings = await loadSettings(project, { env: context.env, cli: overrides });
|
|
946
946
|
const persistent = setting(settings, 'service.persist');
|
|
947
947
|
const launched = await launchDaemon(project, { cli: overrides, tasksDirectory: tasksOverride(context), persistent, env: context.env });
|
|
948
|
-
let snapshot = await launched.lookup
|
|
948
|
+
let snapshot = await liveSnapshot(project, launched.lookup);
|
|
949
949
|
const deadline = Date.now() + 10_000;
|
|
950
|
-
while (snapshot.
|
|
950
|
+
while (snapshot.phase === 'starting' && Date.now() < deadline) {
|
|
951
951
|
await new Promise((resolvePromise) => setTimeout(resolvePromise, 300));
|
|
952
|
-
snapshot = await launched.lookup
|
|
952
|
+
snapshot = await liveSnapshot(project, launched.lookup);
|
|
953
953
|
}
|
|
954
954
|
return { kind: launched.started ? 'started' : 'reused', snapshot, note: launched.persistence?.note ?? (persistent ? undefined : 'Restart persistence is disabled (--no-persist).') };
|
|
955
955
|
}
|
|
@@ -988,7 +988,7 @@ function renderInitSummary(context, input) {
|
|
|
988
988
|
: ready
|
|
989
989
|
? [['ptbk start', service?.kind === 'failed' ? 'start the service after fixing the problem above' : 'start the agenda in the background']]
|
|
990
990
|
: [['ptbk init', 'resume setup after resolving the items above']];
|
|
991
|
-
const first = result.firstTask ?
|
|
991
|
+
const first = result.firstTask ? `{{${result.firstTask.title}}} → Expert (${toProjectRelative(root, result.firstTask.path)})` : undefined;
|
|
992
992
|
const headline = !ready ? 'Setup incomplete' : running ? 'Project ready · agenda running' : 'Setup complete · service not running';
|
|
993
993
|
if (!terminal.pretty) {
|
|
994
994
|
const lines = [`${headline}: ${root} (ptbk ${ENGINE_VERSION})`];
|