lynxprompt 1.0.4 → 1.0.6

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
@@ -1715,23 +1715,43 @@ function parseVariablesString(varsStr) {
1715
1715
  return variables;
1716
1716
  }
1717
1717
  var PLATFORM_FILES = {
1718
+ // Popular platforms
1719
+ universal: "AGENTS.md",
1718
1720
  agents: "AGENTS.md",
1721
+ // Alias for universal
1719
1722
  cursor: ".cursor/rules/project.mdc",
1720
1723
  claude: "CLAUDE.md",
1721
1724
  copilot: ".github/copilot-instructions.md",
1722
1725
  windsurf: ".windsurfrules",
1726
+ // AI-powered IDEs
1723
1727
  antigravity: "GEMINI.md",
1724
1728
  zed: ".zed/instructions.md",
1725
- aider: ".aider.conf.yml",
1729
+ void: ".void/config.json",
1730
+ trae: ".trae/rules/project.mdc",
1731
+ firebase: ".idx/rules/project.mdc",
1732
+ // Editor extensions
1726
1733
  cline: ".clinerules",
1727
- continue: ".continue/rules.md",
1728
- cody: ".cody/rules.md",
1729
- amazonq: ".amazonq/rules/project.md",
1734
+ roocode: ".roo/rules/project.mdc",
1735
+ continue: ".continue/config.json",
1736
+ cody: ".cody/config.json",
1730
1737
  tabnine: ".tabnine.yaml",
1731
- supermaven: ".supermaven/rules.md",
1732
- codegpt: ".codegpt/rules.md",
1733
- void: ".void/rules.md",
1734
- goose: ".goosehints"
1738
+ supermaven: ".supermaven/config.json",
1739
+ codegpt: ".codegpt/config.json",
1740
+ amazonq: ".amazonq/rules/project.md",
1741
+ augment: ".augment/rules/project.mdc",
1742
+ kilocode: ".kilocode/rules/project.mdc",
1743
+ junie: ".junie/guidelines.md",
1744
+ kiro: ".kiro/steering/project.mdc",
1745
+ // CLI tools
1746
+ aider: ".aider.conf.yml",
1747
+ goose: ".goosehints",
1748
+ warp: "WARP.md",
1749
+ "gemini-cli": "GEMINI.md",
1750
+ opencode: "opencode.json",
1751
+ // Other emerging tools
1752
+ openhands: ".openhands/microagents/repo.md",
1753
+ crush: "CRUSH.md",
1754
+ firebender: "firebender.json"
1735
1755
  };
1736
1756
  var PERSONA_DESCRIPTIONS = {
1737
1757
  backend: "a senior backend developer specializing in APIs, databases, and microservices architecture",
@@ -2155,14 +2175,22 @@ function generateConfig(options) {
2155
2175
  }
2156
2176
  function generateFileContent(options, platform2) {
2157
2177
  const sections = [];
2158
- const isMdc = platform2 === "cursor";
2159
- const isYaml = platform2 === "aider" || platform2 === "tabnine";
2160
- const isPlainText = platform2 === "windsurf" || platform2 === "cline" || platform2 === "goose";
2161
- const isMarkdown = !isMdc && !isYaml && !isPlainText;
2178
+ const mdcPlatforms = ["cursor", "trae", "firebase", "roocode", "augment", "kilocode", "kiro"];
2179
+ const yamlPlatforms = ["aider", "tabnine"];
2180
+ const plainTextPlatforms = ["windsurf", "cline", "goose"];
2181
+ const jsonPlatforms = ["void", "continue", "cody", "supermaven", "codegpt", "opencode", "firebender"];
2182
+ const isMdc = mdcPlatforms.includes(platform2);
2183
+ const isYaml = yamlPlatforms.includes(platform2);
2184
+ const isPlainText = plainTextPlatforms.includes(platform2);
2185
+ const isJson = jsonPlatforms.includes(platform2);
2186
+ const isMarkdown = !isMdc && !isYaml && !isPlainText && !isJson;
2162
2187
  const bp = options.blueprintMode || false;
2163
2188
  if (isYaml) {
2164
2189
  return generateYamlConfig(options, platform2);
2165
2190
  }
2191
+ if (isJson) {
2192
+ return generateJsonConfig(options, platform2);
2193
+ }
2166
2194
  const projectName = bpVar(bp, "PROJECT_NAME", options.name);
2167
2195
  if (isMdc) {
2168
2196
  sections.push("---");
@@ -2786,6 +2814,51 @@ function generateFileContent(options, platform2) {
2786
2814
  }
2787
2815
  return sections.join("\n");
2788
2816
  }
2817
+ function generateJsonConfig(options, platform2) {
2818
+ const config2 = {
2819
+ version: "1.0.0",
2820
+ project: {
2821
+ name: options.name,
2822
+ description: options.description || "",
2823
+ stack: options.stack.map((s) => STACK_NAMES[s] || s)
2824
+ }
2825
+ };
2826
+ const personaDesc = options.userPersona || PERSONA_DESCRIPTIONS[options.persona] || options.persona || "";
2827
+ if (personaDesc) {
2828
+ config2.persona = personaDesc;
2829
+ }
2830
+ const rules = [];
2831
+ const boundaryRules = BOUNDARIES[options.boundaries] || BOUNDARIES.standard;
2832
+ rules.push(...boundaryRules.always.map((r) => `AUTO-APPROVE: ${r}`));
2833
+ rules.push(...boundaryRules.askFirst.map((r) => `ASK FIRST: ${r}`));
2834
+ rules.push(...boundaryRules.never.map((r) => `PROHIBITED: ${r}`));
2835
+ rules.push("SECURITY: Do not commit secrets. Use environment variables or secret managers.");
2836
+ rules.push("SECURITY: When making changes involving auth, data, or APIs, perform security audit.");
2837
+ config2.rules = rules;
2838
+ if (options.importantFiles && options.importantFiles.length > 0) {
2839
+ config2.context = {
2840
+ readFirst: options.importantFiles.map((f) => IMPORTANT_FILES_PATHS[f] || f)
2841
+ };
2842
+ }
2843
+ if (platform2 === "continue") {
2844
+ config2.name = options.name;
2845
+ config2.customInstructions = rules.join("\n");
2846
+ } else if (platform2 === "cody") {
2847
+ config2.customInstructions = rules.join("\n");
2848
+ } else if (platform2 === "void") {
2849
+ config2.editor = { rules: rules.join("\n") };
2850
+ } else if (platform2 === "supermaven") {
2851
+ config2.rules = rules;
2852
+ } else if (platform2 === "codegpt") {
2853
+ config2.systemPrompt = rules.join("\n");
2854
+ } else if (platform2 === "opencode") {
2855
+ config2.instructions = rules;
2856
+ } else if (platform2 === "firebender") {
2857
+ config2.transforms = rules;
2858
+ }
2859
+ config2._comment = `Generated by LynxPrompt CLI for ${options.name}`;
2860
+ return JSON.stringify(config2, null, 2);
2861
+ }
2789
2862
  function generateYamlConfig(options, platform2) {
2790
2863
  const lines = [];
2791
2864
  if (platform2 === "aider") {
@@ -3307,11 +3380,11 @@ var LOGGING_OPTIONS = [
3307
3380
  { id: "other", label: "Other" }
3308
3381
  ];
3309
3382
  var AI_BEHAVIOR_RULES = [
3310
- { id: "always_debug_after_build", label: "Always Debug After Building", description: "Run and test locally after making changes", recommended: true },
3311
- { id: "check_logs_after_build", label: "Check Logs After Build/Commit", description: "Check logs when build or commit finishes", recommended: true },
3312
- { id: "run_tests_before_commit", label: "Run Tests Before Commit", description: "Ensure tests pass before committing", recommended: true },
3313
- { id: "follow_existing_patterns", label: "Follow Existing Patterns", description: "Match the codebase's existing style", recommended: true },
3314
- { id: "ask_before_large_refactors", label: "Ask Before Large Refactors", description: "Confirm before significant changes", recommended: true }
3383
+ { id: "always_debug_after_build", label: "Always Debug After Building", description: "AI should build and run code locally to verify changes work before suggesting them as complete", recommended: true },
3384
+ { id: "check_logs_after_build", label: "Check Logs After Build/Commit", description: "AI should review build output, test logs, and error messages to catch issues early", recommended: true },
3385
+ { id: "run_tests_before_commit", label: "Run Tests Before Commit", description: "AI must run the test suite and ensure all tests pass before suggesting a commit", recommended: true },
3386
+ { id: "follow_existing_patterns", label: "Follow Existing Patterns", description: "AI should study existing code and follow the same naming, structure, and conventions used in the codebase", recommended: true },
3387
+ { id: "ask_before_large_refactors", label: "Ask Before Large Refactors", description: "AI should always ask for explicit approval before making significant architectural changes or refactoring multiple files", recommended: true }
3315
3388
  ];
3316
3389
  var SECRETS_MANAGEMENT_OPTIONS = [
3317
3390
  { id: "env_vars", label: "Environment Variables", description: "Use .env files locally, env vars in prod", recommended: true },
@@ -3409,11 +3482,18 @@ var DATA_HANDLING_OPTIONS = [
3409
3482
  { id: "other", label: "Other", description: "Custom data handling" }
3410
3483
  ];
3411
3484
  var IMPORTANT_FILES = [
3412
- { id: "readme", label: "README.md", icon: "\u{1F4D6} " },
3413
- { id: "package", label: "package.json / pyproject.toml", icon: "\u{1F4E6} " },
3414
- { id: "tsconfig", label: "tsconfig.json / config files", icon: "\u2699\uFE0F " },
3415
- { id: "architecture", label: "ARCHITECTURE.md", icon: "\u{1F3D7}\uFE0F " },
3416
- { id: "contributing", label: "CONTRIBUTING.md", icon: "\u{1F91D} " }
3485
+ { id: "readme", label: "README.md", icon: "\u{1F4D6}", description: "Project overview, setup instructions, and documentation" },
3486
+ { id: "package_json", label: "package.json", icon: "\u{1F4E6}", description: "Dependencies, scripts, and project metadata" },
3487
+ { id: "changelog", label: "CHANGELOG.md", icon: "\u{1F4DD}", description: "Version history and release notes" },
3488
+ { id: "contributing", label: "CONTRIBUTING.md", icon: "\u{1F91D}", description: "Contribution guidelines and code standards" },
3489
+ { id: "makefile", label: "Makefile", icon: "\u{1F527}", description: "Build commands and automation tasks" },
3490
+ { id: "dockerfile", label: "Dockerfile", icon: "\u{1F433}", description: "Container configuration and build steps" },
3491
+ { id: "docker_compose", label: "docker-compose.yml", icon: "\u{1F433}", description: "Multi-container setup and services" },
3492
+ { id: "env_example", label: ".env.example", icon: "\u{1F510}", description: "Environment variables template" },
3493
+ { id: "openapi", label: "openapi.yaml / swagger.json", icon: "\u{1F4E1}", description: "API specification and endpoints" },
3494
+ { id: "architecture_md", label: "ARCHITECTURE.md", icon: "\u{1F3D7}\uFE0F", description: "System architecture and design decisions" },
3495
+ { id: "api_docs", label: "API documentation", icon: "\u{1F4DA}", description: "API reference and usage examples" },
3496
+ { id: "database_schema", label: "Database schema / migrations", icon: "\u{1F5C4}\uFE0F", description: "Database structure and migration files" }
3417
3497
  ];
3418
3498
  var BOUNDARY_OPTIONS = [
3419
3499
  "Delete files",
@@ -3862,7 +3942,7 @@ async function runWizardWithDraftProtection(options) {
3862
3942
  console.log(chalk7.gray(" No project detected in current directory."));
3863
3943
  console.log();
3864
3944
  }
3865
- const canDetectRemote = true;
3945
+ const canDetectRemote = !options.yes;
3866
3946
  if (canDetectRemote) {
3867
3947
  console.log();
3868
3948
  console.log(chalk7.magenta.bold(" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510"));
@@ -4326,11 +4406,14 @@ async function runInteractiveWizard(options, detected, userTier) {
4326
4406
  console.log(chalk7.green(` \u2713 Detected in project: ${detected.stack.join(", ")}`));
4327
4407
  console.log();
4328
4408
  }
4329
- const languageChoices = sortSelectedFirst(LANGUAGES.map((s) => ({
4330
- title: s.title,
4331
- value: s.value,
4332
- selected: detected?.stack?.includes(s.value)
4333
- })));
4409
+ const languageChoices = sortSelectedFirst(LANGUAGES.map((s) => {
4410
+ const isDetected = detected?.stack?.includes(s.value);
4411
+ return {
4412
+ title: isDetected ? `${s.title} ${chalk7.green("(detected)")}` : s.title,
4413
+ value: s.value,
4414
+ selected: isDetected
4415
+ };
4416
+ }));
4334
4417
  const languageResponse = await prompts3({
4335
4418
  type: "autocompleteMultiselect",
4336
4419
  name: "languages",
@@ -4340,11 +4423,14 @@ async function runInteractiveWizard(options, detected, userTier) {
4340
4423
  instructions: false
4341
4424
  }, promptConfig);
4342
4425
  const selectedLanguages = languageResponse.languages || [];
4343
- const frameworkChoices = sortSelectedFirst(FRAMEWORKS.map((s) => ({
4344
- title: s.title,
4345
- value: s.value,
4346
- selected: detected?.stack?.includes(s.value)
4347
- })));
4426
+ const frameworkChoices = sortSelectedFirst(FRAMEWORKS.map((s) => {
4427
+ const isDetected = detected?.stack?.includes(s.value);
4428
+ return {
4429
+ title: isDetected ? `${s.title} ${chalk7.green("(detected)")}` : s.title,
4430
+ value: s.value,
4431
+ selected: isDetected
4432
+ };
4433
+ }));
4348
4434
  const frameworkResponse = await prompts3({
4349
4435
  type: "autocompleteMultiselect",
4350
4436
  name: "frameworks",
@@ -4354,11 +4440,14 @@ async function runInteractiveWizard(options, detected, userTier) {
4354
4440
  instructions: false
4355
4441
  }, promptConfig);
4356
4442
  const selectedFrameworks = frameworkResponse.frameworks || [];
4357
- const databaseChoices = sortSelectedFirst(DATABASES.map((s) => ({
4358
- title: s.title,
4359
- value: s.value,
4360
- selected: detected?.stack?.includes(s.value)
4361
- })));
4443
+ const databaseChoices = sortSelectedFirst(DATABASES.map((s) => {
4444
+ const isDetected = detected?.stack?.includes(s.value);
4445
+ return {
4446
+ title: isDetected ? `${s.title} ${chalk7.green("(detected)")}` : s.title,
4447
+ value: s.value,
4448
+ selected: isDetected
4449
+ };
4450
+ }));
4362
4451
  const databaseResponse = await prompts3({
4363
4452
  type: "autocompleteMultiselect",
4364
4453
  name: "databases",
@@ -4507,18 +4596,24 @@ async function runInteractiveWizard(options, detected, userTier) {
4507
4596
  answers.customRegistryUrl = customRegistryResponse.customRegistryUrl || "";
4508
4597
  }
4509
4598
  }
4599
+ console.log();
4600
+ console.log(chalk7.gray(" \u{1F4DA} Point the AI to a well-structured public repository as a reference."));
4601
+ console.log(chalk7.gray(" The AI will study its code patterns, architecture, and conventions to better assist you."));
4510
4602
  const exampleRepoResponse = await prompts3({
4511
4603
  type: "text",
4512
4604
  name: "exampleRepoUrl",
4513
- message: chalk7.white("Example repository URL (optional):"),
4514
- hint: chalk7.gray("A similar public repo for AI to learn from")
4605
+ message: chalk7.white("Reference repository URL (optional):"),
4606
+ hint: chalk7.gray("e.g., https://github.com/vercel/next.js")
4515
4607
  }, promptConfig);
4516
4608
  answers.exampleRepoUrl = exampleRepoResponse.exampleRepoUrl || "";
4609
+ console.log();
4610
+ console.log(chalk7.gray(" \u{1F4D6} Link to your team's external documentation for project context."));
4611
+ console.log(chalk7.gray(" The AI will read these docs to understand your project's domain and conventions."));
4517
4612
  const docsUrlResponse = await prompts3({
4518
4613
  type: "text",
4519
4614
  name: "documentationUrl",
4520
- message: chalk7.white("External documentation URL (optional):"),
4521
- hint: chalk7.gray("Confluence, Notion, GitBook, etc.")
4615
+ message: chalk7.white("External docs URL (optional):"),
4616
+ hint: chalk7.gray("e.g., Confluence, Notion, GitBook, internal wiki")
4522
4617
  }, promptConfig);
4523
4618
  answers.documentationUrl = docsUrlResponse.documentationUrl || "";
4524
4619
  const securityStep = getCurrentStep("security");
@@ -4544,6 +4639,15 @@ async function runInteractiveWizard(options, detected, userTier) {
4544
4639
  instructions: false
4545
4640
  }, promptConfig);
4546
4641
  answers.secretsManagement = secretsResponse.secretsManagement || [];
4642
+ if (answers.secretsManagement.includes("other")) {
4643
+ const customSecretsResponse = await prompts3({
4644
+ type: "text",
4645
+ name: "customSecretsManagement",
4646
+ message: chalk7.white("Describe your secrets management approach:"),
4647
+ hint: chalk7.gray("e.g., custom KMS integration, proprietary vault")
4648
+ }, promptConfig);
4649
+ answers.secretsManagementOther = customSecretsResponse.customSecretsManagement || "";
4650
+ }
4547
4651
  console.log();
4548
4652
  console.log(chalk7.cyan(" 2\uFE0F\u20E3 Security Tooling"));
4549
4653
  console.log(chalk7.gray(" Security scanning, dependency updates, and vulnerability detection."));
@@ -4562,6 +4666,15 @@ async function runInteractiveWizard(options, detected, userTier) {
4562
4666
  instructions: false
4563
4667
  }, promptConfig);
4564
4668
  answers.securityTooling = securityToolingResponse.securityTooling || [];
4669
+ if (answers.securityTooling.includes("other")) {
4670
+ const customSecurityToolingResponse = await prompts3({
4671
+ type: "text",
4672
+ name: "customSecurityTooling",
4673
+ message: chalk7.white("Describe your security tooling:"),
4674
+ hint: chalk7.gray("e.g., custom SAST tool, internal vulnerability scanner")
4675
+ }, promptConfig);
4676
+ answers.securityToolingOther = customSecurityToolingResponse.customSecurityTooling || "";
4677
+ }
4565
4678
  console.log();
4566
4679
  console.log(chalk7.cyan(" 3\uFE0F\u20E3 Authentication Patterns"));
4567
4680
  console.log(chalk7.gray(" How users and services authenticate with your application."));
@@ -4579,6 +4692,15 @@ async function runInteractiveWizard(options, detected, userTier) {
4579
4692
  instructions: false
4580
4693
  }, promptConfig);
4581
4694
  answers.authPatterns = authPatternsResponse.authPatterns || [];
4695
+ if (answers.authPatterns.includes("other")) {
4696
+ const customAuthResponse = await prompts3({
4697
+ type: "text",
4698
+ name: "customAuthPatterns",
4699
+ message: chalk7.white("Describe your authentication approach:"),
4700
+ hint: chalk7.gray("e.g., custom SSO, proprietary auth system")
4701
+ }, promptConfig);
4702
+ answers.authPatternsOther = customAuthResponse.customAuthPatterns || "";
4703
+ }
4582
4704
  console.log();
4583
4705
  console.log(chalk7.cyan(" 4\uFE0F\u20E3 Data Handling & Compliance"));
4584
4706
  console.log(chalk7.gray(" Data protection, encryption, and compliance requirements."));
@@ -4597,6 +4719,15 @@ async function runInteractiveWizard(options, detected, userTier) {
4597
4719
  instructions: false
4598
4720
  }, promptConfig);
4599
4721
  answers.dataHandling = dataHandlingResponse.dataHandling || [];
4722
+ if (answers.dataHandling.includes("other")) {
4723
+ const customDataHandlingResponse = await prompts3({
4724
+ type: "text",
4725
+ name: "customDataHandling",
4726
+ message: chalk7.white("Describe your data handling policies:"),
4727
+ hint: chalk7.gray("e.g., custom encryption, specific compliance requirements")
4728
+ }, promptConfig);
4729
+ answers.dataHandlingOther = customDataHandlingResponse.customDataHandling || "";
4730
+ }
4600
4731
  const securityNotesResponse = await prompts3({
4601
4732
  type: "text",
4602
4733
  name: "securityNotes",
@@ -4802,24 +4933,50 @@ async function runInteractiveWizard(options, detected, userTier) {
4802
4933
  if (rule) console.log(chalk7.cyan(` \u2022 ${rule.label}`));
4803
4934
  }
4804
4935
  }
4936
+ console.log();
4937
+ console.log(chalk7.gray(" \u{1F4C1} Select files the AI should read first to understand your project context."));
4938
+ console.log(chalk7.gray(" These help the AI understand your codebase, APIs, and conventions."));
4805
4939
  const importantFilesResponse = await prompts3({
4806
4940
  type: "autocompleteMultiselect",
4807
4941
  name: "importantFiles",
4808
4942
  message: chalk7.white("Important files AI should read (type to search):"),
4809
4943
  choices: IMPORTANT_FILES.map((f) => ({
4810
4944
  title: `${f.icon} ${f.label}`,
4811
- value: f.id
4812
- // No pre-selection - user must explicitly choose
4945
+ value: f.id,
4946
+ description: chalk7.gray(f.description)
4813
4947
  })),
4814
4948
  hint: chalk7.gray("type to filter \u2022 space select \u2022 enter confirm"),
4815
4949
  instructions: false
4816
4950
  }, promptConfig);
4817
4951
  answers.importantFiles = importantFilesResponse.importantFiles || [];
4818
4952
  console.log();
4953
+ const customImportantFilesResponse = await prompts3({
4954
+ type: "text",
4955
+ name: "importantFilesOther",
4956
+ message: chalk7.white("Other important files (comma-separated, optional):"),
4957
+ hint: chalk7.gray("e.g., src/config/index.ts, docs/api.md, prisma/schema.prisma")
4958
+ }, promptConfig);
4959
+ answers.importantFilesOther = customImportantFilesResponse.importantFilesOther || "";
4960
+ console.log();
4819
4961
  console.log(chalk7.gray(" \u2500\u2500\u2500 Cloud & AI Options \u2500\u2500\u2500"));
4820
4962
  console.log();
4821
- console.log(chalk7.gray(" \u{1F4E4} Save your config to LynxPrompt cloud and add a curl command to auto-update."));
4822
- console.log(chalk7.gray(" When you run the curl, your local config syncs with cloud changes."));
4963
+ console.log(chalk7.gray(" \u{1F9E0} Enable AI to suggest improvements to your config file."));
4964
+ console.log(chalk7.gray(" When enabled, the AI can propose updates to this AGENTS.md file"));
4965
+ console.log(chalk7.gray(" (e.g., better rules, new patterns) and you approve the changes."));
4966
+ const selfImproveResponse = await prompts3({
4967
+ type: "toggle",
4968
+ name: "selfImprove",
4969
+ message: chalk7.white("Allow AI to suggest config improvements?"),
4970
+ initial: false,
4971
+ active: "Yes",
4972
+ inactive: "No",
4973
+ hint: chalk7.gray("AI proposes updates, you approve")
4974
+ }, promptConfig);
4975
+ answers.selfImprove = selfImproveResponse.selfImprove || false;
4976
+ console.log();
4977
+ console.log(chalk7.gray(" \u2601\uFE0F Save your config to LynxPrompt cloud for automatic updates."));
4978
+ console.log(chalk7.gray(" When you update the blueprint online, the AI can run the sync command"));
4979
+ console.log(chalk7.gray(" to fetch the latest version automatically."));
4823
4980
  const enableAutoUpdateResponse = await prompts3({
4824
4981
  type: "toggle",
4825
4982
  name: "enableAutoUpdate",
@@ -4827,28 +4984,37 @@ async function runInteractiveWizard(options, detected, userTier) {
4827
4984
  initial: false,
4828
4985
  active: "Yes",
4829
4986
  inactive: "No",
4830
- hint: chalk7.gray("Adds curl command for automatic updates")
4987
+ hint: chalk7.gray("Adds sync command for automatic updates")
4831
4988
  }, promptConfig);
4832
4989
  answers.enableAutoUpdate = enableAutoUpdateResponse.enableAutoUpdate || false;
4990
+ answers.preferCliSync = false;
4991
+ if (answers.enableAutoUpdate && api) {
4992
+ console.log();
4993
+ console.log(chalk7.gray(" \u{1F4E5} Choose how the AI should sync updates from the cloud:"));
4994
+ console.log(chalk7.gray(" \u2022 CLI: Uses 'lynxp pull' command (requires CLI installed in dev environment)"));
4995
+ console.log(chalk7.gray(" \u2022 curl: Uses curl command with API (works everywhere, but exposes token in file)"));
4996
+ const syncMethodResponse = await prompts3({
4997
+ type: "toggle",
4998
+ name: "preferCliSync",
4999
+ message: chalk7.white("Will you have LynxPrompt CLI available in your dev environment?"),
5000
+ initial: true,
5001
+ active: "Yes (use CLI)",
5002
+ inactive: "No (use curl)",
5003
+ hint: chalk7.gray("CLI is recommended - no token in file")
5004
+ }, promptConfig);
5005
+ answers.preferCliSync = syncMethodResponse.preferCliSync ?? true;
5006
+ if (answers.preferCliSync) {
5007
+ console.log(chalk7.green(" \u2713 Great! AI will use 'lynxp pull' to sync (no API token in file)"));
5008
+ } else {
5009
+ console.log(chalk7.yellow(" \u26A0\uFE0F Using curl with API token. The token will be visible in your config file."));
5010
+ }
5011
+ }
4833
5012
  if (answers.enableAutoUpdate && !api) {
4834
5013
  console.log(chalk7.yellow(" \u26A0\uFE0F Cloud sync requires login. Run 'lynxp login' first."));
4835
5014
  console.log(chalk7.gray(" Continuing without cloud sync..."));
4836
5015
  answers.enableAutoUpdate = false;
4837
5016
  }
4838
5017
  console.log();
4839
- console.log(chalk7.gray(" \u{1F9E0} Self-improving blueprints track your manual edits and suggest improvements."));
4840
- console.log(chalk7.gray(" LynxPrompt learns your preferences to generate better configs over time."));
4841
- const selfImproveResponse = await prompts3({
4842
- type: "toggle",
4843
- name: "selfImprove",
4844
- message: chalk7.white("Enable AI learning from your edits?"),
4845
- initial: false,
4846
- active: "Yes",
4847
- inactive: "No",
4848
- hint: chalk7.gray("AI learns your style from manual changes")
4849
- }, promptConfig);
4850
- answers.selfImprove = selfImproveResponse.selfImprove || false;
4851
- console.log();
4852
5018
  console.log(chalk7.gray(" \u{1F464} Include your profile info (name, email, persona) in the generated config."));
4853
5019
  console.log(chalk7.gray(" This helps AI tools personalize responses to your expertise level."));
4854
5020
  const includePersonalResponse = await prompts3({