@qlucent/fishi 0.12.0 → 0.14.2
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 +109 -5
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
4
|
import { Command } from "commander";
|
|
5
|
-
import
|
|
5
|
+
import chalk14 from "chalk";
|
|
6
6
|
|
|
7
7
|
// src/commands/init.ts
|
|
8
8
|
import chalk from "chalk";
|
|
@@ -953,8 +953,8 @@ async function initCommand(description, options) {
|
|
|
953
953
|
const targetDir = process.cwd();
|
|
954
954
|
const projectName = path3.basename(targetDir);
|
|
955
955
|
console.log("");
|
|
956
|
-
console.log(chalk.cyan.bold(" \u{1F41F} FISHI \u2014
|
|
957
|
-
console.log(chalk.gray(" Autonomous
|
|
956
|
+
console.log(chalk.cyan.bold(" \u{1F41F} FISHI \u2014 AI-Powered Software Delivery Pipeline"));
|
|
957
|
+
console.log(chalk.gray(" Autonomous AI development with human governance"));
|
|
958
958
|
console.log("");
|
|
959
959
|
if (fs3.existsSync(path3.join(targetDir, ".fishi"))) {
|
|
960
960
|
if (options.interactive !== false) {
|
|
@@ -2359,11 +2359,114 @@ async function securityCommand(action, options) {
|
|
|
2359
2359
|
}
|
|
2360
2360
|
}
|
|
2361
2361
|
|
|
2362
|
+
// src/commands/patterns.ts
|
|
2363
|
+
import chalk13 from "chalk";
|
|
2364
|
+
import fs15 from "fs";
|
|
2365
|
+
import path15 from "path";
|
|
2366
|
+
import {
|
|
2367
|
+
getPatternCategories,
|
|
2368
|
+
getPattern,
|
|
2369
|
+
searchPatterns,
|
|
2370
|
+
saveSelectedPatterns,
|
|
2371
|
+
readSelectedPatterns,
|
|
2372
|
+
generatePatternGuide
|
|
2373
|
+
} from "@qlucent/fishi-core";
|
|
2374
|
+
async function patternsCommand(action, options) {
|
|
2375
|
+
const targetDir = process.cwd();
|
|
2376
|
+
if (action === "list") {
|
|
2377
|
+
console.log("");
|
|
2378
|
+
console.log(chalk13.cyan.bold(" FISHI Pattern Marketplace"));
|
|
2379
|
+
console.log(chalk13.gray(" Pre-built architectural blueprints for common integrations"));
|
|
2380
|
+
console.log("");
|
|
2381
|
+
const categories = getPatternCategories();
|
|
2382
|
+
for (const cat of categories) {
|
|
2383
|
+
console.log(chalk13.white.bold(` ${cat.name}`));
|
|
2384
|
+
console.log(chalk13.gray(` ${cat.description}`));
|
|
2385
|
+
for (const p of cat.patterns) {
|
|
2386
|
+
console.log(chalk13.gray(` - ${chalk13.cyan(p.id)} \u2014 ${p.name} (${p.tools.join(", ")})`));
|
|
2387
|
+
}
|
|
2388
|
+
console.log("");
|
|
2389
|
+
}
|
|
2390
|
+
const total = categories.reduce((s, c) => s + c.patterns.length, 0);
|
|
2391
|
+
console.log(chalk13.gray(` ${categories.length} categories, ${total} patterns available`));
|
|
2392
|
+
console.log("");
|
|
2393
|
+
} else if (action === "search") {
|
|
2394
|
+
if (!options.query) {
|
|
2395
|
+
console.log(chalk13.yellow(' Usage: fishi patterns search --query "stripe"'));
|
|
2396
|
+
return;
|
|
2397
|
+
}
|
|
2398
|
+
const results = searchPatterns(options.query);
|
|
2399
|
+
console.log("");
|
|
2400
|
+
console.log(chalk13.cyan.bold(` Search: "${options.query}" \u2014 ${results.length} results`));
|
|
2401
|
+
console.log("");
|
|
2402
|
+
for (const p of results) {
|
|
2403
|
+
console.log(` ${chalk13.cyan(p.id)} \u2014 ${p.name} [${p.category}]`);
|
|
2404
|
+
console.log(chalk13.gray(` ${p.description}`));
|
|
2405
|
+
console.log(chalk13.gray(` Tools: ${p.tools.join(", ")}`));
|
|
2406
|
+
console.log("");
|
|
2407
|
+
}
|
|
2408
|
+
} else if (action === "info") {
|
|
2409
|
+
if (!options.query) {
|
|
2410
|
+
console.log(chalk13.yellow(' Usage: fishi patterns info --query "stripe"'));
|
|
2411
|
+
return;
|
|
2412
|
+
}
|
|
2413
|
+
const pattern = getPattern(options.query);
|
|
2414
|
+
if (!pattern) {
|
|
2415
|
+
console.log(chalk13.yellow(` Pattern "${options.query}" not found. Run: fishi patterns list`));
|
|
2416
|
+
return;
|
|
2417
|
+
}
|
|
2418
|
+
console.log("");
|
|
2419
|
+
console.log(chalk13.cyan.bold(` ${pattern.name}`));
|
|
2420
|
+
console.log(chalk13.gray(` Category: ${pattern.category}`));
|
|
2421
|
+
console.log(chalk13.gray(` Tools: ${pattern.tools.join(", ")}`));
|
|
2422
|
+
console.log("");
|
|
2423
|
+
console.log(pattern.guide);
|
|
2424
|
+
} else if (action === "select") {
|
|
2425
|
+
if (!options.query) {
|
|
2426
|
+
console.log(chalk13.yellow(' Usage: fishi patterns select --query "stripe,auth0,sendgrid"'));
|
|
2427
|
+
return;
|
|
2428
|
+
}
|
|
2429
|
+
const ids = options.query.split(",").map((s) => s.trim());
|
|
2430
|
+
const valid = [];
|
|
2431
|
+
const invalid = [];
|
|
2432
|
+
for (const id of ids) {
|
|
2433
|
+
if (getPattern(id)) valid.push(id);
|
|
2434
|
+
else invalid.push(id);
|
|
2435
|
+
}
|
|
2436
|
+
if (invalid.length > 0) {
|
|
2437
|
+
console.log(chalk13.yellow(` Unknown patterns: ${invalid.join(", ")}`));
|
|
2438
|
+
}
|
|
2439
|
+
if (valid.length > 0) {
|
|
2440
|
+
saveSelectedPatterns(targetDir, valid);
|
|
2441
|
+
const guide = generatePatternGuide(valid);
|
|
2442
|
+
const guidePath = path15.join(targetDir, ".fishi", "patterns-guide.md");
|
|
2443
|
+
fs15.writeFileSync(guidePath, guide, "utf-8");
|
|
2444
|
+
console.log(chalk13.green(` Selected ${valid.length} patterns: ${valid.join(", ")}`));
|
|
2445
|
+
console.log(chalk13.green(` Guide saved to .fishi/patterns-guide.md`));
|
|
2446
|
+
}
|
|
2447
|
+
} else if (action === "selected") {
|
|
2448
|
+
const selected = readSelectedPatterns(targetDir);
|
|
2449
|
+
if (selected.length === 0) {
|
|
2450
|
+
console.log(chalk13.gray(' No patterns selected. Run: fishi patterns select --query "stripe,auth0"'));
|
|
2451
|
+
return;
|
|
2452
|
+
}
|
|
2453
|
+
console.log("");
|
|
2454
|
+
console.log(chalk13.cyan.bold(" Selected Patterns"));
|
|
2455
|
+
for (const id of selected) {
|
|
2456
|
+
const p = getPattern(id);
|
|
2457
|
+
if (p) console.log(` ${chalk13.cyan(p.id)} \u2014 ${p.name} (${p.tools.join(", ")})`);
|
|
2458
|
+
}
|
|
2459
|
+
console.log("");
|
|
2460
|
+
} else {
|
|
2461
|
+
console.log(chalk13.yellow(` Unknown action: ${action}. Use: list, search, info, select, selected`));
|
|
2462
|
+
}
|
|
2463
|
+
}
|
|
2464
|
+
|
|
2362
2465
|
// src/index.ts
|
|
2363
2466
|
var program = new Command();
|
|
2364
2467
|
program.name("fishi").description(
|
|
2365
|
-
|
|
2366
|
-
).version("0.
|
|
2468
|
+
chalk14.cyan("\u{1F41F} FISHI") + " \u2014 AI-Powered Software Delivery Pipeline\n Autonomous AI development with human governance"
|
|
2469
|
+
).version("0.14.2");
|
|
2367
2470
|
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(
|
|
2368
2471
|
"-c, --cost-mode <mode>",
|
|
2369
2472
|
"Cost mode: performance | balanced | economy",
|
|
@@ -2380,4 +2483,5 @@ program.command("quickstart").description("Vibe mode \u2014 skip gates, scaffold
|
|
|
2380
2483
|
program.command("preview").description("Start live preview dev server").option("--dev-cmd <cmd>", "Custom dev server command").option("--port <port>", "Dev server port").action(previewCommand);
|
|
2381
2484
|
program.command("design").description("Design system \u2014 detect tokens, init design system, validate with Brand Guardian").argument("<action>", "Action: detect | init | validate").option("-o, --output <path>", "Output path for design config").action(designCommand);
|
|
2382
2485
|
program.command("security").description("Security scanner \u2014 native SAST + OWASP vulnerability detection").argument("<action>", "Action: scan | rules").option("-o, --output <path>", "Save report to file").option("--json", "Output as JSON").action(securityCommand);
|
|
2486
|
+
program.command("patterns").description("Pattern marketplace \u2014 browse, search, select integration blueprints").argument("<action>", "Action: list | search | info | select | selected").option("-q, --query <query>", "Search query or pattern ID(s)").option("-c, --category <category>", "Filter by category").option("-o, --output <path>", "Save guide to file").action(patternsCommand);
|
|
2383
2487
|
program.parse();
|