Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions docs/architecture/context-modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
6 changes: 2 additions & 4 deletions website/DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions website/LAUNCH.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
22 changes: 16 additions & 6 deletions website/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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.
4 changes: 2 additions & 2 deletions website/REVIEW.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
33 changes: 33 additions & 0 deletions website/scripts/editorial.mjs
Original file line number Diff line number Diff line change
@@ -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 };
}
9 changes: 5 additions & 4 deletions website/scripts/sync-upstream.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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) }));
Expand Down Expand Up @@ -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');
Expand Down
4 changes: 4 additions & 0 deletions website/scripts/validate-content.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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'));
Expand All @@ -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));
Expand Down
4 changes: 2 additions & 2 deletions website/src/components/Media.astro
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ if (!slot) throw new Error(`Unknown media slot: ${id}`);
) : slot.src ? (
<img src={slot.src} width={slot.width} height={slot.height} alt={slot.alt} loading="lazy" decoding="async" />
) : (
<div class="media-pending" role="img" aria-label={`${slot.title}. ${id === 'learn-concept' ? 'Future concept' : 'Product media'} pending; no capture or functional demonstration is shown.`}>
<div class="media-center"><span class="media-symbol" aria-hidden="true">↗</span><span class="eyebrow">{id === 'learn-concept' ? 'Future concept' : 'Reserved for the real product'}</span><span class="media-title">{slot.title}</span></div>
<div class="media-pending" role="img" aria-label={`${slot.title}. Product media pending; no capture or functional demonstration is shown.`}>
<div class="media-center"><span class="media-symbol" aria-hidden="true">↗</span><span class="eyebrow">Reserved for the real product</span><span class="media-title">{slot.title}</span></div>
<span class="media-status">Media pending <span aria-hidden="true">·</span> {id}</span>
</div>
)}
Expand Down
2 changes: 1 addition & 1 deletion website/src/content.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 }),
Expand Down
2 changes: 0 additions & 2 deletions website/src/content/guides/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
3 changes: 1 addition & 2 deletions website/src/content/guides/setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
5 changes: 3 additions & 2 deletions website/src/content/reference/context-modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down
Loading
Loading