@qlucent/fishi 0.15.0 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +47 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2566,13 +2566,18 @@ import {
|
|
|
2566
2566
|
getSandboxPolicyTemplate,
|
|
2567
2567
|
getMonitorEmitterScript,
|
|
2568
2568
|
getFileLockHookScript,
|
|
2569
|
+
getPhaseGuardHook,
|
|
2569
2570
|
getSessionStartHook,
|
|
2570
2571
|
getAutoCheckpointHook,
|
|
2571
2572
|
getAgentCompleteHook,
|
|
2572
2573
|
getGateManagerScript,
|
|
2573
|
-
getWorktreeManagerScript
|
|
2574
|
+
getWorktreeManagerScript,
|
|
2575
|
+
getInitCommand,
|
|
2576
|
+
getStatusCommand,
|
|
2577
|
+
getGateCommand,
|
|
2578
|
+
getBoardCommand
|
|
2574
2579
|
} from "@qlucent/fishi-core";
|
|
2575
|
-
var CURRENT_VERSION = "0.
|
|
2580
|
+
var CURRENT_VERSION = "0.16.0";
|
|
2576
2581
|
function fixHooksFormat(settings) {
|
|
2577
2582
|
if (!settings.hooks) return false;
|
|
2578
2583
|
let fixed = false;
|
|
@@ -2698,7 +2703,8 @@ async function upgradeCommand() {
|
|
|
2698
2703
|
{ name: "gate-manager.mjs", getter: getGateManagerScript },
|
|
2699
2704
|
{ name: "worktree-manager.mjs", getter: getWorktreeManagerScript },
|
|
2700
2705
|
{ name: "monitor-emitter.mjs", getter: getMonitorEmitterScript },
|
|
2701
|
-
{ name: "file-lock-hook.mjs", getter: getFileLockHookScript }
|
|
2706
|
+
{ name: "file-lock-hook.mjs", getter: getFileLockHookScript },
|
|
2707
|
+
{ name: "phase-guard.mjs", getter: getPhaseGuardHook }
|
|
2702
2708
|
];
|
|
2703
2709
|
const scriptsDir = path16.join(targetDir, ".fishi", "scripts");
|
|
2704
2710
|
if (fs16.existsSync(scriptsDir)) {
|
|
@@ -2711,6 +2717,43 @@ async function upgradeCommand() {
|
|
|
2711
2717
|
}
|
|
2712
2718
|
}
|
|
2713
2719
|
}
|
|
2720
|
+
const commandsDir = path16.join(targetDir, ".claude", "commands");
|
|
2721
|
+
if (fs16.existsSync(commandsDir)) {
|
|
2722
|
+
const commandsToRegenerate = [
|
|
2723
|
+
{ name: "fishi-init.md", getter: getInitCommand },
|
|
2724
|
+
{ name: "fishi-status.md", getter: getStatusCommand },
|
|
2725
|
+
{ name: "fishi-gate.md", getter: getGateCommand },
|
|
2726
|
+
{ name: "fishi-board.md", getter: getBoardCommand }
|
|
2727
|
+
];
|
|
2728
|
+
for (const cmd of commandsToRegenerate) {
|
|
2729
|
+
try {
|
|
2730
|
+
fs16.writeFileSync(path16.join(commandsDir, cmd.name), cmd.getter(), "utf-8");
|
|
2731
|
+
updated.push(`.claude/commands/${cmd.name} (orchestration enforcement)`);
|
|
2732
|
+
} catch {
|
|
2733
|
+
}
|
|
2734
|
+
}
|
|
2735
|
+
}
|
|
2736
|
+
const settingsPath2 = path16.join(targetDir, ".claude", "settings.json");
|
|
2737
|
+
if (fs16.existsSync(settingsPath2)) {
|
|
2738
|
+
try {
|
|
2739
|
+
const existing2 = JSON.parse(fs16.readFileSync(settingsPath2, "utf-8"));
|
|
2740
|
+
const preToolUse = existing2.hooks?.PreToolUse || [];
|
|
2741
|
+
const hasPhaseGuard = preToolUse.some(
|
|
2742
|
+
(h) => h.hooks?.some((hook) => hook.command?.includes("phase-guard"))
|
|
2743
|
+
);
|
|
2744
|
+
if (!hasPhaseGuard) {
|
|
2745
|
+
if (!existing2.hooks) existing2.hooks = {};
|
|
2746
|
+
if (!existing2.hooks.PreToolUse) existing2.hooks.PreToolUse = [];
|
|
2747
|
+
existing2.hooks.PreToolUse.push({
|
|
2748
|
+
matcher: "Write|Edit",
|
|
2749
|
+
hooks: [{ type: "command", command: "node .fishi/scripts/phase-guard.mjs" }]
|
|
2750
|
+
});
|
|
2751
|
+
fs16.writeFileSync(settingsPath2, JSON.stringify(existing2, null, 2) + "\n", "utf-8");
|
|
2752
|
+
updated.push(".claude/settings.json (added phase-guard hook)");
|
|
2753
|
+
}
|
|
2754
|
+
} catch {
|
|
2755
|
+
}
|
|
2756
|
+
}
|
|
2714
2757
|
spinner.succeed("Upgrade complete");
|
|
2715
2758
|
console.log("");
|
|
2716
2759
|
if (updated.length > 0) {
|
|
@@ -2735,7 +2778,7 @@ async function upgradeCommand() {
|
|
|
2735
2778
|
var program = new Command();
|
|
2736
2779
|
program.name("fishi").description(
|
|
2737
2780
|
chalk15.cyan("\u{1F41F} FISHI") + " \u2014 AI-Powered Software Delivery Pipeline\n Autonomous AI development with human governance"
|
|
2738
|
-
).version("0.
|
|
2781
|
+
).version("0.16.1");
|
|
2739
2782
|
program.command("init").description("Initialize FISHI in the current directory").argument("[description]", "Project description (skip wizard with zero-config)").option("-l, --language <lang>", "Primary language (e.g., typescript, python)").option("-f, --framework <framework>", "Framework (e.g., nextjs, express, django)").option(
|
|
2740
2783
|
"-c, --cost-mode <mode>",
|
|
2741
2784
|
"Cost mode: performance | balanced | economy",
|