@cmetech/otto 1.0.8 → 1.0.9
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/dist/cli-args.d.ts +2 -0
- package/dist/cli-args.js +6 -0
- package/dist/cli.js +27 -0
- package/dist/help-text.js +15 -0
- package/dist/onboarding.d.ts +19 -0
- package/dist/onboarding.js +133 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/otto/commands/release-notes/_data.js +155 -0
- package/dist/resources/extensions/otto/commands/release-notes/command.js +114 -0
- package/dist/resources/extensions/otto/extension-manifest.json +1 -1
- package/dist/resources/extensions/otto/index.js +3 -0
- package/dist/seed-defaults.d.ts +50 -0
- package/dist/seed-defaults.js +226 -0
- package/package.json +8 -7
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +3 -3
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +3 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +17 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +89 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +105 -67
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js +20 -2
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +41 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/package.json +2 -2
- package/packages/pi-coding-agent/src/core/agent-session.ts +3 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +90 -1
- package/packages/pi-coding-agent/src/core/package-manager.ts +131 -64
- package/packages/pi-coding-agent/src/core/resolve-config-value.ts +20 -2
- package/packages/pi-coding-agent/src/core/settings-manager.ts +56 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/otto/commands/release-notes/_data.ts +171 -0
- package/src/resources/extensions/otto/commands/release-notes/command.ts +141 -0
- package/src/resources/extensions/otto/extension-manifest.json +1 -1
- package/src/resources/extensions/otto/index.ts +4 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@otto-build/rpc-client",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Standalone RPC client SDK for OTTO — zero internal dependencies",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"otto": {
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"test": "node --test dist/rpc-client.test.js"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@otto-build/contracts": "^1.0.
|
|
37
|
+
"@otto-build/contracts": "^1.0.9"
|
|
38
38
|
},
|
|
39
39
|
"engines": {
|
|
40
40
|
"node": ">=22.0.0"
|
package/pkg/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loop24/client",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"piConfig": {
|
|
5
5
|
"_comment": "AUTO-SYNCED from root package.json by scripts/sync-piconfig.mjs (runs on prebuild). Do not edit this block directly — edit root package.json and re-run `npm run build` or `npm run sync-piconfig`.",
|
|
6
6
|
"name": "otto",
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// AUTO-GENERATED — DO NOT EDIT.
|
|
2
|
+
// Source: CHANGELOG.md (regenerated by scripts/sync-release-notes.mjs on prebuild)
|
|
3
|
+
//
|
|
4
|
+
// To add or correct release notes, edit CHANGELOG.md and rebuild. Editing this
|
|
5
|
+
// file directly will be clobbered on the next build.
|
|
6
|
+
|
|
7
|
+
export interface ReleaseNote {
|
|
8
|
+
version: string;
|
|
9
|
+
date: string;
|
|
10
|
+
headline?: string;
|
|
11
|
+
added?: string[];
|
|
12
|
+
fixed?: string[];
|
|
13
|
+
changed?: string[];
|
|
14
|
+
notes?: string[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const RELEASE_NOTES: ReleaseNote[] = [
|
|
18
|
+
{
|
|
19
|
+
version: '1.0.9',
|
|
20
|
+
date: '2026-05-29',
|
|
21
|
+
headline: 'Recommended packages, /release-notes, and quieter startup.',
|
|
22
|
+
added: [
|
|
23
|
+
'New `otto onboarding` subcommand — re-run the first-run wizard at any time to revisit LLM provider, web search, remote questions, tool keys, or recommended packages.',
|
|
24
|
+
'New `/release-notes` slash command — browse what\'s new across releases. Type `/release-notes` for the interactive selector, `/release-notes <version>` for a specific release, `/release-notes list` for the index, or `/release-notes latest`.',
|
|
25
|
+
'Onboarding now offers a categorical "Recommended packages" step (Developer + Productivity personas) — see what each package does, untick anything you don\'t want, and OTTO installs them on launch.',
|
|
26
|
+
'Opt-in flags for recommended packages without re-running onboarding: `otto --with-defaults` (one launch), `OTTO_SEED_DEFAULTS=1` (env), or `seedDefaultsOnLaunch: true` in settings.json.',
|
|
27
|
+
'Opt-out controls with matching precedence: `otto --no-seed-defaults`, `OTTO_NO_SEED_DEFAULTS=1`, or `seedDefaultsOnLaunch: false`.',
|
|
28
|
+
'New `quietExtensions: string[]` setting — case-insensitive substring patterns matched against extension paths. Matching extensions have their `ui.notify` AND `console.log/warn/error/info` calls suppressed while their handlers are on the stack. Use to mute noisy session_start banners from extensions like piolium (`ui.notify`) or pi-notion (`console.log`). Concurrent non-quiet extensions are unaffected — suppression is scoped via AsyncLocalStorage to the quiet handler\'s own async context.',
|
|
29
|
+
'Known-noisy default packages are now silenced automatically: when onboarding seeds pi-notion (and any future curated package with a `quietPattern`), the pattern is added to `quietExtensions` on the same launch. Tracked via a new `seededQuietPatterns` settings key — if you remove a pattern from `quietExtensions`, OTTO will not re-add it.',
|
|
30
|
+
'New `OTTO_LOG_BLOCKED_COMMANDS=1` env to opt back into the `[resolve-config-value]` warning when actively debugging credential resolution.',
|
|
31
|
+
],
|
|
32
|
+
fixed: [
|
|
33
|
+
'Doubled OTTO header on first launch is gone: auto-resolve npm install no longer corrupts the TUI\'s alt-screen because install stdio is now captured instead of inherited. Explicit `otto install <pkg>` still streams live progress.',
|
|
34
|
+
'A bad source in `settings.packages` (typo, 404, dead git host) no longer crashes startup — the resolver now warns-and-continues per source with the underlying npm/git error attached to the message.',
|
|
35
|
+
'`/release-notes` content renders inside a chat response card via the session\'s custom-message stream instead of being interleaved with live TUI redraws.',
|
|
36
|
+
'`[resolve-config-value] Blocked disallowed command: "sh"` warning is suppressed by default; it was unactionable noise from extensions that intentionally register `!sh -lc ...` apiKey expressions.',
|
|
37
|
+
],
|
|
38
|
+
changed: [
|
|
39
|
+
'`CHANGELOG.md` is now the single source of truth for `/release-notes` data. `src/resources/extensions/otto/commands/release-notes/_data.ts` is regenerated by `scripts/sync-release-notes.mjs` on every prebuild.',
|
|
40
|
+
'Piolium dropped from the default Recommended Packages list. Existing installs are left alone; the zombie-resurrection guard prevents reseeding. `otto remove npm:@vigolium/piolium` to drop it.',
|
|
41
|
+
],
|
|
42
|
+
notes: [
|
|
43
|
+
'New `~/.otto/agent/settings.json` keys this release: `seedDefaultsOnLaunch`, `seededDefaults`, `enabledDefaultPackages`, `quietExtensions`. All optional; omit to inherit the defaults documented in `/release-notes`.',
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
version: '1.0.8',
|
|
48
|
+
date: '2026-05-28',
|
|
49
|
+
headline: 'Bundled-tools path fix.',
|
|
50
|
+
fixed: [
|
|
51
|
+
'Bundled ripgrep/fd now land in the correct destination so OTTO\'s managed tools resolve on fresh installs.',
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
version: '1.0.7',
|
|
56
|
+
date: '2026-05-28',
|
|
57
|
+
headline: 'OTTO brand cutover + bundled ripgrep & fd.',
|
|
58
|
+
added: [
|
|
59
|
+
'Ship ripgrep and fd with the OTTO binary — no separate install required for fast search and file discovery.',
|
|
60
|
+
],
|
|
61
|
+
changed: [
|
|
62
|
+
'README rebrand from prior identity to OTTO — clearer messaging for the v1.x line.',
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
version: '1.0.6',
|
|
67
|
+
date: '2026-05-27',
|
|
68
|
+
headline: 'uuid deprecation warning silenced.',
|
|
69
|
+
fixed: [
|
|
70
|
+
'Pin the uuid package override so Node no longer prints deprecation warnings during startup.',
|
|
71
|
+
'Native package repository.url corrected to cmetech/otto-cli for provenance verification.',
|
|
72
|
+
],
|
|
73
|
+
changed: [
|
|
74
|
+
'INSTALL.md expanded with macOS and Linux instructions.',
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
version: '1.0.5',
|
|
79
|
+
date: '2026-05-26',
|
|
80
|
+
headline: 'npm provenance enabled.',
|
|
81
|
+
added: [
|
|
82
|
+
'Publish with npm provenance — installs can now verify OTTO and engine packages came from this repo\'s CI.',
|
|
83
|
+
],
|
|
84
|
+
changed: [
|
|
85
|
+
'Native and main publish workflows split for trusted-publishing compatibility.',
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
version: '1.0.4',
|
|
90
|
+
date: '2026-05-24',
|
|
91
|
+
headline: 'Trusted publishing + gateway model discovery.',
|
|
92
|
+
added: [
|
|
93
|
+
'Gateway: discover available models exposed through `OTTO_GATEWAY_URL` so `/model` lists them out of the box.',
|
|
94
|
+
'Footer: GW status color decoupled from the routing label so health is glanceable.',
|
|
95
|
+
],
|
|
96
|
+
fixed: [
|
|
97
|
+
'LangFlow: surface timeouts on id lookups instead of hanging silently.',
|
|
98
|
+
'LangFlow: fail fast on auth failures with a clear actionable message.',
|
|
99
|
+
],
|
|
100
|
+
changed: [
|
|
101
|
+
'Release pipeline switched to npm trusted publishing by default.',
|
|
102
|
+
'Bumped CI npm-registry propagation retry budgets to reduce flaky publishes.',
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
version: '1.0.3',
|
|
107
|
+
date: '2026-05-23',
|
|
108
|
+
headline: 'TUI hardening + workflow command cleanup.',
|
|
109
|
+
fixed: [
|
|
110
|
+
'Hardened interactive TUI behavior across edge cases (resize, focus, paste).',
|
|
111
|
+
'Streamlined workflow command handling so dispatching is more predictable.',
|
|
112
|
+
'OTTO startup no longer requires you to be inside a project directory.',
|
|
113
|
+
'Workflow context no longer attempts to load from the home directory.',
|
|
114
|
+
],
|
|
115
|
+
changed: [
|
|
116
|
+
'Tightened gateway remote-tool handling.',
|
|
117
|
+
'Hardened npm publish and install tooling.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
version: '1.0.2',
|
|
122
|
+
date: '2026-05-23',
|
|
123
|
+
headline: 'Hard-fork runtime complete + LangFlow control plane.',
|
|
124
|
+
added: [
|
|
125
|
+
'LangFlow control plane: register, validate, smoke-test, and import flows from inside OTTO.',
|
|
126
|
+
'Codebase excavation workflows for spelunking unfamiliar repos.',
|
|
127
|
+
'Improved OTTO package management — install, remove, list, and update with provenance-aware paths.',
|
|
128
|
+
'Lazy `/gsd init` — OTTO is now bootable from any directory, no preflight required.',
|
|
129
|
+
'`requireProject` guard so gsd commands fail with a clear message when run outside a project.',
|
|
130
|
+
],
|
|
131
|
+
fixed: [
|
|
132
|
+
'RTK opt-in is now read from user settings before project preferences (correct precedence).',
|
|
133
|
+
'`loadProjectGSDPreferences` returns null outside projects instead of throwing.',
|
|
134
|
+
],
|
|
135
|
+
notes: [
|
|
136
|
+
'This release completes the hard-fork rebrand to OTTO: workspace scope, config dirs, brand colors, and patches now flow from `piConfig` as the single source of truth.',
|
|
137
|
+
],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
version: '1.0.0',
|
|
141
|
+
date: '2026-05-22',
|
|
142
|
+
headline: 'Project baseline.',
|
|
143
|
+
changed: [
|
|
144
|
+
'Started the `open-gsd/gsd-pi` development baseline.',
|
|
145
|
+
'Reset first-party package versions to `1.0.0`.',
|
|
146
|
+
'Cleaned public README and changelog history for the new project ownership.',
|
|
147
|
+
],
|
|
148
|
+
notes: [
|
|
149
|
+
'Historical release notes are archived outside the active changelog.',
|
|
150
|
+
'New release notes should be added above this entry under `Unreleased`.',
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
];
|
|
154
|
+
|
|
155
|
+
export function getLatestRelease(): ReleaseNote {
|
|
156
|
+
return RELEASE_NOTES[0];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function findReleaseByVersion(version: string): ReleaseNote | undefined {
|
|
160
|
+
const normalized = version.trim().replace(/^v/, "");
|
|
161
|
+
return RELEASE_NOTES.find((r) => r.version === normalized);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function countItems(release: ReleaseNote): number {
|
|
165
|
+
return (
|
|
166
|
+
(release.added?.length ?? 0) +
|
|
167
|
+
(release.fixed?.length ?? 0) +
|
|
168
|
+
(release.changed?.length ?? 0) +
|
|
169
|
+
(release.notes?.length ?? 0)
|
|
170
|
+
);
|
|
171
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /release-notes — browse OTTO's "what's new" history.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* /release-notes → interactive selector across all versions
|
|
6
|
+
* /release-notes <version> → show that version directly (e.g. 1.0.7 or v1.0.7)
|
|
7
|
+
* /release-notes latest → alias for the newest version
|
|
8
|
+
* /release-notes list → non-interactive index (one line per version)
|
|
9
|
+
*
|
|
10
|
+
* UX modelled after Claude Code's /release-notes: a top-level list with a
|
|
11
|
+
* count badge per entry, then full detail on selection. Output is written
|
|
12
|
+
* to stdout so it lands in the chat transcript.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { ExtensionAPI, ExtensionCommandContext } from "@otto/pi-coding-agent";
|
|
16
|
+
import {
|
|
17
|
+
RELEASE_NOTES,
|
|
18
|
+
countItems,
|
|
19
|
+
findReleaseByVersion,
|
|
20
|
+
getLatestRelease,
|
|
21
|
+
type ReleaseNote,
|
|
22
|
+
} from "./_data.js";
|
|
23
|
+
|
|
24
|
+
const USAGE = `Usage:
|
|
25
|
+
/release-notes Browse all releases interactively
|
|
26
|
+
/release-notes <version> Show a specific release (e.g. 1.0.7)
|
|
27
|
+
/release-notes latest Show the newest release
|
|
28
|
+
/release-notes list Print a one-line index of every release`;
|
|
29
|
+
|
|
30
|
+
function formatSelectorLabel(release: ReleaseNote): string {
|
|
31
|
+
const total = countItems(release);
|
|
32
|
+
const headline = release.headline ? ` — ${release.headline}` : "";
|
|
33
|
+
const badge = total === 1 ? "1 item" : `${total} items`;
|
|
34
|
+
return `v${release.version} (${release.date}, ${badge})${headline}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function renderSection(title: string, items: string[] | undefined): string {
|
|
38
|
+
if (!items || items.length === 0) return "";
|
|
39
|
+
const bulleted = items.map((line) => `- ${line}`).join("\n");
|
|
40
|
+
return `\n### ${title}\n${bulleted}\n`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function renderRelease(release: ReleaseNote): string {
|
|
44
|
+
const header = `# OTTO v${release.version} — ${release.date}`;
|
|
45
|
+
const headline = release.headline ? `\n_${release.headline}_\n` : "";
|
|
46
|
+
const body = [
|
|
47
|
+
renderSection("Added", release.added),
|
|
48
|
+
renderSection("Fixed", release.fixed),
|
|
49
|
+
renderSection("Changed", release.changed),
|
|
50
|
+
renderSection("Notes", release.notes),
|
|
51
|
+
].join("");
|
|
52
|
+
const tail = `\n---\n${RELEASE_NOTES.length} releases tracked. Use \`/release-notes\` to browse, \`/release-notes <version>\` for any other release.`;
|
|
53
|
+
return `${header}${headline}${body}${tail}\n`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function renderIndex(): string {
|
|
57
|
+
const rows = RELEASE_NOTES.map((r) => {
|
|
58
|
+
const total = countItems(r);
|
|
59
|
+
const badge = total === 1 ? "1 item" : `${total} items`;
|
|
60
|
+
const headline = r.headline ? ` — ${r.headline}` : "";
|
|
61
|
+
return `- v${r.version} (${r.date}, ${badge})${headline}`;
|
|
62
|
+
}).join("\n");
|
|
63
|
+
return `# OTTO release index\n\n${rows}\n\nView any release with \`/release-notes <version>\`.\n`;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function findByVersionToken(token: string): ReleaseNote | undefined {
|
|
67
|
+
if (token === "latest") return getLatestRelease();
|
|
68
|
+
return findReleaseByVersion(token);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const CUSTOM_TYPE = "otto-release-notes";
|
|
72
|
+
|
|
73
|
+
function postToChat(pi: ExtensionAPI, content: string): void {
|
|
74
|
+
// Routes through the session's custom-message stream so the content lands
|
|
75
|
+
// inside a chat response card instead of stdout (which the TUI redraws on
|
|
76
|
+
// top of, producing the interleaved-text bug from the first cut).
|
|
77
|
+
pi.sendMessage({ customType: CUSTOM_TYPE, content, display: true });
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function registerReleaseNotesCommand(pi: ExtensionAPI): void {
|
|
81
|
+
pi.registerCommand("release-notes", {
|
|
82
|
+
description: "Browse OTTO release notes — what's new, fixed, and changed",
|
|
83
|
+
handler: async (args: string, ctx: ExtensionCommandContext) => {
|
|
84
|
+
const trimmed = args.trim();
|
|
85
|
+
|
|
86
|
+
// ── Direct version / latest ──────────────────────────────────
|
|
87
|
+
if (trimmed && trimmed !== "list") {
|
|
88
|
+
const match = findByVersionToken(trimmed);
|
|
89
|
+
if (!match) {
|
|
90
|
+
postToChat(
|
|
91
|
+
pi,
|
|
92
|
+
`**No release found for \`${trimmed}\`**\n\nKnown versions: ${RELEASE_NOTES.map((r) => `v${r.version}`).join(", ")}`,
|
|
93
|
+
);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
postToChat(pi, renderRelease(match));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// ── Index dump ───────────────────────────────────────────────
|
|
101
|
+
if (trimmed === "list") {
|
|
102
|
+
postToChat(pi, renderIndex());
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ── Interactive selector ─────────────────────────────────────
|
|
107
|
+
if (!ctx.hasUI || typeof ctx.ui?.select !== "function") {
|
|
108
|
+
// Headless / piped: print to stdout (no TUI to corrupt) so the
|
|
109
|
+
// content is still recoverable in scripted / mcp / rpc modes.
|
|
110
|
+
process.stdout.write(renderRelease(getLatestRelease()));
|
|
111
|
+
process.stdout.write("\n" + renderIndex());
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const options = RELEASE_NOTES.map(formatSelectorLabel);
|
|
116
|
+
let pick: string | string[] | undefined;
|
|
117
|
+
try {
|
|
118
|
+
pick = await ctx.ui.select(
|
|
119
|
+
`OTTO release notes — ${RELEASE_NOTES.length} versions available`,
|
|
120
|
+
options,
|
|
121
|
+
);
|
|
122
|
+
} catch (err) {
|
|
123
|
+
postToChat(
|
|
124
|
+
pi,
|
|
125
|
+
`**release-notes error:** ${(err as Error).message}\n\n${USAGE}`,
|
|
126
|
+
);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (!pick) return; // user cancelled — nothing to do
|
|
131
|
+
const picked = Array.isArray(pick) ? pick[0] : pick;
|
|
132
|
+
const index = options.indexOf(picked);
|
|
133
|
+
const release = index >= 0 ? RELEASE_NOTES[index] : undefined;
|
|
134
|
+
if (!release) {
|
|
135
|
+
postToChat(pi, `**No match for** \`${picked}\``);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
postToChat(pi, renderRelease(release));
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
}
|
|
@@ -22,6 +22,7 @@ import { registerOttoTools } from "./tools/_loader.js";
|
|
|
22
22
|
import { executeLangFlowTool } from "./tools/langflow.js";
|
|
23
23
|
import { registerBuildFlowCommand } from "./commands/build-flow/command.js";
|
|
24
24
|
import { registerPromptEngineerCommand } from "./commands/prompt-engineer/command.js";
|
|
25
|
+
import { registerReleaseNotesCommand } from "./commands/release-notes/command.js";
|
|
25
26
|
import { parseLangFlowNaturalLanguage } from "./commands/langflow/natural-language.js";
|
|
26
27
|
|
|
27
28
|
const _here = dirname(fileURLToPath(import.meta.url));
|
|
@@ -186,6 +187,9 @@ export default function Otto(pi: ExtensionAPI): void {
|
|
|
186
187
|
// ── Register /otto prompt-engineer slash command (Phase 5) ──
|
|
187
188
|
registerPromptEngineerCommand(pi);
|
|
188
189
|
|
|
190
|
+
// ── Register /release-notes slash command ──
|
|
191
|
+
registerReleaseNotesCommand(pi);
|
|
192
|
+
|
|
189
193
|
// ── Load and register flow-trigger slash commands ──
|
|
190
194
|
// Fire-and-forget. Pi's command registry is dynamic; late registrations work.
|
|
191
195
|
loadFlowTriggers(FLOW_TRIGGERS_DIR)
|