Compare commits

..

7 Commits

Author SHA1 Message Date
Jesse Vincent
ffc29fa077 fix(writing-skills): run graphviz without a shell in render-graphs.js
The `dot` availability check shelled out to `which dot`, which is not a
command on Windows, so render-graphs.js reported graphviz as missing on
Windows even when it was installed. Replace it with a direct `dot -V`
probe via execFileSync.

Also switch the SVG render call from execSync to execFileSync('dot',
['-Tsvg']). Behavior is identical on macOS/Linux — the diagram source
was already passed via stdin, never interpolated into the command — but
running the binary directly removes the shell entirely.
2026-06-18 15:15:54 -07:00
Jesse Vincent
81f860a993 test(deps): bump ws to ^8.21.0 in brainstorm-server tests
Clears two dependabot alerts on the test harness's ws dependency:
GHSA-96hv-2xvq-fx4p (high, memory-exhaustion DoS, fixed 8.21.0) and
GHSA-58qx-3vcg-4xpx (medium, uninitialized memory disclosure, fixed
8.20.1). Test-only — the shipped brainstorm server hand-rolls its
WebSocket framing and does not depend on ws. Suite passes (57/57).
2026-06-18 14:57:28 -07:00
Jesse Vincent
80f810a4c2 docs: add v6.0.3 release notes for the SDD .git/ workspace fix 2026-06-18 14:47:05 -07:00
Jesse Vincent
528be9f974 test(sdd): wire test-sdd-workspace.sh into the runner; note git clean -fdx
The per-worktree workspace test was added but never registered in
run-skill-tests.sh, so it only ran when invoked by hand. Add it to the
fast unit-test array alongside the other pure-shell test.

Also document, in the Durable Progress section, that the ledger now
lives in git-ignored working-tree scratch, so `git clean -fdx` deletes
it — recover from `git log` if that happens.
2026-06-18 14:46:21 -07:00
Jesse Vincent
ce8fd59f33 test(sdd): lock in per-worktree workspace isolation (#1780) 2026-06-18 11:49:56 -07:00
Jesse Vincent
f660e9e9d6 fix(sdd): write artifacts to working-tree .superpowers/sdd, not .git/ (#1780) 2026-06-18 11:49:56 -07:00
Jesse Vincent
78ec255a2d feat(sdd): add sdd-workspace helper for a self-ignoring artifact dir 2026-06-18 11:49:56 -07:00
10 changed files with 12 additions and 92 deletions

View File

@@ -1,20 +0,0 @@
{
"name": "superpowers-dev",
"interface": {
"displayName": "Superpowers Dev"
},
"plugins": [
{
"name": "superpowers",
"source": {
"source": "url",
"url": "./"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Developer Tools"
}
]
}

View File

@@ -9,7 +9,7 @@
{
"name": "superpowers",
"description": "Core skills library for Claude Code: TDD, debugging, collaboration patterns, and proven techniques",
"version": "6.0.3",
"version": "6.0.2",
"source": "./",
"author": {
"name": "Jesse Vincent",

View File

@@ -1,7 +1,7 @@
{
"name": "superpowers",
"description": "Core skills library for Claude Code: TDD, debugging, collaboration patterns, and proven techniques",
"version": "6.0.3",
"version": "6.0.2",
"author": {
"name": "Jesse Vincent",
"email": "jesse@fsck.com"

View File

@@ -1,6 +1,6 @@
{
"name": "superpowers",
"version": "6.0.3",
"version": "6.0.2",
"description": "An agentic skills framework & software development methodology that works: planning, TDD, debugging, and collaboration workflows.",
"author": {
"name": "Jesse Vincent",

View File

@@ -2,7 +2,7 @@
"name": "superpowers",
"displayName": "Superpowers",
"description": "Core skills library: TDD, debugging, collaboration patterns, and proven techniques",
"version": "6.0.3",
"version": "6.0.2",
"author": {
"name": "Jesse Vincent",
"email": "jesse@fsck.com"

View File

@@ -1,6 +1,6 @@
{
"name": "superpowers",
"version": "6.0.3",
"version": "6.0.2",
"description": "An agentic skills framework and software development methodology.",
"author": {
"name": "Jesse Vincent",

View File

@@ -1,6 +1,6 @@
{
"name": "superpowers",
"description": "Core skills library: TDD, debugging, collaboration patterns, and proven techniques",
"version": "6.0.3",
"version": "6.0.2",
"contextFileName": "GEMINI.md"
}

View File

@@ -1,6 +1,6 @@
{
"name": "superpowers",
"version": "6.0.3",
"version": "6.0.2",
"description": "Superpowers skills and runtime bootstrap for coding agents",
"type": "module",
"main": ".opencode/plugins/superpowers.js",

View File

@@ -15,7 +15,7 @@
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const { execFileSync } = require('child_process');
function extractDotBlocks(markdown) {
const blocks = [];
@@ -69,7 +69,7 @@ ${bodies.join('\n\n')}
function renderToSvg(dotContent) {
try {
return execSync('dot -Tsvg', {
return execFileSync('dot', ['-Tsvg'], {
input: dotContent,
encoding: 'utf-8',
maxBuffer: 10 * 1024 * 1024
@@ -107,9 +107,10 @@ function main() {
process.exit(1);
}
// Check if dot is available
// Check if dot is available. Run the binary directly rather than probing
// with `which`, which is not a command on Windows.
try {
execSync('which dot', { encoding: 'utf-8' });
execFileSync('dot', ['-V'], { stdio: 'ignore' });
} catch {
console.error('Error: graphviz (dot) not found. Install with:');
console.error(' brew install graphviz # macOS');

View File

@@ -1,61 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
MARKETPLACE="$REPO_ROOT/.agents/plugins/marketplace.json"
python3 - "$MARKETPLACE" "$REPO_ROOT" <<'PY'
import json
import sys
from pathlib import Path
marketplace_path = Path(sys.argv[1])
repo_root = Path(sys.argv[2])
if not marketplace_path.exists():
raise AssertionError(".agents/plugins/marketplace.json must exist")
marketplace = json.loads(marketplace_path.read_text(encoding="utf-8"))
def assert_equal(actual, expected, label):
if actual != expected:
raise AssertionError(f"{label}: expected {expected!r}, got {actual!r}")
assert_equal(marketplace.get("name"), "superpowers-dev", "marketplace name")
assert_equal(
marketplace.get("interface", {}).get("displayName"),
"Superpowers Dev",
"marketplace display name",
)
plugins = marketplace.get("plugins")
if not isinstance(plugins, list):
raise AssertionError("plugins must be a list")
matching_plugins = [plugin for plugin in plugins if plugin.get("name") == "superpowers"]
assert_equal(len(matching_plugins), 1, "superpowers plugin entry count")
plugin = matching_plugins[0]
assert_equal(plugin.get("source"), {"source": "url", "url": "./"}, "plugin source")
assert_equal(
plugin.get("policy"),
{"installation": "AVAILABLE", "authentication": "ON_INSTALL"},
"plugin policy",
)
assert_equal(plugin.get("category"), "Developer Tools", "plugin category")
plugin_manifest = repo_root / ".codex-plugin" / "plugin.json"
if not plugin_manifest.exists():
raise AssertionError(".codex-plugin/plugin.json must exist")
manifest = json.loads(plugin_manifest.read_text(encoding="utf-8"))
assert_equal(manifest.get("name"), plugin.get("name"), "plugin manifest name")
assert_equal(
manifest.get("hooks"),
"./hooks/hooks-codex.json",
"Codex hooks manifest",
)
print("Codex marketplace manifest looks good")
PY