@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/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
- // src/services/config.ts
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 document = data.document || data;
1825
+ const document2 = data.document || data;
1823
1826
  return {
1824
1827
  id: nodeId || fileKey,
1825
- name: document.name || "\u672A\u547D\u540D\u8BBE\u8BA1\u7A3F",
1828
+ name: document2.name || "\u672A\u547D\u540D\u8BBE\u8BA1\u7A3F",
1826
1829
  platform: "figma",
1827
1830
  url,
1828
- width: document.absoluteBoundingBox?.width || 0,
1829
- height: document.absoluteBoundingBox?.height || 0,
1831
+ width: document2.absoluteBoundingBox?.width || 0,
1832
+ height: document2.absoluteBoundingBox?.height || 0,
1830
1833
  scale: 1,
1831
- layers: this.parseFigmaLayers(document.children || []),
1832
- styles: this.extractStylesFromDocument(document),
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(document) {
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(document);
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
- await workflow.initialize(cwd);
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
- // src/commands/runner.ts
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);