Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
09dec1c
docs: define shadcn docs theme design
aeei Jul 14, 2026
791a181
docs: add shadcn theme implementation plan
aeei Jul 14, 2026
68e77d2
feat: add neutral docs theme baseline
aeei Jul 14, 2026
1d82e40
feat: adopt Lucide icons in OpenAPI controls
aeei Jul 14, 2026
4182e6e
feat: refine docs header and command search
aeei Jul 14, 2026
6191adf
feat: apply compact sidebar navigation
aeei Jul 14, 2026
da09e64
feat: refine docs content and toc
aeei Jul 14, 2026
01ee7de
feat: apply semantic tokens to OpenAPI docs
aeei Jul 14, 2026
8c3255c
fix: improve responsive docs navigation
aeei Jul 14, 2026
b0107d1
feat: adopt Nova components across docs theme
aeei Jul 15, 2026
166595e
feat: complete shadcn Base Nova docs theme
aeei Jul 15, 2026
4ae1985
chore: point theme metadata to aeei fork
aeei Jul 15, 2026
2229a11
fix: remove nested DocSearch escape key border
aeei Jul 15, 2026
e478ae1
docs: define OpenSpec for docs theme launch
aeei Jul 15, 2026
8e5d4b0
feat: extract docs-only Docusaurus theme
aeei Jul 16, 2026
e3e1081
feat: add public docs release surface
aeei Jul 16, 2026
5f4ddbd
fix: include shared theme utility in source
aeei Jul 16, 2026
378fc70
feat: restore Base Nova theme foundation
aeei Jul 17, 2026
be87a49
feat: ship Base Nova docs theme
aeei Jul 20, 2026
d2b3f4b
fix: align mobile shell with Nextra
aeei Jul 20, 2026
531592d
fix: stabilize theme control hydration
aeei Jul 20, 2026
aa946e6
fix: preserve breadcrumb markup during SSG
aeei Jul 20, 2026
4154dea
fix: index trailing-slash docs routes
aeei Jul 20, 2026
f77f7a1
fix: remove duplicate mobile back arrow
aeei Jul 20, 2026
72d6125
fix(theme): restore Mermaid prose spacing
aeei Jul 21, 2026
c8feb07
fix(theme): align TOC inline code styling
aeei Jul 21, 2026
153283b
fix(theme): filter doc metadata from navbar links
aeei Jul 21, 2026
68b8c14
chore(theme): release 0.1.7
aeei Jul 21, 2026
a6d0afb
test(theme): align audits with sticky sidebar
aeei Jul 21, 2026
f80780f
feat(theme): bundle Pretendard Korean fallback
aeei Jul 22, 2026
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
Binary file added .github/assets/theme-dark.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/assets/theme-light.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
48 changes: 48 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: Deploy docs

on:
push:
branches: [shadcn-theme]
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: yarn
- uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0
- run: yarn install --frozen-lockfile --ignore-scripts
- run: yarn workspace @aeei/docusaurus-theme build
- run: yarn workspace @aeei/docs-starter build
env:
ALGOLIA_APP_ID: ${{ vars.ALGOLIA_APP_ID }}
ALGOLIA_SEARCH_API_KEY: ${{ vars.ALGOLIA_SEARCH_API_KEY }}
ALGOLIA_INDEX_NAME: ${{ vars.ALGOLIA_INDEX_NAME }}
- uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1
with:
path: examples/docs-starter/build

deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy
id: deployment
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
54 changes: 54 additions & 0 deletions .github/workflows/theme-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Theme CI

on:
pull_request:
push:
branches: [shadcn-theme]

permissions:
contents: read

jobs:
validate:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: 24
cache: yarn
- run: yarn install --frozen-lockfile --ignore-scripts
- run: yarn workspace @aeei/docusaurus-theme build
- name: Theme contracts
run: >-
NODE_OPTIONS=--experimental-vm-modules yarn jest
packages/docusaurus-theme/src/package-contract.test.ts
packages/docusaurus-theme/src/theme/base-ui-contract.test.ts
packages/docusaurus-theme/src/theme/icon-contract.test.ts
packages/docusaurus-theme/src/theme/navbar-shell-contract.test.ts
packages/docusaurus-theme/src/theme/paginator-contract.test.ts
packages/docusaurus-theme/src/theme/prose-contract.test.ts
packages/docusaurus-theme/src/theme/registry-source-contract.test.ts
packages/docusaurus-theme/src/theme/sidebar-contract.test.ts
packages/docusaurus-theme/src/theme/style-contract.test.ts
examples/docs-starter/config-contract.test.ts
--runInBand
- run: yarn workspace @aeei/docs-starter build
- name: Package contents
working-directory: packages/docusaurus-theme
run: npm pack --dry-run
- run: npx playwright install --with-deps chromium
- name: Browser matrix
run: >-
yarn start-server-and-test
"yarn workspace @aeei/docs-starter serve --port 3001 --no-open"
http://127.0.0.1:3001/docusaurus-theme/
"node scripts/audit-docs-starter.cjs && node scripts/audit-critical-ui-relations.cjs && PLAYWRIGHT_BASE_URL=http://127.0.0.1:3001/docusaurus-theme/ yarn test:e2e:theme"
- name: Upload browser failures
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: docs-starter-browser-failures
path: artifacts/docs-starter
if-no-files-found: ignore
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ build
dist
lib
lib-next
lib-theme

# Dependencies
/node_modules
Expand Down Expand Up @@ -147,3 +148,8 @@ demo/**/*.json

# Playwright
visual_diffs/
test-results/
artifacts/

# Local pi session state
.pi/goals/
156 changes: 156 additions & 0 deletions .pi/prompts/opsx-apply.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
---
description: Implement tasks from an OpenSpec change (Experimental)
---

Implement tasks from an OpenSpec change.

**Input**: Optionally specify a change name (e.g., `/opsx-apply add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes.
**Provided arguments**: $@

**Steps**

1. **Select the change**

If a name is provided, use it. Otherwise:
- Infer from conversation context if the user mentioned a change
- Auto-select if only one active change exists
- If ambiguous, run `openspec list --json` to get available changes and use the **AskUserQuestion tool** to let the user select

Always announce: "Using change: <name>" and how to override (e.g., `/opsx-apply <other>`).

2. **Check status to understand the schema**

```bash
openspec status --change "<name>" --json
```

Parse the JSON to understand:
- `schemaName`: The workflow being used (e.g., "spec-driven")
- `planningHome`, `changeRoot`, and `actionContext`: planning scope and edit constraints
- Which artifact contains the tasks (typically "tasks" for spec-driven, check status for others)

3. **Get apply instructions**

```bash
openspec instructions apply --change "<name>" --json
```

This returns:
- `contextFiles`: artifact ID -> array of concrete file paths (varies by schema)
- Progress (total, complete, remaining)
- Task list with status
- Dynamic instruction based on current state

**Handle states:**
- If `state: "blocked"` (missing artifacts): show message, suggest using `/opsx-continue`
- If `state: "all_done"`: congratulate, suggest archive
- Otherwise: proceed to implementation

**Workspace guard:** If status JSON reports `actionContext.mode: "workspace-planning"` and `allowedEditRoots` is empty, explain that full workspace apply is not supported in this slice. Treat linked repos and folders as read-only context, ask the user to select an affected area through an explicit implementation workflow, and STOP before editing files.

4. **Read context files**

Read every file path listed under `contextFiles` from the apply instructions output.
The files depend on the schema being used:
- **spec-driven**: proposal, specs, design, tasks
- Other schemas: follow the contextFiles from CLI output

5. **Show current progress**

Display:
- Schema being used
- Progress: "N/M tasks complete"
- Remaining tasks overview
- Dynamic instruction from CLI

6. **Implement tasks (loop until done or blocked)**

For each pending task:
- Show which task is being worked on
- Make the code changes required
- Keep changes minimal and focused
- Mark task complete in the tasks file: `- [ ]` → `- [x]`
- Continue to next task

**Pause if:**
- Task is unclear → ask for clarification
- Implementation reveals a design issue → suggest updating artifacts
- Error or blocker encountered → report and wait for guidance
- User interrupts

7. **On completion or pause, show status**

Display:
- Tasks completed this session
- Overall progress: "N/M tasks complete"
- If all done: suggest archive
- If paused: explain why and wait for guidance

**Output During Implementation**

```
## Implementing: <change-name> (schema: <schema-name>)

Working on task 3/7: <task description>
[...implementation happening...]
✓ Task complete

Working on task 4/7: <task description>
[...implementation happening...]
✓ Task complete
```

**Output On Completion**

```
## Implementation Complete

**Change:** <change-name>
**Schema:** <schema-name>
**Progress:** 7/7 tasks complete ✓

### Completed This Session
- [x] Task 1
- [x] Task 2
...

All tasks complete! You can archive this change with `/opsx-archive`.
```

**Output On Pause (Issue Encountered)**

```
## Implementation Paused

**Change:** <change-name>
**Schema:** <schema-name>
**Progress:** 4/7 tasks complete

### Issue Encountered
<description of the issue>

**Options:**
1. <option 1>
2. <option 2>
3. Other approach

What would you like to do?
```

**Guardrails**

- Keep going through tasks until done or blocked
- Always read context files before starting (from the apply instructions output)
- If task is ambiguous, pause and ask before implementing
- If implementation reveals issues, pause and suggest artifact updates
- Keep code changes minimal and scoped to each task
- Update task checkbox immediately after completing each task
- Pause on errors, blockers, or unclear requirements - don't guess
- Use contextFiles from CLI output, don't assume specific file names

**Fluid Workflow Integration**

This skill supports the "actions on a change" model:

- **Can be invoked anytime**: Before all artifacts are done (if tasks exist), after partial implementation, interleaved with other actions
- **Allows artifact updates**: If implementation reveals design issues, suggest updating artifacts - not phase-locked, work fluidly
Loading