Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
6396dd9
chore(e2e): add Playwright tests for internal links and config
jessecooper Sep 11, 2026
ea747d8
working posts
jessecooper Sep 11, 2026
54c74ac
Convert templates/components to Tailwind utilities; remove deprecated…
jessecooper Sep 11, 2026
93c5eb5
Tune Tailwind typography, convert remaining styles to utilities, remo…
jessecooper Sep 11, 2026
1e236ba
Add styled responsive Tailwind navbar and Playwright tests
jessecooper Sep 11, 2026
0403196
docs: Add Astro run/build/test instructions to README
jessecooper Sep 11, 2026
2daf17f
chore(openspec): add repo OpenSpec configuration
jessecooper Sep 22, 2026
ab6e4f4
feat(astro): modernize navbar and fix Tailwind setup
jessecooper Sep 22, 2026
846f804
Fix navbar search flow
jessecooper Sep 22, 2026
92c5740
Add draft Astro migration post
jessecooper Sep 22, 2026
2dcfac8
Retarget navbar links to topic tag pages
jessecooper Sep 23, 2026
7e67550
Add social icons to Astro navbar
jessecooper Sep 23, 2026
3174cf5
Add Astro-native RSS feed
jessecooper Sep 23, 2026
7f8df07
fix search in desktop view
jessecooper Sep 23, 2026
5c042b3
fix theme selector
jessecooper Sep 23, 2026
dae4f51
make it easy to deploy the site to the dev system
jessecooper Sep 24, 2026
82be6ca
fix dark mode color pallot
jessecooper Sep 24, 2026
19b3ee3
fix light mode nav text
jessecooper Sep 24, 2026
8929503
add astro-embed for youtube videos
jessecooper Sep 24, 2026
165561a
feat(astro): support better code highlighting and copying
jessecooper Sep 24, 2026
8c4d1b7
Create beyond-flock-the-quiet-standardization of Mass Sureillance-(tl…
EReis0 Sep 25, 2026
72b1f97
Update beyond-flock-the-quiet-standardization of Mass Sureillance-(tl…
EReis0 Sep 25, 2026
201b128
Update beyond-flock-the-quiet-standardization of Mass Sureillance-(tl…
EReis0 Sep 26, 2026
b14d8c1
Dockerfile and Docker Compose
EReis0 Sep 26, 2026
95737d3
Create SIDEBAR.md
EReis0 Sep 26, 2026
5891d7f
Create the-death-of-the-self-taught-hacker.md
EReis0 Sep 26, 2026
30ba045
fix inline markdown
jessecooper Sep 28, 2026
6d15a81
Add Mermaid support and update OpenSpec docs
EReis0 Sep 29, 2026
38c4291
Rename: remove spaces from 'beyond-flock...' filenames
jessecooper Oct 1, 2026
bc2082d
modify file name to not have spaces
jessecooper Oct 1, 2026
3dd433c
Update .gitignore for Playwright artifacts
jessecooper Oct 1, 2026
57bd3b8
Add PNG favicons (16x16,32x32) and update Astro layout; mark tasks done
jessecooper Oct 1, 2026
080aa36
add favicon.ico
jessecooper Oct 1, 2026
ef70e80
remove draft from migration post
jessecooper Oct 1, 2026
e20764b
placeholder favicons
EReis0 Oct 2, 2026
ab9909e
Merge branch 'astrodev' of https://github.com/Codeholics/codeholics i…
EReis0 Oct 2, 2026
cf4e6d5
Create site.webmanifest
EReis0 Oct 2, 2026
d24dddb
Added additional meta support and site manifest
EReis0 Oct 2, 2026
6fd4bd4
update summary on top 4 posts and add a astro metadata skill for post…
jessecooper Oct 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
74 changes: 74 additions & 0 deletions .github/agents/openspec.agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
name: OpenSpec
description: "Manages OpenSpec changes, specs, and workflows using the OpenSpec CLI. Use this agent for proposing changes, exploring ideas, validating artifacts, checking status, and archiving completed work."
tools:
- "execute"
- "read"
- "search"
- "edit"
---

<!-- Generated by OpenSpec for GitHub Copilot coding agent support. -->

# OpenSpec Agent

You are a specialized agent for managing OpenSpec workflows. Before using the `openspec` CLI, run `openspec --version`. If it is unavailable, install it with `npm install -g @fission-ai/openspec`.

## What is OpenSpec?

OpenSpec is a structured change management system for codebases. It organizes work into **changes** with planning artifacts (proposals, specs, designs, tasks) that guide implementation.

## Available Commands

### Agent-Compatible CLI Commands (prefer `--json` for structured output)

| Command | Purpose |
|---------|---------|
| `openspec list [--json]` | List all changes and specs |
| `openspec show <item> [--json]` | View a specific change or spec |
| `openspec validate [--all] [--json]` | Validate changes and specs for issues |
| `openspec status [--change <name>] [--json]` | Show artifact progress for a change |
| `openspec instructions [artifact] [--change <name>] [--json]` | Get next-step instructions for a change |
| `openspec templates [--json]` | List available templates |
| `openspec schemas [--json]` | List available workflow schemas |
| `openspec archive <change> --json [--yes]` | Archive a completed change; use `--yes` only after confirming all tasks are complete |

### Interactive CLI Commands (use when prompted by the user)

| Command | Purpose |
|---------|---------|
| `openspec init` | Initialize OpenSpec in the project |
| `openspec update` | Update OpenSpec configuration and artifacts |
| `openspec view` | Interactive dashboard |
| `openspec config` | View or modify settings |

## Workflow

When asked to work with OpenSpec, follow this pattern:

1. **Find the change**: Run `openspec list --json` to see active changes.
2. **Check progress**: Run `openspec status --change <name> --json` for the selected change.
3. **Follow instructions**: Run `openspec instructions [artifact] --change <name> --json` for the next artifact.
4. **Validate before completing**: Run `openspec validate <name> --json`.

## Creating New Changes

When the user wants to propose a new change:

1. Run `openspec new change <name>`.
2. Run `openspec status --change <name> --json` to see the artifact sequence.
3. Use `openspec instructions [artifact] --change <name> --json` before creating each artifact.
4. Run `openspec validate <name> --json` when the artifacts are complete.

## Key Directories

- `openspec/` — Root OpenSpec directory
- `openspec/changes/` — Active changes with their artifacts
- `openspec/config.yaml` — Project configuration

## Best Practices

- Always use `--json` flag when you need to parse output programmatically
- Run `openspec validate` after creating or modifying artifacts
- Check `openspec status` before starting work to understand the current state
- When archiving, ensure all tasks are completed and validated first
1 change: 1 addition & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ Quick reference for future Copilot sessions working in this repository.
- `pelicanconf.py` enables specific plugins and theme integrations: `webassets`, `liquid_tags`, `tag_cloud`, `gzip_cache`, `tipue_search`, and `i18n_subsites`. Preserve those integrations when editing config.
- Search is wired through Pelican direct templates and the theme: `DIRECT_TEMPLATES` includes `search`, and `tipue_search` is enabled.
- Do not edit or commit files under `output/`; regenerate them instead.
- For AI-assisted Astro post drafting, run `cd astro && npm run ai:post:finalize -- --file src/content/posts/<slug>.md` to emit warning-only metadata checks (`title`, `date`, `category`, `tags`, `slug`, `summary`) before finalizing content.
- Workflow automation currently targets the `dev` branch in `.github/workflows/build.yml` and `.github/workflows/deploy.yml`.
- The deploy workflow uses `appleboy/scp-action` to copy `codeholics/output/*` into `${{ secrets.DEV_PATH }}` with `strip_components: 2` and `rm: true`.

Expand Down
194 changes: 194 additions & 0 deletions .github/prompts/opsx-apply.prompt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
---
description: "Implement tasks from an OpenSpec change (Experimental)"
---

Implement tasks from an OpenSpec change.

**Store selection:** If the user names a store (a store is a standalone OpenSpec repo registered on this machine) or the work lives in one, run `openspec store list --json` to discover registered store ids, then pass `--store <id>` on the commands that read or write specs and changes (`new change`, `status`, `instructions`, `list`, `show`, `validate`, `archive`, `doctor`, `context`, `schemas`, `view`). Once selected, treat `--store <id>` as sticky for the rest of the workflow. Every unscoped example of those commands below is shorthand: before running it, append the flag. For example, run `openspec status --change "<name>" --json --store "<id>"`, not the unscoped form shown below. Other commands do not take the flag. Hints printed by commands already carry the flag; keep it on follow-ups. Without a store, commands act on the nearest local `openspec/` root.

**Project check:** These steps expect a project that already uses OpenSpec. Before the first step that writes anything (`new change`, `archive`, `sync specs`, or authoring an artifact file), confirm the project has a root: run `openspec list --json` (with `--store <id>` when a store is selected, since the store is then the root) and read `root`. A root object means the project is set up. `"root": null` means it is not - there is no `openspec/` directory here, and a write such as `openspec new change` would create one as a side effect. The command also exits non-zero, which is that answer rather than a broken CLI, so read the JSON instead of retrying or working around it.

One `"root": null` is not about setup: when a `status` error message starts with `Declared in` or `Invalid store declaration in` and names this project's `openspec/config.yaml` (or `config.yml`), the project does use OpenSpec through a store it declares, which this machine cannot resolve (the store is not registered, or the `store:` line is malformed). Do not treat it as uninitialized and skip the branches below: stop before writing and show the user that error's `message` and `fix`.

Otherwise, with no root, what happens next depends on how this workflow was reached:

- **Auto-selected**: you chose this workflow yourself, without the user naming OpenSpec, naming this skill, or running its slash command. Stop using OpenSpec and answer the request normally, as you would with no OpenSpec installed. Do not ask them to set anything up and do not mention OpenSpec setup.
- **Explicit OpenSpec request**: the user named OpenSpec, named this skill, or ran its slash command. Stop before writing and ask how to proceed: set this project up (`openspec init`), target a store they already have (`--store <id>`), or continue without OpenSpec for this request. Wait for their answer.

In both branches, never create the root as a side effect: do not run `openspec init` until the user asks for it, do not hand-create `openspec/` files, and do not let a command create it.

**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.

**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 ask the user to select one

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 - could be proposal/specs/design/tasks or spec/tests/implementation/docs)
- Progress (total, complete, remaining)
- Task list with status
- Dynamic instruction based on current state
- Optional `context`: current required project instruction input from the selected root
- Optional `operationGuidance`: current advisory guidance for apply
- `missingArtifacts` (when present): required artifact ids with no output

**Handle states:**
- If `state: "blocked"`: show the message and pause implementation.
- If `missingArtifacts` is non-empty: suggest completing the missing artifacts. Run `openspec status --change "<name>" --json`, select the next `ready` artifact (not `skipped` or `blocked`), and use `openspec instructions "<artifact-id>" --change "<name>" --json` for its rules and template. Keep the selected `--store <id>` on both commands.
- Otherwise, follow the CLI instruction to create or repair the schema-configured tracking file from existing planning artifacts. Do not assume another artifact is ready or start implementation while blocked.
- If `state: "all_done"`: congratulate, suggest archive
- Otherwise: proceed to implementation

Treat `context` as a required prompt-level input. Read and consider it, and
apply relevant project facts, conventions, and constraints while implementing.
Treat `operationGuidance` as optional additive advice. Read and consider every
entry, and follow entries that are applicable and compatible with the built-in
workflow.

Keep both fields separate from CLI-returned state, missing artifacts, tasks,
progress, `contextFiles`, and the built-in `instruction`. They are not
evidence of task completion, do not replace the built-in instruction, and do
not permit bypassing a blocked state. If context conflicts with the built-in
instruction, an explicit user choice, or a CLI-controlled value, report the
conflict and preserve the controlling value. If guidance is inapplicable or
conflicts with those controlling inputs, do not follow it and explain why.
These are prompt-level behavior contracts, not enforceable checks.

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

Do not copy `context` or `operationGuidance` verbatim into implementation
files or planning artifacts unless the user separately asks for that content.

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
- A task needs work beyond what the spec and tasks describe, or you are tempted to drop, narrow, defer, or accept exceptions to specified behavior to make it fit → surface the added scope and ask; do not absorb it silently
- 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
- When a task needs work beyond what the spec describes, surface the added scope and pause - never silently narrow, defer, or simplify away specified behavior
- Only mark a task `- [x]` when its specified behavior is fully implemented, not when it is partially done or deferred
- Use contextFiles from CLI output, don't assume specific file names
- Do not use context or operation guidance as proof that a task is complete
- Apply relevant project context; report conflicts with controlling workflow inputs
- Consider every guidance entry; explain any inapplicable or conflicting advice
- Do not copy runtime context or operation guidance into implementation files or planning artifacts
- Preserve CLI-controlled blocked/ready/all-done behavior and completion criteria

**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
Loading