@prodero/curator 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/ARCHITECTURE.md +12 -0
  2. package/CHANGELOG.md +29 -3
  3. package/README.md +64 -10
  4. package/dist/chat-text.js +139 -0
  5. package/dist/cli.js +9 -2
  6. package/dist/contracts.js +2 -0
  7. package/dist/conversation-presentation.js +101 -142
  8. package/dist/core/agent-instructions.js +7 -4
  9. package/dist/core/context.js +4 -2
  10. package/dist/core/curation-graphical.js +1 -1
  11. package/dist/core/curation-review.js +61 -17
  12. package/dist/core/curation-revision.js +2 -0
  13. package/dist/core/curation-semantic-jobs.js +2 -2
  14. package/dist/core/json-schema.js +6 -0
  15. package/dist/core/memory-index.js +1 -1
  16. package/dist/core/memory-pressure.js +16 -5
  17. package/dist/core/memory-sync.js +16 -9
  18. package/dist/core/memory-transformation-proposal.js +2 -2
  19. package/dist/core/project.js +18 -4
  20. package/dist/core/session-index.js +2 -2
  21. package/dist/core/session-reconciliation.js +320 -0
  22. package/dist/curation-review-adapter.js +1 -1
  23. package/dist/hosts/install-command.js +130 -0
  24. package/dist/hosts/manager.js +1 -1
  25. package/dist/memory-presentation.js +5 -175
  26. package/dist/presentation-server.js +12 -6
  27. package/dist/presentation-trace.js +3 -2
  28. package/dist/presentation.js +57 -136
  29. package/dist/providers/mcp-sampling.js +6 -6
  30. package/dist/server.js +63 -29
  31. package/dist/status-presentation.js +4 -2
  32. package/dist/text-layout.js +16 -24
  33. package/dist-ui/index.html +140 -128
  34. package/docs/COMPATIBILITY.md +28 -16
  35. package/docs/INSTALL-WITH-AGENT.md +64 -0
  36. package/docs/RELEASING.md +6 -6
  37. package/docs/V0.3.0-CHAT-TEXT.md +75 -0
  38. package/docs/V0.3.0-MAINTENANCE.md +23 -0
  39. package/docs/hosts.md +21 -7
  40. package/docs/images/prodero-overview-cropped.png +0 -0
  41. package/instructions/AGENTS.md +6 -4
  42. package/package.json +8 -5
  43. package/plugins/migrate_ai_studio/schema.cjs +1 -2
  44. package/plugins/migrate_ai_studio/ui/dist/index.html +75 -42
  45. package/setup.md +151 -0
package/ARCHITECTURE.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Prodero Architecture
2
2
 
3
+ ## 0.3.0 development: quiet session maintenance
4
+
5
+ Ordinary Open/Prepare/Close and visual/CLI navigation no longer expose a memory moderation queue. Existing deterministic synchronization owns snapshot recovery, conservative consolidation, provenance and transactional checkpoints. Legacy curation APIs retain their low-level source/approval contracts for technical compatibility; persisted questions/candidates are not accepted, dismissed or deleted by UI removal.
6
+
7
+ Prepare can offer the current host agent one bounded `prodero_session_reconcile_prepare` / `prodero_session_reconcile_propose` task. Its immutable job binds the active prepared session, latest native task/scope fingerprint, authorized retrieval or task-dispute evidence and canonical revisions. Source prose is untrusted evidence, never authority. Complete semantic coverage and existing lifecycle transactions permit only justified eligible Local inferred State/Lesson changes. Protected/shared/rule changes, metadata loss, unsupported scope changes and unresolved intent preserve originals. Supersession additionally needs an existing replacement edge and matching boundaries. Exact retry reuses the receipt; invalid reasoning consumes the attempt; confirmed changes refresh the original task context once.
8
+
9
+ There is no additional model provider or credential. Real save/storage/recovery errors and current-task Required blockers remain visible. Optional planning signals and pending housekeeping do not create user decisions. Explicit selected Knowledge sharing/editing and migrations retain their own exact approvals. The general chat renderer style remains separate from this behavior change.
10
+
3
11
  ## Primary experience
4
12
 
5
13
  Users interact with Prodero primarily through their coding agent.
@@ -296,3 +304,7 @@ Only potential_conflict uses warning styling. State transitions say “Knowledge
296
304
  ## Migration Foundation
297
305
 
298
306
  Project structure and canonical knowledge have independent versions under `.prodero/config.json`. The existing Core migration engine owns ordered planning, approval-bound execution, staging, backup integrity, shared locking, rollback and diagnostic history. Open, Prepare, MCP/text and CLI consume that engine. See [Migration Foundation](docs/MIGRATIONS.md) for version transitions and lifecycle boundaries.
307
+
308
+ ## Chat text boundary — 0.3.0 development
309
+
310
+ `src/chat-text.ts` renders native Markdown from the existing ViewModel/conversation projection, without I/O, capability guessing or business mutations. `renderText` selects that chat route by default; `renderTerminalText` and explicit MCP `plain:true` retain the existing width-bounded terminal route in `src/text-layout.ts`. CLI migration calls the terminal route explicitly. The MCP gateway and invisible-App fallback share the Markdown output while App negotiation/actions remain unchanged. Chat returns named actions and exact knowledge bindings; numbered aliases are supplied only with the explicitly displayed terminal fallback. Exact review/source/code bodies and diagnostics retain literal preservation; no interface is fenced. Missing counts, Required blockers, deferred saving and errors remain factual. The runtime guide, not a duplicate global launcher policy, owns the relay/translation contract.
package/CHANGELOG.md CHANGED
@@ -1,8 +1,34 @@
1
1
  # Changelog
2
2
 
3
- ## 0.2.0
3
+ ## 0.3.0 — 2026-11-09 (Public Preview)
4
4
 
5
- Release notes finalized 2026-10-23. This is the preparation date; registry publication is a separate maintainer action.
5
+ - Updated MCP SDK to 1.32.2, refreshed compatible production dependency patches, and migrated validators to Zod 4.6.7. Bounded collections now reject oversized input before walking elements; provider/plugin JSON Schema and legacy input defaults/receipts retain their validation contracts.
6
+
7
+ - Open navigation preserves filtered catalogue pages on detail return, reports Initialize failures truthfully, clears completed sharing selections and retains confirmed Apply receipts across refresh errors. Unavailable/cached catalogues are explicit and cannot masquerade as empty current data.
8
+
9
+ - Compact text Open now shows branch lines with total/Local/Versioned memory and actual bootstrap instruction counts. Four stable numbered actions support natural-language requests and clearly distinguish legacy instruction refinement from sharing memory via Git.
10
+
11
+ - Installation examples now follow npm `@latest`; the agent resolves and reviews one exact release before installing, so the stable prompt needs no version edit on future releases.
12
+ - Added an optional prompt-assisted installation guide, with current-stable wizard fallback and a landing Copy prompt publication handoff. Manual npm/CLI installation remains supported.
13
+ - Added explicit one-host installation preview/apply for agents, reusing existing native configuration ownership, backups and recovery. Saved configuration and pending restart/connectivity remain distinct.
14
+ - Added an approved prerequisite preparation path to the installation guide, preserving existing runtime versions/defaults and separating project initialization.
15
+ - Retained explicit Curate Memory and selected Local → Versioned actions in both interfaces, with fresh current previews isolated from unavailable historical reviews and unchanged approval guards.
16
+ - Close always returns a confirmed, visible final receipt, including zero observations, replay, deferred saving and diagnostic failures.
17
+ - Removed the old routine memory moderation queues, cards and attention prompts from text/visual interfaces; CLI status keeps maintenance diagnostics in explicit JSON rather than nagging counters.
18
+ - Bounded current-session agent reconciliation reuses semantic validation and transactional history for eligible Local knowledge. Protected, ambiguous and unsupported changes preserve originals; no new external provider is required.
19
+ - MCP chat text now uses native Markdown: a small ›_ prodero launch mark, factual project overview, named actions and brief unbranded task/save updates. Terminal CLI/explicit ASCII fallback and visual App contracts remain separate.
20
+
21
+ Project schema remains **8** and knowledge schema remains **3**; no canonical schema migration is added. See [compatibility and verification](docs/COMPATIBILITY.md) for the tested artifact and host coverage.
22
+
23
+ ## 0.2.1 — 2026-10-25 (Public Preview)
24
+
25
+ - Corrected public documentation and release wording, including installation and compatibility guidance.
26
+ - Documented the built-in updater's npm **10.9.x** requirement.
27
+ - Replaced the outdated overview screenshot with the current **Curate Memory** interface using demonstration project data.
28
+
29
+ This is a documentation-only patch. Application behavior and project/knowledge schemas are unchanged. Users already running 0.2.0 do not need an urgent upgrade.
30
+
31
+ ## 0.2.0 — 2026-10-25 (Public Preview)
6
32
 
7
33
  - **Curate Memory** replaces the Memory Sync user-facing name, with existing MCP tool IDs and saved workflows retained. Retry/expired analysis, saved answers, deferred questions and Revisit resume reliably; partial progress and remaining work stay visible.
8
34
  - Text mode uses the shared Telemetry/Pulse layout with letter-bound knowledge entries, exact numeric actions, complete review bodies and mobile-width output. Prepare continues automatically; Prepare/Close retain a compact fallback when an App is invisible, without repeating Core calls.
@@ -15,7 +41,7 @@ Release notes finalized 2026-10-23. This is the preparation date; registry publi
15
41
  - Incomplete provenance diagnostics no longer imply proven loss of history; no provenance backfill or canonical storage redesign is included.
16
42
  - Session writers serialize lock acquisition, stale-owner recovery and release under the same transition guard, preventing a stale PID decision from deleting a successor's lock. Deterministic process barriers and acknowledgment-preservation stress regressions cover record/close concurrency; unknown owners and interrupted guards remain fail-closed.
17
43
 
18
- Project schema remains **8** and knowledge schema remains **3**. No canonical schema migration is added by this version bump. See [compatibility and evidence limits](docs/COMPATIBILITY.md) for exact-SHA CI, installed-artifact native checks and the owner-reported manual acceptance. The final release tree and artifact must satisfy the [release gates](docs/RELEASING.md); these notes do not announce registry availability.
44
+ Project schema remains **8** and knowledge schema remains **3**. This release adds no canonical schema migration. See [compatibility and verification](docs/COMPATIBILITY.md) for tested clients, platforms and the published package identity.
19
45
 
20
46
  ## 0.1.0 — 2026-10-15 (Public Preview)
21
47
 
package/README.md CHANGED
@@ -2,18 +2,30 @@
2
2
 
3
3
  **Project memory for Codex and Claude Code.**
4
4
 
5
- > **0.2.0 release materials.** The npm command below requires 0.2.0 to be published. For review before publication, use the exact candidate tarball and isolated setup in [the release guide](docs/RELEASING.md). A checkout or local tarball does not establish registry availability. See [0.2.0 changes](CHANGELOG.md) and [verification limits](docs/COMPATIBILITY.md).
5
+ **0.3.0 Public Preview.** See [compatibility and verification](docs/COMPATIBILITY.md) for the exact coverage and limitations.
6
6
 
7
7
  Keep project decisions, conventions, and lessons across sessions, right inside your coding assistant.
8
8
 
9
- **Install in two commands → open Codex or Claude Code → type prodero.**
9
+ ## Install with a prompt
10
+
11
+ Paste this into your coding agent:
12
+
13
+ ```text
14
+ Install Prodero Curator using https://prodero.io/curator/setup.md
15
+ ```
16
+
17
+ The guide covers Codex and experimental Claude Code: it inspects your setup, proposes one concrete plan and verifies the selected client's connection. See the [publication handoff](docs/INSTALL-WITH-AGENT.md). [Manual installation](#manual-installation) remains available.
18
+
19
+ ## Manual installation
20
+
21
+ Install the latest published release in two commands, reopen your coding client, then type **`prodero`**. The prompt-assisted guide resolves `@latest` to an exact reviewed version before installing.
10
22
 
11
23
  ```sh
12
- npm install --global @prodero/curator@0.2.0
24
+ npm install --global @prodero/curator@latest
13
25
  prodero install
14
26
  ```
15
27
 
16
- Requires **Node.js >=22.14.0 <23**, npm and Git. **v0.2.0 preview release.** Codex CLI has native text-workflow evidence; Claude Code remains experimental, with native text-workflow evidence. See the [compatibility matrix](docs/COMPATIBILITY.md).
28
+ Requires **Node.js >=22.14.0 <23**, npm and Git. **v0.3.0 Public Preview.** Claude Code remains experimental; native-client coverage is recorded by version below. See the [compatibility matrix](docs/COMPATIBILITY.md).
17
29
 
18
30
  1. In the installation wizard, select **Codex** or **Claude Code**, confirm the setup and choose **Finish**.
19
31
  2. Reopen Codex or Claude Code in your repository and type **`prodero`** in chat.
@@ -21,7 +33,47 @@ Requires **Node.js >=22.14.0 <23**, npm and Git. **v0.2.0 preview release.** Cod
21
33
 
22
34
  For Claude Code, also create or update the project’s `CLAUDE.md` to import `@AGENTS.md`. The installer does not create that file. See the [setup guide](docs/hosts.md).
23
35
 
24
- ![Prodero Curator overview in the coding assistant](docs/images/prodero-overview-cropped.png)
36
+ ## How Curator helps
37
+
38
+ ### Project memory, selected for the task
39
+
40
+ One Context Engine selects bounded context from Local and Versioned Knowledge and active skills. Your agent gets the relevant project background instead of the whole memory store.
41
+
42
+ ```mermaid
43
+ flowchart LR
44
+ local["Local Knowledge<br/>Git-ignored"] --> engine["Curator<br/>Context Engine"]
45
+ versioned["Versioned Knowledge<br/>Git-shareable"] --> engine
46
+ skills["Active skills<br/>Reusable procedures"] --> engine
47
+ engine --> agent["Your coding agent<br/>Required + Relevant + Skills"]
48
+ classDef store fill:#F0F5FF,stroke:#7897C2,color:#152B46
49
+ classDef focus fill:#DFF4D7,stroke:#669D50,color:#203D17
50
+ classDef output fill:#F4EBFF,stroke:#A17AC4,color:#38214F
51
+ class local,versioned,skills store
52
+ class engine focus
53
+ class agent output
54
+ ```
55
+
56
+ Local Knowledge stays Git-ignored; Versioned Knowledge can travel with reviewed Git changes. Curator retrieves both and does not commit or push.
57
+
58
+ ### Recorded lessons can help the next task
59
+
60
+ When your agent records useful outcomes and closes the session with synchronization, Curator can bring the resulting Local Knowledge into later tasks.
61
+
62
+ ```mermaid
63
+ flowchart LR
64
+ work["Work with context"] --> close["Close the session<br/>Sync to Local Knowledge"]
65
+ close --> next["Next task<br/>Reuse relevant lessons"]
66
+ classDef step fill:#F0F5FF,stroke:#7897C2,color:#152B46
67
+ classDef saved fill:#DFF4D7,stroke:#669D50,color:#203D17
68
+ class work,next step
69
+ class close saved
70
+ ```
71
+
72
+ This follows the agent's Prepare → Record → Close workflow; Curator does not watch every conversation or save unrecorded details.
73
+
74
+ ![Curator App overview with Curate Memory](docs/images/prodero-overview-cropped.png)
75
+
76
+ *Current Curator App with demonstration project data.*
25
77
 
26
78
  ## Relevant context, automatically
27
79
 
@@ -46,9 +98,11 @@ Everyday work happens in conversation with Codex or Claude Code; the terminal is
46
98
  - “Update the saved testing convention to use the new fixture directory.”
47
99
  - “Review which Local lessons would be useful to share with the team.”
48
100
 
49
- Use **Knowledge** to search, inspect and edit saved items. **Curate Memory** lets you choose **Improve memory**, **Share knowledge**, or both, then start the workflow. Eligible Local improvements can apply within that workflow; sharing presents proposed Versioned changes for review. Normal session learning does not require running Curate Memory.
101
+ Use **Knowledge** to search, inspect and edit saved items. Explicit Open also offers **Curate Memory** and **Local → Versioned**: preview current knowledge, select exact changes or records, and approve before applying. Curator handles ordinary memory maintenance during work; there is no memory moderation dashboard or routine review queue. Bounded conflicts can be analyzed by the current session's coding agent. Deterministic checks preserve original evidence and protected rules when a safe change cannot be established. Only a decision that actually blocks the current task needs the user's input.
102
+
103
+ The [maintenance contract](docs/V0.3.0-MAINTENANCE.md) describes automatic work, conservative retention and the remaining safety boundaries.
50
104
 
51
- Where the host supports MCP Apps, Curator provides a graphical interface. Otherwise, use text mode: **“Show Prodero as text.”** You do not need to memorize CLI commands.
105
+ Where the host supports MCP Apps, Curator provides a graphical interface. Otherwise, use text mode: **“Show Prodero as text.”** In 0.3.0, chat uses compact native Markdown with a small `›_ prodero` launch mark and brief task/save updates. The terminal keeps its own renderer. See [text behavior and examples](docs/V0.3.0-CHAT-TEXT.md). You do not need to memorize CLI commands.
52
106
 
53
107
  ## Main capabilities
54
108
 
@@ -68,9 +122,9 @@ The generated `.prodero/index.md` can include active **Local skill titles and pa
68
122
 
69
123
  ## Compatibility and limitations
70
124
 
71
- **Codex CLI 0.144.4 and Claude Code 2.1.302 passed native text workflows with the installed 0.2.0 runtime candidate.** Claude Code remains experimental. On 2026-10-23 the owner reported successful manual checks in Codex Desktop, Claude CLI and Codex Mobile. This is owner-reported acceptance; client build versions and an exact artifact/SHA binding were not supplied, so it is not independently traced per-case Apps certification. Cursor is detection-only, and there is no Claude Desktop installer.
125
+ Codex CLI and Claude Code were tested with text workflows. The maintainer also reported successful manual checks in Codex Desktop, Claude CLI and Codex Mobile. Claude Code remains experimental; Cursor is detection-only, and there is no Claude Desktop installer. Tested versions and the scope of these checks are listed in the [compatibility matrix](docs/COMPATIBILITY.md).
72
126
 
73
- MCP Apps, workspace roots and sampling support vary by host. Text mode supports core workflows, but App-only curation review/apply is unavailable through the text gateway. See the [host/runtime matrix](docs/COMPATIBILITY.md) and [setup guide](docs/hosts.md).
127
+ MCP Apps, workspace roots and sampling support vary by host. Text mode supports core workflows; explicit edits, sharing and Required-policy decisions retain their safety checks. Legacy maintenance APIs remain technical compatibility interfaces. See the [host/runtime matrix](docs/COMPATIBILITY.md) and [setup guide](docs/hosts.md).
74
128
 
75
129
  ## Privacy and security
76
130
 
@@ -91,4 +145,4 @@ Curator is [MIT licensed](LICENSE).
91
145
 
92
146
  ### Updating the installed core
93
147
 
94
- Codex/Claude show an available-version indicator and terminal instructions only. Run `prodero update` in your terminal, finish active work and close the hosts when prompted, then explicitly confirm. Restart the hosts after completion. Project knowledge migration is offered separately on Open/Prepare; package update preserves saved dev selection and preferences. See [update and non-interactive options](docs/hosts.md#commands-and-status).
148
+ Codex/Claude show an available-version indicator and terminal instructions only. Run `prodero update` in your terminal, finish active work and close the hosts when prompted, then explicitly confirm. Restart the hosts after completion. The built-in updater supports a same-user global npm installation with **npm 10.9.x**; use your package manager for other installation layouts or toolchains. Project knowledge migration is offered separately on Open/Prepare; package update preserves saved dev selection and preferences. See [update and non-interactive options](docs/hosts.md#updates-and-advanced-project-commands).
@@ -0,0 +1,139 @@
1
+ import { numberedActions, chatOpenActions } from './conversation-presentation.js';
2
+ import { safeText, textFence } from './text-layout.js';
3
+ // Project names, titles and diagnostics are data, never Markdown structure or links.
4
+ export const markdownText = (value) => safeText(value).replace(/[\r\n\u2028\u2029]+/g, ' ').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/[\\`*{}\[\]()#!|~]/g, '\\$&').replace(/(?<![\p{L}\p{N}])_|_(?![\p{L}\p{N}])/gu, '\\$&');
5
+ const count = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
6
+ const plural = (value, noun) => `${value.toLocaleString('en-US')} ${noun}${value === 1 ? '' : 's'}`;
7
+ const hardBreak = '\\' + '\n';
8
+ export function renderChatText(vm, diagnostics = false, expanded = diagnostics) {
9
+ const scene = vm.textScene, action = scene?.action, v = vm.conversation;
10
+ const full = expanded || !v || v.kind === 'details';
11
+ const parts = [];
12
+ const text = (value) => { if (value !== undefined && value !== null && String(value).trim())
13
+ parts.push(markdownText(value)); };
14
+ const heading = (value) => parts.push(`**${markdownText(value)}**`);
15
+ const attention = () => { for (const value of v?.attention ?? [])
16
+ text(value); };
17
+ const bodies = (title, items) => {
18
+ if (!items.length)
19
+ return;
20
+ parts.push(`### ${markdownText(title)}`);
21
+ for (const item of items) {
22
+ heading(item.title);
23
+ // Exact requested evidence/code is literal. These fences contain source
24
+ // material only, never the interface, navigation or a manufactured screen.
25
+ if (item.body)
26
+ parts.push(textFence(item.body));
27
+ if (item.notes.length)
28
+ parts.push(item.notes.map(note => `- ${markdownText(note)}`).join('\n'));
29
+ }
30
+ };
31
+ const actions = () => {
32
+ const available = numberedActions(vm, full);
33
+ if (!available.length)
34
+ return;
35
+ parts.push('You can ask me to:\n\n' + available.map(a => `- ${markdownText(a.label)}${a.approval ? ' — Explicit approval required.' : ''}`).join('\n'));
36
+ };
37
+ if (scene?.home && !full) {
38
+ // The small mark belongs to an explicit launch/overview, not every work step.
39
+ parts.push('**›_ prodero**' + (scene.project ? ` · **${markdownText(scene.project)}**` : ''));
40
+ const h = scene.home;
41
+ if (h.initialized === true) {
42
+ if (action === 'initialized')
43
+ text('Project memory initialized.');
44
+ const memory = count(h.records) ? plural(h.records, 'record') : 'not loaded';
45
+ const local = count(h.local) ? h.local.toLocaleString('en-US') : 'not loaded';
46
+ const versioned = count(h.versioned) ? h.versioned.toLocaleString('en-US') : 'not loaded';
47
+ const context = count(h.loadedInstructions) ? `Context loaded: ${plural(h.loadedInstructions, 'instruction')}` : 'Loaded instruction count: unavailable';
48
+ parts.push([`├─ Memory: ${memory}`, `├─ Local: ${local} · Versioned: ${versioned}`, `└─ ${context}`].join(hardBreak));
49
+ attention();
50
+ const menu = chatOpenActions(vm);
51
+ if (menu.length) {
52
+ parts.push(menu.map(a => `**${a.number}.** ${markdownText(a.label)}`).join(hardBreak));
53
+ text('Choose a number or ask in your own words.');
54
+ }
55
+ const updates = vm.notices.filter(notice => notice.startsWith('Update available:'));
56
+ updates.forEach(text);
57
+ if (updates.length)
58
+ text('Ask me to show update instructions.');
59
+ }
60
+ else {
61
+ heading(h.initialized === false ? 'Not initialized' : 'Project state unavailable');
62
+ (v?.facts ?? vm.notices).forEach(text);
63
+ attention();
64
+ if (v?.prompt)
65
+ text(v.prompt);
66
+ }
67
+ }
68
+ else if (action === 'prepare' || action === 'context') {
69
+ heading(v?.blocking ? v.state : action === 'context' ? 'View Context' : v?.attention.length ? 'Context prepared' : 'Context Ready');
70
+ const loaded = v?.contextLoaded;
71
+ if (loaded && [loaded.instructions, loaded.knowledge, loaded.skills].every(count)) {
72
+ text(`Loaded ${plural(loaded.instructions, 'project instruction')} · ${plural(loaded.knowledge, 'knowledge record')} · ${plural(loaded.skills, 'skill')}.`);
73
+ }
74
+ else
75
+ text('Loaded context counts unavailable.');
76
+ if (v?.blocking || v?.attention.length)
77
+ attention();
78
+ else
79
+ text(action === 'context' ? 'Read-only context view.' : 'Continuing the task.');
80
+ if (v?.prompt)
81
+ text(v.prompt);
82
+ if (full) {
83
+ if (scene?.task)
84
+ text(`Task: ${scene.task}`);
85
+ if (scene?.budget && Number.isFinite(scene.budget.used) && Number.isFinite(scene.budget.total))
86
+ text(`${scene.budget.used.toLocaleString('en-US')} / ${scene.budget.total.toLocaleString('en-US')} est. Prodero tokens`);
87
+ vm.sections.forEach(s => bodies(s.title, s.items));
88
+ actions();
89
+ }
90
+ }
91
+ else if (action === 'session-close') {
92
+ const receipt = v?.closeReceipt;
93
+ if (receipt)
94
+ parts.push(`**${markdownText(receipt.label)}** · ${markdownText(receipt.detail)}`);
95
+ else
96
+ text('Session status unavailable.');
97
+ attention();
98
+ if (full) {
99
+ if (vm.metrics.length)
100
+ parts.push(vm.metrics.map(m => `- ${markdownText(m.label)}: ${markdownText(m.value)}`).join('\n'));
101
+ vm.sections.forEach(s => bodies(s.title, s.items));
102
+ actions();
103
+ }
104
+ }
105
+ else if (vm.knowledgeTable) {
106
+ heading('Knowledge');
107
+ const table = vm.knowledgeTable;
108
+ text(table.rows.length ? `Showing ${table.offset + 1}–${table.offset + table.rows.length} of ${table.total}. Ask for a record by title.` : 'No knowledge matches these filters.');
109
+ // Long titles and mobile clients benefit from lists, rather than a wide table.
110
+ if (!expanded)
111
+ parts.push(table.rows.map(row => `- **${markdownText(row.title)}** — ${markdownText(row.layer)} · ${markdownText(row.category)}`).join('\n'));
112
+ else
113
+ vm.sections.forEach(s => bodies(s.title, s.items));
114
+ actions();
115
+ }
116
+ else {
117
+ heading(vm.title.replace(/^Prodero · /, ''));
118
+ if (!full && v) {
119
+ if (v.state && v.state !== 'Ready')
120
+ text(v.state);
121
+ v.facts.forEach(text);
122
+ attention();
123
+ }
124
+ else {
125
+ if (vm.metrics.length)
126
+ parts.push(vm.metrics.map(m => `- ${markdownText(m.label)}: ${markdownText(m.value)}${m.detail ? ` · ${markdownText(m.detail)}` : ''}`).join('\n'));
127
+ vm.notices.forEach(text);
128
+ vm.sections.forEach(s => bodies(s.title, s.items));
129
+ }
130
+ if (v?.prompt)
131
+ text(v.prompt);
132
+ actions();
133
+ }
134
+ if (diagnostics || full && action === 'migration')
135
+ for (const section of vm.diagnostics ?? [])
136
+ bodies(section.title, section.items);
137
+ return parts.filter(Boolean).join('\n\n');
138
+ }
139
+ //# sourceMappingURL=chat-text.js.map
package/dist/cli.js CHANGED
@@ -3,10 +3,11 @@ import { realpathSync } from "node:fs";
3
3
  import { pathToFileURL } from "node:url";
4
4
  import { captureLocalStdioContext } from "./mcp-workspace.js";
5
5
  import { planProjectMigration, applyProjectMigration } from "./core/migrations.js";
6
- import { buildViewModel, renderText } from "./presentation.js";
6
+ import { buildViewModel, renderTerminalText as renderText } from "./presentation.js";
7
7
  import { runMemorySync } from './core/memory-sync.js';
8
8
  import { machineIntegrations } from "./hosts/manager.js";
9
9
  import { installWizard } from "./hosts/wizard.js";
10
+ import { installCommand } from "./hosts/install-command.js";
10
11
  import { runtimeCommand } from "./hosts/runtime-command.js";
11
12
  import { buildMemoryTransformationBundle } from "./core/memory-transformation-bundle.js";
12
13
  import { getMemoryIntelligencePlan } from "./core/memory-intelligence.js";
@@ -25,13 +26,15 @@ Usage: prodero <command> [--root /absolute/project]
25
26
  migrate [status] Review or apply the project knowledge update with backup
26
27
  init Initialize the selected project
27
28
  install Open the interactive agent installation wizard
29
+ install --host HOST --dry-run [--json] Preview one host integration without writes
30
+ install --host HOST --yes [--json] Apply the reviewed integration for one host
28
31
  runtime <mode> --host HOST Switch one agent between package and dev (runtime --help)
29
32
  uninstall [host] [--all] Remove managed host integration; preserve projects
30
33
  status [--json] Show readable machine integrations; --json for scripts
31
34
  status --root PATH [--json] Show existing project status without maintenance
32
35
  memory-bundle <id> Inspect one read-only transformation bundle (JSON)
33
36
  memory-plan Inspect deterministic memory candidates (read-only JSON)
34
- sync Start/resume Curate Memory (JSON; continue through MCP)
37
+ sync Legacy technical memory-workflow API (JSON)
35
38
  sync-sessions Low-level deterministic closed-session recovery
36
39
  recall <query> Recall project knowledge without a session
37
40
  context [query] Inspect retrieved context
@@ -118,6 +121,10 @@ function parse(argv) {
118
121
  return { dev, checkout, json, command: helpRequested ? "help" : command, root, query, host: all ? "all" : host };
119
122
  }
120
123
  async function run(localStdio) {
124
+ if (process.argv[2] === 'install' && process.argv.length > 3) {
125
+ process.exitCode = await installCommand(process.argv.slice(3));
126
+ return;
127
+ }
121
128
  if (process.argv[2] === 'update') {
122
129
  process.exitCode = await updateCommand(process.argv.slice(3));
123
130
  return;
package/dist/contracts.js CHANGED
@@ -34,6 +34,8 @@ export const PRODERO_TOOLS = {
34
34
  promotionPreview: "prodero_promotion_preview",
35
35
  promote: "prodero_promote",
36
36
  sessionRecord: "prodero_session_record",
37
+ sessionReconcilePrepare: "prodero_session_reconcile_prepare",
38
+ sessionReconcilePropose: "prodero_session_reconcile_propose",
37
39
  sessionClose: "prodero_session_close",
38
40
  sessionReview: "prodero_session_review",
39
41
  sessionReviewMutate: "prodero_session_review_mutate",