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 +752 -342
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
-
|
|
24
|
+
tokens: {
|
|
31
25
|
type: "object",
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
52
|
-
|
|
55
|
+
function getLogins() {
|
|
56
|
+
return config.get("tokens") ?? {};
|
|
53
57
|
}
|
|
54
|
-
function
|
|
55
|
-
|
|
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
|
-
|
|
63
|
-
return void 0;
|
|
64
|
-
}
|
|
65
|
-
return config.get("token");
|
|
86
|
+
return currentLogin()?.token;
|
|
66
87
|
}
|
|
67
88
|
function setToken(token) {
|
|
68
|
-
|
|
69
|
-
|
|
89
|
+
const logins = getLogins();
|
|
90
|
+
logins[normalizeUrl(getApiUrl())] = { token };
|
|
91
|
+
setLogins(logins);
|
|
70
92
|
}
|
|
71
93
|
function getStoredCredentials() {
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
if (!
|
|
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:
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
96
|
-
return void 0;
|
|
97
|
-
}
|
|
98
|
-
return config.get("user");
|
|
125
|
+
return currentLogin()?.user;
|
|
99
126
|
}
|
|
100
127
|
function setUser(user) {
|
|
101
|
-
|
|
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(
|
|
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
|
|
796
|
-
|
|
797
|
-
|
|
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 =
|
|
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
|
|
1330
|
-
const
|
|
1331
|
-
const
|
|
1332
|
-
const
|
|
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
|
|
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 === "
|
|
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 =
|
|
2428
|
-
if (platform2 &&
|
|
2429
|
-
|
|
2430
|
-
|
|
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(
|
|
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.
|
|
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) => !
|
|
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(
|
|
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 ?
|
|
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: ".
|
|
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: "
|
|
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
|
-
".
|
|
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 "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
11044
|
-
".
|
|
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 =
|
|
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: ${
|
|
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
|
-
|
|
11148
|
-
|
|
11149
|
-
const
|
|
11150
|
-
outputFilename = `${
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
12254
|
+
const url = resetApiUrl();
|
|
11846
12255
|
console.log(
|
|
11847
|
-
chalk19.green("\u2713") + " API URL reset to " + chalk19.cyan(
|
|
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.
|
|
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://
|
|
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")}
|