@prodero/curator 0.2.1 → 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.
- package/ARCHITECTURE.md +12 -0
- package/CHANGELOG.md +20 -0
- package/README.md +60 -6
- package/dist/chat-text.js +139 -0
- package/dist/cli.js +9 -2
- package/dist/contracts.js +2 -0
- package/dist/conversation-presentation.js +101 -142
- package/dist/core/agent-instructions.js +7 -4
- package/dist/core/context.js +4 -2
- package/dist/core/curation-graphical.js +1 -1
- package/dist/core/curation-review.js +61 -17
- package/dist/core/curation-revision.js +2 -0
- package/dist/core/curation-semantic-jobs.js +2 -2
- package/dist/core/json-schema.js +6 -0
- package/dist/core/memory-index.js +1 -1
- package/dist/core/memory-pressure.js +16 -5
- package/dist/core/memory-sync.js +16 -9
- package/dist/core/memory-transformation-proposal.js +2 -2
- package/dist/core/project.js +18 -4
- package/dist/core/session-index.js +2 -2
- package/dist/core/session-reconciliation.js +320 -0
- package/dist/curation-review-adapter.js +1 -1
- package/dist/hosts/install-command.js +130 -0
- package/dist/hosts/manager.js +1 -1
- package/dist/memory-presentation.js +5 -175
- package/dist/presentation-server.js +12 -6
- package/dist/presentation-trace.js +3 -2
- package/dist/presentation.js +57 -136
- package/dist/providers/mcp-sampling.js +6 -6
- package/dist/server.js +63 -29
- package/dist/status-presentation.js +4 -2
- package/dist/text-layout.js +16 -24
- package/dist-ui/index.html +140 -128
- package/docs/COMPATIBILITY.md +14 -4
- package/docs/INSTALL-WITH-AGENT.md +64 -0
- package/docs/RELEASING.md +2 -2
- package/docs/V0.3.0-CHAT-TEXT.md +75 -0
- package/docs/V0.3.0-MAINTENANCE.md +23 -0
- package/docs/hosts.md +18 -4
- package/instructions/AGENTS.md +6 -4
- package/package.json +8 -5
- package/plugins/migrate_ai_studio/schema.cjs +1 -2
- package/plugins/migrate_ai_studio/ui/dist/index.html +75 -42
- 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,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.0 — 2026-11-09 (Public Preview)
|
|
4
|
+
|
|
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
|
+
|
|
3
23
|
## 0.2.1 — 2026-10-25 (Public Preview)
|
|
4
24
|
|
|
5
25
|
- Corrected public documentation and release wording, including installation and compatibility guidance.
|
package/README.md
CHANGED
|
@@ -2,16 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
**Project memory for Codex and Claude Code.**
|
|
4
4
|
|
|
5
|
+
**0.3.0 Public Preview.** See [compatibility and verification](docs/COMPATIBILITY.md) for the exact coverage and limitations.
|
|
6
|
+
|
|
5
7
|
Keep project decisions, conventions, and lessons across sessions, right inside your coding assistant.
|
|
6
8
|
|
|
7
|
-
|
|
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.
|
|
8
22
|
|
|
9
23
|
```sh
|
|
10
|
-
npm install --global @prodero/curator@
|
|
24
|
+
npm install --global @prodero/curator@latest
|
|
11
25
|
prodero install
|
|
12
26
|
```
|
|
13
27
|
|
|
14
|
-
Requires **Node.js >=22.14.0 <23**, npm and Git. **v0.
|
|
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).
|
|
15
29
|
|
|
16
30
|
1. In the installation wizard, select **Codex** or **Claude Code**, confirm the setup and choose **Finish**.
|
|
17
31
|
2. Reopen Codex or Claude Code in your repository and type **`prodero`** in chat.
|
|
@@ -19,6 +33,44 @@ Requires **Node.js >=22.14.0 <23**, npm and Git. **v0.2.1 Public Preview.** Code
|
|
|
19
33
|
|
|
20
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).
|
|
21
35
|
|
|
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
|
+
|
|
22
74
|

|
|
23
75
|
|
|
24
76
|
*Current Curator App with demonstration project data.*
|
|
@@ -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**
|
|
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
|
|
|
@@ -70,7 +124,7 @@ The generated `.prodero/index.md` can include active **Local skill titles and pa
|
|
|
70
124
|
|
|
71
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,
|
|
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
|
|
|
@@ -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, '&').replace(/</g, '<').replace(/>/g, '>').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
|
|
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",
|