diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 85cada01..14e2edcd 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -22,7 +22,7 @@ Before starting work, check:
- **[GitHub Issues](https://github.com/raiseCatError/notMyShell/issues)** — concrete actionable work; acceptance criteria in each issue are authoritative
- **[v0.20.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.20.0)** — current stable release, merged through [PR #392](https://github.com/raiseCatError/notMyShell/pull/392) (see [ROADMAP.md](ROADMAP.md))
- **[CHANGELOG.md](CHANGELOG.md)** — the authoritative record of notable changes; see [Changelog](#changelog) below
-- **GitHub Project** — [NMSh Development](https://github.com/users/raiseCatError/projects/1) — live development status board
+- **GitHub Issues** — [raiseCatError/notMyShell issues](https://github.com/raiseCatError/notMyShell/issues) — public bug reports, proposals and development status
## Branch Model
diff --git a/docs/architecture/context-modules.md b/docs/architecture/context-modules.md
index 6153e8dc..ba48a067 100644
--- a/docs/architecture/context-modules.md
+++ b/docs/architecture/context-modules.md
@@ -8,8 +8,8 @@ without taking over shell execution or running anything the workspace chose.
> **Release status.** v0.17.0 shipped the foundation: typed fact metadata,
> native module routing and the Context Rail. Everything else described here —
> capability scheduling, the first-party module catalog, declarative Context
-> Packs, Status Strip routing and Status Strip 2.0, `/modules` and Claude Code agent context — is in
-> the v0.18 development stack, pending acceptance and release.
+> Packs, Status Strip routing and Status Strip 2.0, `/modules` and Claude Code agent context — shipped
+> in v0.18.0 and is part of every later release, including the current v0.20.0.
## From capability to presentation
diff --git a/website/DESIGN.md b/website/DESIGN.md
index a794b7cb..93f76aca 100644
--- a/website/DESIGN.md
+++ b/website/DESIGN.md
@@ -49,8 +49,7 @@ silently promoted by a build. A check-only sync reports drift without changing f
## Information architecture
-Product `/`, Features `/features/`, Install `/install/`, Docs `/docs/`, future Learn
-`/learn/`, Roadmap `/roadmap/`, Releases `/releases/`, Architecture `/architecture/`.
+Product `/`, Features `/features/`, Install `/install/`, Docs `/docs/`, Roadmap `/roadmap/`, Releases `/releases/`, Architecture `/architecture/`.
Docs progress from first run, concepts and everyday use through composer, completion,
transcript, sessions, prompts, themes, integrations, context, shells, configuration,
accessibility, troubleshooting, advanced usage, development and reference.
@@ -70,8 +69,7 @@ decorative animation. Original brand artwork is reused unmodified.
Marketing sections use editorial splits, numbered explanations and comparison rows,
not endless cards. A fine ruled media field with an abstract registration mark,
purpose label and honest pending notice reserves its real aspect ratio. No fake
-commands, output, playback buttons or product UI. Learn is a conceptual introduction,
-not a functional lesson player. The homepage stays static. Motion is limited to quick
+commands, output, playback buttons or product UI. The homepage stays static. Motion is limited to quick
article-only fades between documentation pages, short native dialog entry/exit and
hover feedback. No scroll-triggered reveals or JavaScript-gated content. Reduced
motion disables it. Focus rings and text labels carry state
diff --git a/website/LAUNCH.md b/website/LAUNCH.md
index 0cdff701..b0f60f83 100644
--- a/website/LAUNCH.md
+++ b/website/LAUNCH.md
@@ -57,7 +57,7 @@ followed by a successful rerun. None establishes final released-tag physical acc
| Prompts, Theme Studio, Chroma and Theme Bridge | Integrated; prompt/theme ownership contracts | Prompts, themes, configuration, accessibility |
| Rerunnable Setup | Integrated; `src/setup/SetupCat.ts`, `tests/setupOrder.test.ts` | Setup guide; starting points versus full guided wizard |
| Reactive Horizon first run | Integrated into production app paths at public `15d776ee`; `tests/startupApp.test.ts`, `tests/startupEnding.test.ts` | Setup guide; four choices, reactive sky, transparency, real-composer ending and bounded host offer |
-| Learn Mode | **Future proposal**, issue #398; not part of v0.20 code | Dedicated planned Learn page; isolation gates preserved |
+| Learn Mode | Deferred idea, issue #398; not part of v0.20 code | Intentionally not advertised; `/learn/` returns 404 |
## Onboarding integration boundary
@@ -105,7 +105,7 @@ reason to call the already integrated Horizon experience a future proposal.
- Curated guides and pages were reconciled against the release: welcome on every first
run, Keep Existing provider choices, the Tools tiers and flow, the update notice,
queue settings and history, platform evidence. Candidate-only wording is state-gated
- or removed. Learn Mode stays a planned proposal.
+ or removed. Learn Mode is not advertised.
- Checks on the synced tree: `npm test`, `npm run check`, `npm run build:launch`
(62 pages, internal links/anchors, sitemap, metadata, search), `npm run test:browser`
(17/17, axe in both themes and reduced motion). External links: 198 of 199 return
diff --git a/website/README.md b/website/README.md
index 3c21a4ba..16686fe3 100644
--- a/website/README.md
+++ b/website/README.md
@@ -22,7 +22,7 @@ website/
data/ Launch baseline, public releases, source hashes, media inventory
layouts/ Shared product shell and documentation layout
lib/ Shared release metadata and docs navigation
- pages/ Product, install, Learn, roadmap, docs and release routes
+ pages/ Product, install, roadmap, docs and release routes
scripts/ Small browser enhancement: theme, copy and search
styles/ Shared tokens, responsive layouts and prose styles
public/ Genuine brand artwork, robots and Cloudflare headers
@@ -161,9 +161,10 @@ not leave a half-fetched refresh. Filesystem write failures still require checki
the Git diff and rerunning the refresh; normal builds validate the complete result.
The roadmap is a curated editorial view linked to public issues, not an API dump.
-Recheck issue state and product direction during each release review. Issue #398 is
-authoritative for Learn Mode; it remains a future proposal with no date or version
-commitment. Never add an install command, fake course player or unsafe host-shell demo.
+Recheck issue state and product direction during each release review. The site does
+not advertise Learn Mode or any Bash/zsh course: issue #398 is a deferred, unscheduled
+idea about explaining NMSh's own interface and stays off the public site. Never add an
+install command, fake course player or unsafe host-shell demo.
Add product pages in `src/pages/`, reuse `Base`, `Code` and `Media`, and update sitemap
routes/global navigation deliberately. New or renamed docs paths need explicit
@@ -185,7 +186,6 @@ caption and future alt-text requirements. Every slot is currently intentionally
| `session-resume` | Detach and reattach a live shell | 1440×900 / 8:5 |
| `context-modules` | Native prompt, Rail and Status Strip | 1440×900 / 8:5 |
| `vespyr-appearance` | Vespyr and appearance choices | 1440×900 / 8:5 |
-| `learn-concept` | Future approved guide/practice concept | 1440×960 / 3:2 |
When genuine supplied assets are available, put them in `public/media/` and add
`src: "/media/name.webp"`, `kind: "image"`, and a specific `alt` to the corresponding
@@ -197,7 +197,7 @@ No video library, automatic playback or animation bypass is introduced. Match th
reserved ratio (the home slot is height-capped on desktop) to avoid layout movement.
Update the caption honestly when replacing pending media. Do not call a conceptual
-Learn image a working interface. Requirements in `altRequirement` are instructions
+image a working interface. Requirements in `altRequirement` are instructions
for a future author, never fabricated alt text for an unavailable asset. Build
validation rejects missing local assets, missing alt text, bad dimensions and
unapproved external media URLs. Genuine existing logo/lockup assets are copied
@@ -379,3 +379,13 @@ References: [disabled Git builds](https://developers.cloudflare.com/pages/config
theme switching usable without falsely claiming persistence.
- **Cloudflare root install builds the CLI:** set Root directory to `website` and
verify the explicit build command and dependency-install environment above.
+
+## Editorial corrections to pinned references
+
+Reference pages are synchronized from the tagged release and are never edited by hand
+(`validate-content` rejects it). A stale or wrong passage in a tagged document is
+corrected in `scripts/editorial.mjs` instead: each entry is pinned to one source commit,
+must match exactly once, is applied during `npm run sync:upstream`, is listed in the
+provenance manifest and appears on the page as an "Editorial update". Fix the canonical
+document on the development branch too, then delete the entry once a tagged release
+contains the fix.
diff --git a/website/REVIEW.md b/website/REVIEW.md
index d6686174..47643729 100644
--- a/website/REVIEW.md
+++ b/website/REVIEW.md
@@ -87,7 +87,7 @@ not the revised v0.20 baseline. They are retained as historical verification evi
## Shipped for review
-Home, Features, Install, documentation index, planned Learn, Roadmap, Releases,
+Home, Features, Install, documentation index, Roadmap, Releases,
historical release-note pages, Architecture and custom 404. The handbook includes
18 curated guides and 15 version-pinned technical references, with desktop sidebar,
compact navigation/contents, anchor links, previous/next and local full-text search.
@@ -120,7 +120,7 @@ Chrome covers 1440px desktop, 834px tablet and 390px mobile; dark and light them
blocked storage writes; clipboard success/denial; search results, no-results and
failed-index fallback; Escape focus return; no-JS docs; compact contents/permalinks;
404 and pending-media behavior. Automated axe checks exercise representative product,
-installation, learning and technical-doc pages in both themes.
+installation and technical-doc pages in both themes.
Rendered **webpage-only** viewport QA was visually inspected at desktop/tablet/mobile
sizes, using disposable external scratch. These images contain the website and its
diff --git a/website/scripts/editorial.mjs b/website/scripts/editorial.mjs
new file mode 100644
index 00000000..2da29cb6
--- /dev/null
+++ b/website/scripts/editorial.mjs
@@ -0,0 +1,33 @@
+// Audited corrections to release-pinned references. The tagged source is immutable, so a wrong or
+// stale sentence in it is corrected here, shown on the page as an editorial update and recorded in
+// the provenance manifest. Each correction applies only to the commit it was written against and
+// must match exactly once; remove it once the corrected text ships in a tagged release.
+export const corrections = [
+ {
+ id: 'context-modules-release-status',
+ commit: '65e4de55b2d8f1ad3a734a9d415a353b56b81e2c',
+ slug: 'context-modules',
+ note: 'The release-status paragraph said the module platform was still pending acceptance. It shipped in v0.18.0 and is part of v0.20.0.',
+ from: 'Packs, Status Strip routing and Status Strip 2.0, `/modules` and Claude Code agent context — is in\n> the v0.18 development stack, pending acceptance and release.',
+ to: 'Packs, Status Strip routing and Status Strip 2.0, `/modules` and Claude Code agent context — shipped\n> in v0.18.0 and is part of every later release, including the current v0.20.0.',
+ },
+ {
+ id: 'contributing-public-link',
+ commit: '65e4de55b2d8f1ad3a734a9d415a353b56b81e2c',
+ slug: 'contributing',
+ note: 'The tagged document linked to a private GitHub Project. The link now points to the public issue tracker.',
+ from: '- **GitHub Project** — [NMSh Development](https://github.com/users/raiseCatError/projects/1) — live development status board',
+ to: '- **GitHub Issues** — [raiseCatError/notMyShell issues](https://github.com/raiseCatError/notMyShell/issues) — public bug reports, proposals and development status',
+ },
+];
+
+export function applyEditorial(slug, commit, body) {
+ const applied = [];
+ let text = body;
+ for (const correction of corrections.filter(item => item.slug === slug && item.commit === commit)) {
+ if (text.split(correction.from).length !== 2) throw new Error(`Editorial correction ${correction.id} no longer matches exactly once; review or remove it.`);
+ text = text.replace(correction.from, () => correction.to);
+ applied.push(correction);
+ }
+ return { body: text, applied };
+}
diff --git a/website/scripts/sync-upstream.mjs b/website/scripts/sync-upstream.mjs
index 744e4eb3..e964b071 100644
--- a/website/scripts/sync-upstream.mjs
+++ b/website/scripts/sync-upstream.mjs
@@ -3,6 +3,7 @@ import { createHash } from 'node:crypto';
import { selectStable, normalizeMarkdown, renderReleaseMarkdown, assertReleaseCache, planOwnedRemovals } from './content.mjs';
import { sources } from './upstream-sources.mjs';
import { assertLaunch } from './launch.mjs';
+import { applyEditorial } from './editorial.mjs';
const repository = 'raiseCatError/notMyShell';
const root = new URL('../', import.meta.url);
@@ -53,9 +54,9 @@ const sha256 = text => createHash('sha256').update(text).digest('hex');
const files = [];
for (const source of sources) {
const original = await fetchText(`https://raw.githubusercontent.com/${repository}/${commit.sha}/${source.path}`);
- const body = normalizeMarkdown(original.replace(/^# .+\r?\n/, ''));
- const markdown = `---\ntitle: ${JSON.stringify(source.title)}\ndescription: ${JSON.stringify(`Canonical ${source.title.toLowerCase()} from the v${version} ${state} source.`)}\ngroup: Technical reference\norder: ${sources.indexOf(source) + 100}\nsource: ${JSON.stringify(source.path)}\n---\n${body}`;
- files.push({ source, original, markdown });
+ const { body, applied } = applyEditorial(source.slug, commit.sha, normalizeMarkdown(original.replace(/^# .+\r?\n/, '')));
+ const markdown = `---\ntitle: ${JSON.stringify(source.title)}\ndescription: ${JSON.stringify(`Canonical ${source.title.toLowerCase()} from the v${version} ${state} source.`)}\ngroup: Technical reference\norder: ${sources.indexOf(source) + 100}\nsource: ${JSON.stringify(source.path)}\n${applied.length ? `editorial: ${JSON.stringify(applied.map(item => item.note))}\n` : ''}---\n${body}`;
+ files.push({ source, original, markdown, editorial: applied.map(item => item.id) });
}
const history = releases.filter(release => !release.draft && !release.prerelease && /^v\d+\.\d+\.\d+$/.test(release.tag_name));
const releaseFiles = history.map(release => ({ name: `${release.tag_name}.md`, markdown: renderReleaseMarkdown(release) }));
@@ -98,7 +99,7 @@ const snapshot = {
const manifest = {
commit: commit.sha, version, state,
routes: Object.fromEntries(sources.map(source => [source.path, source.slug])),
- files: files.map(file => ({ ...file.source, sourceSha256: sha256(file.original), generatedSha256: sha256(file.markdown) })),
+ files: files.map(file => ({ ...file.source, sourceSha256: sha256(file.original), generatedSha256: sha256(file.markdown), ...(file.editorial.length ? { editorial: file.editorial } : {}) })),
};
await writeFile(new URL('src/data/release.json', root), JSON.stringify(snapshot, null, 2) + '\n');
await writeFile(new URL('src/data/launch.json', root), JSON.stringify(launch, null, 2) + '\n');
diff --git a/website/scripts/validate-content.mjs b/website/scripts/validate-content.mjs
index 39c4b759..c8142477 100644
--- a/website/scripts/validate-content.mjs
+++ b/website/scripts/validate-content.mjs
@@ -2,6 +2,7 @@ import { readFile, access, readdir } from 'node:fs/promises';
import { createHash } from 'node:crypto';
import { validateMedia, assertFileMembership } from './content.mjs';
import { assertLaunch } from './launch.mjs';
+import { corrections } from './editorial.mjs';
const root = new URL('../', import.meta.url);
const read = async path => JSON.parse(await readFile(new URL(path, root), 'utf8'));
@@ -16,6 +17,9 @@ for (const file of manifest.files) {
const markdown = await readFile(new URL(`src/content/reference/${file.slug}.md`, root));
const hash = createHash('sha256').update(markdown).digest('hex');
if (hash !== file.generatedSha256) throw new Error(`Generated reference changed: ${file.slug}. Edit upstream, not the snapshot.`);
+ const expected = corrections.filter(item => item.slug === file.slug && item.commit === manifest.commit).map(item => item.id);
+ if (JSON.stringify(expected) !== JSON.stringify(file.editorial || [])) throw new Error(`Editorial corrections for ${file.slug} do not match the provenance manifest. Run the upstream sync.`);
+ for (const item of corrections.filter(item => expected.includes(item.id))) if (!markdown.toString().includes(item.to) || markdown.toString().includes(item.from)) throw new Error(`Editorial correction ${item.id} is not applied exactly.`);
}
for (const item of release.history) {
const markdown = await readFile(new URL(`src/content/releases/${item.tag}.md`, root));
diff --git a/website/src/components/Media.astro b/website/src/components/Media.astro
index 1b203c40..bc9468cf 100644
--- a/website/src/components/Media.astro
+++ b/website/src/components/Media.astro
@@ -16,8 +16,8 @@ if (!slot) throw new Error(`Unknown media slot: ${id}`);
) : slot.src ? (
) : (
-
-
↗{id === 'learn-concept' ? 'Future concept' : 'Reserved for the real product'}{slot.title}
+
+
↗Reserved for the real product{slot.title}
Media pending · {id}
)}
diff --git a/website/src/content.config.ts b/website/src/content.config.ts
index fb33ddf7..67955476 100644
--- a/website/src/content.config.ts
+++ b/website/src/content.config.ts
@@ -4,7 +4,7 @@ import { glob } from 'astro/loaders';
const documentSchema = z.object({
title: z.string(), description: z.string(), group: z.string(), order: z.number(),
- source: z.string().optional(), sources: z.array(z.string()).default([]),
+ source: z.string().optional(), editorial: z.array(z.string()).default([]), sources: z.array(z.string()).default([]),
});
export const collections = {
guides: defineCollection({ loader: glob({ pattern: '**/*.md', base: './src/content/guides' }), schema: documentSchema }),
diff --git a/website/src/content/guides/commands.md b/website/src/content/guides/commands.md
index 82c2ce33..b3ee5fd6 100644
--- a/website/src/content/guides/commands.md
+++ b/website/src/content/guides/commands.md
@@ -62,5 +62,3 @@ nmsh config export --output nmsh-settings.json
Context Packs are managed through `nmsh packs`; refer to the
[pack reference](/docs/reference/context-modules/) for the format and safety model.
-No `/learn` command is available in this release. [Learn Mode](/learn/) is a future
-proposal, subject to architecture, curriculum and security approval.
diff --git a/website/src/content/guides/setup.md b/website/src/content/guides/setup.md
index e72bb513..12d45728 100644
--- a/website/src/content/guides/setup.md
+++ b/website/src/content/guides/setup.md
@@ -92,5 +92,4 @@ shell configuration. Review individual changes and installation plans. Use
These instructions describe the published [v0.20.0 release](/releases/).
[First-run behavior and validation](/docs/reference/onboarding/) records its defaults
-and the acceptance evidence behind them. [Learn Mode](/learn/) is separate:
-it remains a future learning proposal, not part of setup.
+and the acceptance evidence behind them.
diff --git a/website/src/content/reference/context-modules.md b/website/src/content/reference/context-modules.md
index 527635ca..a8d7c3ed 100644
--- a/website/src/content/reference/context-modules.md
+++ b/website/src/content/reference/context-modules.md
@@ -4,6 +4,7 @@ description: "Canonical context modules and packs from the v0.20.0 published sou
group: Technical reference
order: 103
source: "docs/architecture/context-modules.md"
+editorial: ["The release-status paragraph said the module platform was still pending acceptance. It shipped in v0.18.0 and is part of v0.20.0."]
---
NMSh runs around a real persistent zsh, Bash or Fish session. Its native modules
@@ -14,8 +15,8 @@ without taking over shell execution or running anything the workspace chose.
> **Release status.** v0.17.0 shipped the foundation: typed fact metadata,
> native module routing and the Context Rail. Everything else described here —
> capability scheduling, the first-party module catalog, declarative Context
-> Packs, Status Strip routing and Status Strip 2.0, `/modules` and Claude Code agent context — is in
-> the v0.18 development stack, pending acceptance and release.
+> Packs, Status Strip routing and Status Strip 2.0, `/modules` and Claude Code agent context — shipped
+> in v0.18.0 and is part of every later release, including the current v0.20.0.
## From capability to presentation
diff --git a/website/src/content/reference/contributing.md b/website/src/content/reference/contributing.md
index 431d1a74..28166fad 100644
--- a/website/src/content/reference/contributing.md
+++ b/website/src/content/reference/contributing.md
@@ -4,6 +4,7 @@ description: "Canonical contributing to nmsh from the v0.20.0 published source."
group: Technical reference
order: 114
source: "CONTRIBUTING.md"
+editorial: ["The tagged document linked to a private GitHub Project. The link now points to the public issue tracker."]
---
Thank you for your interest in contributing to notMyShell (NMSh)!
@@ -28,7 +29,7 @@ Before starting work, check:
- **[GitHub Issues](https://github.com/raiseCatError/notMyShell/issues)** — concrete actionable work; acceptance criteria in each issue are authoritative
- **[v0.20.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.20.0)** — current stable release, merged through [PR #392](https://github.com/raiseCatError/notMyShell/pull/392) (see [ROADMAP.md](ROADMAP.md))
- **[CHANGELOG.md](CHANGELOG.md)** — the authoritative record of notable changes; see [Changelog](#changelog) below
-- **GitHub Project** — [NMSh Development](https://github.com/users/raiseCatError/projects/1) — live development status board
+- **GitHub Issues** — [raiseCatError/notMyShell issues](https://github.com/raiseCatError/notMyShell/issues) — public bug reports, proposals and development status
## Branch Model
diff --git a/website/src/data/media.json b/website/src/data/media.json
index d67ae8ca..7ea7201d 100644
--- a/website/src/data/media.json
+++ b/website/src/data/media.json
@@ -5,6 +5,5 @@
{ "id": "theme-studio", "title": "A palette that feels like yours", "purpose": "Theme Studio and its real preview", "width": 1440, "height": 960, "caption": "Theme Studio · genuine media pending.", "altRequirement": "Name the theme and the actual Studio controls visible; explain the change in words." },
{ "id": "session-resume", "title": "Pick up where the shell stayed", "purpose": "Detach and explicitly reattach a live session", "width": 1440, "height": 900, "caption": "Live-session resume · genuine media pending.", "altRequirement": "Distinguish the live shell from a saved transcript and describe the actual resume action." },
{ "id": "context-modules", "title": "Context, where it belongs", "purpose": "Native modules, Context Rail and Status Strip", "width": 1440, "height": 900, "caption": "Context Engine surfaces · genuine media pending.", "altRequirement": "Identify visible modules and their surfaces, using non-sensitive example facts." },
- { "id": "vespyr-appearance", "title": "A little character. Entirely optional.", "purpose": "Vespyr and reduced-motion appearance choices", "width": 1440, "height": 900, "caption": "Vespyr and appearance · genuine media pending.", "altRequirement": "Describe Vespyr and the real appearance setting; provide a static poster for motion." },
- { "id": "learn-concept", "title": "A guide beside your practice", "purpose": "Future lesson/practice layout, only after design approval", "width": 1440, "height": 960, "caption": "Planned Learn Mode · conceptual media slot, not an implemented interface.", "altRequirement": "Label the image as a future concept, describe guide/practice areas and state whether execution is simulated or verified isolated." }
+ { "id": "vespyr-appearance", "title": "A little character. Entirely optional.", "purpose": "Vespyr and reduced-motion appearance choices", "width": 1440, "height": 900, "caption": "Vespyr and appearance · genuine media pending.", "altRequirement": "Describe Vespyr and the real appearance setting; provide a static poster for motion." }
]
diff --git a/website/src/data/upstream.json b/website/src/data/upstream.json
index 8c0c6746..38daee7e 100644
--- a/website/src/data/upstream.json
+++ b/website/src/data/upstream.json
@@ -53,7 +53,10 @@
"slug": "context-modules",
"title": "Context modules and packs",
"sourceSha256": "735b91b0fadd0ea2c33b3b9e4a56f530150e083038781e2b89e918e1385f966c",
- "generatedSha256": "c24fb6df5fcc6fe25f6d63da1f9a826bc3e3462343845070955605e3d8452ca0"
+ "generatedSha256": "6e11afae418c6ef80e6f755196731533ae135057acf5ac8d479326095e1370ec",
+ "editorial": [
+ "context-modules-release-status"
+ ]
},
{
"path": "docs/architecture/prompt-customization.md",
@@ -130,7 +133,10 @@
"slug": "contributing",
"title": "Contributing to NMSh",
"sourceSha256": "a08d586847b0a8dc8bc5ba8f93cde805f1021e934e900d30bc4fc099012ee56b",
- "generatedSha256": "688aa47c2aa3581a7debb305ba78e53db51b93e424bf9797ec87e0b3ac696a1c"
+ "generatedSha256": "c42ab4971c3c4651ddc17db918f247dd3bdc0bd06bb4d3beb052bce3d67863d6",
+ "editorial": [
+ "contributing-public-link"
+ ]
},
{
"path": "CHANGELOG.md",
diff --git a/website/src/layouts/Base.astro b/website/src/layouts/Base.astro
index e50c1604..d2588dfc 100644
--- a/website/src/layouts/Base.astro
+++ b/website/src/layouts/Base.astro
@@ -10,7 +10,7 @@ const socialImage = `${site.url}/brand/social-preview.png`;
const socialAlt = 'notMyShell. A richer way to use the terminal. Vespyr, the lavender NMSh cat, on charcoal.';
const navigation = [
{ href: '/features/', title: 'Features' }, { href: '/docs/', title: 'Docs' },
- { href: '/learn/', title: 'Learn', planned: true }, { href: '/roadmap/', title: 'Roadmap' },
+ { href: '/roadmap/', title: 'Roadmap' },
];
const isActive = (href: string) => Astro.url.pathname.startsWith(href);
---
@@ -55,14 +55,14 @@ const isActive = (href: string) => Astro.url.pathname.startsWith(href);
diff --git a/website/src/pages/index.astro b/website/src/pages/index.astro
index f2cfbbe9..a0a14b8b 100644
--- a/website/src/pages/index.astro
+++ b/website/src/pages/index.astro
@@ -25,6 +25,6 @@ import { release, launch, launchLabel, site } from '../lib/site';
03 / Make it your environment
Useful context. Optional character.
Route native modules where they make sense. Choose your palette and prompt provider. Keep Vespyr and motion, or choose a quieter view. The frontend adapts; the shell stays the shell.
Context with boundaries
Project, runtime, Git and system facts come from bounded local capabilities. Opening a repository is not permission to execute its code.
diff --git a/website/src/pages/learn.astro b/website/src/pages/learn.astro
deleted file mode 100644
index dd005320..00000000
--- a/website/src/pages/learn.astro
+++ /dev/null
@@ -1,13 +0,0 @@
----
-import Base from '../layouts/Base.astro';
-import Media from '../components/Media.astro';
----
-
-
Planned · Future Learn Mode
Learn the shell. Understand the command.
Read a lesson, try it, then work out why it behaved that way. A proposed place to learn Bash and zsh through practice, with skills you can use in any ordinary terminal.
NMSh already keeps input, output and context together. Learn Mode would use that space to teach Bash and zsh themselves, rather than a collection of NMSh shortcuts.
On wide terminals, a lesson guide could sit beside a practice area. Smaller terminals would use adaptive tabs or a toggle, keeping both reading and practice usable.
Understand the concept.
Short explanations, clear objectives, layered hints and a searchable course-like reading experience.
Try it, then inspect.
Practice with files, pipes, quoting and scripts. Feedback should explain the actual result, not reward memorizing one exact command.
Return with your progress.
Versioned checkpoints, unfinished practice files and resumable learning, designed to stay local.
-
Skills for an ordinary shell.
The initial teaching shells proposed are Bash and zsh. Their differences must be taught honestly; Fish is deferred. No course, command or practice terminal is available from this page.
Find your footing
Terminals and shells. Paths and directories. Files, permissions and how to ask for help.
Proposed foundations
Connect ideas
Streams and pipes. Quoting, variables, exit status and inspecting mistakes instead of guessing.
Proposed practice
Make something work
Write and edit small shell scripts, debug them, and apply the concepts in practical challenges.
Proposed scripting
-
Safety is an architectural gate
Practice should not put your computer at risk.
A temporary folder is not a secure sandbox. A real shell can reach other files, credentials, processes and the network. Isolation has to be enforced outside the lesson.
Verified isolated real shell
Real Bash or zsh practice would require proven OS-enforced containment, a bounded practice filesystem, no host home or credential mounts, no network by default, resource limits and reliable cleanup.
Explicitly labeled simulation
If strong isolation cannot be verified on a platform, the proposal requires a clearly labeled simulator or disabled execution. It must never silently fall back to your ordinary host shell. Simulation must not claim full Bash/zsh compatibility.
Dangerous demonstrations remain simulated. A command blacklist or confirmation prompt is educational feedback, not the security boundary.
-
diff --git a/website/src/pages/llms.txt.ts b/website/src/pages/llms.txt.ts
index e6037317..c96a4e67 100644
--- a/website/src/pages/llms.txt.ts
+++ b/website/src/pages/llms.txt.ts
@@ -1,4 +1,4 @@
import type { APIRoute } from 'astro';
import { documents } from '../lib/docs';
import { site, release, launch, launchLabel } from '../lib/site';
-export const GET: APIRoute = async () => new Response(`# notMyShell (NMSh)\n\n> A terminal frontend over a persistent real zsh, Bash 4.4+ or Fish shell. Not a replacement shell or terminal emulator. Independent open-source software by raiseCatError, GPL-3.0-only.\n\nWebsite baseline: ${launchLabel}, source ${launch.commit}, verified ${launch.verifiedAt}. Latest published stable: ${release.latest.tag}, ${release.latest.date}. ${launch.state === 'candidate' ? 'A candidate is not a published release; final release integration and physical QA remain launch gates. ' : `The website documents the published v${launch.version} release; physical-terminal evidence is partial (macOS first-run setup and Tools accepted; no physical Linux or WSL pass). `}Learn Mode is a future proposal, not available functionality.\n\n## Documentation\n${(await documents()).map(entry => `- [${entry.data.title}](${site.url}/docs/${entry.slug}/): ${entry.data.description}`).join('\n')}\n\n## Project\n- [Release and baseline status](${site.url}/releases/#launch-baseline)\n- [Roadmap](${site.url}/roadmap/)\n- [Future Learn Mode](${site.url}/learn/)\n- [Source](${site.repo})\n`, { headers: { 'Content-Type': 'text/plain; charset=utf-8' } });
+export const GET: APIRoute = async () => new Response(`# notMyShell (NMSh)\n\n> A terminal frontend over a persistent real zsh, Bash 4.4+ or Fish shell. Not a replacement shell or terminal emulator. Independent open-source software by raiseCatError, GPL-3.0-only.\n\nWebsite baseline: ${launchLabel}, source ${launch.commit}, verified ${launch.verifiedAt}. Latest published stable: ${release.latest.tag}, ${release.latest.date}. ${launch.state === 'candidate' ? 'A candidate is not a published release; final release integration and physical QA remain launch gates. ' : `The website documents the published v${launch.version} release; physical-terminal evidence is partial (macOS first-run setup and Tools accepted; no physical Linux or WSL pass). `}\n\n## Documentation\n${(await documents()).map(entry => `- [${entry.data.title}](${site.url}/docs/${entry.slug}/): ${entry.data.description}`).join('\n')}\n\n## Project\n- [Release and baseline status](${site.url}/releases/#launch-baseline)\n- [Roadmap](${site.url}/roadmap/)\n- [Source](${site.repo})\n`, { headers: { 'Content-Type': 'text/plain; charset=utf-8' } });
diff --git a/website/src/pages/roadmap.astro b/website/src/pages/roadmap.astro
index 8d3a403c..4d7000d1 100644
--- a/website/src/pages/roadmap.astro
+++ b/website/src/pages/roadmap.astro
@@ -6,7 +6,7 @@ import { launch, launchLabel, site, sourceUrl } from '../lib/site';
Direction / Built in the open
What’s taking shape.
A clear view of the product, the work being finished and the ideas that still need testing.
Shipped in v0.20.0.
The {launchLabel} release brings the existing frontend together with the terminal workflow, a reviewed first run, background tasks and expanded context. Release notes and history →
Released
Commands, output and continuity
A persistent composer and shell, live sessions, serial queue, execution timeline, output selection, Copy Actions, reviewed reports and comparisons.
Session-owned background tasks, managed Claude Code beta, worktree tools, read-only GitHub inspection and a larger native module catalog. The experimental workspace sidebar remains Off by default.
Item-by-item checklist passes in Ghostty and Terminal.app, and any physical Linux, Omarchy or WSL 2 pass, are still open. Linux remains beta on automated CI.
Directions worth investigating, not scheduled commitments. Scope, feasibility, security and design approval can change what eventually ships.
Planned · Future
Learn the command line by doing
Guided Bash/zsh lessons, practice files, helpful feedback and resumable progress. Strong real-shell isolation must be verified, or execution must be explicitly simulated or disabled.