@qlucent/fishi 0.8.0 → 0.9.0
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 +99 -3
- 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 chalk12 from "chalk";
|
|
6
6
|
|
|
7
7
|
// src/commands/init.ts
|
|
8
8
|
import chalk from "chalk";
|
|
@@ -2161,11 +2161,106 @@ async function previewCommand(options) {
|
|
|
2161
2161
|
});
|
|
2162
2162
|
}
|
|
2163
2163
|
|
|
2164
|
+
// src/commands/design.ts
|
|
2165
|
+
import chalk11 from "chalk";
|
|
2166
|
+
import fs13 from "fs";
|
|
2167
|
+
import path13 from "path";
|
|
2168
|
+
import {
|
|
2169
|
+
detectDesignTokens,
|
|
2170
|
+
generateDefaultTokens,
|
|
2171
|
+
detectComponentRegistry,
|
|
2172
|
+
runBrandGuardian,
|
|
2173
|
+
generateDesignSystemConfig
|
|
2174
|
+
} from "@qlucent/fishi-core";
|
|
2175
|
+
async function designCommand(action, options) {
|
|
2176
|
+
const targetDir = process.cwd();
|
|
2177
|
+
if (action === "detect") {
|
|
2178
|
+
console.log("");
|
|
2179
|
+
console.log(chalk11.cyan.bold(" FISHI Design System \u2014 Detect"));
|
|
2180
|
+
console.log("");
|
|
2181
|
+
const tokens = detectDesignTokens(targetDir);
|
|
2182
|
+
const registry = detectComponentRegistry(targetDir);
|
|
2183
|
+
console.log(chalk11.white.bold(" Design Tokens"));
|
|
2184
|
+
console.log(chalk11.gray(` Colors: ${Object.keys(tokens.colors).length} detected`));
|
|
2185
|
+
console.log(chalk11.gray(` Typography: ${tokens.typography.fontFamilies.length} font families, ${Object.keys(tokens.typography.scale).length} scale values`));
|
|
2186
|
+
console.log(chalk11.gray(` Spacing: ${Object.keys(tokens.spacing).length} values`));
|
|
2187
|
+
console.log(chalk11.gray(` Border radius: ${Object.keys(tokens.borderRadius).length} values`));
|
|
2188
|
+
console.log(chalk11.gray(` Dark mode: ${tokens.darkMode ? chalk11.green("yes") : chalk11.yellow("no")}`));
|
|
2189
|
+
console.log("");
|
|
2190
|
+
console.log(chalk11.white.bold(" Component Registry"));
|
|
2191
|
+
console.log(chalk11.gray(` Library: ${registry.library || "none detected"}`));
|
|
2192
|
+
console.log(chalk11.gray(` Framework: ${registry.framework || "none detected"}`));
|
|
2193
|
+
console.log(chalk11.gray(` Components: ${registry.components.length} found`));
|
|
2194
|
+
if (registry.components.length > 0) {
|
|
2195
|
+
const byType = {};
|
|
2196
|
+
for (const c of registry.components) byType[c.type] = (byType[c.type] || 0) + 1;
|
|
2197
|
+
for (const [type, count] of Object.entries(byType)) {
|
|
2198
|
+
console.log(chalk11.gray(` ${type}: ${count}`));
|
|
2199
|
+
}
|
|
2200
|
+
}
|
|
2201
|
+
console.log("");
|
|
2202
|
+
if (options.output || fs13.existsSync(path13.join(targetDir, ".fishi"))) {
|
|
2203
|
+
const outputPath = options.output || path13.join(targetDir, ".fishi", "design-system.json");
|
|
2204
|
+
const dir = path13.dirname(outputPath);
|
|
2205
|
+
if (!fs13.existsSync(dir)) fs13.mkdirSync(dir, { recursive: true });
|
|
2206
|
+
fs13.writeFileSync(outputPath, generateDesignSystemConfig(tokens, registry), "utf-8");
|
|
2207
|
+
console.log(chalk11.green(` Saved to ${path13.relative(targetDir, outputPath)}`));
|
|
2208
|
+
}
|
|
2209
|
+
} else if (action === "init") {
|
|
2210
|
+
console.log("");
|
|
2211
|
+
console.log(chalk11.cyan.bold(" FISHI Design System \u2014 Initialize"));
|
|
2212
|
+
console.log("");
|
|
2213
|
+
let tokens = detectDesignTokens(targetDir);
|
|
2214
|
+
const hasExisting = Object.keys(tokens.colors).length > 0;
|
|
2215
|
+
if (!hasExisting) {
|
|
2216
|
+
tokens = generateDefaultTokens();
|
|
2217
|
+
console.log(chalk11.yellow(" No design tokens found \u2014 using FISHI defaults."));
|
|
2218
|
+
} else {
|
|
2219
|
+
console.log(chalk11.green(` Detected ${Object.keys(tokens.colors).length} colors from your project.`));
|
|
2220
|
+
}
|
|
2221
|
+
const registry = detectComponentRegistry(targetDir);
|
|
2222
|
+
const outputPath = path13.join(targetDir, ".fishi", "design-system.json");
|
|
2223
|
+
const dir = path13.dirname(outputPath);
|
|
2224
|
+
if (!fs13.existsSync(dir)) fs13.mkdirSync(dir, { recursive: true });
|
|
2225
|
+
fs13.writeFileSync(outputPath, generateDesignSystemConfig(tokens, registry), "utf-8");
|
|
2226
|
+
console.log(chalk11.green(` Design system saved to .fishi/design-system.json`));
|
|
2227
|
+
console.log(chalk11.gray(" Your agents will use these tokens for consistent styling."));
|
|
2228
|
+
console.log("");
|
|
2229
|
+
} else if (action === "validate") {
|
|
2230
|
+
console.log("");
|
|
2231
|
+
console.log(chalk11.cyan.bold(" FISHI Brand Guardian \u2014 Validation"));
|
|
2232
|
+
console.log("");
|
|
2233
|
+
const tokens = detectDesignTokens(targetDir);
|
|
2234
|
+
const report = runBrandGuardian(targetDir, tokens);
|
|
2235
|
+
if (report.issues.length === 0) {
|
|
2236
|
+
console.log(chalk11.green(" No issues found! Your frontend follows the design system."));
|
|
2237
|
+
} else {
|
|
2238
|
+
for (const issue of report.issues) {
|
|
2239
|
+
const icon = issue.severity === "error" ? chalk11.red("ERROR") : issue.severity === "warning" ? chalk11.yellow("WARN") : chalk11.blue("INFO");
|
|
2240
|
+
console.log(` ${icon} ${chalk11.gray(issue.file)}:${issue.line}`);
|
|
2241
|
+
console.log(` ${issue.message}`);
|
|
2242
|
+
if (issue.fix) console.log(` ${chalk11.gray("Fix: " + issue.fix)}`);
|
|
2243
|
+
}
|
|
2244
|
+
}
|
|
2245
|
+
console.log("");
|
|
2246
|
+
console.log(chalk11.white.bold(" Summary"));
|
|
2247
|
+
console.log(chalk11.gray(` Files scanned: ${report.stats.filesScanned}`));
|
|
2248
|
+
console.log(chalk11.red(` Errors: ${report.stats.errors}`));
|
|
2249
|
+
console.log(chalk11.yellow(` Warnings: ${report.stats.warnings}`));
|
|
2250
|
+
console.log(chalk11.blue(` Info: ${report.stats.infos}`));
|
|
2251
|
+
console.log(` Status: ${report.passed ? chalk11.green("PASSED") : chalk11.red("FAILED")}`);
|
|
2252
|
+
console.log("");
|
|
2253
|
+
if (!report.passed) process.exit(1);
|
|
2254
|
+
} else {
|
|
2255
|
+
console.log(chalk11.yellow(` Unknown action: ${action}. Use: detect, init, validate`));
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
|
|
2164
2259
|
// src/index.ts
|
|
2165
2260
|
var program = new Command();
|
|
2166
2261
|
program.name("fishi").description(
|
|
2167
|
-
|
|
2168
|
-
).version("0.
|
|
2262
|
+
chalk12.cyan("\u{1F41F} FISHI") + " \u2014 Your AI Dev Team That Actually Ships\n Autonomous agent framework for Claude Code"
|
|
2263
|
+
).version("0.9.0");
|
|
2169
2264
|
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(
|
|
2170
2265
|
"-c, --cost-mode <mode>",
|
|
2171
2266
|
"Cost mode: performance | balanced | economy",
|
|
@@ -2180,4 +2275,5 @@ program.command("dashboard").description("Agent observability \u2014 web dashboa
|
|
|
2180
2275
|
program.command("sandbox").description("Sandbox status and policy management").argument("<action>", "Action: status | policy").action(sandboxCommand);
|
|
2181
2276
|
program.command("quickstart").description("Vibe mode \u2014 skip gates, scaffold + start dev server immediately").argument("[description]", "What are you building?").option("-l, --language <lang>", "Primary language").option("-f, --framework <framework>", "Framework").option("-c, --cost-mode <mode>", "Cost mode", "balanced").option("--dev-cmd <cmd>", "Custom dev server command").option("--port <port>", "Dev server port").action(quickstartCommand);
|
|
2182
2277
|
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);
|
|
2278
|
+
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);
|
|
2183
2279
|
program.parse();
|