@nick848/sf-cli 1.0.0 → 1.0.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/README.md +61 -0
- package/dist/cli/index.js +212 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.mts +254 -245
- package/dist/index.d.ts +254 -245
- package/dist/index.js +169 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +158 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -12,6 +12,7 @@ var chalk9 = require('chalk');
|
|
|
12
12
|
var uuid = require('uuid');
|
|
13
13
|
var enquirer = require('enquirer');
|
|
14
14
|
var child_process = require('child_process');
|
|
15
|
+
var module$1 = require('module');
|
|
15
16
|
|
|
16
17
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
18
|
|
|
@@ -40,7 +41,9 @@ var crypto__namespace = /*#__PURE__*/_interopNamespace(crypto);
|
|
|
40
41
|
var os__namespace = /*#__PURE__*/_interopNamespace(os);
|
|
41
42
|
var chalk9__default = /*#__PURE__*/_interopDefault(chalk9);
|
|
42
43
|
|
|
43
|
-
//
|
|
44
|
+
// node_modules/tsup/assets/cjs_shims.js
|
|
45
|
+
var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
|
|
46
|
+
var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
|
|
44
47
|
var DEFAULT_CONFIG = {
|
|
45
48
|
model: "GLM-5",
|
|
46
49
|
apiKey: "",
|
|
@@ -1819,17 +1822,17 @@ var FigmaMCPAdapter = class extends MCPAdapterBase {
|
|
|
1819
1822
|
* 解析设计规格
|
|
1820
1823
|
*/
|
|
1821
1824
|
parseDesignSpec(data, url, fileKey, nodeId) {
|
|
1822
|
-
const
|
|
1825
|
+
const document2 = data.document || data;
|
|
1823
1826
|
return {
|
|
1824
1827
|
id: nodeId || fileKey,
|
|
1825
|
-
name:
|
|
1828
|
+
name: document2.name || "\u672A\u547D\u540D\u8BBE\u8BA1\u7A3F",
|
|
1826
1829
|
platform: "figma",
|
|
1827
1830
|
url,
|
|
1828
|
-
width:
|
|
1829
|
-
height:
|
|
1831
|
+
width: document2.absoluteBoundingBox?.width || 0,
|
|
1832
|
+
height: document2.absoluteBoundingBox?.height || 0,
|
|
1830
1833
|
scale: 1,
|
|
1831
|
-
layers: this.parseFigmaLayers(
|
|
1832
|
-
styles: this.extractStylesFromDocument(
|
|
1834
|
+
layers: this.parseFigmaLayers(document2.children || []),
|
|
1835
|
+
styles: this.extractStylesFromDocument(document2),
|
|
1833
1836
|
assets: this.parseAssets(data.assets || []),
|
|
1834
1837
|
extractedAt: /* @__PURE__ */ new Date()
|
|
1835
1838
|
};
|
|
@@ -1925,7 +1928,7 @@ var FigmaMCPAdapter = class extends MCPAdapterBase {
|
|
|
1925
1928
|
/**
|
|
1926
1929
|
* 从文档提取全局样式
|
|
1927
1930
|
*/
|
|
1928
|
-
extractStylesFromDocument(
|
|
1931
|
+
extractStylesFromDocument(document2) {
|
|
1929
1932
|
const styles = {
|
|
1930
1933
|
colors: [],
|
|
1931
1934
|
typography: [],
|
|
@@ -1951,7 +1954,7 @@ var FigmaMCPAdapter = class extends MCPAdapterBase {
|
|
|
1951
1954
|
node.children.forEach(traverse);
|
|
1952
1955
|
}
|
|
1953
1956
|
};
|
|
1954
|
-
traverse(
|
|
1957
|
+
traverse(document2);
|
|
1955
1958
|
styles.colors = this.deduplicateColors(styles.colors);
|
|
1956
1959
|
styles.typography = this.deduplicateTypography(styles.typography);
|
|
1957
1960
|
return styles;
|
|
@@ -6651,15 +6654,32 @@ var MAX_FILE_SIZE2 = 1024 * 1024;
|
|
|
6651
6654
|
var COMPLEXITY_THRESHOLD = 6;
|
|
6652
6655
|
async function handleNew(args, ctx) {
|
|
6653
6656
|
const workingDir = ctx.options.workingDirectory;
|
|
6657
|
+
const workflowEngine = ctx.workflowEngine;
|
|
6658
|
+
if (workflowEngine) {
|
|
6659
|
+
const existingState = workflowEngine.getState();
|
|
6660
|
+
if (existingState && existingState.status === "running") {
|
|
6661
|
+
return {
|
|
6662
|
+
output: chalk9__default.default.yellow("\u5F53\u524D\u5DF2\u6709\u6D3B\u8DC3\u7684\u5DE5\u4F5C\u6D41") + chalk9__default.default.gray(`
|
|
6663
|
+
|
|
6664
|
+
\u5DE5\u4F5C\u6D41: ${existingState.title}`) + chalk9__default.default.gray(`
|
|
6665
|
+
\u5F53\u524D\u9636\u6BB5: ${existingState.currentStep}`) + chalk9__default.default.gray(`
|
|
6666
|
+
|
|
6667
|
+
\u9009\u9879:`) + chalk9__default.default.gray(`
|
|
6668
|
+
1. \u7EE7\u7EED\u5F53\u524D\u5DE5\u4F5C\u6D41: /opsx:${existingState.currentStep}`) + chalk9__default.default.gray(`
|
|
6669
|
+
2. \u53D6\u6D88\u5F53\u524D\u5DE5\u4F5C\u6D41: /opsx:cancel`) + chalk9__default.default.gray(`
|
|
6670
|
+
3. \u67E5\u770B\u5DE5\u4F5C\u6D41\u72B6\u6001: /opsx:status`)
|
|
6671
|
+
};
|
|
6672
|
+
}
|
|
6673
|
+
}
|
|
6654
6674
|
const { requirement, forceComplexity } = parseArgs(args);
|
|
6655
6675
|
if (!requirement) {
|
|
6656
6676
|
return {
|
|
6657
6677
|
output: chalk9__default.default.red("\u8BF7\u8F93\u5165\u9700\u6C42\u63CF\u8FF0") + chalk9__default.default.gray("\n\u7528\u6CD5: /new <\u9700\u6C42\u63CF\u8FF0>") + chalk9__default.default.gray("\n\u9009\u9879:") + chalk9__default.default.gray("\n --simple \u5F3A\u5236\u4F7F\u7528\u7B80\u5355\u6D41\u7A0B") + chalk9__default.default.gray("\n --complex \u5F3A\u5236\u4F7F\u7528\u590D\u6742\u6D41\u7A0B")
|
|
6658
6678
|
};
|
|
6659
6679
|
}
|
|
6660
|
-
return newFeature({ requirement, forceComplexity }, workingDir);
|
|
6680
|
+
return newFeature({ requirement, forceComplexity }, workingDir, workflowEngine);
|
|
6661
6681
|
}
|
|
6662
|
-
async function newFeature(options, workingDir) {
|
|
6682
|
+
async function newFeature(options, workingDir, workflowEngine) {
|
|
6663
6683
|
const cwd = workingDir || process.cwd();
|
|
6664
6684
|
const { requirement, forceComplexity } = options;
|
|
6665
6685
|
try {
|
|
@@ -6677,8 +6697,10 @@ async function newFeature(options, workingDir) {
|
|
|
6677
6697
|
try {
|
|
6678
6698
|
const context = await readProjectContext(cwd);
|
|
6679
6699
|
const analysis = forceComplexity ? createForcedAnalysis(forceComplexity) : analyzeComplexity(requirement, context);
|
|
6680
|
-
const workflow = new WorkflowEngine();
|
|
6681
|
-
|
|
6700
|
+
const workflow = workflowEngine || new WorkflowEngine();
|
|
6701
|
+
if (!workflowEngine) {
|
|
6702
|
+
await workflow.initialize(cwd);
|
|
6703
|
+
}
|
|
6682
6704
|
const state = await workflow.start(requirement, analysis.score, {
|
|
6683
6705
|
title: extractTitle(requirement)
|
|
6684
6706
|
});
|
|
@@ -7232,8 +7254,9 @@ ${generateConfirmationPrompt(e.point)}`) + chalk9__default.default.cyan(`
|
|
|
7232
7254
|
throw e;
|
|
7233
7255
|
}
|
|
7234
7256
|
}
|
|
7235
|
-
|
|
7236
|
-
|
|
7257
|
+
var require2 = module$1.createRequire(importMetaUrl);
|
|
7258
|
+
var packageJson = require2("../../package.json");
|
|
7259
|
+
var VERSION2 = packageJson.version;
|
|
7237
7260
|
async function runSlashCommand(command, args, ctx) {
|
|
7238
7261
|
const normalizedCommand = normalizeCommand(command);
|
|
7239
7262
|
switch (normalizedCommand) {
|
|
@@ -7261,6 +7284,11 @@ async function runSlashCommand(command, args, ctx) {
|
|
|
7261
7284
|
case "new":
|
|
7262
7285
|
case "n":
|
|
7263
7286
|
return handleNew(args, ctx);
|
|
7287
|
+
case "version":
|
|
7288
|
+
case "v":
|
|
7289
|
+
return {
|
|
7290
|
+
output: chalk9__default.default.cyan(`sf-cli v${VERSION2}`)
|
|
7291
|
+
};
|
|
7264
7292
|
default:
|
|
7265
7293
|
if (normalizedCommand.startsWith("opsx:")) {
|
|
7266
7294
|
return handleOpsx(normalizedCommand, args, ctx);
|
|
@@ -7371,12 +7399,75 @@ async function handleNaturalLanguage(input, ctx) {
|
|
|
7371
7399
|
}
|
|
7372
7400
|
|
|
7373
7401
|
// src/cli/executor.ts
|
|
7402
|
+
var ALLOWED_COMMANDS_WITHOUT_WORKFLOW = [
|
|
7403
|
+
"help",
|
|
7404
|
+
"h",
|
|
7405
|
+
"?",
|
|
7406
|
+
"init",
|
|
7407
|
+
"i",
|
|
7408
|
+
"model",
|
|
7409
|
+
"m",
|
|
7410
|
+
"new",
|
|
7411
|
+
"n",
|
|
7412
|
+
"exit",
|
|
7413
|
+
"e",
|
|
7414
|
+
"q",
|
|
7415
|
+
"quit",
|
|
7416
|
+
"clear",
|
|
7417
|
+
"c",
|
|
7418
|
+
"update",
|
|
7419
|
+
"u",
|
|
7420
|
+
"version",
|
|
7421
|
+
"v"
|
|
7422
|
+
];
|
|
7423
|
+
var STAGE_PERMISSIONS = {
|
|
7424
|
+
"explore": {
|
|
7425
|
+
canRead: true,
|
|
7426
|
+
canWrite: false,
|
|
7427
|
+
canRunShell: false,
|
|
7428
|
+
allowedAgents: ["architect"]
|
|
7429
|
+
},
|
|
7430
|
+
"new": {
|
|
7431
|
+
canRead: true,
|
|
7432
|
+
canWrite: true,
|
|
7433
|
+
canRunShell: false,
|
|
7434
|
+
allowedAgents: ["frontend-dev", "architect"]
|
|
7435
|
+
},
|
|
7436
|
+
"continue": {
|
|
7437
|
+
canRead: true,
|
|
7438
|
+
canWrite: true,
|
|
7439
|
+
canRunShell: true,
|
|
7440
|
+
allowedAgents: ["frontend-dev", "tester"]
|
|
7441
|
+
},
|
|
7442
|
+
"propose": {
|
|
7443
|
+
canRead: true,
|
|
7444
|
+
canWrite: true,
|
|
7445
|
+
canRunShell: true,
|
|
7446
|
+
allowedAgents: ["frontend-dev"]
|
|
7447
|
+
},
|
|
7448
|
+
"apply": {
|
|
7449
|
+
canRead: true,
|
|
7450
|
+
canWrite: true,
|
|
7451
|
+
canRunShell: true,
|
|
7452
|
+
allowedAgents: ["code-reviewer"]
|
|
7453
|
+
},
|
|
7454
|
+
"archive": {
|
|
7455
|
+
canRead: true,
|
|
7456
|
+
canWrite: false,
|
|
7457
|
+
canRunShell: false,
|
|
7458
|
+
allowedAgents: []
|
|
7459
|
+
}
|
|
7460
|
+
};
|
|
7374
7461
|
var CommandExecutor = class {
|
|
7375
7462
|
async execute(parseResult, ctx) {
|
|
7376
7463
|
if (!parseResult.success || !parseResult.command) {
|
|
7377
7464
|
return { output: chalk9__default.default.red(`\u9519\u8BEF: ${parseResult.error}`) };
|
|
7378
7465
|
}
|
|
7379
7466
|
const { command } = parseResult;
|
|
7467
|
+
const workflowCheck = this.checkWorkflowPermission(command, ctx);
|
|
7468
|
+
if (!workflowCheck.allowed) {
|
|
7469
|
+
return { output: workflowCheck.message };
|
|
7470
|
+
}
|
|
7380
7471
|
switch (command.type) {
|
|
7381
7472
|
case "slash" /* SLASH */:
|
|
7382
7473
|
return this.executeSlashCommand(command, ctx);
|
|
@@ -7394,13 +7485,75 @@ var CommandExecutor = class {
|
|
|
7394
7485
|
return { output: chalk9__default.default.red("\u672A\u77E5\u7684\u547D\u4EE4\u7C7B\u578B") };
|
|
7395
7486
|
}
|
|
7396
7487
|
}
|
|
7488
|
+
/**
|
|
7489
|
+
* 检查工作流权限
|
|
7490
|
+
*/
|
|
7491
|
+
checkWorkflowPermission(command, ctx) {
|
|
7492
|
+
const workflowEngine = ctx.workflowEngine;
|
|
7493
|
+
const workflowState = workflowEngine?.getState();
|
|
7494
|
+
if (!workflowState) {
|
|
7495
|
+
if (command.type === "slash" /* SLASH */) {
|
|
7496
|
+
const cmd = command.command?.toLowerCase();
|
|
7497
|
+
if (!ALLOWED_COMMANDS_WITHOUT_WORKFLOW.includes(cmd)) {
|
|
7498
|
+
return {
|
|
7499
|
+
allowed: false,
|
|
7500
|
+
message: chalk9__default.default.yellow("\u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u7684\u5DE5\u4F5C\u6D41") + chalk9__default.default.gray("\n\u8BF7\u5148\u4F7F\u7528 ") + chalk9__default.default.cyan("/new <\u9700\u6C42\u63CF\u8FF0>") + chalk9__default.default.gray(" \u542F\u52A8\u65B0\u5DE5\u4F5C\u6D41")
|
|
7501
|
+
};
|
|
7502
|
+
}
|
|
7503
|
+
}
|
|
7504
|
+
if (command.type === "natural" /* NATURAL */) {
|
|
7505
|
+
return {
|
|
7506
|
+
allowed: false,
|
|
7507
|
+
message: chalk9__default.default.yellow("\u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u7684\u5DE5\u4F5C\u6D41") + chalk9__default.default.gray("\n\u8BF7\u5148\u4F7F\u7528 ") + chalk9__default.default.cyan("/new <\u9700\u6C42\u63CF\u8FF0>") + chalk9__default.default.gray(" \u542F\u52A8\u65B0\u5DE5\u4F5C\u6D41")
|
|
7508
|
+
};
|
|
7509
|
+
}
|
|
7510
|
+
if (command.type === "dollar" /* DOLLAR */) {
|
|
7511
|
+
return {
|
|
7512
|
+
allowed: false,
|
|
7513
|
+
message: chalk9__default.default.yellow("\u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u7684\u5DE5\u4F5C\u6D41\uFF0C\u65E0\u6CD5\u8C03\u7528 Agent") + chalk9__default.default.gray("\n\u8BF7\u5148\u4F7F\u7528 ") + chalk9__default.default.cyan("/new <\u9700\u6C42\u63CF\u8FF0>") + chalk9__default.default.gray(" \u542F\u52A8\u65B0\u5DE5\u4F5C\u6D41")
|
|
7514
|
+
};
|
|
7515
|
+
}
|
|
7516
|
+
if (command.type === "shell" /* SHELL */) {
|
|
7517
|
+
return {
|
|
7518
|
+
allowed: false,
|
|
7519
|
+
message: chalk9__default.default.yellow("\u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u7684\u5DE5\u4F5C\u6D41\uFF0C\u65E0\u6CD5\u6267\u884C Shell \u547D\u4EE4") + chalk9__default.default.gray("\n\u8BF7\u5148\u4F7F\u7528 ") + chalk9__default.default.cyan("/new <\u9700\u6C42\u63CF\u8FF0>") + chalk9__default.default.gray(" \u542F\u52A8\u65B0\u5DE5\u4F5C\u6D41")
|
|
7520
|
+
};
|
|
7521
|
+
}
|
|
7522
|
+
return { allowed: true };
|
|
7523
|
+
}
|
|
7524
|
+
const currentStep = workflowState.currentStep;
|
|
7525
|
+
const permissions = STAGE_PERMISSIONS[currentStep];
|
|
7526
|
+
if (command.type === "at" /* AT */ && !permissions.canRead) {
|
|
7527
|
+
return {
|
|
7528
|
+
allowed: false,
|
|
7529
|
+
message: chalk9__default.default.yellow(`\u5F53\u524D\u9636\u6BB5 [${currentStep}] \u4E0D\u5141\u8BB8\u8BFB\u53D6\u6587\u4EF6`)
|
|
7530
|
+
};
|
|
7531
|
+
}
|
|
7532
|
+
if (command.type === "dollar" /* DOLLAR */) {
|
|
7533
|
+
const agentId = command.agent?.toLowerCase().replace("$", "");
|
|
7534
|
+
if (!permissions.allowedAgents.includes(agentId)) {
|
|
7535
|
+
return {
|
|
7536
|
+
allowed: false,
|
|
7537
|
+
message: chalk9__default.default.yellow(`\u5F53\u524D\u9636\u6BB5 [${currentStep}] \u4E0D\u5141\u8BB8\u8C03\u7528 $${agentId} Agent`) + chalk9__default.default.gray(`
|
|
7538
|
+
\u5F53\u524D\u9636\u6BB5\u5141\u8BB8\u7684 Agent: ${permissions.allowedAgents.map((a) => `$${a}`).join(", ") || "\u65E0"}`)
|
|
7539
|
+
};
|
|
7540
|
+
}
|
|
7541
|
+
}
|
|
7542
|
+
if (command.type === "shell" /* SHELL */ && !permissions.canRunShell) {
|
|
7543
|
+
return {
|
|
7544
|
+
allowed: false,
|
|
7545
|
+
message: chalk9__default.default.yellow(`\u5F53\u524D\u9636\u6BB5 [${currentStep}] \u4E0D\u5141\u8BB8\u6267\u884C Shell \u547D\u4EE4`)
|
|
7546
|
+
};
|
|
7547
|
+
}
|
|
7548
|
+
return { allowed: true };
|
|
7549
|
+
}
|
|
7397
7550
|
async executeSlashCommand(command, ctx) {
|
|
7398
7551
|
const result = await runSlashCommand(
|
|
7399
7552
|
command.command,
|
|
7400
7553
|
command.args || [],
|
|
7401
7554
|
ctx
|
|
7402
7555
|
);
|
|
7403
|
-
return { output: result.output };
|
|
7556
|
+
return { output: result.output, exit: result.exit };
|
|
7404
7557
|
}
|
|
7405
7558
|
async executeFileReference(command, ctx) {
|
|
7406
7559
|
const result = await handleFileReference(command.path, ctx);
|