From ce2265736dfbc95eb346bb34d711865e1325b32c Mon Sep 17 00:00:00 2001 From: Bruno Azoulay Date: Wed, 11 Nov 2026 00:11:10 +0100 Subject: [PATCH 1/5] chore(harness): require @fusengine/harness >= 0.1.116 Existing installs at 0.1.115 now upgrade at the next session start (atomic swap unchanged). 0.1.116 fixes the false "[CONFIRM] Bash file write Shell redirect to file detected" on `( ... 2>&1) || true` introduced in 0.1.115; the real-registry test covers the regression. --- .cursor-plugin/plugin-runtime/hook.sh | 2 +- .../plugins/core-guards/scripts/hook.sh | 2 +- .../plugins/fuse-ai-pilot/scripts/hook.sh | 2 +- .../plugins/fuse-cartographer/scripts/hook.sh | 2 +- .../plugins/fuse-changelog/scripts/hook.sh | 2 +- .../plugins/fuse-design/scripts/hook.sh | 2 +- .../plugins/fuse-go/scripts/hook.sh | 2 +- .../plugins/fuse-hermes/scripts/hook.sh | 2 +- .../plugins/fuse-laravel/scripts/hook.sh | 2 +- .../plugins/fuse-lessons/scripts/hook.sh | 2 +- .../plugins/fuse-nextjs/scripts/hook.sh | 2 +- .../plugins/fuse-php/scripts/hook.sh | 2 +- .../plugins/fuse-react/scripts/hook.sh | 2 +- .../plugins/fuse-rules/scripts/hook.sh | 2 +- .../plugins/fuse-rust/scripts/hook.sh | 2 +- .../plugins/fuse-security/scripts/hook.sh | 2 +- .../plugins/fuse-seo/scripts/hook.sh | 2 +- .../plugins/fuse-shadcn-ui/scripts/hook.sh | 2 +- .../plugins/fuse-solid/scripts/hook.sh | 2 +- .../fuse-swift-apple-expert/scripts/hook.sh | 2 +- .../plugins/fuse-tailwindcss/scripts/hook.sh | 2 +- .../fuse-tanstack-start/scripts/hook.sh | 2 +- .../plugins/fuse-typescript/scripts/hook.sh | 2 +- tests/harness-autoupdate-real.sh | 20 +++++++ tests/harness-autoupdate.test.sh | 56 ++++++++++++------- 25 files changed, 79 insertions(+), 43 deletions(-) diff --git a/.cursor-plugin/plugin-runtime/hook.sh b/.cursor-plugin/plugin-runtime/hook.sh index 12329dd..ead17e1 100644 --- a/.cursor-plugin/plugin-runtime/hook.sh +++ b/.cursor-plugin/plugin-runtime/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/core-guards/scripts/hook.sh b/.cursor-plugin/plugins/core-guards/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/core-guards/scripts/hook.sh +++ b/.cursor-plugin/plugins/core-guards/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-ai-pilot/scripts/hook.sh b/.cursor-plugin/plugins/fuse-ai-pilot/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-ai-pilot/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-ai-pilot/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-cartographer/scripts/hook.sh b/.cursor-plugin/plugins/fuse-cartographer/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-cartographer/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-cartographer/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-changelog/scripts/hook.sh b/.cursor-plugin/plugins/fuse-changelog/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-changelog/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-changelog/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-design/scripts/hook.sh b/.cursor-plugin/plugins/fuse-design/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-design/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-design/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-go/scripts/hook.sh b/.cursor-plugin/plugins/fuse-go/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-go/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-go/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-hermes/scripts/hook.sh b/.cursor-plugin/plugins/fuse-hermes/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-hermes/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-hermes/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-laravel/scripts/hook.sh b/.cursor-plugin/plugins/fuse-laravel/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-laravel/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-laravel/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-lessons/scripts/hook.sh b/.cursor-plugin/plugins/fuse-lessons/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-lessons/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-lessons/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-nextjs/scripts/hook.sh b/.cursor-plugin/plugins/fuse-nextjs/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-nextjs/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-nextjs/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-php/scripts/hook.sh b/.cursor-plugin/plugins/fuse-php/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-php/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-php/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-react/scripts/hook.sh b/.cursor-plugin/plugins/fuse-react/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-react/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-react/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-rules/scripts/hook.sh b/.cursor-plugin/plugins/fuse-rules/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-rules/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-rules/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-rust/scripts/hook.sh b/.cursor-plugin/plugins/fuse-rust/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-rust/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-rust/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-security/scripts/hook.sh b/.cursor-plugin/plugins/fuse-security/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-security/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-security/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-seo/scripts/hook.sh b/.cursor-plugin/plugins/fuse-seo/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-seo/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-seo/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-shadcn-ui/scripts/hook.sh b/.cursor-plugin/plugins/fuse-shadcn-ui/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-shadcn-ui/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-shadcn-ui/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-solid/scripts/hook.sh b/.cursor-plugin/plugins/fuse-solid/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-solid/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-solid/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-swift-apple-expert/scripts/hook.sh b/.cursor-plugin/plugins/fuse-swift-apple-expert/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-swift-apple-expert/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-swift-apple-expert/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-tailwindcss/scripts/hook.sh b/.cursor-plugin/plugins/fuse-tailwindcss/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-tailwindcss/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-tailwindcss/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-tanstack-start/scripts/hook.sh b/.cursor-plugin/plugins/fuse-tanstack-start/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-tanstack-start/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-tanstack-start/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/.cursor-plugin/plugins/fuse-typescript/scripts/hook.sh b/.cursor-plugin/plugins/fuse-typescript/scripts/hook.sh index 12329dd..ead17e1 100755 --- a/.cursor-plugin/plugins/fuse-typescript/scripts/hook.sh +++ b/.cursor-plugin/plugins/fuse-typescript/scripts/hook.sh @@ -50,7 +50,7 @@ # Cursor's 60 s default hook timeout); sessionStart entries that can upgrade # therefore carry no timeout below 60. -HARNESS_MIN="0.1.115" +HARNESS_MIN="0.1.116" HARNESS_SPEC="latest" CONTROL_ROOT="${FUSE_HARNESS_ROOT:-${HOME}/.cursor/.fusengine-global}" PKG_REL="node_modules/@fusengine/harness" diff --git a/tests/harness-autoupdate-real.sh b/tests/harness-autoupdate-real.sh index e0d3554..2507e33 100644 --- a/tests/harness-autoupdate-real.sh +++ b/tests/harness-autoupdate-real.sh @@ -50,5 +50,25 @@ case "$DENY" in *'"permission":"deny"'*) ok "guard denies destructive command on ALLOW="$(cd /tmp && hook '{"hook_event_name":"beforeShellExecution","command":"ls -la","cwd":"/tmp","workspace_roots":["/tmp"]}')" case "$ALLOW" in *'"permission":"allow"'*) ok "guard allows benign command on $now" ;; *) fail "benign not allowed: $ALLOW" ;; esac +# ---- Regression: 0.1.115 falsely flags `( ... 2>&1) || true` as a file write ------------ +# Fixed in 0.1.116, so HARNESS_MIN (0.1.116) must pull a real 0.1.115 install forward. +if [ "$LATEST" = 0.1.115 ]; then echo "registry latest is 0.1.115: regression case skipped"; else +HOME_DIR="$TMP/home2"; CR="$HOME_DIR/.cursor/.fusengine-global" +mkdir -p "$CR/versions/0.1.115" +printf '{"name":"stage","private":true}\n' > "$CR/versions/0.1.115/package.json" +(cd "$CR/versions/0.1.115" && bun add "@fusengine/harness@0.1.115" --silent >/dev/null 2>&1) +echo 0.1.115 > "$CR/current" +SUBSHELL='{"hook_event_name":"beforeShellExecution","command":"(echo hi 2>&1) || true","cwd":"/tmp","workspace_roots":["/tmp"]}' +OUT="$(cd /tmp && hook "$SUBSHELL")" +case "$OUT" in *"Shell redirect to file detected"*) ok "0.1.115 reproduces the false CONFIRM on a subshell redirect" ;; *) fail "0.1.115 did not flag it: $OUT" ;; esac +hook "$SESSION" --session-start rules >/dev/null 2>&1 +read -r now < "$CR/current" +[ "$now" = "$LATEST" ] && ok "0.1.115 -> $now through --session-start" || fail "current is $now, expected $LATEST" +OUT="$(cd /tmp && hook "$SUBSHELL")" +case "$OUT" in *'"permission":"allow"'*) ok "$now allows \`(echo hi 2>&1) || true\`" ;; *) fail "$now did not allow it: $OUT" ;; esac +OUT="$(cd /tmp && hook '{"hook_event_name":"beforeShellExecution","command":"rm -rf /","cwd":"/tmp","workspace_roots":["/tmp"]}')" +case "$OUT" in *'"permission":"deny"'*) ok "$now still denies a destructive command" ;; *) fail "destructive not denied on $now: $OUT" ;; esac +fi + printf '\n%s failures\n' "$FAILS" [ "$FAILS" -eq 0 ] diff --git a/tests/harness-autoupdate.test.sh b/tests/harness-autoupdate.test.sh index 731e479..e5b4529 100644 --- a/tests/harness-autoupdate.test.sh +++ b/tests/harness-autoupdate.test.sh @@ -40,7 +40,7 @@ if [ "$1" = add ]; then [ -z "$STUB_ADD_SLEEP" ] || /bin/sleep "$STUB_ADD_SLEEP" [ "${STUB_ADD_RC:-0}" = 0 ] || exit "$STUB_ADD_RC" mkdir -p node_modules/@fusengine/harness/dist/cli - printf '{\n "name": "@fusengine/harness",\n "version": "%s"\n}\n' "${STUB_NEW_VERSION:-0.1.115}" \ + printf '{\n "name": "@fusengine/harness",\n "version": "%s"\n}\n' "${STUB_NEW_VERSION:-0.1.116}" \ > node_modules/@fusengine/harness/package.json echo "// bin" > node_modules/@fusengine/harness/dist/cli/bin.mjs exit 0 @@ -91,9 +91,9 @@ reset_env() { unset STUB_ADD_SLEEP FUSE_HARNESS_INSTALL_TIMEOUT_SEC STUB_ADD_RC eq() { [ "$1" = "$2" ]; } # 1. Current version at session start: zero process, zero update, scopes intact. -reset_env; new_case; seed_current 0.1.115 +reset_env; new_case; seed_current 0.1.116 hook --session-start rules -check "current: bin run with scope, flag stripped" grep -q "versions/0.1.115/.*bin.mjs hook cursor rules$" "$LOG" +check "current: bin run with scope, flag stripped" grep -q "versions/0.1.116/.*bin.mjs hook cursor rules$" "$LOG" check "current: no bun add" eq "$(adds)" 0 check "current: ZERO external process" eq "$(wc -c < "$PROCS" | tr -d ' ')" 0 @@ -107,8 +107,8 @@ check "newer: ZERO external process" eq "$(wc -c < "$PROCS" | tr -d ' ')" 0 reset_env; new_case; seed_current 0.1.110 hook --session-start solid check "stale: exactly one bun add" eq "$(adds)" 1 -check "stale: pointer switched" eq "$(cur)" 0.1.115 -check "stale: new bin executed with scope" grep -q "versions/0.1.115/.*bin.mjs hook cursor solid$" "$LOG" +check "stale: pointer switched" eq "$(cur)" 0.1.116 +check "stale: new bin executed with scope" grep -q "versions/0.1.116/.*bin.mjs hook cursor solid$" "$LOG" check "stale: previous version kept" test -f "$CR/versions/0.1.110/node_modules/@fusengine/harness/dist/cli/bin.mjs" check "stale: no stamp after success" test ! -e "$CR/.harness-update-failed" check "stale: lock released" test ! -e "$CR/.harness-update.lock" @@ -118,11 +118,11 @@ check "stale: staging dir cleaned" eq "$(ls -A "$CR/versions" | grep -c ' reset_env; new_case; seed_legacy 0.1.110 hook --session-start check "legacy: one bun add" eq "$(adds)" 1 -check "legacy: pointer created" eq "$(cur)" 0.1.115 +check "legacy: pointer created" eq "$(cur)" 0.1.116 check "legacy: legacy tree untouched" test -f "$CR/node_modules/@fusengine/harness/dist/cli/bin.mjs" # 5. Legacy fast path without upgrade need. -reset_env; new_case; seed_legacy 0.1.115 +reset_env; new_case; seed_legacy 0.1.116 hook --session-start check "legacy current: legacy bin runs" grep -q "$CR/node_modules/@fusengine/harness/dist/cli/bin.mjs hook cursor" "$LOG" check "legacy current: no add" eq "$(adds)" 0 @@ -207,10 +207,10 @@ check "prune: old extra removed" test ! -e "$CR/versions/0.1.100" check "prune: dead staging removed" test ! -e "$CR/versions/.stage-999" check "prune: previous kept" test -d "$CR/versions/0.1.110" check "prune: recent extra kept" test -d "$CR/versions/0.1.108" -check "prune: new kept" test -d "$CR/versions/0.1.115" +check "prune: new kept" test -d "$CR/versions/0.1.116" # 14. Hostile pointer never escapes the control root. -reset_env; new_case; seed_legacy 0.1.115; echo "../../etc" > "$CR/current" +reset_env; new_case; seed_legacy 0.1.116; echo "../../etc" > "$CR/current" hook --session-start check "bad pointer: legacy bin used" grep -q "$CR/node_modules/@fusengine/harness/dist/cli/bin.mjs hook cursor" "$LOG" @@ -218,8 +218,8 @@ check "bad pointer: legacy bin used" grep -q "$CR/node_modules/@fusengine/harnes reset_env; new_case hook solid check "self-heal: one add" eq "$(adds)" 1 -check "self-heal: pointer set" eq "$(cur)" 0.1.115 -check "self-heal: new bin ran" grep -q "versions/0.1.115/.*bin.mjs hook cursor solid$" "$LOG" +check "self-heal: pointer set" eq "$(cur)" 0.1.116 +check "self-heal: new bin ran" grep -q "versions/0.1.116/.*bin.mjs hook cursor solid$" "$LOG" rm -rf "$CR/versions" "$CR/current"; : > "$LOG" hook solid check "self-heal: stamp stops a second attempt" eq "$(adds)" 0 @@ -228,7 +228,7 @@ check "self-heal: stamp stops a second attempt" eq "$(adds)" 0 reset_env; new_case; seed_current 0.1.110; : > "$CR/.harness-update-failed" hook --install-harness; rc=$? check "install-harness: rc 0" eq "$rc" 0 -check "install-harness: pointer moved" eq "$(cur)" 0.1.115 +check "install-harness: pointer moved" eq "$(cur)" 0.1.116 check "install-harness: no bin run" eq "$(runs)" 0 reset_env; new_case; seed_current 0.1.110; STUB_ADD_RC=1; hook --install-harness; rc=$? check "install-harness failure: rc 1, pointer intact" eq "$rc.$(cur)" 1.0.1.110 @@ -237,11 +237,11 @@ reset_env # 17. versions/ exists but is broken: replaced by the verified stage, never kept broken. # (The stub bun runs every bin successfully, so "broken" is simulated by a missing bin.) reset_env; new_case; seed_current 0.1.110 -mkdir -p "$CR/versions/0.1.115/node_modules" +mkdir -p "$CR/versions/0.1.116/node_modules" hook --session-start -check "broken dest: replaced and switched" eq "$(cur)" 0.1.115 -check "broken dest: bin present afterwards" test -f "$CR/versions/0.1.115/node_modules/@fusengine/harness/dist/cli/bin.mjs" -check "broken dest: old tree kept aside" test -d "$CR/versions/0.1.115.broken.$(ls "$CR/versions" | sed -n 's/.*broken\.//p' | head -1)" +check "broken dest: replaced and switched" eq "$(cur)" 0.1.116 +check "broken dest: bin present afterwards" test -f "$CR/versions/0.1.116/node_modules/@fusengine/harness/dist/cli/bin.mjs" +check "broken dest: old tree kept aside" test -d "$CR/versions/0.1.116.broken.$(ls "$CR/versions" | sed -n 's/.*broken\.//p' | head -1)" # 18. `current` is a directory: the switch is reported as failed (stamp), not as success. reset_env; new_case; seed_current 0.1.110; rm "$CR/current"; mkdir "$CR/current" @@ -263,7 +263,7 @@ check "hung install: old bin ran" grep -q "versions/0.1.110/.*bin check "hung install: lock released" test ! -e "$CR/.harness-update.lock" check "hung install: staging cleaned" eq "$(ls -A "$CR/versions" | grep -c '^\.stage' || true)" 0 check "hung install: exactly one stderr warning" eq "$(wc -l < "$T/err" | tr -d ' ')" 1 -check "hung install: warning names versions" grep -q "installed 0.1.110, target >= 0.1.115" "$T/err" +check "hung install: warning names versions" grep -q "installed 0.1.110, target >= 0.1.116" "$T/err" check "hung install: stdout clean" test ! -s "$T/out" reset_env @@ -290,15 +290,31 @@ if [ -z "${HOOK_SH:-}" ]; then check "hook.sh copies: all byte-identical" eq "$distinct" 1 fi +# 21b. 0.1.115 carries the false "[CONFIRM] Shell redirect" on `( ... 2>&1) || true`: it is stale +# now that HARNESS_MIN is 0.1.116, on every upgrade path. +reset_env; new_case; seed_current 0.1.115 +hook --session-start solid +check "0.1.115 is stale: session-start upgrades it" eq "$(adds).$(cur)" 1.0.1.116 +reset_env; new_case; seed_current 0.1.115 +hook --harness-check +check "0.1.115 is stale: --harness-check upgrades it" eq "$(adds).$(cur).$(runs)" 1.0.1.116.0 +reset_env; new_case; seed_legacy 0.1.115 +hook --session-start +check "0.1.115 legacy install is stale too" eq "$(adds).$(cur)" 1.0.1.116 +reset_env; new_case; seed_current 0.1.115 +hook --install-harness; rc=$? +check "installer path (--install-harness) upgrades 0.1.115 regardless of HARNESS_MIN" eq "$rc.$(cur)" 0.0.1.116 +reset_env + # 22. --harness-check (upgrade-only mode for plugins whose sessionStart must not run the bin). reset_env; new_case; seed_current 0.1.110 hook --harness-check > "$T/out" 2> "$T/err"; rc=$? check "check/stale: rc 0" eq "$rc" 0 check "check/stale: one bun add" eq "$(adds)" 1 -check "check/stale: pointer switched" eq "$(cur)" 0.1.115 +check "check/stale: pointer switched" eq "$(cur)" 0.1.116 check "check/stale: bin never executed" eq "$(runs)" 0 check "check/stale: stdout empty" test ! -s "$T/out" -reset_env; new_case; seed_current 0.1.115 +reset_env; new_case; seed_current 0.1.116 hook --harness-check > "$T/out" 2> "$T/err"; rc=$? check "check/current: rc 0, nothing run" eq "$rc.$(adds).$(runs)" 0.0.0 check "check/current: ZERO process" eq "$(wc -c < "$PROCS" | tr -d ' ')" 0 @@ -320,7 +336,7 @@ hook --install-harness > "$T/out" 2> "$T/err"; rc=$? check "install-harness failure: rc 1" eq "$rc" 1 check "install-harness failure: one warning line, stdout empty" eq "$(wc -l < "$T/err" | tr -d ' ').$(wc -c < "$T/out" | tr -d ' ')" 1.0 check "install-harness failure: warning text, no 'retry in -'" \ - bash -c 'grep -q "installed 0.1.110, target >= 0.1.115" "$1" && grep -q "re-run the installer to retry" "$1" && ! grep -q "retry in -" "$1"' _ "$T/err" + bash -c 'grep -q "installed 0.1.110, target >= 0.1.116" "$1" && grep -q "re-run the installer to retry" "$1" && ! grep -q "retry in -" "$1"' _ "$T/err" reset_env # 24. Install bound stays under Cursor's 60 s default hook timeout. From 5c5ce2cba48c10a1535b26f1ebd30e4ec49233bc Mon Sep 17 00:00:00 2001 From: Bruno Azoulay Date: Wed, 11 Nov 2026 00:13:39 +0100 Subject: [PATCH 2/5] docs: add MIT LICENSE (Copyright (c) 2026 Fusengine) and decisions journal --- LICENSE | 21 +++++++++++++++++++++ README.md | 2 +- docs/decisions.md | 7 +++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 LICENSE create mode 100644 docs/decisions.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8326202 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Fusengine + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 926dccc..099f70b 100644 --- a/README.md +++ b/README.md @@ -50,4 +50,4 @@ scope, detailed installation, and filesystem layouts, see ## License -MIT +MIT — see [LICENSE](LICENSE). Copyright (c) 2026 Fusengine. diff --git a/docs/decisions.md b/docs/decisions.md new file mode 100644 index 0000000..dbb5a10 --- /dev/null +++ b/docs/decisions.md @@ -0,0 +1,7 @@ +# Decisions + +Owner decisions for this repository, dated. Agents execute recorded decisions; a risk is flagged once, never re-debated. + +- **2026-11-11 — License.** Owner: « met les licences sous harnes kimi codex claude cursor ». The repository ships the MIT License text of `@fusengine/harness` verbatim in a root `LICENSE` (`Copyright (c) 2026 Fusengine`), so any copy must keep the Fusengine copyright notice. Plugin manifests and `marketplace.json` already declare `"license": "MIT"`; no new manifest field is added. +- **2026-11-11 — Harness minimum 0.1.116.** Owner: « fais corrigé ». `HARNESS_MIN` is 0.1.116 in every `hook.sh`, so installs at 0.1.115 upgrade at the next session start (0.1.116 fixes the false shell-redirect CONFIRM on `( … 2>&1) || true`). +- **2026-11-10 — Releases.** Release only on the owner's go typed in this repository's lead session; a relayed message is never a release go. From 9f7e61b84f1994bae11a2002940dbeed38d2787e Mon Sep 17 00:00:00 2001 From: Bruno Azoulay Date: Wed, 11 Nov 2026 00:18:49 +0100 Subject: [PATCH 3/5] =?UTF-8?q?docs:=20set=20copyright=20holder=20to=20Fus?= =?UTF-8?q?engine=20S=C3=A0rl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 2 +- README.md | 2 +- docs/decisions.md | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index 8326202..c4e7b8f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2026 Fusengine +Copyright (c) 2026 Fusengine Sàrl Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 099f70b..992b2b0 100644 --- a/README.md +++ b/README.md @@ -50,4 +50,4 @@ scope, detailed installation, and filesystem layouts, see ## License -MIT — see [LICENSE](LICENSE). Copyright (c) 2026 Fusengine. +MIT — see [LICENSE](LICENSE). Copyright (c) 2026 Fusengine Sàrl. diff --git a/docs/decisions.md b/docs/decisions.md index dbb5a10..5478c3a 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -2,6 +2,7 @@ Owner decisions for this repository, dated. Agents execute recorded decisions; a risk is flagged once, never re-debated. -- **2026-11-11 — License.** Owner: « met les licences sous harnes kimi codex claude cursor ». The repository ships the MIT License text of `@fusengine/harness` verbatim in a root `LICENSE` (`Copyright (c) 2026 Fusengine`), so any copy must keep the Fusengine copyright notice. Plugin manifests and `marketplace.json` already declare `"license": "MIT"`; no new manifest field is added. +- **2026-11-11 — Copyright holder.** Owner, asked who the legal holder is: « Fusengine Sàrl ». Every `Copyright (c) … Fusengine` line reads `Copyright (c) 2026 Fusengine Sàrl` (UTF-8); `author` fields and prose are unchanged. +- **2026-11-11 — License.** Owner: « met les licences sous harnes kimi codex claude cursor ». The repository ships the MIT License text of `@fusengine/harness` in a root `LICENSE` (holder per the entry above), so any copy must keep the Fusengine Sàrl copyright notice. Plugin manifests and `marketplace.json` already declare `"license": "MIT"`; no new manifest field is added. - **2026-11-11 — Harness minimum 0.1.116.** Owner: « fais corrigé ». `HARNESS_MIN` is 0.1.116 in every `hook.sh`, so installs at 0.1.115 upgrade at the next session start (0.1.116 fixes the false shell-redirect CONFIRM on `( … 2>&1) || true`). - **2026-11-10 — Releases.** Release only on the owner's go typed in this repository's lead session; a relayed message is never a release go. From 466413e77c671ad984f1a48bdfb1369cfc059ae0 Mon Sep 17 00:00:00 2001 From: Bruno Azoulay Date: Wed, 11 Nov 2026 00:26:43 +0100 Subject: [PATCH 4/5] =?UTF-8?q?docs(commit-pro):=20set=20license=20holder?= =?UTF-8?q?=20to=20Fusengine=20S=C3=A0rl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursor-plugin/plugins/fuse-commit-pro/LICENSE | 2 +- docs/decisions.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.cursor-plugin/plugins/fuse-commit-pro/LICENSE b/.cursor-plugin/plugins/fuse-commit-pro/LICENSE index cc9fc5d..fe94e78 100644 --- a/.cursor-plugin/plugins/fuse-commit-pro/LICENSE +++ b/.cursor-plugin/plugins/fuse-commit-pro/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 Bruno Azoulay +Copyright (c) 2025 Fusengine Sàrl Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/docs/decisions.md b/docs/decisions.md index 5478c3a..03f71a8 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -2,6 +2,7 @@ Owner decisions for this repository, dated. Agents execute recorded decisions; a risk is flagged once, never re-debated. +- **2026-11-11 — Plugin license holder.** Owner, told that `fuse-commit-pro/LICENSE` read `Copyright (c) 2025 Bruno Azoulay`: « non fusengine Sàrl ». Every `Copyright (c)` line in the repository names `Fusengine Sàrl` (year unchanged). - **2026-11-11 — Copyright holder.** Owner, asked who the legal holder is: « Fusengine Sàrl ». Every `Copyright (c) … Fusengine` line reads `Copyright (c) 2026 Fusengine Sàrl` (UTF-8); `author` fields and prose are unchanged. - **2026-11-11 — License.** Owner: « met les licences sous harnes kimi codex claude cursor ». The repository ships the MIT License text of `@fusengine/harness` in a root `LICENSE` (holder per the entry above), so any copy must keep the Fusengine Sàrl copyright notice. Plugin manifests and `marketplace.json` already declare `"license": "MIT"`; no new manifest field is added. - **2026-11-11 — Harness minimum 0.1.116.** Owner: « fais corrigé ». `HARNESS_MIN` is 0.1.116 in every `hook.sh`, so installs at 0.1.115 upgrade at the next session start (0.1.116 fixes the false shell-redirect CONFIRM on `( … 2>&1) || true`). From 8d8b0d581908ed9b936d92b2703ceb205d15f38e Mon Sep 17 00:00:00 2001 From: Bruno Azoulay Date: Wed, 11 Nov 2026 00:31:24 +0100 Subject: [PATCH 5/5] chore: bump marketplace and CHANGELOG to 0.1.13 --- .cursor-plugin/marketplace.json | 48 +++++++++---------- .../core-guards/.cursor-plugin/plugin.json | 2 +- .../fuse-ai-pilot/.cursor-plugin/plugin.json | 2 +- .../.cursor-plugin/plugin.json | 2 +- .../fuse-changelog/.cursor-plugin/plugin.json | 2 +- .../.cursor-plugin/plugin.json | 2 +- .../fuse-design/.cursor-plugin/plugin.json | 2 +- .../fuse-go/.cursor-plugin/plugin.json | 2 +- .../fuse-hermes/.cursor-plugin/plugin.json | 2 +- .../fuse-laravel/.cursor-plugin/plugin.json | 2 +- .../fuse-lessons/.cursor-plugin/plugin.json | 2 +- .../fuse-nextjs/.cursor-plugin/plugin.json | 2 +- .../fuse-php/.cursor-plugin/plugin.json | 2 +- .../fuse-react/.cursor-plugin/plugin.json | 2 +- .../fuse-rules/.cursor-plugin/plugin.json | 2 +- .../fuse-rust/.cursor-plugin/plugin.json | 2 +- .../fuse-security/.cursor-plugin/plugin.json | 2 +- .../fuse-seo/.cursor-plugin/plugin.json | 2 +- .../fuse-shadcn-ui/.cursor-plugin/plugin.json | 2 +- .../fuse-solid/.cursor-plugin/plugin.json | 2 +- .../.cursor-plugin/plugin.json | 2 +- .../.cursor-plugin/plugin.json | 2 +- .../.cursor-plugin/plugin.json | 2 +- .../.cursor-plugin/plugin.json | 2 +- CHANGELOG.md | 19 ++++++++ README.md | 2 +- docs/decisions.md | 1 + 27 files changed, 68 insertions(+), 48 deletions(-) diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 851116d..2035d5d 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -6,14 +6,14 @@ }, "metadata": { "description": "Professional Cursor plugins with APEX workflow, SOLID principles, and expert development agents for Next.js, Laravel, Swift, Tailwind CSS, and more", - "version": "0.1.12" + "version": "0.1.13" }, "plugins": [ { "name": "core-guards", "source": ".cursor-plugin/plugins/core-guards", "description": "Core security guards (git, install, security) and SOLID enforcement hooks", - "version": "1.1.40", + "version": "1.1.41", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -36,7 +36,7 @@ "name": "fuse-ai-pilot", "source": ".cursor-plugin/plugins/fuse-ai-pilot", "description": "AI Pilot workflow agents: sniper (code quality), research-expert, explore-codebase, websearch", - "version": "1.2.47", + "version": "1.2.48", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -81,7 +81,7 @@ "name": "fuse-cartographer", "source": ".cursor-plugin/plugins/fuse-cartographer", "description": "Generates indented markdown maps of the plugin ecosystem for agent navigation", - "version": "1.0.15", + "version": "1.0.16", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -102,7 +102,7 @@ "name": "fuse-changelog", "source": ".cursor-plugin/plugins/fuse-changelog", "description": "Claude Code update watcher: changelog tracking, breaking changes detection, community pulse via Exa, plugin compatibility analysis", - "version": "1.0.17", + "version": "1.0.18", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -124,7 +124,7 @@ "name": "fuse-commit-pro", "source": ".cursor-plugin/plugins/fuse-commit-pro", "description": "Professional git commits with Conventional Commits, GitHub Flow branch enforcement, auto PR creation, security validation, and auto-detection", - "version": "1.2.27", + "version": "1.2.28", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -145,7 +145,7 @@ "name": "fuse-design", "source": ".cursor-plugin/plugins/fuse-design", "description": "Design Director for websites, web apps, iOS, and Android. Generates HTML/CSS directly (Gemini Design MCP, Magic/21st.dev, and shadcn MCP are optional). iOS/Android produce tokens + a device-framed mockup + a handoff spec, never SwiftUI/Compose. Design method, design system tokens, motion, UX copy, and a deterministic design-review gate. Anti-AI-Slop, WCAG 2.2.", - "version": "2.2.12", + "version": "2.2.13", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -207,7 +207,7 @@ "name": "fuse-go", "source": ".cursor-plugin/plugins/fuse-go", "description": "Expert Go 1.26+ — idioms, concurrency, backend services, cargo-grade tooling (golangci-lint v2, govulncheck), with SOLID principles", - "version": "1.0.9", + "version": "1.0.10", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -233,7 +233,7 @@ "name": "fuse-hermes", "source": ".cursor-plugin/plugins/fuse-hermes", "description": "Expert Nous Research Hermes Agent 0.23+ — config.yaml, SOUL.md / .hermes.md, profiles, delegation, cron, gateways, security, plus chief-of-staff operating patterns driven by a universal profile.yaml", - "version": "1.0.1", + "version": "1.0.2", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -259,7 +259,7 @@ "name": "fuse-laravel", "source": ".cursor-plugin/plugins/fuse-laravel", "description": "Expert Laravel 13 + PHP 8.3+ with SOLID principles, first-class PHP Attributes, Laravel AI SDK, JSON:API Resources, native vector search (pgvector), Eloquent, Livewire, queues with routing, and comprehensive documentation", - "version": "1.2.11", + "version": "1.2.12", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -281,7 +281,7 @@ "name": "fuse-lessons", "source": ".cursor-plugin/plugins/fuse-lessons", "description": "Project memory: writes compact 'never reproduce' lessons to MEMORY/LESSON.md on finish, force-reads them at session/subagent start.", - "version": "1.0.9", + "version": "1.0.10", "author": { "name": "Fusengine" }, @@ -299,7 +299,7 @@ "name": "fuse-nextjs", "source": ".cursor-plugin/plugins/fuse-nextjs", "description": "Expert Next.js 16 + React 19 with App Router, Server Components, Prisma 7, and Better Auth", - "version": "1.1.27", + "version": "1.1.28", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -321,7 +321,7 @@ "name": "fuse-php", "source": ".cursor-plugin/plugins/fuse-php", "description": "Expert modern PHP 8.5/8.4 for non-Laravel projects — libraries, standalone Symfony components, Slim, API-first apps, and CLI tools, with PER Coding Style 3.0, PHPStan, and SOLID principles", - "version": "1.0.10", + "version": "1.0.11", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -374,7 +374,7 @@ "name": "fuse-react", "source": ".cursor-plugin/plugins/fuse-react", "description": "Expert React 19 with hooks, TanStack Router, Zustand, React Hook Form, Testing Library, shadcn/ui, and SOLID principles", - "version": "1.0.24", + "version": "1.0.25", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -398,7 +398,7 @@ "name": "fuse-rules", "source": ".cursor-plugin/plugins/fuse-rules", "description": "Global rules for all sessions: APEX workflow, SOLID/DRY enforcement, project detection, agent delegation, frontend/git standards", - "version": "1.0.26", + "version": "1.0.27", "author": { "name": "Fusengine" }, @@ -411,7 +411,7 @@ "name": "fuse-rust", "source": ".cursor-plugin/plugins/fuse-rust", "description": "Expert Rust 1.96+ (2024 edition) — ownership, error handling, async/tokio, axum backends, cargo tooling, with SOLID principles", - "version": "1.0.10", + "version": "1.0.11", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -437,7 +437,7 @@ "name": "fuse-security", "source": ".cursor-plugin/plugins/fuse-security", "description": "Security vulnerability detection and remediation: OWASP Top 10, SAST scanning, CVE research, dependency audit, secrets detection", - "version": "1.0.21", + "version": "1.0.22", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -460,7 +460,7 @@ "name": "fuse-seo", "source": ".cursor-plugin/plugins/fuse-seo", "description": "SEO/GEO 2026 plugin. Local-first, framework-aware, zero third-party APIs. Covers technical SEO, schema markup, E-E-A-T, AI Overviews optimization, local SEO, sitemaps, hreflang, internal linking, content briefs, semantic clustering, and search experience optimization.", - "version": "1.0.15", + "version": "1.0.16", "author": { "name": "Fusengine" }, @@ -490,7 +490,7 @@ "name": "fuse-shadcn-ui", "source": ".cursor-plugin/plugins/fuse-shadcn-ui", "description": "Expert shadcn/ui with Radix UI and Base UI detection, component patterns, registries, theming, and migration", - "version": "1.0.21", + "version": "1.0.22", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -514,7 +514,7 @@ "name": "fuse-solid", "source": ".cursor-plugin/plugins/fuse-solid", "description": "SOLID principles enforcement with automatic project detection and validation for all languages", - "version": "1.0.22", + "version": "1.0.23", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -535,7 +535,7 @@ "name": "fuse-swift-apple-expert", "source": ".cursor-plugin/plugins/fuse-swift-apple-expert", "description": "Expert Swift 6.2 + SwiftUI for iOS 26, macOS 26, iPadOS 26, watchOS 26, visionOS 26, tvOS 26 with Liquid Glass, @Observable, actors, SwiftData inheritance", - "version": "1.1.23", + "version": "1.1.24", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -562,7 +562,7 @@ "name": "fuse-tailwindcss", "source": ".cursor-plugin/plugins/fuse-tailwindcss", "description": "Expert Tailwind CSS v4.1 - CSS-first configuration, @theme, @utility, @variant, Oxide engine 5x faster, OKLCH colors, container queries, 15 specialized skills", - "version": "1.1.14", + "version": "1.1.15", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -594,7 +594,7 @@ "name": "fuse-tanstack-start", "source": ".cursor-plugin/plugins/fuse-tanstack-start", "description": "Expert TanStack Start (React, RC) full-stack framework with file-based routing, createServerFn server functions, selective SSR, and Nitro deployment", - "version": "1.0.8", + "version": "1.0.9", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" @@ -619,7 +619,7 @@ "name": "fuse-typescript", "source": ".cursor-plugin/plugins/fuse-typescript", "description": "Expert TypeScript 6.0 for pure TS projects — CLI tools, libraries, scripts, and backends on Node 24 LTS or Bun 1.3, with SOLID principles", - "version": "1.0.10", + "version": "1.0.11", "author": { "name": "Fusengine", "email": "hello@fusengine.ch" diff --git a/.cursor-plugin/plugins/core-guards/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/core-guards/.cursor-plugin/plugin.json index 32bbbe4..c2b1605 100644 --- a/.cursor-plugin/plugins/core-guards/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/core-guards/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "core-guards", - "version": "1.1.40", + "version": "1.1.41", "description": "Core security guards (git, install, security) and SOLID enforcement hooks", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-ai-pilot/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-ai-pilot/.cursor-plugin/plugin.json index 82cd2ec..22f5cc6 100644 --- a/.cursor-plugin/plugins/fuse-ai-pilot/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-ai-pilot/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-ai-pilot", - "version": "1.2.47", + "version": "1.2.48", "description": "AI Pilot workflow agents: sniper (code quality), research-expert, explore-codebase, websearch", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-cartographer/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-cartographer/.cursor-plugin/plugin.json index 2a92b45..abc2322 100644 --- a/.cursor-plugin/plugins/fuse-cartographer/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-cartographer/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-cartographer", - "version": "1.0.15", + "version": "1.0.16", "description": "Generates indented markdown maps of the plugin ecosystem for agent navigation", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-changelog/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-changelog/.cursor-plugin/plugin.json index 709df52..0ade485 100644 --- a/.cursor-plugin/plugins/fuse-changelog/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-changelog/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-changelog", - "version": "1.0.17", + "version": "1.0.18", "description": "Claude Code update watcher: changelog tracking, breaking changes detection, community pulse via Exa, plugin compatibility analysis", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-commit-pro/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-commit-pro/.cursor-plugin/plugin.json index 1817c07..6b8af9d 100644 --- a/.cursor-plugin/plugins/fuse-commit-pro/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-commit-pro/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-commit-pro", - "version": "1.2.27", + "version": "1.2.28", "description": "Professional git commits with Conventional Commits, GitHub Flow branch enforcement, auto PR creation, security validation, and auto-detection", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-design/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-design/.cursor-plugin/plugin.json index 3b1a4c1..65b9335 100644 --- a/.cursor-plugin/plugins/fuse-design/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-design/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-design", - "version": "2.2.12", + "version": "2.2.13", "description": "Design Director for websites, web apps, iOS, and Android. Generates HTML/CSS directly (Gemini Design MCP, Magic/21st.dev, and shadcn MCP are optional). iOS/Android produce tokens + a device-framed mockup + a handoff spec, never SwiftUI/Compose. Design method, design system tokens, motion, UX copy, and a deterministic design-review gate. Anti-AI-Slop, WCAG 2.2.", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-go/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-go/.cursor-plugin/plugin.json index 131564f..2f52e86 100644 --- a/.cursor-plugin/plugins/fuse-go/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-go/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-go", - "version": "1.0.9", + "version": "1.0.10", "description": "Expert Go 1.26+ — idioms, concurrency, backend services, cargo-grade tooling (golangci-lint v2, govulncheck), with SOLID principles", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-hermes/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-hermes/.cursor-plugin/plugin.json index 027670f..801645e 100644 --- a/.cursor-plugin/plugins/fuse-hermes/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-hermes/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-hermes", - "version": "1.0.1", + "version": "1.0.2", "description": "Expert Nous Research Hermes Agent 0.23+ — config.yaml, SOUL.md / .hermes.md, profiles, delegation, cron, gateways, security, plus chief-of-staff operating patterns driven by a universal profile.yaml", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-laravel/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-laravel/.cursor-plugin/plugin.json index 9bff241..3c7186f 100644 --- a/.cursor-plugin/plugins/fuse-laravel/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-laravel/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-laravel", - "version": "1.2.11", + "version": "1.2.12", "description": "Expert Laravel 13 + PHP 8.3+ with SOLID principles, first-class PHP Attributes, Laravel AI SDK, JSON:API Resources, native vector search (pgvector), Eloquent, Livewire, queues with routing, and comprehensive documentation", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-lessons/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-lessons/.cursor-plugin/plugin.json index 4ccd594..c20331c 100644 --- a/.cursor-plugin/plugins/fuse-lessons/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-lessons/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-lessons", - "version": "1.0.9", + "version": "1.0.10", "description": "Project memory: writes compact 'never reproduce' lessons to MEMORY/LESSON.md on finish, force-reads them at session/subagent start.", "author": { "name": "Fusengine" diff --git a/.cursor-plugin/plugins/fuse-nextjs/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-nextjs/.cursor-plugin/plugin.json index 238b8fd..8f91f29 100644 --- a/.cursor-plugin/plugins/fuse-nextjs/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-nextjs/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-nextjs", - "version": "1.1.27", + "version": "1.1.28", "description": "Expert Next.js 16 + React 19 with App Router, Server Components, Prisma 7, and Better Auth", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-php/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-php/.cursor-plugin/plugin.json index c81fe5c..25cb853 100644 --- a/.cursor-plugin/plugins/fuse-php/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-php/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-php", - "version": "1.0.10", + "version": "1.0.11", "description": "Expert modern PHP 8.5/8.4 for non-Laravel projects — libraries, standalone Symfony components, Slim, API-first apps, and CLI tools, with PER Coding Style 3.0, PHPStan, and SOLID principles", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-react/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-react/.cursor-plugin/plugin.json index f1d28d9..cab624a 100644 --- a/.cursor-plugin/plugins/fuse-react/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-react/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-react", - "version": "1.0.24", + "version": "1.0.25", "description": "Expert React 19 with hooks, TanStack Router, Zustand, React Hook Form, Testing Library, shadcn/ui, and SOLID principles", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-rules/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-rules/.cursor-plugin/plugin.json index 67f4e4d..c486c67 100644 --- a/.cursor-plugin/plugins/fuse-rules/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-rules/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-rules", - "version": "1.0.26", + "version": "1.0.27", "description": "Global rules for all agent sessions: APEX workflow, SOLID/DRY enforcement, project detection, agent delegation, frontend/git standards", "author": { "name": "Fusengine" diff --git a/.cursor-plugin/plugins/fuse-rust/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-rust/.cursor-plugin/plugin.json index 8992e9a..d3e07a3 100644 --- a/.cursor-plugin/plugins/fuse-rust/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-rust/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-rust", - "version": "1.0.10", + "version": "1.0.11", "description": "Expert Rust 1.99+ (2024 edition) — ownership, error handling, async/tokio, axum backends, cargo tooling, with SOLID principles", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-security/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-security/.cursor-plugin/plugin.json index cd4c0c4..3d4bf53 100644 --- a/.cursor-plugin/plugins/fuse-security/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-security/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-security", - "version": "1.0.21", + "version": "1.0.22", "description": "Security vulnerability detection and remediation: OWASP Top 10, SAST scanning, CVE research, dependency audit, secrets detection", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-seo/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-seo/.cursor-plugin/plugin.json index 7f35627..80018ea 100644 --- a/.cursor-plugin/plugins/fuse-seo/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-seo/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-seo", - "version": "1.0.15", + "version": "1.0.16", "description": "SEO/GEO 2026 plugin. Local-first, framework-aware, zero third-party APIs. Covers technical SEO, schema markup, E-E-A-T, AI Overviews optimization, local SEO, sitemaps, hreflang, internal linking, content briefs, semantic clustering, and search experience optimization.", "author": { "name": "Fusengine" diff --git a/.cursor-plugin/plugins/fuse-shadcn-ui/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-shadcn-ui/.cursor-plugin/plugin.json index 3e8694d..cfcbe5e 100644 --- a/.cursor-plugin/plugins/fuse-shadcn-ui/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-shadcn-ui/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-shadcn-ui", - "version": "1.0.21", + "version": "1.0.22", "description": "Expert shadcn/ui with Radix UI and Base UI detection, component patterns, registries, theming, and migration", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-solid/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-solid/.cursor-plugin/plugin.json index fc0fbb3..9a3c818 100644 --- a/.cursor-plugin/plugins/fuse-solid/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-solid/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-solid", - "version": "1.0.22", + "version": "1.0.23", "description": "SOLID principles enforcement with automatic project detection and validation for all languages", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-swift-apple-expert/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-swift-apple-expert/.cursor-plugin/plugin.json index a9a5018..aa18634 100644 --- a/.cursor-plugin/plugins/fuse-swift-apple-expert/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-swift-apple-expert/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-swift-apple-expert", - "version": "1.1.23", + "version": "1.1.24", "description": "Expert Swift 6.4.2 + SwiftUI (Xcode 27.2) for iOS 27.2, macOS 27.2, iPadOS 27.2, watchOS 27.2, visionOS 27.2, tvOS 27.2 with Liquid Glass, @Observable, actors, SwiftData inheritance", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-tailwindcss/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-tailwindcss/.cursor-plugin/plugin.json index 451ca67..ab7bae0 100644 --- a/.cursor-plugin/plugins/fuse-tailwindcss/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-tailwindcss/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-tailwindcss", - "version": "1.1.14", + "version": "1.1.15", "description": "Expert Tailwind CSS v4.1 - CSS-first configuration, @theme, @utility, @variant, Oxide engine 5x faster, OKLCH colors, container queries, 15 specialized skills", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-tanstack-start/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-tanstack-start/.cursor-plugin/plugin.json index f2336ad..05cc038 100644 --- a/.cursor-plugin/plugins/fuse-tanstack-start/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-tanstack-start/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-tanstack-start", - "version": "1.0.8", + "version": "1.0.9", "description": "Expert TanStack Start (React, 1.x stable) full-stack framework with file-based routing, createServerFn server functions, selective SSR, and Nitro deployment", "author": { "name": "Fusengine", diff --git a/.cursor-plugin/plugins/fuse-typescript/.cursor-plugin/plugin.json b/.cursor-plugin/plugins/fuse-typescript/.cursor-plugin/plugin.json index 5cc76db..b1ced34 100644 --- a/.cursor-plugin/plugins/fuse-typescript/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugins/fuse-typescript/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "fuse-typescript", - "version": "1.0.10", + "version": "1.0.11", "description": "Expert TypeScript 7.0 for pure TS projects — CLI tools, libraries, scripts, and backends on Node 26 LTS (24 in Maintenance LTS) or Bun 1.4, with SOLID principles", "author": { "name": "Fusengine", diff --git a/CHANGELOG.md b/CHANGELOG.md index dbe64e4..7b8162d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## [0.1.13] - 11-11-2026 + +- chore(harness): shared harness minimum raised to `@fusengine/harness` + 0.1.116 (`HARNESS_MIN` in every `hook.sh`) — existing 0.1.115 installs + upgrade at the next session start; fixes the false + `[CONFIRM] Bash file write Shell redirect` on `( … 2>&1) || true` +- docs(license): root MIT `LICENSE` (Copyright (c) 2026 Fusengine Sàrl) and + `docs/decisions.md` decisions journal added; README License section links it +- docs(commit-pro): fuse-commit-pro `LICENSE` holder changed to Fusengine Sàrl +- chore(plugins): PATCH bump, mirrored in `.cursor-plugin/marketplace.json` — + core-guards 1.1.41, fuse-ai-pilot 1.2.48, fuse-cartographer 1.0.16, + fuse-changelog 1.0.18, fuse-commit-pro 1.2.28, fuse-design 2.2.13, + fuse-go 1.0.10, fuse-hermes 1.0.2, fuse-laravel 1.2.12, fuse-lessons 1.0.10, + fuse-nextjs 1.1.28, fuse-php 1.0.11, fuse-react 1.0.25, fuse-rules 1.0.27, + fuse-rust 1.0.11, fuse-security 1.0.22, fuse-seo 1.0.16, + fuse-shadcn-ui 1.0.22, fuse-solid 1.0.23, fuse-swift-apple-expert 1.1.24, + fuse-tailwindcss 1.1.15, fuse-tanstack-start 1.0.9, fuse-typescript 1.0.11 +- chore(marketplace): suite `metadata.version` 0.1.12 → 0.1.13, README version badge updated + ## [0.1.12] - 10-11-2026 - feat(devops): new fuse-devops plugin at 1.0.0 — `devops-expert` agent + 18 diff --git a/README.md b/README.md index 992b2b0..06c6c3e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Fusengine Cursor Plugins -![version](https://img.shields.io/badge/version-0.1.12-blue?style=flat-square) +![version](https://img.shields.io/badge/version-0.1.13-blue?style=flat-square) ![plugins](https://img.shields.io/badge/plugins-26-brightgreen?style=flat-square) ![runtime](https://img.shields.io/badge/runtime-Cursor%20CLI-black?style=flat-square) ![License: MIT](https://img.shields.io/badge/License-MIT-yellow?style=flat-square) diff --git a/docs/decisions.md b/docs/decisions.md index 03f71a8..6919fc5 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -7,3 +7,4 @@ Owner decisions for this repository, dated. Agents execute recorded decisions; a - **2026-11-11 — License.** Owner: « met les licences sous harnes kimi codex claude cursor ». The repository ships the MIT License text of `@fusengine/harness` in a root `LICENSE` (holder per the entry above), so any copy must keep the Fusengine Sàrl copyright notice. Plugin manifests and `marketplace.json` already declare `"license": "MIT"`; no new manifest field is added. - **2026-11-11 — Harness minimum 0.1.116.** Owner: « fais corrigé ». `HARNESS_MIN` is 0.1.116 in every `hook.sh`, so installs at 0.1.115 upgrade at the next session start (0.1.116 fixes the false shell-redirect CONFIRM on `( … 2>&1) || true`). - **2026-11-10 — Releases.** Release only on the owner's go typed in this repository's lead session; a relayed message is never a release go. +- **2026-11-11 — Release 0.1.13.** Owner, typed in this session: « Oui, release 0.1.13 ».