@f5-sales-demo/xcsh 20.20.2 → 20.20.3

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/CHANGELOG.md CHANGED
@@ -15,6 +15,14 @@
15
15
  - Unified generated and existing media publication behind the versioned `xcsh.media/v1` result
16
16
  contract so TUI, Browser, Office, RPC, and ACP transports no longer identify media by tool name
17
17
  ([#3202](https://github.com/f5-sales-demo/xcsh/issues/3202)).
18
+ - Standardized documentation terminology, Handlebars prompt template rendering for `renderAboutDoc`,
19
+ Office add-in development test ownership, and language switcher links
20
+ ([#2848](https://github.com/f5-sales-demo/xcsh/issues/2848),
21
+ [#2999](https://github.com/f5-sales-demo/xcsh/issues/2999),
22
+ [#1327](https://github.com/f5-sales-demo/xcsh/issues/1327),
23
+ [#3001](https://github.com/f5-sales-demo/xcsh/issues/3001),
24
+ [#2850](https://github.com/f5-sales-demo/xcsh/issues/2850),
25
+ [#2514](https://github.com/f5-sales-demo/xcsh/issues/2514)).
18
26
 
19
27
  ### Fixed
20
28
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@f5-sales-demo/xcsh",
4
- "version": "20.20.2",
4
+ "version": "20.20.3",
5
5
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://github.com/f5-sales-demo/xcsh",
7
7
  "author": "Can Boluk",
@@ -61,13 +61,13 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "@agentclientprotocol/sdk": "1.3.0",
64
- "@f5-sales-demo/pi-agent-core": "20.20.2",
65
- "@f5-sales-demo/pi-ai": "20.20.2",
66
- "@f5-sales-demo/pi-natives": "20.20.2",
67
- "@f5-sales-demo/pi-resource-management": "20.20.2",
68
- "@f5-sales-demo/pi-tui": "20.20.2",
69
- "@f5-sales-demo/pi-utils": "20.20.2",
70
- "@f5-sales-demo/xcsh-stats": "20.20.2",
64
+ "@f5-sales-demo/pi-agent-core": "20.20.3",
65
+ "@f5-sales-demo/pi-ai": "20.20.3",
66
+ "@f5-sales-demo/pi-natives": "20.20.3",
67
+ "@f5-sales-demo/pi-resource-management": "20.20.3",
68
+ "@f5-sales-demo/pi-tui": "20.20.3",
69
+ "@f5-sales-demo/pi-utils": "20.20.3",
70
+ "@f5-sales-demo/xcsh-stats": "20.20.3",
71
71
  "@mozilla/readability": "^0.6",
72
72
  "@sinclair/typebox": "^0.34",
73
73
  "@xterm/headless": "^6.0",
@@ -2,6 +2,7 @@ import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
3
  import { prompt } from "@f5-sales-demo/pi-utils";
4
4
  import { $ } from "bun";
5
+ import aboutTemplate from "../prompts/internal-urls/about.md" with { type: "text" };
5
6
  import activeModelTemplate from "../prompts/internal-urls/active-model.md" with { type: "text" };
6
7
  import containmentTemplate from "../prompts/internal-urls/containment.md" with { type: "text" };
7
8
  import type { ContainmentStatus } from "../sandbox/containment";
@@ -182,133 +183,12 @@ export function renderAboutDoc(
182
183
  model: ActiveModelSnapshot | null,
183
184
  containment: ContainmentStatus | null,
184
185
  ): string {
185
- return [
186
- "# xcsh — identity and build fingerprint",
187
- "",
188
- "You are running inside xcsh, a coworker-style CLI for F5 sales engineers:",
189
- "demos, docs, research, MEDDPICC, customer meeting prep, and day-to-day SE tasks.",
190
- "This document is the authoritative answer when the user asks about xcsh itself.",
191
- "",
192
- "## Build fingerprint",
193
- "",
194
- `- Version: \`${info.version}\``,
195
- `- Commit: \`${info.shortCommit || "unknown"}\` (full: \`${info.commit || "unknown"}\`)`,
196
- `- Branch: \`${info.branch || "unknown"}\``,
197
- `- Tag: ${info.tag ? `\`${info.tag}\`` : "(not a tagged build)"}`,
198
- `- Commit date: ${info.commitDate || "unknown"}`,
199
- `- Build date: ${info.buildDate || "unknown"}`,
200
- `- Built from dirty tree: ${info.dirty ? "yes" : "no"}`,
201
- `- PR that shipped this version: ${info.prNumber ? `#${info.prNumber}` : "unknown (resolve via gh if needed)"}`,
202
- `- Provenance source: \`${info.source}\` (resolved at ${info.resolvedAt})`,
203
- "",
204
- renderPlatformContext(context, Date.now()),
205
- renderActiveModel(model),
206
- renderContainment(containment),
207
- "## Source of truth",
208
- "",
209
- `- Repository: ${info.repoUrl}`,
210
- `- Issues: ${info.repoUrl}/issues`,
211
- `- Pull requests: ${info.repoUrl}/pulls`,
212
- `- This commit on GitHub: ${info.commitUrl}`,
213
- `- Release for this version: ${info.releaseUrl}`,
214
- "",
215
- "## Product knowledge",
216
- "",
217
- "xcsh serves F5 Distributed Cloud sales engineers. Product documentation is",
218
- "federated across the f5-sales-demo GitHub organization. Entry point:",
219
- "https://f5-sales-demo.github.io/docs/llms.txt",
220
- "",
221
- "Each product repo publishes: llms.txt (index with sidebar nav), custom sets",
222
- "at /_llms-txt/{topic}.txt, per-page content at /{slug}.md, plus",
223
- "llms-small.txt (compact) and llms-full.txt (complete).",
224
- "",
225
- "Every one of those exists per language as well: {locale}/llms.txt,",
226
- "{locale}/llms-small.txt, {locale}/llms-full.txt, the tiered sets at",
227
- "/_llms-txt/{locale}/{topic}.txt, and per-page content at /{locale}/{slug}.md.",
228
- "The root llms.txt lists the languages under `## Translations`. When the user",
229
- "is working in a language, read that language's set rather than translating the",
230
- "default locale's — it is already written in their language. Locale segments",
231
- "are slugs, not BCP-47 tags (pt-br, zh-cn, zh-tw). The default locale's",
232
- "complete and abridged documents stay at the repo root, so its",
233
- "{locale}/llms-full.txt is intentionally absent.",
234
- "",
235
- "## Lineage",
236
- "",
237
- "xcsh is a fork of [badlogic/pi-mono](https://github.com/badlogic/pi-mono).",
238
- "Upstream authors: Mario Zechner (badlogic) and contributors. Fork maintainer:",
239
- "f5-sales-demo. The fork adds F5 XC product knowledge,",
240
- "SE-specific skills, and the federated llms.txt hierarchy.",
241
- "",
242
- "## Architecture",
243
- "",
244
- "| Package | Role |",
245
- "|---------|------|",
246
- "| `coding-agent` | System prompt, tool orchestration, agent loop |",
247
- "| `agent` | Multi-agent coordination, subagent lifecycle |",
248
- "| `ai` | LLM provider abstraction (Anthropic, OpenAI, etc.) |",
249
- "| `tui` | Terminal UI, key bindings, themes |",
250
- "| `natives` | Native Bun/Rust bindings (PTY, fs, crypto) |",
251
- "| `stats` | Token counting, cost tracking |",
252
- "| `utils` | Shared utilities, config, logging |",
253
- "| `crates/pi-natives` | Rust native addon (compiled per-platform) |",
254
- "",
255
- "## Capabilities",
256
- "",
257
- "Sessions, MCP server/client, skills, TUI with themes, commit assistant,",
258
- "Python REPL, native shell/PTY, provider-agnostic LLM routing, slash commands,",
259
- "SSH remote execution, image generation and analysis.",
260
- "",
261
- "SE specialization: F5 XC API integration (xcsh_api, api-catalog, api-spec),",
262
- "F5 XC federated product docs (llms.txt hierarchy),",
263
- "F5 XC console browser automation (catalog_workflow_runner, xcsh://console/ workflow catalog),",
264
- "SE-specific subagents (deal-analyst, status-operator, cli-operator, github-ops).",
265
- "",
266
- "## What to do when asked about xcsh itself",
267
- "",
268
- "1. The version above is authoritative — it is embedded at build time in this session's BUILD_INFO and also shown in the `<workstation>` header of the system prompt. Do not run `xcsh --version` to check — that reports the installed binary, which may differ from the running session after an upgrade. The **Active model** section is authoritative the same way: answer \"what model are you?\" from it, and never by running `xcsh -p`, which measures a new session's default rather than this one.",
269
- '2. For recent changes / "what\'s new", read `xcsh://changes` — it lists merged PRs live and flags',
270
- " what shipped after your build (it falls back to `gh pr list` / `git log` when gh is unavailable).",
271
- ' A fix may already be on `main`. For "where is X implemented?", read `xcsh://source`.',
272
- " For the class of the repository you are working in and what you may author there, read `xcsh://fleet`.",
273
- "3. If behavior contradicts `xcsh://…` docs, read the actual source under the repo above to determine",
274
- " whether the binary is wrong or the doc is stale.",
275
- "4. Classify the report as one of: **bug**, **feature**, **docs-drift**, or **config/usage**.",
276
- "5. Offer to file it with",
277
- " `gh issue create --repo f5-sales-demo/xcsh --title ... --body ...`, referencing the commit above.",
278
- "",
279
- "## Self-improvement and editable surfaces",
280
- "",
281
- `The xcsh repository above is the **source of truth** for all xcsh behavior. The directory \`~/.xcsh/\` on the user's machine is *runtime config and state* (themes, skills they installed, session data) — it is **not** xcsh's source code, and editing it will not change shipped behavior.`,
282
- "",
283
- "When the user asks how to improve or modify xcsh, classify the change against `EDITABLE_SURFACES`:",
284
- "",
285
- "- **Soft surfaces (shippable via a normal PR to the repo above):**",
286
- " - System prompt fragments under `packages/coding-agent/src/prompts/`",
287
- " - Tool descriptions, internal-url doc renderers, and skill definitions",
288
- " - New skills, new `xcsh://` docs, keybinding defaults, theme defaults",
289
- "- **Hard surfaces (require a compiled release — cannot hot-patch):**",
290
- " - The compiled binary, native Bun modules, and anything under `packages/*/native/`",
291
- " - Startup bootstrap and the build-info generator itself",
292
- "",
293
- "The improvement workflow is always: open an issue on the repo, then a PR. The user receives changes only after a new release is built and they upgrade. Do not claim a change is live until the commit above reflects it.",
294
- "",
295
- "You are a network-engineer assistant operating through GitHub, not a coding assistant: your job is",
296
- "to author the issue, the reproduction, the Terraform/manifests/scripts/docs, and the PR description.",
297
- "Whether **implementing** the change is yours depends on the repository's class — read `xcsh://fleet`.",
298
- "xcsh itself is classified `developer`, so feature code here is delegated to a dedicated coding",
299
- "harness (Claude Code / Codex) with its own dev environment; the same holds for the other `developer`",
300
- "repositories such as `f5-sales-demo/marketplace` and `f5-sales-demo/api-specs-enriched`. In a",
301
- "`content` repository you author directly.",
302
- "To file well: clone the relevant repo, reproduce the behavior first, and follow `CONTRIBUTING.md` —",
303
- "TDD, evidence required, no unverified claims.",
304
- "",
305
- "## What NOT to assume",
306
- "",
307
- "- Do not guess the repo URL, version, or commit — use the values above.",
308
- "- Do not invent recent changes; fetch them at runtime via `gh` or `git`.",
309
- "- Do not read this document unless the user asked about xcsh itself.",
310
- "",
311
- ].join("\n");
186
+ return prompt.render(aboutTemplate, {
187
+ info,
188
+ platformContext: renderPlatformContext(context, Date.now()),
189
+ activeModel: renderActiveModel(model),
190
+ containment: renderContainment(containment),
191
+ });
312
192
  }
313
193
 
314
194
  // Bun-embedded module URL markers. Mirrors the native addon loader
@@ -17,17 +17,17 @@ export interface BuildInfo {
17
17
  }
18
18
 
19
19
  export const BUILD_INFO: BuildInfo = {
20
- "version": "20.20.2",
21
- "commit": "04c71999d5ced53fa9200d3ae79a4ad2ba86debb",
22
- "shortCommit": "04c7199",
20
+ "version": "20.20.3",
21
+ "commit": "4e9c88dd1a386f0396ff44b6e9c56c3e482c9e4a",
22
+ "shortCommit": "4e9c88d",
23
23
  "branch": "main",
24
- "tag": "v20.20.2",
25
- "commitDate": "2026-08-17T12:59:16Z",
26
- "buildDate": "2026-08-17T13:25:27.576Z",
24
+ "tag": "v20.20.3",
25
+ "commitDate": "2026-08-18T08:48:18Z",
26
+ "buildDate": "2026-08-18T09:19:44.080Z",
27
27
  "dirty": true,
28
28
  "prNumber": "",
29
29
  "repoUrl": "https://github.com/f5-sales-demo/xcsh",
30
30
  "repoSlug": "f5-sales-demo/xcsh",
31
- "commitUrl": "https://github.com/f5-sales-demo/xcsh/commit/04c71999d5ced53fa9200d3ae79a4ad2ba86debb",
32
- "releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v20.20.2"
31
+ "commitUrl": "https://github.com/f5-sales-demo/xcsh/commit/4e9c88dd1a386f0396ff44b6e9c56c3e482c9e4a",
32
+ "releaseUrl": "https://github.com/f5-sales-demo/xcsh/releases/tag/v20.20.3"
33
33
  };
@@ -2,10 +2,10 @@
2
2
 
3
3
  import type { ConsoleCatalogData } from "./console-catalog-types";
4
4
 
5
- export const CONSOLE_CATALOG_VERSION = "1999b4cee787136ee0bc7cd02deba57ac6381885";
5
+ export const CONSOLE_CATALOG_VERSION = "4e059e3ff2de43517ffd0b45c0d4d89485d34713";
6
6
 
7
7
  export const CONSOLE_CATALOG_DATA: ConsoleCatalogData = {
8
- version: "1999b4cee787136ee0bc7cd02deba57ac6381885",
8
+ version: "4e059e3ff2de43517ffd0b45c0d4d89485d34713",
9
9
  workflows: {
10
10
  "address-allocator/create":
11
11
  '---\nschema: urn:xcsh:console:workflow:v1\nid: address-allocator-create\nlabel: Create IP Address Allocators\nresource: address-allocator\noperation: create\npreconditions:\n - user_logged_in\n - "role_minimum: admin"\nparams:\n name:\n required: true\n description: IP Address Allocators name (lowercase alphanumeric and hyphens)\n example: example-address-allocator\n address_allocator_mode:\n required: true\n description: Address Allocator Mode\n allocation_unit:\n required: false\n description: Allocation Unit\n default: 0\n address_pool:\n required: false\n description: Address Pool\n default: value\n address_allocation_scheme:\n required: false\n description: "Server-required: Field should be not nil"\n default: value\nsteps:\n - id: navigate-to-list\n action: navigate\n url: /web/workspaces/multi-cloud-network-connect/manage/networking/legacy_network_configuration/address_allocators\n wait_for: text(\'IP Address Allocators\')\n description: Navigate to IP Address Allocators list page\n - id: click-add-tab\n action: click\n selector: text(\'Add IP Address Allocator\')\n wait_for: textbox[name=\'Name\']\n description: Click Add IP Address Allocator to open the create form\n - id: fill-name\n action: fill\n selector: textbox[name=\'Name\']\n value: "{name}"\n description: Enter Name\n - id: select-address_allocator_mode\n action: select\n selector: listbox\n context: Address Allocator Mode section\n value: "{address_allocator_mode}"\n description: Select Address Allocator Mode\n - id: fill-allocation_unit\n action: fill\n selector: spinbutton[name=\'Allocation Unit\']\n value: "{allocation_unit}"\n description: Set Allocation Unit\n - id: fill-address_pool\n action: fill\n selector: ngx-datatable input.form-control\n context: Address Pool table\n value: "{address_pool}"\n description: Enter Address Pool in the existing table row (no Add Item needed — the table ships one empty row)\n - id: select-address_allocation_scheme\n action: select\n selector: listbox\n context: Address Allocation Scheme section\n value: "{address_allocation_scheme}"\n description: Select Address Allocation Scheme\n - id: save\n action: click\n selector: "[class*=\'save-bt\'],[class*=\'submit-button\']"\n context: footer\n wait_for: text(\'{name}\')\n wait_timeout_ms: 30000\n description: Save/submit the form (union selector matches save-bt OR submit-button)\npostconditions:\n - resource_list_page_visible\n - "resource_name_in_list: {name}"\nmetadata:\n confidence: inferred\n discovered_at: 2026-06-24\n console_version: "2025.06"\n notes: Auto-generated by scripts/generate-workflows.ts from api-specs-enriched field metadata.\n',