From 1043d925513ac20717f828c9bfc6ebebf3b65c1b Mon Sep 17 00:00:00 2001 From: AnExiledDev Date: Fri, 27 Feb 2026 01:18:54 +0000 Subject: [PATCH 1/2] Add versioned docs infrastructure and fix docs site URL Install starlight-versions plugin (commented out until first version archive) and configure the versions content collection. Fix site URL to codeforge.core-directive.com and remove /CodeForge base path, updating all internal links and meta tag references. --- .devcontainer/CHANGELOG.md | 2 + docs/astro.config.mjs | 22 ++- docs/package-lock.json | 163 +++++++++++++++++++ docs/package.json | 1 + docs/src/components/Header.astro | 18 +- docs/src/components/Hero.astro | 6 +- docs/src/content.config.ts | 8 +- docs/src/content/docs/index.mdx | 2 +- docs/src/content/docs/reference/changelog.md | 12 +- 9 files changed, 212 insertions(+), 22 deletions(-) diff --git a/.devcontainer/CHANGELOG.md b/.devcontainer/CHANGELOG.md index a109aeb..822a74c 100644 --- a/.devcontainer/CHANGELOG.md +++ b/.devcontainer/CHANGELOG.md @@ -18,6 +18,8 @@ - Merged setup variables (`.env` flags) into the Environment Variables reference - Merged `.secrets` file authentication docs into the Configuration page - Removed `.devcontainer/docs/` directory — all content now lives in the docs site +- **Versioned docs infrastructure** — installed `starlight-versions` plugin; no archived versions yet, first snapshot will be taken when v3 development begins +- **Fixed docs site URL** — updated `site` to `https://codeforge.core-directive.com` and removed `/CodeForge` base path (custom domain serves from root) ### Fixed diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index f27b677..af18a59 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -9,10 +9,11 @@ import starlightLinksValidator from "starlight-links-validator"; import starlightLlmsTxt from "starlight-llms-txt"; import starlightScrollToTop from "starlight-scroll-to-top"; import starlightSidebarTopics from "starlight-sidebar-topics"; +// Uncomment when activating versioned docs (see plugin comment below) +// import starlightVersions from "starlight-versions"; export default defineConfig({ - site: "https://anexileddev.github.io", - base: "/CodeForge", + site: "https://codeforge.core-directive.com", integrations: [ // astro-mermaid MUST be registered BEFORE starlight astroMermaid(), @@ -44,7 +45,7 @@ export default defineConfig({ tag: "meta", attrs: { name: "og:image", - content: "/CodeForge/og-image.png", + content: "/og-image.png", }, }, { @@ -52,14 +53,14 @@ export default defineConfig({ attrs: { rel: "icon", type: "image/png", - href: "/CodeForge/favicon.png", + href: "/favicon.png", }, }, { tag: "link", attrs: { rel: "apple-touch-icon", - href: "/CodeForge/apple-touch-icon.png", + href: "/apple-touch-icon.png", }, }, { @@ -70,6 +71,17 @@ export default defineConfig({ }, ], plugins: [ + // ── Versioned docs (activate when archiving the first version) ── + // starlightVersions requires at least one archived version. + // When v3 development begins, uncomment and add v2 as the first entry: + // + // starlightVersions({ + // versions: [{ slug: "2.0", label: "v2.0" }], + // current: { label: "v3" }, + // }), + // + // Then run `npm run dev` — the plugin archives current docs as v2.0. + // See: https://github.com/HiDeoo/starlight-versions starlightSidebarTopics([ { label: "Getting Started", diff --git a/docs/package-lock.json b/docs/package-lock.json index a643f4f..730bd61 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -23,6 +23,7 @@ "starlight-scroll-to-top": "^0.4.0", "starlight-sidebar-topics": "^0.6.2", "starlight-tags": "^0.4.0", + "starlight-versions": "^0.7.0", "tailwindcss": "^4.2.1" } }, @@ -4888,6 +4889,19 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -4947,6 +4961,14 @@ "node": ">=20" } }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -6152,6 +6174,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-gfm": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", @@ -6522,6 +6562,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", @@ -7857,6 +7913,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", + "integrity": "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-directive": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", @@ -7873,6 +7945,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -8393,6 +8481,66 @@ "@astrojs/starlight": ">=0.35.0" } }, + "node_modules/starlight-versions": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/starlight-versions/-/starlight-versions-0.7.0.tgz", + "integrity": "sha512-obz0/sdoflXBqr1zwu12KlkioRy0bFtvbmdVyT/4Ax7LObDJXBkmSymU72Z3vj3ajKZYui0RAle2wiqghaaeOw==", + "license": "MIT", + "dependencies": { + "@pagefind/default-ui": "^1.2.0", + "github-slugger": "^2.0.0", + "mdast-util-mdx-jsx": "^3.1.3", + "mdast-util-mdxjs-esm": "^2.0.1", + "remark": "^15.0.1", + "remark-directive": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-mdx": "^3.1.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3", + "yaml": "^2.6.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@astrojs/starlight": ">=0.32.0" + } + }, + "node_modules/starlight-versions/node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/starlight-versions/node_modules/remark-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/stream-replace-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", @@ -9272,6 +9420,21 @@ "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", "license": "MIT" }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", diff --git a/docs/package.json b/docs/package.json index 0d40df3..2c5ab5a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -26,6 +26,7 @@ "starlight-scroll-to-top": "^0.4.0", "starlight-sidebar-topics": "^0.6.2", "starlight-tags": "^0.4.0", + "starlight-versions": "^0.7.0", "tailwindcss": "^4.2.1" } } diff --git a/docs/src/components/Header.astro b/docs/src/components/Header.astro index 742edd0..b10742b 100644 --- a/docs/src/components/Header.astro +++ b/docs/src/components/Header.astro @@ -1,17 +1,17 @@ --- +import LanguageSelect from "virtual:starlight/components/LanguageSelect"; +import Search from "virtual:starlight/components/Search"; +import SiteTitle from "virtual:starlight/components/SiteTitle"; +import SocialIcons from "virtual:starlight/components/SocialIcons"; +import ThemeSelect from "virtual:starlight/components/ThemeSelect"; /** * Custom Header — extends Starlight's default Header with a "Docs" button. */ -import config from 'virtual:starlight/user-config'; - -import LanguageSelect from 'virtual:starlight/components/LanguageSelect'; -import Search from 'virtual:starlight/components/Search'; -import SiteTitle from 'virtual:starlight/components/SiteTitle'; -import SocialIcons from 'virtual:starlight/components/SocialIcons'; -import ThemeSelect from 'virtual:starlight/components/ThemeSelect'; +import config from "virtual:starlight/user-config"; const shouldRenderSearch = - config.pagefind || config.components.Search !== '@astrojs/starlight/components/Search.astro'; + config.pagefind || + config.components.Search !== "@astrojs/starlight/components/Search.astro"; ---
@@ -22,7 +22,7 @@ const shouldRenderSearch = {shouldRenderSearch && }
- Docs + Docs diff --git a/docs/src/components/Hero.astro b/docs/src/components/Hero.astro index df89dc8..17dd774 100644 --- a/docs/src/components/Hero.astro +++ b/docs/src/components/Hero.astro @@ -6,8 +6,8 @@ * * Receives Starlight's Hero props but renders entirely custom content. */ -import FeatureCard from './FeatureCard.astro'; -import InstallCommand from './InstallCommand.astro'; +import FeatureCard from "./FeatureCard.astro"; +import InstallCommand from "./InstallCommand.astro"; /* Accept Starlight's props to satisfy the component override contract */ const _props = Astro.props; @@ -44,7 +44,7 @@ const _props = Astro.props; {/* ---- CTA buttons ---- */}
- + Get Started diff --git a/docs/src/content.config.ts b/docs/src/content.config.ts index d9ee8c9..95dd2ba 100644 --- a/docs/src/content.config.ts +++ b/docs/src/content.config.ts @@ -1,7 +1,9 @@ -import { defineCollection } from 'astro:content'; -import { docsLoader } from '@astrojs/starlight/loaders'; -import { docsSchema } from '@astrojs/starlight/schema'; +import { defineCollection } from "astro:content"; +import { docsLoader } from "@astrojs/starlight/loaders"; +import { docsSchema } from "@astrojs/starlight/schema"; +import { docsVersionsLoader } from "starlight-versions/loader"; export const collections = { docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), + versions: defineCollection({ loader: docsVersionsLoader() }), }; diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index 5e5ff26..b54c8d4 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -6,7 +6,7 @@ hero: tagline: Your AI dev environment, battle-tested. actions: - text: Get Started - link: /CodeForge/getting-started/ + link: /getting-started/ icon: right-arrow variant: primary - text: View on GitHub diff --git a/docs/src/content/docs/reference/changelog.md b/docs/src/content/docs/reference/changelog.md index 6e8a65f..2d46160 100644 --- a/docs/src/content/docs/reference/changelog.md +++ b/docs/src/content/docs/reference/changelog.md @@ -58,13 +58,15 @@ For minor and patch updates, you can usually just rebuild the container. Check t - Updated prerequisites and installation docs to support all DevContainer clients (VS Code, CLI, JetBrains Gateway, DevPod, Codespaces) - Added tabbed client-specific instructions on the installation page - Added dedicated port forwarding reference page covering VS Code auto-detect, devcontainer-bridge, and SSH tunneling -- **Ported `.devcontainer/docs/` to docs site** — merged 5 legacy reference docs into the Starlight documentation site: +- **Ported `.devcontainer/docs/` to docs site** — migrated content from 5 legacy reference docs into the Starlight documentation site: - New **Keybindings** page (Customization) — VS Code/Claude Code shortcut conflicts and resolution options - New **Troubleshooting** page (Reference) — 12+ problem/solution entries for build, auth, plugins, and performance issues - New **Optional Features** page (Customization) — mcp-qdrant vector memory setup guide - Merged setup variables (`.env` flags) into the Environment Variables reference - Merged `.secrets` file authentication docs into the Configuration page - Removed `.devcontainer/docs/` directory — all content now lives in the docs site +- **Versioned docs infrastructure** — installed `starlight-versions` plugin; no archived versions yet, first snapshot will be taken when v3 development begins +- **Fixed docs site URL** — updated `site` to `https://codeforge.core-directive.com` and removed `/CodeForge` base path (custom domain serves from root) ### Fixed @@ -132,6 +134,9 @@ For minor and patch updates, you can usually just rebuild the container. Check t ### Fixed +#### CI/CD +- **Release workflow** — switched from auto-publish on `package.json` change to tag-triggered (`v*` tags only); prevents accidental releases when PRs include version bumps. Tag must match `package.json` version or the workflow fails. + #### CCStatusLine Deployment - **`CONFIG_SOURCE_DIR` deprecation guard** — `setup.sh` now detects stale `CONFIG_SOURCE_DIR=/workspaces/.claude` in `.env`, overrides to `$DEVCONTAINER_DIR/config`, and auto-comments the line on disk; the wrong path caused `setup-config.sh` to skip the file manifest entirely, leaving ccstatusline (and all manifest-based configs) undeployed - **System template directory permissions** — `install.sh` now chowns `/usr/local/share/ccstatusline/` to the target user so `setup-config.sh` can write the template file during post-start @@ -157,6 +162,11 @@ For minor and patch updates, you can usually just rebuild the container. Check t - **`agent-system/README.md`** — updated `verify-no-regression.py` comment to list both consumers (implementer, refactorer); hyphenated "question-surfacing protocol" - **`orchestrator-system-prompt.md`** — clarified plan mode allows investigator delegation for research; added catch-all entry in selection criteria pointing to the full specialist catalog - **MD040 compliance** — added `text` language specifiers to 7 fenced code blocks across `investigator.md`, `tester.md`, and `documenter.md` +- **`setup.js` path traversal** — `configApply()` now validates that source paths resolve within `.codeforge/` and destination paths resolve within allowed directories (`CLAUDE_CONFIG_DIR`, `HOME`, `/usr/local/`), preventing directory traversal via `../` in manifest entries +- **`setup.sh` CODEFORGE_DIR** — deprecation guard now uses default-assignment semantics (`:=`) instead of unconditional overwrite, preserving any user-defined `CODEFORGE_DIR` from `.env` +- **Docs site URLs** — replaced `anexileddev.github.io/CodeForge/` with custom domain `codeforge.core-directive.com/` across README.md, CLAUDE.md, and .devcontainer/README.md +- **Architecture docs** — added `.checksums/` and `.markers/` directories to the `.codeforge/` tree in architecture.md +- **Troubleshooting docs** — renamed "Reset to Defaults" to "How to Reset" and clarified that `--reset` preserves `.codeforge/` user modifications; added step for restoring default config sources ### Changed From 85cb1e085cac04f5ae50d7a9e46b8d27699dfd2d Mon Sep 17 00:00:00 2001 From: AnExiledDev Date: Fri, 27 Feb 2026 02:15:55 +0000 Subject: [PATCH 2/2] Consolidate duplicate ### Fixed sections in Unreleased changelog Merge three separate ### Fixed headings into one to comply with Keep a Changelog grouping conventions. Addresses CodeRabbit review. --- .devcontainer/CHANGELOG.md | 118 ++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 60 deletions(-) diff --git a/.devcontainer/CHANGELOG.md b/.devcontainer/CHANGELOG.md index 822a74c..cc6e83c 100644 --- a/.devcontainer/CHANGELOG.md +++ b/.devcontainer/CHANGELOG.md @@ -34,6 +34,64 @@ #### Docs - Removed stale merge conflict marker in first-session docs page + +#### CI/CD +- **Release workflow** — switched from auto-publish on `package.json` change to tag-triggered (`v*` tags only); prevents accidental releases when PRs include version bumps. Tag must match `package.json` version or the workflow fails. + +#### CCStatusLine Deployment +- **`CONFIG_SOURCE_DIR` deprecation guard** — `setup.sh` now detects stale `CONFIG_SOURCE_DIR=/workspaces/.claude` in `.env`, overrides to `$DEVCONTAINER_DIR/config`, and auto-comments the line on disk; the wrong path caused `setup-config.sh` to skip the file manifest entirely, leaving ccstatusline (and all manifest-based configs) undeployed +- **System template directory permissions** — `install.sh` now chowns `/usr/local/share/ccstatusline/` to the target user so `setup-config.sh` can write the template file during post-start +- **Silent copy failures** — `setup-config.sh` now reports warnings when file deployment fails instead of logging success after a failed `cp` + +#### Post-Integration Review Fixes +- **skill-engine** — worktree skill definition uses weighted tuples (was plain strings, caused crash) +- **dangerous-command-blocker** — fail closed on unexpected exceptions (was fail-open) +- **ticket-workflow** — remove redundant `ValueError` from exception handlers +- **workspace-scope-guard** — use maxsplit in variable assignment detection +- **Shell scripts** — add executable bit to `check-setup.sh`, quote `PLUGIN_BLACKLIST` variable, add `set -uo pipefail` to tmux installer, replace deprecated `which` with `command -v`, normalize `&>` redirects in setup scripts +- **Documentation** — update agent count to 21, skill count to 38, plugin count to 14 across all docs site pages +- **Documentation** — add missing plugin pages for git-workflow and prompt-snippets +- **Documentation** — add `cc-orc` and `dbr` to commands reference +- **Documentation** — remove merge conflict marker from first-session.md +- **Documentation** — update architecture.md directory tree with new plugins + +#### CodeRabbit Review Fixes +- **`implementer.md`** — changed PostToolUse hook (fires every Edit) to Stop hook (fires once at task end) with 120s timeout; prevents redundant test runs during multi-file tasks +- **`tester.md`** — increased Stop hook timeout from 30s to 120s to accommodate larger test suites +- **`setup-aliases.sh`** — added `cc-orc` to `cc-tools` discovery loop so it appears in tool audit +- **`CLAUDE.md`** — added missing `keybindings.json`, `orchestrator-system-prompt.md`, and `writing-system-prompt.md` to directory structure tree +- **`agent-system/README.md`** — updated `verify-no-regression.py` comment to list both consumers (implementer, refactorer); hyphenated "question-surfacing protocol" +- **`orchestrator-system-prompt.md`** — clarified plan mode allows investigator delegation for research; added catch-all entry in selection criteria pointing to the full specialist catalog +- **MD040 compliance** — added `text` language specifiers to 7 fenced code blocks across `investigator.md`, `tester.md`, and `documenter.md` +- **`setup.js` path traversal** — `configApply()` now validates that source paths resolve within `.codeforge/` and destination paths resolve within allowed directories (`CLAUDE_CONFIG_DIR`, `HOME`, `/usr/local/`), preventing directory traversal via `../` in manifest entries +- **`setup.sh` CODEFORGE_DIR** — deprecation guard now uses default-assignment semantics (`:=`) instead of unconditional overwrite, preserving any user-defined `CODEFORGE_DIR` from `.env` +- **Docs site URLs** — replaced `anexileddev.github.io/CodeForge/` with custom domain `codeforge.core-directive.com/` across README.md, CLAUDE.md, and .devcontainer/README.md +- **Architecture docs** — added `.checksums/` and `.markers/` directories to the `.codeforge/` tree in architecture.md +- **Troubleshooting docs** — renamed "Reset to Defaults" to "How to Reset" and clarified that `--reset` preserves `.codeforge/` user modifications; added step for restoring default config sources + + +#### Claude Code Installation +- **Update script no longer silently discards errors** — background update output now captured to log file instead of being discarded via `&>/dev/null` +- **Update script simplified to native-binary-only** — removed npm fallback and `claude install` bootstrap code; added 60s timeout and transitional npm cleanup +- **Alias resolution simplified** — `_CLAUDE_BIN` now resolves directly to native binary path (removed npm and `/usr/local/bin` fallbacks) +- **POSIX redirect** — replaced `&>/dev/null` with `>/dev/null 2>&1` in dependency check for portability +- **Installer shell** — changed `sh -s` to `bash -s` when piping the official installer (it requires bash) +- **Unquoted `${TARGET}`** — quoted variable in `su -c` command to prevent word splitting +- **Directory prep** — added `~/.local/state` and `~/.claude` pre-creation; consolidated `chown` to cover entire `~/.local` tree + +#### Plugin Marketplace +- **`marketplace.json` schema fix** — changed all 11 plugin `source` fields from bare names (e.g., `"codeforge-lsp"`) to relative paths (`"./plugins/codeforge-lsp"`) so `claude plugin marketplace add` passes schema validation and all plugins register correctly + +#### ChromaTerm +- **Regex lookbehinds** — replaced alternation inside lookbehinds (`(?<=[\s(]|^)` and `(?<=commit |merge |...)`) with non-capturing groups containing individual lookbehinds (`(?:(?<=[\s(])|^)` and `(?:(?<=commit )|(?<=merge )|...)`) for PCRE2 compatibility + +#### Terminal Color Support +- **devcontainer.json** — added `TERM` and `COLORTERM=truecolor` to `remoteEnv`; Docker defaults to `TERM=xterm` (8 colors) which caused Claude Code and other CLI tools to downgrade rendering +- **devcontainer.json** — `TERM` uses `${localEnv:TERM:xterm-256color}` to forward the host terminal type (e.g., `xterm-kitty`) instead of unconditionally overriding it +- **setup-aliases.sh** — added terminal color defaults to managed shell block so tmux panes, `docker exec`, and SSH sessions also get 256-color and truecolor support +- **kitty-terminfo/README.md** — updated documentation to reflect `localEnv` forwarding and clarify behavior across VS Code vs non-VS Code entry points +- **CLAUDE.md** — documented `TERM` and `COLORTERM` environment variables in the Environment section + ### Added #### Startup @@ -85,42 +143,6 @@ - **`documenter`** — consolidated documentation and specification agent (opus) merging doc-writer and spec-writer; handles README, API docs, docstrings, and the full spec lifecycle (create, refine, build, review, update, check) - **Question Surfacing Protocol** — all 4 workhorse agents carry an identical protocol requiring them to STOP and return `## BLOCKED: Questions` sections when hitting ambiguities, ensuring no assumptions are made without user input -### Fixed - -#### CI/CD -- **Release workflow** — switched from auto-publish on `package.json` change to tag-triggered (`v*` tags only); prevents accidental releases when PRs include version bumps. Tag must match `package.json` version or the workflow fails. - -#### CCStatusLine Deployment -- **`CONFIG_SOURCE_DIR` deprecation guard** — `setup.sh` now detects stale `CONFIG_SOURCE_DIR=/workspaces/.claude` in `.env`, overrides to `$DEVCONTAINER_DIR/config`, and auto-comments the line on disk; the wrong path caused `setup-config.sh` to skip the file manifest entirely, leaving ccstatusline (and all manifest-based configs) undeployed -- **System template directory permissions** — `install.sh` now chowns `/usr/local/share/ccstatusline/` to the target user so `setup-config.sh` can write the template file during post-start -- **Silent copy failures** — `setup-config.sh` now reports warnings when file deployment fails instead of logging success after a failed `cp` - -#### Post-Integration Review Fixes -- **skill-engine** — worktree skill definition uses weighted tuples (was plain strings, caused crash) -- **dangerous-command-blocker** — fail closed on unexpected exceptions (was fail-open) -- **ticket-workflow** — remove redundant `ValueError` from exception handlers -- **workspace-scope-guard** — use maxsplit in variable assignment detection -- **Shell scripts** — add executable bit to `check-setup.sh`, quote `PLUGIN_BLACKLIST` variable, add `set -uo pipefail` to tmux installer, replace deprecated `which` with `command -v`, normalize `&>` redirects in setup scripts -- **Documentation** — update agent count to 21, skill count to 38, plugin count to 14 across all docs site pages -- **Documentation** — add missing plugin pages for git-workflow and prompt-snippets -- **Documentation** — add `cc-orc` and `dbr` to commands reference -- **Documentation** — remove merge conflict marker from first-session.md -- **Documentation** — update architecture.md directory tree with new plugins - -#### CodeRabbit Review Fixes -- **`implementer.md`** — changed PostToolUse hook (fires every Edit) to Stop hook (fires once at task end) with 120s timeout; prevents redundant test runs during multi-file tasks -- **`tester.md`** — increased Stop hook timeout from 30s to 120s to accommodate larger test suites -- **`setup-aliases.sh`** — added `cc-orc` to `cc-tools` discovery loop so it appears in tool audit -- **`CLAUDE.md`** — added missing `keybindings.json`, `orchestrator-system-prompt.md`, and `writing-system-prompt.md` to directory structure tree -- **`agent-system/README.md`** — updated `verify-no-regression.py` comment to list both consumers (implementer, refactorer); hyphenated "question-surfacing protocol" -- **`orchestrator-system-prompt.md`** — clarified plan mode allows investigator delegation for research; added catch-all entry in selection criteria pointing to the full specialist catalog -- **MD040 compliance** — added `text` language specifiers to 7 fenced code blocks across `investigator.md`, `tester.md`, and `documenter.md` -- **`setup.js` path traversal** — `configApply()` now validates that source paths resolve within `.codeforge/` and destination paths resolve within allowed directories (`CLAUDE_CONFIG_DIR`, `HOME`, `/usr/local/`), preventing directory traversal via `../` in manifest entries -- **`setup.sh` CODEFORGE_DIR** — deprecation guard now uses default-assignment semantics (`:=`) instead of unconditional overwrite, preserving any user-defined `CODEFORGE_DIR` from `.env` -- **Docs site URLs** — replaced `anexileddev.github.io/CodeForge/` with custom domain `codeforge.core-directive.com/` across README.md, CLAUDE.md, and .devcontainer/README.md -- **Architecture docs** — added `.checksums/` and `.markers/` directories to the `.codeforge/` tree in architecture.md -- **Troubleshooting docs** — renamed "Reset to Defaults" to "How to Reset" and clarified that `--reset` preserves `.codeforge/` user modifications; added step for restoring default config sources - ### Changed #### Skill Engine: Auto-Suggestion @@ -175,30 +197,6 @@ - Added `CLAUDE_AUTH_TOKEN` setup flow to README, configuration reference, and troubleshooting - ccstatusline README verification commands now respect `CLAUDE_CONFIG_DIR` -### Fixed - -#### Claude Code Installation -- **Update script no longer silently discards errors** — background update output now captured to log file instead of being discarded via `&>/dev/null` -- **Update script simplified to native-binary-only** — removed npm fallback and `claude install` bootstrap code; added 60s timeout and transitional npm cleanup -- **Alias resolution simplified** — `_CLAUDE_BIN` now resolves directly to native binary path (removed npm and `/usr/local/bin` fallbacks) -- **POSIX redirect** — replaced `&>/dev/null` with `>/dev/null 2>&1` in dependency check for portability -- **Installer shell** — changed `sh -s` to `bash -s` when piping the official installer (it requires bash) -- **Unquoted `${TARGET}`** — quoted variable in `su -c` command to prevent word splitting -- **Directory prep** — added `~/.local/state` and `~/.claude` pre-creation; consolidated `chown` to cover entire `~/.local` tree - -#### Plugin Marketplace -- **`marketplace.json` schema fix** — changed all 11 plugin `source` fields from bare names (e.g., `"codeforge-lsp"`) to relative paths (`"./plugins/codeforge-lsp"`) so `claude plugin marketplace add` passes schema validation and all plugins register correctly - -#### ChromaTerm -- **Regex lookbehinds** — replaced alternation inside lookbehinds (`(?<=[\s(]|^)` and `(?<=commit |merge |...)`) with non-capturing groups containing individual lookbehinds (`(?:(?<=[\s(])|^)` and `(?:(?<=commit )|(?<=merge )|...)`) for PCRE2 compatibility - -#### Terminal Color Support -- **devcontainer.json** — added `TERM` and `COLORTERM=truecolor` to `remoteEnv`; Docker defaults to `TERM=xterm` (8 colors) which caused Claude Code and other CLI tools to downgrade rendering -- **devcontainer.json** — `TERM` uses `${localEnv:TERM:xterm-256color}` to forward the host terminal type (e.g., `xterm-kitty`) instead of unconditionally overriding it -- **setup-aliases.sh** — added terminal color defaults to managed shell block so tmux panes, `docker exec`, and SSH sessions also get 256-color and truecolor support -- **kitty-terminfo/README.md** — updated documentation to reflect `localEnv` forwarding and clarify behavior across VS Code vs non-VS Code entry points -- **CLAUDE.md** — documented `TERM` and `COLORTERM` environment variables in the Environment section - ### Removed #### Scripts