lynxprompt 2.1.38 → 2.1.39

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
@@ -14,26 +14,30 @@ import Conf from "conf";
14
14
  import { chmodSync } from "fs";
15
15
  var config = new Conf({
16
16
  projectName: "lynxprompt",
17
- // The file holds the API token: readable by its owner only.
17
+ // The file holds API tokens: readable by its owner only.
18
18
  configFileMode: 384,
19
19
  schema: {
20
- token: {
21
- type: "string"
22
- },
23
- tokenApiUrl: {
24
- type: "string"
25
- },
26
20
  apiUrl: {
27
21
  type: "string",
28
22
  default: "https://lynxprompt.com"
29
23
  },
30
- user: {
24
+ tokens: {
31
25
  type: "object",
32
- properties: {
33
- id: { type: "string" },
34
- email: { type: "string" },
35
- name: { type: ["string", "null"] },
36
- plan: { type: "string" }
26
+ additionalProperties: {
27
+ type: "object",
28
+ properties: {
29
+ token: { type: "string" },
30
+ user: {
31
+ type: "object",
32
+ properties: {
33
+ id: { type: "string" },
34
+ email: { type: "string" },
35
+ name: { type: ["string", "null"] },
36
+ plan: { type: "string" }
37
+ }
38
+ }
39
+ },
40
+ required: ["token"]
37
41
  }
38
42
  }
39
43
  },
@@ -48,38 +52,60 @@ try {
48
52
  function normalizeUrl(url) {
49
53
  return url.replace(/\/+$/, "");
50
54
  }
51
- if (config.get("token") && !config.get("tokenApiUrl")) {
52
- config.set("tokenApiUrl", normalizeUrl(config.get("apiUrl")));
55
+ function getLogins() {
56
+ return config.get("tokens") ?? {};
53
57
  }
54
- function storedTokenMatchesApiUrl() {
55
- return config.get("tokenApiUrl") === normalizeUrl(getApiUrl());
58
+ function setLogins(logins) {
59
+ if (Object.keys(logins).length === 0) {
60
+ config.delete("tokens");
61
+ } else {
62
+ config.set("tokens", logins);
63
+ }
64
+ }
65
+ var legacyToken = config.get("token");
66
+ if (legacyToken) {
67
+ const url = normalizeUrl(config.get("tokenApiUrl") ?? config.get("apiUrl"));
68
+ const logins = getLogins();
69
+ if (!logins[url]) {
70
+ const user = config.get("user");
71
+ logins[url] = user ? { token: legacyToken, user } : { token: legacyToken };
72
+ setLogins(logins);
73
+ }
74
+ }
75
+ for (const key of ["token", "tokenApiUrl", "user"]) {
76
+ if (config.has(key)) config.delete(key);
77
+ }
78
+ function currentLogin() {
79
+ return getLogins()[normalizeUrl(getApiUrl())];
56
80
  }
57
81
  function getToken() {
58
82
  const envToken = process.env.LYNXPROMPT_TOKEN;
59
83
  if (envToken) {
60
84
  return envToken;
61
85
  }
62
- if (!storedTokenMatchesApiUrl()) {
63
- return void 0;
64
- }
65
- return config.get("token");
86
+ return currentLogin()?.token;
66
87
  }
67
88
  function setToken(token) {
68
- config.set("token", token);
69
- config.set("tokenApiUrl", normalizeUrl(getApiUrl()));
89
+ const logins = getLogins();
90
+ logins[normalizeUrl(getApiUrl())] = { token };
91
+ setLogins(logins);
70
92
  }
71
93
  function getStoredCredentials() {
72
- const token = config.get("token");
73
- const apiUrl = config.get("tokenApiUrl");
74
- if (!token || !apiUrl) {
94
+ const apiUrl = normalizeUrl(getApiUrl());
95
+ const login = getLogins()[apiUrl];
96
+ if (!login) {
75
97
  return void 0;
76
98
  }
77
- return { token, apiUrl, email: config.get("user")?.email };
99
+ return { token: login.token, apiUrl, email: login.user?.email };
100
+ }
101
+ function getOtherLoggedInUrls() {
102
+ const current = normalizeUrl(getApiUrl());
103
+ return Object.keys(getLogins()).filter((url) => url !== current);
78
104
  }
79
105
  function clearToken() {
80
- config.delete("token");
81
- config.delete("tokenApiUrl");
82
- config.delete("user");
106
+ const logins = getLogins();
107
+ delete logins[normalizeUrl(getApiUrl())];
108
+ setLogins(logins);
83
109
  }
84
110
  function getApiUrl() {
85
111
  const envUrl = process.env.LYNXPROMPT_API_URL;
@@ -91,14 +117,21 @@ function getApiUrl() {
91
117
  function setApiUrl(url) {
92
118
  config.set("apiUrl", url);
93
119
  }
120
+ function resetApiUrl() {
121
+ config.reset("apiUrl");
122
+ return config.get("apiUrl");
123
+ }
94
124
  function getUser() {
95
- if (!process.env.LYNXPROMPT_TOKEN && !storedTokenMatchesApiUrl()) {
96
- return void 0;
97
- }
98
- return config.get("user");
125
+ return currentLogin()?.user;
99
126
  }
100
127
  function setUser(user) {
101
- config.set("user", user);
128
+ const url = normalizeUrl(getApiUrl());
129
+ const logins = getLogins();
130
+ if (!logins[url]) {
131
+ return;
132
+ }
133
+ logins[url] = { ...logins[url], user };
134
+ setLogins(logins);
102
135
  }
103
136
  function isAuthenticated() {
104
137
  return !!getToken();
@@ -473,7 +506,8 @@ import chalk2 from "chalk";
473
506
  async function logoutCommand() {
474
507
  const stored = getStoredCredentials();
475
508
  if (!stored) {
476
- console.log(chalk2.yellow("You are not currently logged in."));
509
+ console.log(chalk2.yellow(`You are not logged in at ${getApiUrl()}.`));
510
+ printOtherLogins();
477
511
  return;
478
512
  }
479
513
  const revoked = await api.revokeToken(stored.apiUrl, stored.token);
@@ -488,6 +522,13 @@ async function logoutCommand() {
488
522
  )
489
523
  );
490
524
  }
525
+ printOtherLogins();
526
+ }
527
+ function printOtherLogins() {
528
+ const others = getOtherLoggedInUrls();
529
+ if (others.length === 0) return;
530
+ console.log(chalk2.gray(` Still logged in at: ${others.join(", ")}`));
531
+ console.log(chalk2.gray(" Switch with 'lynxp config set-url <url>' and run 'lynxp logout' there."));
491
532
  }
492
533
 
493
534
  // src/commands/whoami.ts
@@ -768,6 +809,563 @@ async function checkSyncStatus(cwd) {
768
809
  // src/utils/blueprint-files.ts
769
810
  import path from "path";
770
811
 
812
+ // ../packages/shared/src/platforms.ts
813
+ var PLATFORMS = [
814
+ // ========================================
815
+ // POPULAR - Featured platforms (shown first)
816
+ // ========================================
817
+ {
818
+ id: "universal",
819
+ name: "Universal (AGENTS.md)",
820
+ file: "AGENTS.md",
821
+ blueprintType: "AGENTS_MD",
822
+ icon: "\u{1F310}",
823
+ gradient: "from-violet-500 to-purple-500",
824
+ note: "Works with Claude Code, Copilot, Aider, and many others",
825
+ category: "popular",
826
+ format: "markdown",
827
+ featured: true,
828
+ url: "https://agents-md.dev"
829
+ },
830
+ {
831
+ id: "cursor",
832
+ name: "Cursor",
833
+ file: ".cursor/rules/project.mdc",
834
+ rulesDirectory: ".cursor/rules/",
835
+ blueprintType: "CURSOR_RULES",
836
+ icon: "\u26A1",
837
+ gradient: "from-blue-500 to-cyan-500",
838
+ note: "AI-powered code editor with native rules",
839
+ category: "popular",
840
+ format: "mdc",
841
+ featured: true,
842
+ url: "https://cursor.com"
843
+ },
844
+ {
845
+ id: "claude",
846
+ name: "Claude Code",
847
+ file: "CLAUDE.md",
848
+ blueprintType: "CLAUDE_MD",
849
+ icon: "\u{1F9E0}",
850
+ gradient: "from-orange-500 to-amber-500",
851
+ note: "Anthropic's agentic coding tool",
852
+ category: "popular",
853
+ format: "markdown",
854
+ featured: true,
855
+ url: "https://docs.anthropic.com/en/docs/claude-code"
856
+ },
857
+ {
858
+ id: "copilot",
859
+ name: "GitHub Copilot",
860
+ file: ".github/copilot-instructions.md",
861
+ blueprintType: "COPILOT_INSTRUCTIONS",
862
+ icon: "\u{1F419}",
863
+ gradient: "from-gray-600 to-gray-800",
864
+ note: "GitHub's AI pair programmer",
865
+ category: "popular",
866
+ format: "markdown",
867
+ featured: true,
868
+ url: "https://github.com/features/copilot"
869
+ },
870
+ {
871
+ id: "windsurf",
872
+ name: "Windsurf",
873
+ file: ".windsurfrules",
874
+ blueprintType: "WINDSURF_RULES",
875
+ icon: "\u{1F3C4}",
876
+ gradient: "from-teal-500 to-emerald-500",
877
+ note: "Codeium's AI-native IDE",
878
+ category: "popular",
879
+ format: "text",
880
+ featured: true,
881
+ url: "https://windsurf.com"
882
+ },
883
+ // ========================================
884
+ // AI-POWERED IDEs
885
+ // ========================================
886
+ {
887
+ id: "antigravity",
888
+ name: "Antigravity",
889
+ file: "GEMINI.md",
890
+ blueprintType: "GEMINI_MD",
891
+ icon: "\u{1F48E}",
892
+ gradient: "from-blue-600 to-indigo-600",
893
+ note: "Google's Gemini-powered IDE",
894
+ category: "ide",
895
+ format: "markdown",
896
+ featured: true,
897
+ url: "https://idx.google.com"
898
+ },
899
+ {
900
+ id: "zed",
901
+ name: "Zed",
902
+ file: ".rules",
903
+ blueprintType: "ZED_INSTRUCTIONS",
904
+ icon: "\u26A1",
905
+ gradient: "from-amber-500 to-yellow-500",
906
+ note: "High-performance editor with AI",
907
+ category: "ide",
908
+ format: "markdown",
909
+ url: "https://zed.dev"
910
+ },
911
+ {
912
+ id: "void",
913
+ name: "Void",
914
+ file: ".void/config.json",
915
+ blueprintType: "VOID_CONFIG",
916
+ icon: "\u{1F573}\uFE0F",
917
+ gradient: "from-slate-600 to-slate-800",
918
+ note: "Open-source Cursor alternative",
919
+ category: "ide",
920
+ format: "json",
921
+ url: "https://voideditor.com"
922
+ },
923
+ {
924
+ id: "trae",
925
+ name: "Trae AI",
926
+ file: ".trae/rules/project_rules.md",
927
+ rulesDirectory: ".trae/rules/",
928
+ blueprintType: "TRAE_RULES",
929
+ icon: "\u{1F537}",
930
+ gradient: "from-blue-400 to-blue-600",
931
+ note: "ByteDance's AI IDE",
932
+ category: "ide",
933
+ format: "markdown",
934
+ url: "https://trae.ai"
935
+ },
936
+ {
937
+ id: "firebase",
938
+ name: "Firebase Studio",
939
+ file: ".idx/airules.md",
940
+ blueprintType: "IDX_CONFIG",
941
+ icon: "\u{1F525}",
942
+ gradient: "from-yellow-500 to-orange-500",
943
+ note: "Google's cloud IDE",
944
+ category: "ide",
945
+ format: "markdown",
946
+ url: "https://idx.dev"
947
+ },
948
+ // ========================================
949
+ // EDITOR EXTENSIONS & PLUGINS
950
+ // ========================================
951
+ {
952
+ id: "cline",
953
+ name: "Cline",
954
+ file: ".clinerules",
955
+ blueprintType: "CLINE_RULES",
956
+ icon: "\u{1F527}",
957
+ gradient: "from-purple-500 to-pink-500",
958
+ note: "Autonomous coding agent for VS Code",
959
+ category: "editor",
960
+ format: "text",
961
+ url: "https://cline.bot"
962
+ },
963
+ {
964
+ id: "roocode",
965
+ name: "Roo Code",
966
+ file: ".roo/rules/project.md",
967
+ rulesDirectory: ".roo/rules/",
968
+ blueprintType: "ROO_RULES",
969
+ icon: "\u{1F998}",
970
+ gradient: "from-orange-400 to-red-500",
971
+ note: "AI coding assistant for VS Code",
972
+ category: "editor",
973
+ format: "markdown",
974
+ url: "https://roocode.com"
975
+ },
976
+ {
977
+ id: "continue",
978
+ name: "Continue",
979
+ file: ".continue/config.json",
980
+ blueprintType: "CONTINUE_CONFIG",
981
+ icon: "\u27A1\uFE0F",
982
+ gradient: "from-blue-600 to-indigo-500",
983
+ note: "Open-source AI autopilot",
984
+ category: "editor",
985
+ format: "json",
986
+ url: "https://continue.dev"
987
+ },
988
+ {
989
+ id: "cody",
990
+ name: "Sourcegraph Cody",
991
+ file: ".cody/config.json",
992
+ blueprintType: "CODY_CONFIG",
993
+ icon: "\u{1F50D}",
994
+ gradient: "from-pink-500 to-rose-500",
995
+ note: "Context-aware AI assistant",
996
+ category: "editor",
997
+ format: "json",
998
+ url: "https://sourcegraph.com/cody"
999
+ },
1000
+ {
1001
+ id: "tabnine",
1002
+ name: "Tabnine",
1003
+ file: ".tabnine.yaml",
1004
+ blueprintType: "TABNINE_CONFIG",
1005
+ icon: "\u{1F4DD}",
1006
+ gradient: "from-cyan-500 to-blue-500",
1007
+ note: "AI code completion",
1008
+ category: "editor",
1009
+ format: "yaml",
1010
+ url: "https://tabnine.com"
1011
+ },
1012
+ {
1013
+ id: "supermaven",
1014
+ name: "Supermaven",
1015
+ file: ".supermaven/config.json",
1016
+ icon: "\u{1F9B8}",
1017
+ gradient: "from-amber-500 to-orange-500",
1018
+ note: "Fast AI code completions",
1019
+ category: "editor",
1020
+ format: "json",
1021
+ url: "https://supermaven.com"
1022
+ },
1023
+ {
1024
+ id: "codegpt",
1025
+ name: "CodeGPT",
1026
+ file: ".codegpt/config.json",
1027
+ icon: "\u{1F4AC}",
1028
+ gradient: "from-emerald-500 to-teal-500",
1029
+ note: "VS Code AI assistant",
1030
+ category: "editor",
1031
+ format: "json",
1032
+ url: "https://codegpt.co"
1033
+ },
1034
+ {
1035
+ id: "amazonq",
1036
+ name: "Amazon Q",
1037
+ file: ".amazonq/rules/project.md",
1038
+ rulesDirectory: ".amazonq/rules/",
1039
+ blueprintType: "AMAZONQ_RULES",
1040
+ icon: "\u{1F4E6}",
1041
+ gradient: "from-orange-400 to-amber-500",
1042
+ note: "AWS AI coding companion",
1043
+ category: "editor",
1044
+ format: "markdown",
1045
+ url: "https://aws.amazon.com/q/developer/"
1046
+ },
1047
+ {
1048
+ id: "augment",
1049
+ name: "Augment Code",
1050
+ file: ".augment/rules/project.md",
1051
+ rulesDirectory: ".augment/rules/",
1052
+ blueprintType: "AUGMENT_RULES",
1053
+ icon: "\u{1F52E}",
1054
+ gradient: "from-violet-500 to-purple-600",
1055
+ note: "AI code augmentation",
1056
+ category: "editor",
1057
+ format: "markdown",
1058
+ url: "https://augmentcode.com"
1059
+ },
1060
+ {
1061
+ id: "kilocode",
1062
+ name: "Kilo Code",
1063
+ file: ".kilocode/rules/project.md",
1064
+ rulesDirectory: ".kilocode/rules/",
1065
+ blueprintType: "KILOCODE_RULES",
1066
+ icon: "\u{1F4CA}",
1067
+ gradient: "from-green-500 to-emerald-500",
1068
+ note: "AI code generation",
1069
+ category: "editor",
1070
+ format: "markdown",
1071
+ url: "https://kilocode.ai"
1072
+ },
1073
+ {
1074
+ id: "junie",
1075
+ name: "Junie",
1076
+ file: ".junie/guidelines.md",
1077
+ blueprintType: "JUNIE_GUIDELINES",
1078
+ icon: "\u{1F3AF}",
1079
+ gradient: "from-pink-400 to-rose-500",
1080
+ note: "JetBrains AI assistant",
1081
+ category: "editor",
1082
+ format: "markdown",
1083
+ url: "https://www.jetbrains.com/junie/"
1084
+ },
1085
+ {
1086
+ id: "kiro",
1087
+ name: "Kiro",
1088
+ file: ".kiro/steering/project.md",
1089
+ rulesDirectory: ".kiro/steering/",
1090
+ blueprintType: "KIRO_STEERING",
1091
+ icon: "\u{1F680}",
1092
+ gradient: "from-blue-500 to-purple-500",
1093
+ note: "AWS spec-driven agent",
1094
+ category: "editor",
1095
+ format: "markdown",
1096
+ url: "https://kiro.dev"
1097
+ },
1098
+ // ========================================
1099
+ // CLI TOOLS
1100
+ // ========================================
1101
+ {
1102
+ id: "aider",
1103
+ name: "Aider",
1104
+ file: "CONVENTIONS.md",
1105
+ blueprintType: "AIDER_MD",
1106
+ icon: "\u{1F916}",
1107
+ gradient: "from-green-500 to-lime-500",
1108
+ note: "AI pair programming in terminal",
1109
+ category: "cli",
1110
+ format: "markdown",
1111
+ url: "https://aider.chat"
1112
+ },
1113
+ {
1114
+ id: "goose",
1115
+ name: "Goose",
1116
+ file: ".goosehints",
1117
+ blueprintType: "GOOSEHINTS",
1118
+ icon: "\u{1FABF}",
1119
+ gradient: "from-gray-500 to-gray-700",
1120
+ note: "Block's AI coding agent",
1121
+ category: "cli",
1122
+ format: "text",
1123
+ url: "https://github.com/block/goose"
1124
+ },
1125
+ {
1126
+ id: "warp",
1127
+ name: "Warp AI",
1128
+ file: "WARP.md",
1129
+ blueprintType: "WARP_MD",
1130
+ icon: "\u{1F680}",
1131
+ gradient: "from-purple-500 to-pink-500",
1132
+ note: "AI-powered terminal",
1133
+ category: "cli",
1134
+ format: "markdown",
1135
+ url: "https://warp.dev"
1136
+ },
1137
+ {
1138
+ id: "gemini-cli",
1139
+ name: "Gemini CLI",
1140
+ file: "GEMINI.md",
1141
+ blueprintType: "GEMINI_MD",
1142
+ icon: "\u{1F48E}",
1143
+ gradient: "from-blue-500 to-cyan-500",
1144
+ note: "Google's Gemini in terminal",
1145
+ category: "cli",
1146
+ format: "markdown",
1147
+ url: "https://github.com/google-gemini/gemini-cli"
1148
+ },
1149
+ {
1150
+ id: "opencode",
1151
+ name: "Open Code",
1152
+ file: "AGENTS.md",
1153
+ blueprintType: "OPENCODE_JSON",
1154
+ icon: "\u{1F513}",
1155
+ gradient: "from-gray-600 to-gray-800",
1156
+ note: "Open-source AI coding agent (reads AGENTS.md)",
1157
+ category: "cli",
1158
+ format: "markdown",
1159
+ url: "https://opencode.ai"
1160
+ },
1161
+ // ========================================
1162
+ // OTHER EMERGING TOOLS
1163
+ // ========================================
1164
+ {
1165
+ id: "openhands",
1166
+ name: "OpenHands",
1167
+ file: ".openhands/microagents/repo.md",
1168
+ blueprintType: "OPENHANDS_MD",
1169
+ icon: "\u{1F932}",
1170
+ gradient: "from-indigo-500 to-purple-500",
1171
+ note: "Open-source AI agent",
1172
+ category: "other",
1173
+ format: "markdown",
1174
+ url: "https://github.com/All-Hands-AI/OpenHands"
1175
+ },
1176
+ {
1177
+ id: "crush",
1178
+ name: "Crush",
1179
+ file: "CRUSH.md",
1180
+ icon: "\u{1F4A5}",
1181
+ gradient: "from-red-500 to-orange-500",
1182
+ note: "AI coding assistant",
1183
+ category: "other",
1184
+ format: "markdown"
1185
+ },
1186
+ {
1187
+ id: "firebender",
1188
+ name: "Firebender",
1189
+ file: ".firebender/rules/project.mdc",
1190
+ rulesDirectory: ".firebender/rules/",
1191
+ icon: "\u{1F525}",
1192
+ gradient: "from-orange-600 to-red-600",
1193
+ note: "AI code transformation",
1194
+ category: "other",
1195
+ format: "mdc"
1196
+ },
1197
+ // ========================================
1198
+ // AI AGENT COMMANDS - Slash commands for IDEs
1199
+ // ========================================
1200
+ {
1201
+ id: "cursor-command",
1202
+ name: "Cursor Command",
1203
+ file: ".cursor/commands/",
1204
+ blueprintType: "CURSOR_COMMAND",
1205
+ icon: "\u26A1",
1206
+ gradient: "from-blue-500 to-cyan-500",
1207
+ note: "Custom slash commands for Cursor IDE",
1208
+ category: "command",
1209
+ format: "markdown",
1210
+ isCommand: true,
1211
+ url: "https://docs.cursor.com/context/rules"
1212
+ },
1213
+ {
1214
+ id: "claude-command",
1215
+ name: "Claude Code Command",
1216
+ file: ".claude/commands/",
1217
+ blueprintType: "CLAUDE_COMMAND",
1218
+ icon: "\u{1F9E0}",
1219
+ gradient: "from-orange-500 to-amber-500",
1220
+ note: "Custom slash commands for Claude Code",
1221
+ category: "command",
1222
+ format: "markdown",
1223
+ isCommand: true,
1224
+ url: "https://docs.anthropic.com/en/docs/claude-code"
1225
+ },
1226
+ {
1227
+ id: "windsurf-workflow",
1228
+ name: "Windsurf Workflow",
1229
+ file: ".windsurf/workflows/",
1230
+ blueprintType: "WINDSURF_WORKFLOW",
1231
+ icon: "\u{1F3C4}",
1232
+ gradient: "from-teal-500 to-emerald-500",
1233
+ note: "Cascade workflows for Windsurf IDE",
1234
+ category: "command",
1235
+ format: "markdown",
1236
+ isCommand: true,
1237
+ url: "https://windsurf.com"
1238
+ },
1239
+ {
1240
+ id: "copilot-prompt",
1241
+ name: "Copilot Prompt",
1242
+ file: ".github/prompts/",
1243
+ blueprintType: "COPILOT_PROMPT",
1244
+ icon: "\u{1F419}",
1245
+ gradient: "from-gray-600 to-gray-800",
1246
+ note: "Custom prompts for GitHub Copilot Chat",
1247
+ category: "command",
1248
+ format: "markdown",
1249
+ isCommand: true,
1250
+ url: "https://github.com/features/copilot"
1251
+ },
1252
+ {
1253
+ id: "continue-prompt",
1254
+ name: "Continue Prompt",
1255
+ file: ".continue/prompts/",
1256
+ blueprintType: "CONTINUE_PROMPT",
1257
+ icon: "\u27A1\uFE0F",
1258
+ gradient: "from-blue-600 to-indigo-500",
1259
+ note: "Invokable prompts for Continue.dev",
1260
+ category: "command",
1261
+ format: "markdown",
1262
+ isCommand: true,
1263
+ url: "https://continue.dev"
1264
+ },
1265
+ {
1266
+ id: "opencode-command",
1267
+ name: "OpenCode Command",
1268
+ file: ".opencode/commands/",
1269
+ blueprintType: "OPENCODE_COMMAND",
1270
+ icon: "\u{1F513}",
1271
+ gradient: "from-gray-600 to-gray-800",
1272
+ note: "Custom commands for OpenCode TUI",
1273
+ category: "command",
1274
+ format: "markdown",
1275
+ isCommand: true,
1276
+ url: "https://opencode.ai"
1277
+ }
1278
+ ];
1279
+ var COMMANDS = [
1280
+ {
1281
+ id: "cursor-command",
1282
+ name: "Cursor Command",
1283
+ directory: ".cursor/commands",
1284
+ extension: ".md",
1285
+ platformId: "cursor",
1286
+ icon: "\u26A1",
1287
+ gradient: "from-blue-500 to-cyan-500",
1288
+ note: "Custom slash commands for Cursor IDE (e.g., /deploy, /test)"
1289
+ },
1290
+ {
1291
+ id: "claude-command",
1292
+ name: "Claude Code Command",
1293
+ directory: ".claude/commands",
1294
+ extension: ".md",
1295
+ platformId: "claude",
1296
+ icon: "\u{1F9E0}",
1297
+ gradient: "from-orange-500 to-amber-500",
1298
+ note: "Custom slash commands for Claude Code (e.g., /review, /refactor)"
1299
+ },
1300
+ {
1301
+ id: "windsurf-workflow",
1302
+ name: "Windsurf Workflow",
1303
+ directory: ".windsurf/workflows",
1304
+ extension: ".md",
1305
+ platformId: "windsurf",
1306
+ icon: "\u{1F3C4}",
1307
+ gradient: "from-teal-500 to-emerald-500",
1308
+ note: "Cascade workflows for Windsurf IDE"
1309
+ },
1310
+ {
1311
+ id: "copilot-prompt",
1312
+ name: "Copilot Prompt",
1313
+ directory: ".github/prompts",
1314
+ extension: ".prompt.md",
1315
+ platformId: "copilot",
1316
+ icon: "\u{1F419}",
1317
+ gradient: "from-gray-600 to-gray-800",
1318
+ note: "Custom prompts for GitHub Copilot Chat"
1319
+ },
1320
+ {
1321
+ id: "continue-prompt",
1322
+ name: "Continue Prompt",
1323
+ directory: ".continue/prompts",
1324
+ extension: ".md",
1325
+ platformId: "continue",
1326
+ icon: "\u27A1\uFE0F",
1327
+ gradient: "from-blue-600 to-indigo-500",
1328
+ note: "Invokable prompts for Continue.dev extension"
1329
+ },
1330
+ {
1331
+ id: "opencode-command",
1332
+ name: "OpenCode Command",
1333
+ directory: ".opencode/commands",
1334
+ extension: ".md",
1335
+ platformId: "opencode",
1336
+ icon: "\u{1F513}",
1337
+ gradient: "from-gray-600 to-gray-800",
1338
+ note: "Custom commands for OpenCode TUI"
1339
+ }
1340
+ ];
1341
+ function getPlatform(id) {
1342
+ return PLATFORMS.find((p) => p.id === id);
1343
+ }
1344
+ var PLATFORM_COUNT = PLATFORMS.length;
1345
+ var PLATFORM_FILES = Object.fromEntries(
1346
+ PLATFORMS.map((p) => [p.id, p.file])
1347
+ );
1348
+ function getCommandTemplateType(commandId) {
1349
+ const platform2 = getPlatform(commandId);
1350
+ return platform2?.isCommand ? platform2.blueprintType : void 0;
1351
+ }
1352
+ var BLUEPRINT_TYPE_ALIASES = {
1353
+ CURSOR_MDC: "cursor",
1354
+ CURSORRULES: "cursor",
1355
+ // .cursorrules is deprecated; Cursor reads .cursor/rules/
1356
+ CODEX_MD: "universal",
1357
+ // Codex reads AGENTS.md
1358
+ FIREBASE_RULES: "firebase",
1359
+ GOOSE_HINTS: "goose",
1360
+ OPENCODE_CONFIG: "opencode",
1361
+ OPENHANDS_CONFIG: "openhands",
1362
+ FIREBENDER_CONFIG: "firebender"
1363
+ };
1364
+ function platformForBlueprintType(type) {
1365
+ return PLATFORMS.find((p) => p.blueprintType === type)?.id ?? BLUEPRINT_TYPE_ALIASES[type];
1366
+ }
1367
+ var COMMAND_COUNT = COMMANDS.length;
1368
+
771
1369
  // src/utils/generator.ts
772
1370
  function bpVar(blueprintMode, varName, defaultValue) {
773
1371
  if (!blueprintMode || !defaultValue) return defaultValue;
@@ -792,47 +1390,9 @@ function parseVariablesString(varsStr) {
792
1390
  }
793
1391
  return variables;
794
1392
  }
795
- var PLATFORM_FILES = {
796
- // Popular platforms
797
- universal: "AGENTS.md",
798
- agents: "AGENTS.md",
799
- // Alias for universal
800
- cursor: ".cursor/rules/project.mdc",
801
- claude: "CLAUDE.md",
802
- copilot: ".github/copilot-instructions.md",
803
- windsurf: ".windsurfrules",
804
- // AI-powered IDEs
805
- antigravity: "GEMINI.md",
806
- zed: ".zed/instructions.md",
807
- void: ".void/config.json",
808
- trae: ".trae/rules/project_rules.md",
809
- // Trae reads project_rules.md
810
- firebase: ".idx/rules/project.mdc",
811
- // Editor extensions
812
- cline: ".clinerules",
813
- roocode: ".roo/rules/project.mdc",
814
- continue: ".continue/config.json",
815
- cody: ".cody/config.json",
816
- tabnine: ".tabnine.yaml",
817
- supermaven: ".supermaven/config.json",
818
- codegpt: ".codegpt/config.json",
819
- amazonq: ".amazonq/rules/project.md",
820
- augment: ".augment/rules/project.md",
821
- // Augment rules are .md with a `type` frontmatter
822
- kilocode: ".kilocode/rules/project.mdc",
823
- junie: ".junie/guidelines.md",
824
- kiro: ".kiro/steering/project.md",
825
- // Kiro steering files are .md with an `inclusion` frontmatter
826
- // CLI tools
827
- aider: ".aider.conf.yml",
828
- goose: ".goosehints",
829
- warp: "WARP.md",
830
- "gemini-cli": "GEMINI.md",
831
- opencode: "opencode.json",
832
- // Other emerging tools
833
- openhands: ".openhands/microagents/repo.md",
834
- crush: "CRUSH.md",
835
- firebender: "firebender.json"
1393
+ var PLATFORM_FILES2 = {
1394
+ ...Object.fromEntries(PLATFORMS.filter((p) => !p.isCommand).map((p) => [p.id, p.file])),
1395
+ agents: "AGENTS.md"
836
1396
  };
837
1397
  var PERSONA_DESCRIPTIONS = {
838
1398
  backend: "a senior backend developer specializing in APIs, databases, and microservices architecture",
@@ -1294,7 +1854,7 @@ var STATIC_FILE_PATHS = {
1294
1854
  function generateConfig(options) {
1295
1855
  const files = {};
1296
1856
  for (const platform2 of options.platforms) {
1297
- const filename = PLATFORM_FILES[platform2];
1857
+ const filename = PLATFORM_FILES2[platform2];
1298
1858
  if (filename) {
1299
1859
  files[filename] = generateFileContent(options, platform2);
1300
1860
  }
@@ -1326,12 +1886,10 @@ function generateConfig(options) {
1326
1886
  }
1327
1887
  function generateFileContent(options, platform2) {
1328
1888
  const sections = [];
1329
- const mdcPlatforms = ["cursor", "firebase", "roocode", "kilocode"];
1330
- const yamlPlatforms = ["aider", "tabnine"];
1331
- const jsonPlatforms = ["void", "continue", "cody", "supermaven", "codegpt", "opencode", "firebender"];
1332
- const isMdc = mdcPlatforms.includes(platform2);
1333
- const isYaml = yamlPlatforms.includes(platform2);
1334
- const isJson = jsonPlatforms.includes(platform2);
1889
+ const format = getPlatform(platform2)?.format ?? "markdown";
1890
+ const isMdc = format === "mdc";
1891
+ const isYaml = format === "yaml";
1892
+ const isJson = format === "json";
1335
1893
  const isMarkdown = !isMdc && !isYaml && !isJson;
1336
1894
  const bp = options.blueprintMode || false;
1337
1895
  if (isYaml) {
@@ -1393,7 +1951,7 @@ function generateFileContent(options, platform2) {
1393
1951
  sections.push("# Install CLI: npm install -g lynxprompt");
1394
1952
  sections.push("# Login: lynxp login");
1395
1953
  } else {
1396
- const fileName = platform2 === "cursor" ? ".cursor/rules/agents.mdc" : "AGENTS.md";
1954
+ const fileName = PLATFORM_FILES2[platform2] ?? "AGENTS.md";
1397
1955
  sections.push("");
1398
1956
  sections.push(`# Using curl with environment variable (token stored in $${tokenEnvVar}):`);
1399
1957
  sections.push("");
@@ -2312,32 +2870,13 @@ function generateJsonConfig(options, platform2) {
2312
2870
  config2.rules = rules;
2313
2871
  } else if (platform2 === "codegpt") {
2314
2872
  config2.systemPrompt = rules.join("\n");
2315
- } else if (platform2 === "opencode") {
2316
- config2.instructions = rules;
2317
- } else if (platform2 === "firebender") {
2318
- config2.transforms = rules;
2319
2873
  }
2320
2874
  config2._comment = `Generated by LynxPrompt CLI for ${options.name}`;
2321
2875
  return JSON.stringify(config2, null, 2);
2322
2876
  }
2323
2877
  function generateYamlConfig(options, platform2) {
2324
2878
  const lines = [];
2325
- if (platform2 === "aider") {
2326
- lines.push("# Aider configuration");
2327
- lines.push(`# Project: ${options.name}`);
2328
- lines.push("");
2329
- lines.push("# Code style");
2330
- if (options.stack.includes("typescript") || options.stack.includes("javascript")) {
2331
- lines.push("auto-lint: true");
2332
- }
2333
- lines.push("");
2334
- lines.push("# Custom instructions");
2335
- lines.push("read:");
2336
- lines.push(" - README.md");
2337
- if (options.importantFiles?.includes("architecture") || options.importantFiles?.includes("architecture_md")) {
2338
- lines.push(" - ARCHITECTURE.md");
2339
- }
2340
- } else if (platform2 === "tabnine") {
2879
+ if (platform2 === "tabnine") {
2341
2880
  lines.push("# Tabnine configuration");
2342
2881
  lines.push(`# Project: ${options.name}`);
2343
2882
  lines.push("");
@@ -2366,57 +2905,6 @@ function generateYamlConfig(options, platform2) {
2366
2905
  }
2367
2906
 
2368
2907
  // src/utils/blueprint-files.ts
2369
- var TYPE_TO_PLATFORM = {
2370
- AGENTS_MD: "universal",
2371
- CURSOR_RULES: "cursor",
2372
- CURSOR_MDC: "cursor",
2373
- CURSORRULES: "cursor",
2374
- // .cursorrules is deprecated; Cursor reads .cursor/rules/
2375
- CLAUDE_MD: "claude",
2376
- COPILOT_INSTRUCTIONS: "copilot",
2377
- WINDSURF_RULES: "windsurf",
2378
- GEMINI_MD: "antigravity",
2379
- CLINE_RULES: "cline",
2380
- ZED_INSTRUCTIONS: "zed",
2381
- VOID_CONFIG: "void",
2382
- TRAE_RULES: "trae",
2383
- IDX_CONFIG: "firebase",
2384
- FIREBASE_RULES: "firebase",
2385
- ROO_RULES: "roocode",
2386
- CONTINUE_CONFIG: "continue",
2387
- CODY_CONFIG: "cody",
2388
- TABNINE_CONFIG: "tabnine",
2389
- SUPERMAVEN_CONFIG: "supermaven",
2390
- CODEGPT_CONFIG: "codegpt",
2391
- AMAZONQ_RULES: "amazonq",
2392
- AUGMENT_RULES: "augment",
2393
- KILOCODE_RULES: "kilocode",
2394
- JUNIE_GUIDELINES: "junie",
2395
- KIRO_STEERING: "kiro",
2396
- GOOSEHINTS: "goose",
2397
- GOOSE_HINTS: "goose",
2398
- WARP_MD: "warp",
2399
- OPENCODE_JSON: "opencode",
2400
- OPENCODE_CONFIG: "opencode",
2401
- OPENHANDS_MD: "openhands",
2402
- OPENHANDS_CONFIG: "openhands",
2403
- CRUSH_MD: "crush",
2404
- FIREBENDER_CONFIG: "firebender"
2405
- };
2406
- var TYPE_TO_FIXED_FILE = {
2407
- CODEX_MD: "AGENTS.md",
2408
- // Codex reads AGENTS.md
2409
- AIDER_MD: "AIDER.md"
2410
- // Markdown conventions, not the .aider.conf.yml settings file
2411
- };
2412
- var COMMAND_TYPE_DIRS = {
2413
- CURSOR_COMMAND: ".cursor/commands",
2414
- CLAUDE_COMMAND: ".claude/commands",
2415
- WINDSURF_WORKFLOW: ".windsurf/workflows",
2416
- COPILOT_PROMPT: ".copilot/prompts",
2417
- CONTINUE_PROMPT: ".continue/prompts",
2418
- OPENCODE_COMMAND: ".opencode/commands"
2419
- };
2420
2908
  var FALLBACK_FILE = "ai-config.md";
2421
2909
  function slugify(name) {
2422
2910
  const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
@@ -2424,11 +2912,10 @@ function slugify(name) {
2424
2912
  }
2425
2913
  function blueprintFilename(bp) {
2426
2914
  if (bp.repository_path) return bp.repository_path;
2427
- const platform2 = TYPE_TO_PLATFORM[bp.type];
2428
- if (platform2 && PLATFORM_FILES[platform2]) return PLATFORM_FILES[platform2];
2429
- if (TYPE_TO_FIXED_FILE[bp.type]) return TYPE_TO_FIXED_FILE[bp.type];
2430
- const commandDir = COMMAND_TYPE_DIRS[bp.type];
2431
- if (commandDir) return `${commandDir}/${slugify(bp.name || "")}.md`;
2915
+ const platform2 = platformForBlueprintType(bp.type);
2916
+ if (platform2 && PLATFORM_FILES2[platform2]) return PLATFORM_FILES2[platform2];
2917
+ const command = COMMANDS.find((c) => c.id === platform2);
2918
+ if (command) return `${command.directory}/${slugify(bp.name || "")}${command.extension}`;
2432
2919
  return FALLBACK_FILE;
2433
2920
  }
2434
2921
  function safePath(root, untrusted, pathImpl = path) {
@@ -2441,6 +2928,58 @@ function safePath(root, untrusted, pathImpl = path) {
2441
2928
  }
2442
2929
  return resolved;
2443
2930
  }
2931
+ function normPath(p) {
2932
+ return p.replace(/\\/g, "/").toLowerCase();
2933
+ }
2934
+ function basename(p) {
2935
+ return p.replace(/\\/g, "/").split("/").pop() || "";
2936
+ }
2937
+ var RULE_PLATFORMS = PLATFORMS.filter((p) => !p.isCommand);
2938
+ var typeOf = (p) => p.blueprintType ?? "CUSTOM";
2939
+ var atPath = (relativePath, file) => {
2940
+ const p = normPath(relativePath);
2941
+ return p === file || p.endsWith(`/${file}`);
2942
+ };
2943
+ var inFolder = (relativePath, folder) => {
2944
+ const p = normPath(relativePath);
2945
+ return p.startsWith(folder) || p.includes(`/${folder}`);
2946
+ };
2947
+ var CONFIG_PATTERNS = [
2948
+ // Commands: one file per command in the tool's folder
2949
+ ...COMMANDS.map((c) => ({
2950
+ match: (p) => inFolder(p, `${c.directory}/`) && p.endsWith(c.extension),
2951
+ type: getCommandTemplateType(c.id) ?? "CUSTOM",
2952
+ label: c.name
2953
+ })),
2954
+ // Folders the tool reads every rule file from
2955
+ ...RULE_PLATFORMS.filter((p) => p.rulesDirectory).map((p) => ({
2956
+ match: (rel) => inFolder(rel, p.rulesDirectory) && /\.mdc?$/.test(rel),
2957
+ type: typeOf(p),
2958
+ label: `${p.name} Rules`
2959
+ })),
2960
+ // A file at a fixed path or with a fixed name, wherever it sits
2961
+ ...RULE_PLATFORMS.map((p) => ({
2962
+ match: (rel) => p.file.includes("/") ? atPath(rel, p.file) : basename(rel) === p.file,
2963
+ type: typeOf(p),
2964
+ label: p.name
2965
+ })),
2966
+ // Paths older CLI versions generated
2967
+ { match: (p) => inFolder(p, ".copilot/prompts/") && p.endsWith(".md"), type: "COPILOT_PROMPT", label: "Copilot Prompt" },
2968
+ { match: (p) => inFolder(p, ".idx/") && p.endsWith(".mdc"), type: "IDX_CONFIG", label: "Firebase Studio" },
2969
+ { match: (p) => atPath(p, ".zed/instructions.md"), type: "ZED_INSTRUCTIONS", label: "Zed" },
2970
+ { match: (p) => basename(p) === "AIDER.md", type: "AIDER_MD", label: "AIDER.md" },
2971
+ { match: (p) => basename(p) === ".cursorrules", type: "CURSORRULES", label: "Cursor Rules (legacy)" },
2972
+ { match: (p) => basename(p) === "opencode.json", type: "OPENCODE_JSON", label: "OpenCode Config" },
2973
+ { match: (p) => basename(p) === "firebender.json", type: "CUSTOM", label: "Firebender Config" }
2974
+ ];
2975
+ function matchConfigFile(relativePath) {
2976
+ for (const pattern of CONFIG_PATTERNS) {
2977
+ if (pattern.match(relativePath)) {
2978
+ return { type: pattern.type, label: pattern.label };
2979
+ }
2980
+ }
2981
+ return null;
2982
+ }
2444
2983
 
2445
2984
  // src/commands/pull.ts
2446
2985
  function getSourceFromVisibility(visibility) {
@@ -2875,59 +3414,6 @@ function blueprintUrl(id) {
2875
3414
  return `${getApiUrl().replace(/\/+$/, "")}/templates/${id.replace("bp_", "")}`;
2876
3415
  }
2877
3416
  var VISIBILITIES = ["PRIVATE", "TEAM", "PUBLIC"];
2878
- function normPath(p) {
2879
- return p.replace(/\\/g, "/").toLowerCase();
2880
- }
2881
- var CONFIG_PATTERNS = [
2882
- // Commands (most specific paths first)
2883
- { match: (p) => normPath(p).includes(".cursor/commands/") && p.endsWith(".md"), type: "CURSOR_COMMAND", label: "Cursor Command" },
2884
- { match: (p) => normPath(p).includes(".claude/commands/") && p.endsWith(".md"), type: "CLAUDE_COMMAND", label: "Claude Command" },
2885
- { match: (p) => normPath(p).includes(".windsurf/workflows/") && p.endsWith(".md"), type: "WINDSURF_WORKFLOW", label: "Windsurf Workflow" },
2886
- { match: (p) => normPath(p).includes(".copilot/prompts/") && p.endsWith(".md"), type: "COPILOT_PROMPT", label: "Copilot Prompt" },
2887
- { match: (p) => normPath(p).includes(".continue/prompts/") && p.endsWith(".md"), type: "CONTINUE_PROMPT", label: "Continue Prompt" },
2888
- { match: (p) => normPath(p).includes(".opencode/commands/") && p.endsWith(".md"), type: "OPENCODE_COMMAND", label: "OpenCode Command" },
2889
- // Directory-based rules
2890
- { match: (p) => normPath(p).includes(".cursor/rules/") && p.endsWith(".mdc"), type: "CURSOR_RULES", label: "Cursor Rules" },
2891
- { match: (p) => normPath(p).includes(".trae/rules/") && /\.mdc?$/.test(p), type: "TRAE_RULES", label: "Trae Rules" },
2892
- { match: (p) => normPath(p).includes(".idx/") && p.endsWith(".mdc"), type: "IDX_CONFIG", label: "Firebase Rules" },
2893
- { match: (p) => normPath(p).includes(".roo/rules/") && p.endsWith(".mdc"), type: "ROO_RULES", label: "Roo Rules" },
2894
- { match: (p) => normPath(p).includes(".amazonq/rules/") && /\.mdc?$/.test(p), type: "AMAZONQ_RULES", label: "Amazon Q Rules" },
2895
- { match: (p) => normPath(p).includes(".augment/rules/") && /\.mdc?$/.test(p), type: "AUGMENT_RULES", label: "Augment Rules" },
2896
- { match: (p) => normPath(p).includes(".kilocode/rules/") && p.endsWith(".mdc"), type: "KILOCODE_RULES", label: "Kilo Code Rules" },
2897
- { match: (p) => normPath(p).includes(".kiro/steering/") && /\.mdc?$/.test(p), type: "KIRO_STEERING", label: "Kiro Steering" },
2898
- // Path-based configs
2899
- { match: (p) => normPath(p).includes(".github/copilot-instructions.md"), type: "COPILOT_INSTRUCTIONS", label: "Copilot Instructions" },
2900
- { match: (p) => normPath(p).includes(".zed/instructions.md"), type: "ZED_INSTRUCTIONS", label: "Zed Instructions" },
2901
- { match: (p) => normPath(p).includes(".openhands/microagents/repo.md"), type: "OPENHANDS_MD", label: "OpenHands Config" },
2902
- { match: (p) => normPath(p).includes(".junie/guidelines.md"), type: "JUNIE_GUIDELINES", label: "Junie Guidelines" },
2903
- { match: (p) => normPath(p).includes(".void/config.json"), type: "VOID_CONFIG", label: "Void Config" },
2904
- { match: (p) => normPath(p).includes(".continue/config.json"), type: "CONTINUE_CONFIG", label: "Continue Config" },
2905
- { match: (p) => normPath(p).includes(".cody/config.json"), type: "CODY_CONFIG", label: "Cody Config" },
2906
- { match: (p) => normPath(p).includes(".supermaven/config.json"), type: "CUSTOM", label: "Supermaven Config" },
2907
- { match: (p) => normPath(p).includes(".codegpt/config.json"), type: "CUSTOM", label: "CodeGPT Config" },
2908
- // Basename rules
2909
- { match: (p) => path2.basename(p) === "AGENTS.md", type: "AGENTS_MD", label: "AGENTS.md" },
2910
- { match: (p) => path2.basename(p) === "CLAUDE.md", type: "CLAUDE_MD", label: "CLAUDE.md" },
2911
- { match: (p) => path2.basename(p) === "AIDER.md", type: "AIDER_MD", label: "AIDER.md" },
2912
- { match: (p) => path2.basename(p) === "GEMINI.md", type: "GEMINI_MD", label: "GEMINI.md" },
2913
- { match: (p) => path2.basename(p) === "WARP.md", type: "WARP_MD", label: "WARP.md" },
2914
- { match: (p) => path2.basename(p) === "CRUSH.md", type: "CUSTOM", label: "CRUSH.md" },
2915
- { match: (p) => path2.basename(p) === ".windsurfrules", type: "WINDSURF_RULES", label: "Windsurf Rules" },
2916
- { match: (p) => path2.basename(p) === ".cursorrules", type: "CURSORRULES", label: "Cursor Rules (legacy)" },
2917
- { match: (p) => path2.basename(p) === ".clinerules", type: "CLINE_RULES", label: "Cline Rules" },
2918
- { match: (p) => path2.basename(p) === ".goosehints", type: "GOOSEHINTS", label: "Goose Hints" },
2919
- { match: (p) => path2.basename(p) === ".tabnine.yaml", type: "TABNINE_CONFIG", label: "Tabnine Config" },
2920
- { match: (p) => path2.basename(p) === "opencode.json", type: "OPENCODE_JSON", label: "OpenCode Config" },
2921
- { match: (p) => path2.basename(p) === "firebender.json", type: "CUSTOM", label: "Firebender Config" }
2922
- ];
2923
- function matchConfigFile(relativePath) {
2924
- for (const pattern of CONFIG_PATTERNS) {
2925
- if (pattern.match(relativePath)) {
2926
- return { type: pattern.type, label: pattern.label };
2927
- }
2928
- }
2929
- return null;
2930
- }
2931
3417
  function scanForAgentFiles(cwd, maxDepth = 5) {
2932
3418
  const results = [];
2933
3419
  function scan(dir, depth) {
@@ -4674,6 +5160,7 @@ var COMMAND_DIRECTORIES = [
4674
5160
  { directory: ".cursor/commands", type: "cursor-command", platform: "cursor", templateType: "CURSOR_COMMAND" },
4675
5161
  { directory: ".claude/commands", type: "claude-command", platform: "claude", templateType: "CLAUDE_COMMAND" },
4676
5162
  { directory: ".windsurf/workflows", type: "windsurf-workflow", platform: "windsurf", templateType: "WINDSURF_WORKFLOW" },
5163
+ { directory: ".github/prompts", type: "copilot-prompt", platform: "copilot", templateType: "COPILOT_PROMPT" },
4677
5164
  { directory: ".copilot/prompts", type: "copilot-prompt", platform: "copilot", templateType: "COPILOT_PROMPT" },
4678
5165
  { directory: ".continue/prompts", type: "continue-prompt", platform: "continue", templateType: "CONTINUE_PROMPT" },
4679
5166
  { directory: ".opencode/commands", type: "opencode-command", platform: "opencode", templateType: "OPENCODE_COMMAND" }
@@ -4691,7 +5178,7 @@ async function detectCommandFiles(cwd) {
4691
5178
  const filePath = join2(dirPath, entry.name);
4692
5179
  try {
4693
5180
  const content = await readFileAsync(filePath, "utf-8");
4694
- const name = entry.name.replace(/\.md$/, "");
5181
+ const name = entry.name.replace(/(\.prompt)?\.md$/, "");
4695
5182
  commands.push({
4696
5183
  path: filePath,
4697
5184
  name,
@@ -6104,7 +6591,7 @@ var TEST_FRAMEWORKS2 = TEST_FRAMEWORKS;
6104
6591
 
6105
6592
  // src/commands/wizard.ts
6106
6593
  var DRAFTS_DIR = ".lynxprompt/drafts";
6107
- var CLI_VERSION = "2.1.38";
6594
+ var CLI_VERSION = "2.1.39";
6108
6595
  async function saveDraftLocally(name, config2, stepReached) {
6109
6596
  const draftsPath = join3(process.cwd(), DRAFTS_DIR);
6110
6597
  await mkdir3(draftsPath, { recursive: true });
@@ -6208,43 +6695,7 @@ var WIZARD_STEPS = [
6208
6695
  { id: "static", title: "Static Files", icon: "\u{1F4C4}" },
6209
6696
  { id: "extra", title: "Final Details", icon: "\u{1F4AC}" }
6210
6697
  ];
6211
- var ALL_PLATFORMS = [
6212
- // Popular platforms
6213
- { id: "universal", name: "Universal (AGENTS.md)", file: "AGENTS.md", icon: "\u{1F310}", note: "Works with Claude Code, Copilot, Aider, and many others" },
6214
- { id: "cursor", name: "Cursor", file: ".cursor/rules/", icon: "\u26A1", note: "AI-powered code editor with native rules" },
6215
- { id: "claude", name: "Claude Code", file: "CLAUDE.md", icon: "\u{1F9E0}", note: "Anthropic's agentic coding tool" },
6216
- { id: "copilot", name: "GitHub Copilot", file: ".github/copilot-instructions.md", icon: "\u{1F419}", note: "GitHub's AI pair programmer" },
6217
- { id: "windsurf", name: "Windsurf", file: ".windsurfrules", icon: "\u{1F3C4}", note: "Codeium's AI-native IDE" },
6218
- // AI IDEs
6219
- { id: "antigravity", name: "Antigravity", file: "GEMINI.md", icon: "\u{1F48E}", note: "Google's Gemini-powered IDE" },
6220
- { id: "zed", name: "Zed", file: ".zed/instructions.md", icon: "\u26A1", note: "High-performance editor with AI" },
6221
- { id: "void", name: "Void", file: ".void/config.json", icon: "\u{1F573}\uFE0F", note: "Open-source Cursor alternative" },
6222
- { id: "trae", name: "Trae AI", file: ".trae/rules/", icon: "\u{1F537}", note: "ByteDance's AI IDE" },
6223
- { id: "firebase", name: "Firebase Studio", file: ".idx/", icon: "\u{1F525}", note: "Google's cloud IDE" },
6224
- // Editor extensions
6225
- { id: "cline", name: "Cline", file: ".clinerules", icon: "\u{1F527}", note: "Autonomous coding agent for VS Code" },
6226
- { id: "roocode", name: "Roo Code", file: ".roo/rules/", icon: "\u{1F998}", note: "AI coding assistant for VS Code" },
6227
- { id: "continue", name: "Continue", file: ".continue/config.json", icon: "\u27A1\uFE0F", note: "Open-source AI autopilot" },
6228
- { id: "cody", name: "Sourcegraph Cody", file: ".cody/config.json", icon: "\u{1F50D}", note: "Context-aware AI assistant" },
6229
- { id: "tabnine", name: "Tabnine", file: ".tabnine.yaml", icon: "\u{1F4DD}", note: "AI code completion" },
6230
- { id: "supermaven", name: "Supermaven", file: ".supermaven/config.json", icon: "\u{1F9B8}", note: "Fast AI code completions" },
6231
- { id: "codegpt", name: "CodeGPT", file: ".codegpt/config.json", icon: "\u{1F4AC}", note: "VS Code AI assistant" },
6232
- { id: "amazonq", name: "Amazon Q", file: ".amazonq/rules/", icon: "\u{1F4E6}", note: "AWS AI coding companion" },
6233
- { id: "augment", name: "Augment Code", file: ".augment/rules/", icon: "\u{1F52E}", note: "AI code augmentation" },
6234
- { id: "kilocode", name: "Kilo Code", file: ".kilocode/rules/", icon: "\u{1F4CA}", note: "AI code generation" },
6235
- { id: "junie", name: "Junie", file: ".junie/guidelines.md", icon: "\u{1F3AF}", note: "JetBrains AI assistant" },
6236
- { id: "kiro", name: "Kiro", file: ".kiro/steering/", icon: "\u{1F680}", note: "AWS spec-driven agent" },
6237
- // CLI tools
6238
- { id: "aider", name: "Aider", file: "AIDER.md", icon: "\u{1F916}", note: "AI pair programming in terminal" },
6239
- { id: "goose", name: "Goose", file: ".goosehints", icon: "\u{1FABF}", note: "Block's AI coding agent" },
6240
- { id: "warp", name: "Warp AI", file: "WARP.md", icon: "\u{1F680}", note: "AI-powered terminal" },
6241
- { id: "gemini-cli", name: "Gemini CLI", file: "GEMINI.md", icon: "\u{1F48E}", note: "Google's Gemini in terminal" },
6242
- { id: "opencode", name: "Open Code", file: "opencode.json", icon: "\u{1F513}", note: "Open-source AI coding" },
6243
- // Other
6244
- { id: "openhands", name: "OpenHands", file: ".openhands/microagents/repo.md", icon: "\u{1F932}", note: "Open-source AI agent" },
6245
- { id: "crush", name: "Crush", file: "CRUSH.md", icon: "\u{1F4A5}", note: "AI coding assistant" },
6246
- { id: "firebender", name: "Firebender", file: "firebender.json", icon: "\u{1F525}", note: "AI code transformation" }
6247
- ];
6698
+ var ALL_PLATFORMS = PLATFORMS.filter((p) => !p.isCommand);
6248
6699
  var LANGUAGES3 = LANGUAGES2;
6249
6700
  var FRAMEWORKS3 = FRAMEWORKS2;
6250
6701
  var DATABASES3 = DATABASES2;
@@ -6971,10 +7422,10 @@ var promptConfig = {
6971
7422
  };
6972
7423
  function parsePlatformList(value) {
6973
7424
  const platforms = value.split(",").map((f) => f.trim()).filter(Boolean);
6974
- const unknown = platforms.filter((p) => !PLATFORM_FILES[p]);
7425
+ const unknown = platforms.filter((p) => !PLATFORM_FILES2[p]);
6975
7426
  if (unknown.length > 0 || platforms.length === 0) {
6976
7427
  console.error(chalk7.red(` \u2717 Unknown format: ${unknown.join(", ") || value}`));
6977
- console.error(chalk7.gray(` Supported formats: ${Object.keys(PLATFORM_FILES).join(", ")}`));
7428
+ console.error(chalk7.gray(` Supported formats: ${Object.keys(PLATFORM_FILES2).join(", ")}`));
6978
7429
  process.exit(1);
6979
7430
  }
6980
7431
  return platforms;
@@ -7287,7 +7738,7 @@ async function runWizardWithDraftProtection(options) {
7287
7738
  if (config2.enableAutoUpdate && api) {
7288
7739
  spinner.text = "Saving blueprint to cloud...";
7289
7740
  try {
7290
- const primaryFile = config2.primarySyncFormat ? PLATFORM_FILES[config2.primarySyncFormat] : void 0;
7741
+ const primaryFile = config2.primarySyncFormat ? PLATFORM_FILES2[config2.primarySyncFormat] : void 0;
7291
7742
  const mainFile = primaryFile && files[primaryFile] !== void 0 ? [primaryFile, files[primaryFile]] : Object.entries(files)[0];
7292
7743
  if (mainFile) {
7293
7744
  const [fileName, content] = mainFile;
@@ -9578,10 +10029,10 @@ var CONFIG_FILES = [
9578
10029
  { path: "CLAUDE.md", name: "CLAUDE.md", platform: "Claude Code" },
9579
10030
  { path: ".github/copilot-instructions.md", name: "Copilot Instructions", platform: "GitHub Copilot" },
9580
10031
  { path: ".windsurfrules", name: ".windsurfrules", platform: "Windsurf" },
9581
- { path: ".zed/instructions.md", name: "Zed Instructions", platform: "Zed" },
10032
+ { path: ".rules", name: ".rules", platform: "Zed" },
9582
10033
  { path: ".clinerules", name: ".clinerules", platform: "Cline" },
9583
10034
  { path: ".goosehints", name: ".goosehints", platform: "Goose" },
9584
- { path: "AIDER.md", name: "AIDER.md", platform: "Aider" }
10035
+ { path: "CONVENTIONS.md", name: "CONVENTIONS.md", platform: "Aider" }
9585
10036
  ];
9586
10037
  var CONFIG_DIRS = [
9587
10038
  { path: ".cursor/rules", name: ".cursor/rules/", platform: "Cursor" },
@@ -9756,7 +10207,10 @@ var CONFIG_FILES2 = [
9756
10207
  { path: ".clinerules", name: "Cline" },
9757
10208
  // may also be a directory of rule files
9758
10209
  { path: ".goosehints", name: "Goose" },
10210
+ { path: ".rules", name: "Zed" },
9759
10211
  { path: ".zed/instructions.md", name: "Zed" },
10212
+ { path: "CONVENTIONS.md", name: "Aider" },
10213
+ { path: ".idx/airules.md", name: "Firebase Studio" },
9760
10214
  { path: ".junie/guidelines.md", name: "Junie" },
9761
10215
  { path: ".openhands/microagents/repo.md", name: "OpenHands" }
9762
10216
  ];
@@ -10365,7 +10819,7 @@ async function linkCommand(fileArg, blueprintIdArg, options = {}) {
10365
10819
  ".cursor/rules/project.mdc",
10366
10820
  ".github/copilot-instructions.md",
10367
10821
  ".windsurfrules",
10368
- ".zed/instructions.md",
10822
+ ".rules",
10369
10823
  ".clinerules"
10370
10824
  ];
10371
10825
  const foundFiles = configFiles.filter((f) => existsSync5(join7(cwd, f)));
@@ -10825,7 +11279,7 @@ async function analyzeCommand(options) {
10825
11279
  // src/commands/convert.ts
10826
11280
  import chalk15 from "chalk";
10827
11281
  import { readFile as readFile8, writeFile as writeFile4, access as access5 } from "fs/promises";
10828
- import { join as join8, basename, resolve as resolve2, dirname as dirname4 } from "path";
11282
+ import { join as join8, basename as basename2, resolve as resolve2, dirname as dirname4 } from "path";
10829
11283
  import ora12 from "ora";
10830
11284
 
10831
11285
  // src/utils/convert-format.ts
@@ -10863,9 +11317,7 @@ function generateTargetContent(config2, targetPlatform) {
10863
11317
  }
10864
11318
  switch (targetPlatform) {
10865
11319
  case "cursor":
10866
- case "roocode":
10867
- case "kilocode":
10868
- case "firebase":
11320
+ case "firebender":
10869
11321
  return `---
10870
11322
  ${mdcFrontmatter}
10871
11323
  ---
@@ -10890,17 +11342,6 @@ ${rawContent}`;
10890
11342
  case "goose":
10891
11343
  case "trae":
10892
11344
  return rawContent;
10893
- case "aider":
10894
- return `# Aider configuration
10895
- # Converted from AI IDE configuration
10896
-
10897
- lint-cmd: []
10898
- auto-test: false
10899
- read: []
10900
- # AI rules converted below as conventions
10901
- conventions:
10902
- ${rawContent.split("\n").filter((line) => line.trim() && !line.startsWith("#")).map((line) => ` - "${line.trim().replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`).join("\n")}
10903
- `;
10904
11345
  case "tabnine":
10905
11346
  return `# Tabnine configuration
10906
11347
  # Converted from AI IDE configuration
@@ -10912,8 +11353,6 @@ ${rawContent.split("\n").map((line) => ` ${line}`).join("\n")}
10912
11353
  case "cody":
10913
11354
  case "codegpt":
10914
11355
  case "supermaven":
10915
- case "opencode":
10916
- case "firebender":
10917
11356
  return JSON.stringify({ instructions: rawContent }, null, 2) + "\n";
10918
11357
  case "copilot":
10919
11358
  return `# GitHub Copilot Instructions
@@ -10932,6 +11371,11 @@ ${rawContent}
10932
11371
  case "warp":
10933
11372
  case "openhands":
10934
11373
  case "crush":
11374
+ case "aider":
11375
+ case "opencode":
11376
+ case "firebase":
11377
+ case "roocode":
11378
+ case "kilocode":
10935
11379
  default:
10936
11380
  return rawContent;
10937
11381
  }
@@ -10952,51 +11396,10 @@ var SOURCE_FILES = {
10952
11396
  ".aider.conf.yml": "aider"
10953
11397
  };
10954
11398
  var TARGET_FILES = {
10955
- // Popular platforms
10956
- universal: "AGENTS.md",
10957
- agents: "AGENTS.md",
10958
- cursor: ".cursor/rules/project.mdc",
11399
+ ...PLATFORM_FILES2,
10959
11400
  cursor_legacy: ".cursorrules",
10960
- claude: "CLAUDE.md",
10961
- copilot: ".github/copilot-instructions.md",
10962
- windsurf: ".windsurfrules",
10963
- // AI-powered IDEs
10964
- antigravity: "GEMINI.md",
10965
- zed: ".zed/instructions.md",
10966
- void: ".void/config.json",
10967
- trae: ".trae/rules/project_rules.md",
10968
- firebase: ".idx/rules/project.mdc",
10969
- // Editor extensions
10970
- cline: ".clinerules",
10971
- roocode: ".roo/rules/project.mdc",
10972
- continue: ".continue/config.json",
10973
- cody: ".cody/config.json",
10974
- tabnine: ".tabnine.yaml",
10975
- supermaven: ".supermaven/config.json",
10976
- codegpt: ".codegpt/config.json",
10977
- amazonq: ".amazonq/rules/project.md",
10978
- augment: ".augment/rules/project.md",
10979
- kilocode: ".kilocode/rules/project.mdc",
10980
- junie: ".junie/guidelines.md",
10981
- kiro: ".kiro/steering/project.md",
10982
- // CLI tools
10983
- aider: ".aider.conf.yml",
10984
- goose: ".goosehints",
10985
- warp: "WARP.md",
10986
- "gemini-cli": "GEMINI.md",
10987
- opencode: "opencode.json",
10988
11401
  codex: "codex.md",
10989
- // Other emerging tools
10990
- openhands: ".openhands/microagents/repo.md",
10991
- crush: "CRUSH.md",
10992
- firebender: "firebender.json",
10993
- // Command targets
10994
- "cursor-command": ".cursor/commands/command.md",
10995
- "claude-command": ".claude/commands/command.md",
10996
- "windsurf-workflow": ".windsurf/workflows/workflow.md",
10997
- "copilot-prompt": ".copilot/prompts/prompt.md",
10998
- "continue-prompt": ".continue/prompts/prompt.md",
10999
- "opencode-command": ".opencode/commands/command.md"
11402
+ ...Object.fromEntries(COMMANDS.map((c) => [c.id, `${c.directory}/command${c.extension}`]))
11000
11403
  };
11001
11404
  var PLATFORM_NAMES = {
11002
11405
  universal: "AGENTS.md (Universal)",
@@ -11040,12 +11443,8 @@ var PLATFORM_NAMES = {
11040
11443
  "opencode-command": "OpenCode Command"
11041
11444
  };
11042
11445
  var COMMAND_DIRS = {
11043
- ".cursor/commands": "cursor-command",
11044
- ".claude/commands": "claude-command",
11045
- ".windsurf/workflows": "windsurf-workflow",
11046
- ".copilot/prompts": "copilot-prompt",
11047
- ".continue/prompts": "continue-prompt",
11048
- ".opencode/commands": "opencode-command"
11446
+ ...Object.fromEntries(COMMANDS.map((c) => [c.directory, c.id])),
11447
+ ".copilot/prompts": "copilot-prompt"
11049
11448
  };
11050
11449
  async function detectSourceFile(cwd) {
11051
11450
  for (const [pattern, platform2] of Object.entries(SOURCE_FILES)) {
@@ -11092,7 +11491,7 @@ async function convertCommand(first, second, options) {
11092
11491
  if (cmdPlatform) {
11093
11492
  sourcePlatform = cmdPlatform;
11094
11493
  } else {
11095
- const sourceBasename = basename(source).toLowerCase();
11494
+ const sourceBasename = basename2(source).toLowerCase();
11096
11495
  sourcePlatform = SOURCE_FILES[sourceBasename] || "unknown";
11097
11496
  }
11098
11497
  } else {
@@ -11136,7 +11535,7 @@ async function convertCommand(first, second, options) {
11136
11535
  console.log(chalk15.red(` \u2717 Could not read source file: ${sourcePath}`));
11137
11536
  process.exit(1);
11138
11537
  }
11139
- console.log(chalk15.white(` Source: ${basename(sourcePath)} (${PLATFORM_NAMES[sourcePlatform] || sourcePlatform})`));
11538
+ console.log(chalk15.white(` Source: ${basename2(sourcePath)} (${PLATFORM_NAMES[sourcePlatform] || sourcePlatform})`));
11140
11539
  console.log(chalk15.white(` Target: ${PLATFORM_NAMES[normalizedTarget]}`));
11141
11540
  console.log();
11142
11541
  const spinner = ora12("Converting configuration...").start();
@@ -11144,10 +11543,10 @@ async function convertCommand(first, second, options) {
11144
11543
  const targetContent = generateTargetContent(config2, normalizedTarget);
11145
11544
  spinner.stop();
11146
11545
  let outputFilename = options.output || TARGET_FILES[normalizedTarget];
11147
- if (isCommandTarget(normalizedTarget) && !options.output) {
11148
- const originalFilename = basename(sourcePath);
11149
- const targetDir = TARGET_FILES[normalizedTarget].split("/").slice(0, -1).join("/");
11150
- outputFilename = `${targetDir}/${originalFilename}`;
11546
+ const targetCommand = COMMANDS.find((c) => c.id === normalizedTarget);
11547
+ if (targetCommand && !options.output) {
11548
+ const commandName = basename2(sourcePath).replace(/(\.prompt)?\.md$/, "");
11549
+ outputFilename = `${targetCommand.directory}/${commandName}${targetCommand.extension}`;
11151
11550
  }
11152
11551
  const outputPath = resolve2(cwd, outputFilename);
11153
11552
  try {
@@ -11180,7 +11579,7 @@ async function convertCommand(first, second, options) {
11180
11579
  // src/commands/merge.ts
11181
11580
  import chalk16 from "chalk";
11182
11581
  import { readFile as readFile9, writeFile as writeFile5, access as access6 } from "fs/promises";
11183
- import { basename as basename2, resolve as resolve3 } from "path";
11582
+ import { basename as basename3, resolve as resolve3 } from "path";
11184
11583
  import ora13 from "ora";
11185
11584
  import prompts5 from "prompts";
11186
11585
 
@@ -11308,7 +11707,7 @@ async function mergeCommand(files, options) {
11308
11707
  }
11309
11708
  try {
11310
11709
  const content = await readFile9(filePath, "utf-8");
11311
- const sections = parseMarkdownSections(content, basename2(file));
11710
+ const sections = parseMarkdownSections(content, basename3(file));
11312
11711
  allSections.push(sections);
11313
11712
  console.log(chalk16.gray(` \u2713 Read ${file} (${sections.length} sections)`));
11314
11713
  } catch (error) {
@@ -11385,7 +11784,7 @@ import chalk17 from "chalk";
11385
11784
  import prompts6 from "prompts";
11386
11785
  import ora14 from "ora";
11387
11786
  import { readFile as readFile10, access as access7, readdir as readdir3 } from "fs/promises";
11388
- import { join as join9, relative as relative3, dirname as dirname5, basename as basename3, resolve as resolve4 } from "path";
11787
+ import { join as join9, relative as relative3, dirname as dirname5, basename as basename4, resolve as resolve4 } from "path";
11389
11788
  var CONFIG_FILE_PATTERNS = [
11390
11789
  "AGENTS.md",
11391
11790
  "CLAUDE.md",
@@ -11465,7 +11864,7 @@ function extractProjectName(content, dirPath) {
11465
11864
  }
11466
11865
  }
11467
11866
  }
11468
- return basename3(dirPath) || "Unnamed";
11867
+ return basename4(dirPath) || "Unnamed";
11469
11868
  }
11470
11869
  function parseMarkdownSections2(content) {
11471
11870
  const sections = [];
@@ -11797,6 +12196,14 @@ function handleError2(error) {
11797
12196
 
11798
12197
  // src/commands/config.ts
11799
12198
  import chalk19 from "chalk";
12199
+ function printLoginState() {
12200
+ if (isAuthenticated()) {
12201
+ const email = getUser()?.email;
12202
+ console.log(chalk19.gray(` Logged in${email ? ` as ${email}` : ""} on this instance.`));
12203
+ } else {
12204
+ console.log(chalk19.gray(" Run 'lynxp login' to authenticate with this instance."));
12205
+ }
12206
+ }
11800
12207
  async function configCommand(action, valueArg) {
11801
12208
  if (!action || action === "show") {
11802
12209
  console.log();
@@ -11805,6 +12212,10 @@ async function configCommand(action, valueArg) {
11805
12212
  console.log(
11806
12213
  chalk19.white(" API URL: ") + chalk19.green(getApiUrl())
11807
12214
  );
12215
+ const loggedIn = isAuthenticated();
12216
+ console.log(
12217
+ chalk19.white(" Login: ") + (loggedIn ? chalk19.green(getUser()?.email ?? "token set") : chalk19.gray("not logged in"))
12218
+ );
11808
12219
  console.log(
11809
12220
  chalk19.white(" Config: ") + chalk19.gray(getConfigPath())
11810
12221
  );
@@ -11836,16 +12247,15 @@ async function configCommand(action, valueArg) {
11836
12247
  console.log(
11837
12248
  chalk19.green("\u2713") + ` API URL set to ${chalk19.cyan(clean)}`
11838
12249
  );
11839
- console.log(
11840
- chalk19.gray(" Run 'lynxp login' to authenticate with this instance.")
11841
- );
12250
+ printLoginState();
11842
12251
  return;
11843
12252
  }
11844
12253
  if (action === "reset-url") {
11845
- setApiUrl("https://api.lynxprompt.com");
12254
+ const url = resetApiUrl();
11846
12255
  console.log(
11847
- chalk19.green("\u2713") + " API URL reset to " + chalk19.cyan("https://api.lynxprompt.com")
12256
+ chalk19.green("\u2713") + " API URL reset to " + chalk19.cyan(url)
11848
12257
  );
12258
+ printLoginState();
11849
12259
  return;
11850
12260
  }
11851
12261
  if (action === "path") {
@@ -11858,7 +12268,7 @@ async function configCommand(action, valueArg) {
11858
12268
  }
11859
12269
 
11860
12270
  // src/index.ts
11861
- var CLI_VERSION2 = "2.1.38";
12271
+ var CLI_VERSION2 = "2.1.39";
11862
12272
  var program = new Command();
11863
12273
  program.name("lynxprompt").description("CLI for LynxPrompt - Generate AI IDE configuration files").version(CLI_VERSION2);
11864
12274
  program.command("wizard").description("Generate AI IDE configuration (recommended for most users)").option("-n, --name <name>", "Project name").option("-d, --description <description>", "Project description").option("-s, --stack <stack>", "Tech stack (comma-separated)").option("-f, --format <format>", "Output format: agents, cursor, or comma-separated for multiple").option("-p, --platforms <platforms>", "Alias for --format (deprecated)").option("--persona <persona>", "AI persona (fullstack, backend, frontend, devops, data, security)").option("--boundaries <level>", "Boundary preset (conservative, standard, permissive)").option("-y, --yes", "Skip prompts, use defaults (generates AGENTS.md)").option("-o, --output <dir>", "Output directory (default: current directory)").option("--repo-url <url>", "Analyze remote repository URL (GitHub/GitLab supported)").option("--blueprint", "Generate with [[VARIABLE|default]] placeholders for templates").option("--license <type>", "License type (mit, apache-2.0, gpl-3.0, etc.)").option("--ci-cd <platform>", "CI/CD platform (github_actions, gitlab_ci, jenkins, etc.)").option("--project-type <type>", "Project type (work, leisure, opensource, learning)").option("--detect-only", "Only detect project info, don't generate files").option("--load-draft <name>", "Load a saved wizard draft").option("--save-draft <name>", "Save wizard state as a draft (auto-saves at end)").option("--vars <values>", "Fill variables: VAR1=value1,VAR2=value2").action(wizardCommand);
@@ -11924,7 +12334,7 @@ ${chalk20.cyan("CI/CD:")}
11924
12334
  ${chalk20.cyan("Configuration:")}
11925
12335
  ${chalk20.white("$ lynxp config")} ${chalk20.gray("Show current settings")}
11926
12336
  ${chalk20.white("$ lynxp config set-url <url>")} ${chalk20.gray("Point CLI to a self-hosted instance")}
11927
- ${chalk20.white("$ lynxp config reset-url")} ${chalk20.gray("Reset to https://api.lynxprompt.com")}
12337
+ ${chalk20.white("$ lynxp config reset-url")} ${chalk20.gray("Reset to https://lynxprompt.com")}
11928
12338
  ${chalk20.white("$ lynxp config path")} ${chalk20.gray("Show config file location")}
11929
12339
 
11930
12340
  ${chalk20.gray("Docs: https://lynxprompt.com/docs/cli")}