From 131b2fb7eb0827c4f5907cfed32d1d8c3186e097 Mon Sep 17 00:00:00 2001 From: Karsten Samaschke Date: Sun, 15 Feb 2026 20:08:35 +0100 Subject: [PATCH 1/2] release: v12.3.1 (#137) * test: add trigger-check coverage for private debug skills * chore: bump version to 12.3.1 * test: skip private-skill checks when source is absent --- CHANGELOG.md | 9 ++ VERSION | 2 +- src/VERSION | 2 +- tests/installer/adopted-debug-skills.test.ts | 83 +++++++++++++++++++ .../private-skills-legacy-trigger.test.ts | 41 +++++++++ 5 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 tests/installer/adopted-debug-skills.test.ts create mode 100644 tests/installer/private-skills-legacy-trigger.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 8893082..aa6c943 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [12.3.1] - 2026-02-15 + +### Added +- Installer trigger-check regression tests for adopted private debug skills (`systematic-debugging`, `parallel-debugging`, `gh-fix-ci`). +- Installer trigger-check regression tests for legacy private skills (`audit-pr-skills`, `rebuild-skill-index`) after schema modernization. + +### Changed +- Aligned `src/VERSION` with root `VERSION` for release consistency. + ## [12.3.0] - 2026-02-15 ### Added diff --git a/VERSION b/VERSION index 4d23cb8..9c028e2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -12.3.0 +12.3.1 diff --git a/src/VERSION b/src/VERSION index 6853326..9c028e2 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -12.2.0 +12.3.1 diff --git a/tests/installer/adopted-debug-skills.test.ts b/tests/installer/adopted-debug-skills.test.ts new file mode 100644 index 0000000..7864818 --- /dev/null +++ b/tests/installer/adopted-debug-skills.test.ts @@ -0,0 +1,83 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import fs from "node:fs"; +import path from "node:path"; +import { execFileSync } from "node:child_process"; + +const repoRoot = process.cwd(); +const checkerScript = path.join(repoRoot, "scripts", "skill-trigger-check.mjs"); +const privateSkillsRoot = path.join(repoRoot, "private-skills", "skills"); +const hasPrivateSkills = fs.existsSync(privateSkillsRoot); + +function runChecker(skillPath: string): { ok: true; stdout: string } | { ok: false; stdout: string; stderr: string } { + try { + const stdout = execFileSync(process.execPath, [checkerScript, "--skill", skillPath], { + cwd: repoRoot, + encoding: "utf8", + stdio: ["ignore", "pipe", "pipe"], + }); + return { ok: true, stdout }; + } catch (error) { + const err = error as { stdout?: string | Buffer; stderr?: string | Buffer }; + return { + ok: false, + stdout: typeof err.stdout === "string" ? err.stdout : (err.stdout?.toString("utf8") ?? ""), + stderr: typeof err.stderr === "string" ? err.stderr : (err.stderr?.toString("utf8") ?? ""), + }; + } +} + +const adoptedSkills = [ + { + name: "systematic-debugging", + path: path.join(repoRoot, "private-skills", "skills", "systematic-debugging", "SKILL.md"), + expectedPhrases: [ + "NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST", + "## Acceptance Tests", + "Positive trigger", + "Negative trigger", + "Behavior", + ], + }, + { + name: "parallel-debugging", + path: path.join(repoRoot, "private-skills", "skills", "parallel-debugging", "SKILL.md"), + expectedPhrases: [ + "Analysis of Competing Hypotheses", + "## Acceptance Tests", + "Positive trigger", + "Negative trigger", + "Behavior", + ], + }, + { + name: "gh-fix-ci", + path: path.join(repoRoot, "private-skills", "skills", "gh-fix-ci", "SKILL.md"), + expectedPhrases: [ + "GitHub Actions", + "gh pr checks", + "## Acceptance Tests", + "Positive trigger", + "Negative trigger", + "Behavior", + ], + }, +]; + +for (const skill of adoptedSkills) { + test(`adopted skill exists: ${skill.name}`, { skip: !hasPrivateSkills }, () => { + assert.equal(fs.existsSync(skill.path), true, `${skill.name} should exist at ${skill.path}`); + }); + + test(`adopted skill passes trigger checks: ${skill.name}`, { skip: !hasPrivateSkills }, () => { + const result = runChecker(skill.path); + assert.equal(result.ok, true, `${skill.name} should pass skill-trigger-check`); + }); + + test(`adopted skill includes TDD acceptance coverage: ${skill.name}`, { skip: !hasPrivateSkills }, () => { + const text = fs.readFileSync(skill.path, "utf8"); + for (const phrase of skill.expectedPhrases) { + assert.match(text, new RegExp(phrase.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i")); + } + }); +} diff --git a/tests/installer/private-skills-legacy-trigger.test.ts b/tests/installer/private-skills-legacy-trigger.test.ts new file mode 100644 index 0000000..5a5b4ff --- /dev/null +++ b/tests/installer/private-skills-legacy-trigger.test.ts @@ -0,0 +1,41 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import fs from "node:fs"; +import path from "node:path"; +import { execFileSync } from "node:child_process"; + +const repoRoot = process.cwd(); +const checkerScript = path.join(repoRoot, "scripts", "skill-trigger-check.mjs"); +const privateSkillsRoot = path.join(repoRoot, "private-skills", "skills"); +const hasPrivateSkills = process.env.ICA_REQUIRE_PRIVATE_SKILLS === "1" || fs.existsSync(privateSkillsRoot); + +function runChecker(skillPath: string): { ok: true; stdout: string } | { ok: false; stdout: string; stderr: string } { + try { + const stdout = execFileSync(process.execPath, [checkerScript, "--skill", skillPath], { + cwd: repoRoot, + encoding: "utf8", + stdio: ["ignore", "pipe", "pipe"], + }); + return { ok: true, stdout }; + } catch (error) { + const err = error as { stdout?: string | Buffer; stderr?: string | Buffer }; + return { + ok: false, + stdout: typeof err.stdout === "string" ? err.stdout : (err.stdout?.toString("utf8") ?? ""), + stderr: typeof err.stderr === "string" ? err.stderr : (err.stderr?.toString("utf8") ?? ""), + }; + } +} + +const legacySkills = [ + path.join(repoRoot, "private-skills", "skills", "audit-pr-skills", "SKILL.md"), + path.join(repoRoot, "private-skills", "skills", "rebuild-skill-index", "SKILL.md"), +]; + +for (const skillPath of legacySkills) { + const skillName = path.basename(path.dirname(skillPath)); + test(`legacy private skill passes trigger check: ${skillName}`, { skip: !hasPrivateSkills }, () => { + const result = runChecker(skillPath); + assert.equal(result.ok, true, `${skillName} should pass skill-trigger-check`); + }); +} From 31552bd61e4af42055ca08751352943c8d67fae3 Mon Sep 17 00:00:00 2001 From: Karsten Samaschke Date: Mon, 16 Feb 2026 09:22:42 +0100 Subject: [PATCH 2/2] docs: add prominent bootstrap prompt and README table of contents --- README.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/README.md b/README.md index f532e0e..8acea2a 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,53 @@ It gives you one clean control plane for: - running from CLI or a local-first dashboard - using verified bootstrap installers and signed, reproducible releases +## Table of Contents + +- [Agent Prompt: Bootstrap ICA for This Local Environment](#agent-prompt-bootstrap-ica-for-this-local-environment) +- [Install First (Verified Bootstrap)](#install-first-verified-bootstrap) +- [Multi-Source Skills (Clear + Explicit)](#multi-source-skills-clear--explicit) +- [Dashboard Preview](#dashboard-preview) +- [Build From Source](#build-from-source) +- [CLI Usage (`ica`)](#cli-usage-ica) +- [Skill Publishing and Official Contribution](#skill-publishing-and-official-contribution) +- [Dashboard](#dashboard) +- [Supported Targets](#supported-targets) +- [Install Modes](#install-modes) +- [Scope Modes](#scope-modes) +- [Managed State](#managed-state) +- [Release + Supply Chain](#release--supply-chain) +- [Documentation](#documentation) +- [Legacy Deployment Paths Removed](#legacy-deployment-paths-removed) + +## Agent Prompt: Bootstrap ICA for This Local Environment + +```text +Bootstrap ICA for this local environment. + +Your task: +1) Download and install this skill file into your own native skill storage (using your runtime's normal skill conventions): + https://raw.githubusercontent.com/intelligentcode-ai/skills/master/skills/ica-bootstrap/SKILL.md +2) Immediately execute the installed `ica-bootstrap` skill. +3) Let `ica-bootstrap` complete end-to-end setup, including: + - ICA CLI installation + - skills source registration/refresh + - installation of `ica-cli` + - verification (`ica doctor`, `ica list`) + +Behavior requirements: +- Do the work directly on this machine. +- Do not ask me where skill folders are. +- Do not ask me to confirm routine steps. +- Ask only if credentials, permissions, or security policy block execution. +- If a command fails, diagnose and retry with the safest fallback automatically. + +Final output: +- What you installed +- What you executed +- Current ICA health/status +- Exact blocker only if setup is still not complete +``` + ## Install First (Verified Bootstrap) macOS/Linux: