@shawnstack/quickforge 1.6.11 → 1.6.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +292 -452
- package/dist/assets/{AgentProfilesPage-CvoB0OId.js → AgentProfilesPage-CooGLweI.js} +1 -1
- package/dist/assets/ChatPanelHost-TEbv0lnL.js +260 -0
- package/dist/assets/{PluginsPage-B_4nlPca.js → PluginsPage-qXTjDrpd.js} +1 -1
- package/dist/assets/{ScheduledTasksPage-Zbsuo8o6.js → ScheduledTasksPage-BBor8Yb2.js} +1 -1
- package/dist/assets/{SettingsWorkspacePage-BtgkwIKN.js → SettingsWorkspacePage-CnFDmGvW.js} +3 -3
- package/dist/assets/{SharedConversationPage-B5FS3eSl.js → SharedConversationPage-CkQ-XwYS.js} +1 -1
- package/dist/assets/{TerminalDock-CiJCmyqg.js → TerminalDock-CvqBBMPg.js} +1 -1
- package/dist/assets/{WorkspaceInspector-C9HyQIvF.js → WorkspaceInspector-6JGc6VGb.js} +1 -1
- package/dist/assets/index-DxNzlPmc.js +63 -0
- package/dist/assets/index-HVxfqXfB.css +3 -0
- package/dist/assets/{mcp-servers-dialog-BPk4a4nW.js → mcp-servers-dialog-CsRQxx7A.js} +1 -1
- package/dist/assets/{skills-dialog-DcxeFWSt.js → skills-dialog-CmVLi_h6.js} +1 -1
- package/dist/index.html +4 -4
- package/package.json +1 -1
- package/server/routes/project.mjs +3 -18
- package/server/utils/platform.mjs +20 -3
- package/dist/assets/ChatPanelHost-Cyi1yi_P.js +0 -244
- package/dist/assets/index-BFKildY3.js +0 -63
- package/dist/assets/index-CsKSKUn-.css +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,n as t}from"./rolldown-runtime-DWdDZTNf.js";import{B as n,It as r,Rt as i,Vt as a,_ as o,n as s}from"./icons-C7j5jdKo.js";import{n as c}from"./react-vendor-VqdnQHHS.js";import{ct as l,dt as u,ht as d}from"./index-
|
|
1
|
+
import{i as e,n as t}from"./rolldown-runtime-DWdDZTNf.js";import{B as n,It as r,Rt as i,Vt as a,_ as o,n as s}from"./icons-C7j5jdKo.js";import{n as c}from"./react-vendor-VqdnQHHS.js";import{ct as l,dt as u,ht as d}from"./index-DxNzlPmc.js";var f=t({SkillsDialog:()=>_,SkillsManagerPanel:()=>g}),p=e(a(),1),m=c();async function h(e){let t=await e.json().catch(()=>null);if(!e.ok)throw Error(t?.error||`HTTP ${e.status}`);return t}function g({active:e=!0,scope:t,project:a,embedded:c=!1,onClose:f,onSaved:g}){let[_,v]=(0,p.useState)([]),[y,b]=(0,p.useState)(()=>new Set),[x,S]=(0,p.useState)(``),[C,w]=(0,p.useState)([]),[T,E]=(0,p.useState)(!1),[D,O]=(0,p.useState)(!1),[k,A]=(0,p.useState)(``),j=t===`project`,[M,N]=(0,p.useState)(null),[P,F]=(0,p.useState)(null),[I,L]=(0,p.useState)(!1),[R,z]=(0,p.useState)(``),B=(0,p.useCallback)(()=>{N(null),F(null),z(``)},[]),V=(0,p.useCallback)(()=>{B(),f?.()},[f,B]);(0,p.useEffect)(()=>{if(!e||j&&!a)return;let t=!1;return(async()=>{E(!0),A(``);try{let e=j?`/api/skills?projectId=${encodeURIComponent(a.id)}`:`/api/skills?scope=global`,n=await h(await fetch(e));if(t)return;v(Array.isArray(n.skills)?n.skills:[]),b(new Set(Array.isArray(n.selectedSkills)?n.selectedSkills:[])),w(Array.isArray(n.searchPaths)?n.searchPaths:[])}catch(e){t||A(e instanceof Error?e.message:d(`failedToLoadSkills`))}finally{t||E(!1)}})(),()=>{t=!0}},[e,a,j]),(0,p.useEffect)(()=>{if(!e||c)return;let t=e=>{e.key===`Escape`&&(M?B():D||V())};return document.addEventListener(`keydown`,t),()=>document.removeEventListener(`keydown`,t)},[e,V,c,D,M,B]);let H=(0,p.useMemo)(()=>{let e=x.trim().toLowerCase();return e?_.filter(t=>[t.name,t.displayName,t.description,t.source,t.compatibility,t.allowedTools,...t.tags??[],...t.triggers??[]].filter(Boolean).join(` `).toLowerCase().includes(e)):_},[x,_]),U=async e=>{N(e),F(null),z(``),L(!0);try{let t=new URLSearchParams({name:e});j&&a?(t.set(`scope`,`project`),t.set(`projectId`,a.id)):t.set(`scope`,`global`),F(await h(await fetch(`/api/skills/content?${t}`)))}catch(e){z(e instanceof Error?e.message:d(`failedToReadSkill`))}finally{L(!1)}};if(!e||j&&!a)return null;let W=e=>{if(D)return;let t=new Set(y);t.has(e)?t.delete(e):t.add(e),b(t),G(t)},G=async e=>{O(!0),A(``);try{let n=await h(await fetch(j?`/api/skills/project`:`/api/skills/global`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify(j?{projectId:a.id,selectedSkills:[...e]}:{selectedSkills:[...e]})}));g({scope:t,project:j?n.projects?.find(e=>e.id===a.id)??{...a,skills:n.selectedSkills}:void 0,projects:n.projects,selectedSkills:n.selectedSkills})}catch(e){b(y),A(e instanceof Error?e.message:d(`failedToSaveSkills`))}finally{O(!1)}},K=d(j?`projectSkills`:`globalSkills`),q=j?d(`projectSkillsDescription`,{project:a.name}):d(`globalSkillsDescription`),J=(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`div`,{className:`quickforge-settings-divider p-3`,children:(0,m.jsxs)(`div`,{className:`quickforge-settings-inline-field`,children:[(0,m.jsx)(o,{className:`pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/60`}),(0,m.jsx)(`input`,{value:x,onChange:e=>S(e.target.value),placeholder:d(`searchSkills`),className:`quickforge-settings-input`,disabled:T||D})]})}),k?(0,m.jsx)(`div`,{className:`quickforge-settings-alert quickforge-settings-warning-attached`,children:k}):null,(0,m.jsxs)(`div`,{className:`quickforge-settings-toolbar`,children:[(0,m.jsx)(`span`,{className:`quickforge-settings-row-title`,children:d(`availableSkills`)}),(0,m.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-info`,children:d(`selectedSkillsCount`,{count:y.size})})]}),(0,m.jsx)(`div`,{className:c?``:`max-h-[46vh] overflow-y-auto`,children:T?(0,m.jsxs)(`div`,{className:`quickforge-settings-empty-row inline-flex items-center gap-2`,children:[(0,m.jsx)(n,{className:`size-4 animate-spin`}),d(`loading`)]}):H.length===0?(0,m.jsx)(`div`,{className:`quickforge-settings-empty-row`,children:d(`noMatchingSkills`)}):H.map(e=>{let t=y.has(e.name);return(0,m.jsxs)(`div`,{className:u(`quickforge-settings-list-item`,t&&`bg-muted/12`),children:[(0,m.jsxs)(`div`,{className:`quickforge-settings-list-item-main`,children:[(0,m.jsx)(`div`,{className:`quickforge-settings-row-title`,children:e.displayName||e.name}),e.description?(0,m.jsx)(`div`,{className:`quickforge-settings-row-description`,children:e.description}):null,(0,m.jsxs)(`div`,{className:`quickforge-settings-meta`,children:[e.source?(0,m.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:e.source}):null,e.compatibility?(0,m.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:e.compatibility}):null,e.allowedTools?(0,m.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:e.allowedTools}):null,e.tags?.slice(0,5).map(e=>(0,m.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:e},e))]})]}),(0,m.jsxs)(`div`,{className:`quickforge-settings-list-item-actions`,onClick:e=>e.stopPropagation(),children:[(0,m.jsxs)(`label`,{className:`quickforge-settings-switch`,"aria-disabled":D?`true`:`false`,children:[(0,m.jsx)(`input`,{type:`checkbox`,checked:t,disabled:D,onChange:()=>W(e.name),"aria-label":t?`Disable ${e.name}`:`Enable ${e.name}`}),(0,m.jsx)(`span`,{"aria-hidden":`true`})]}),(0,m.jsx)(`button`,{type:`button`,className:`quickforge-settings-icon-action`,onClick:()=>void U(e.name),disabled:D||I,title:d(`readSkill`),"aria-label":`${d(`readSkill`)}: ${e.displayName||e.name}`,children:(0,m.jsx)(r,{className:`size-4`})})]})]},e.name)})})]}),Y=(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(`div`,{className:`quickforge-settings-toolbar`,children:[(0,m.jsxs)(`button`,{type:`button`,className:`quickforge-settings-button quickforge-settings-button-secondary`,onClick:B,disabled:I,children:[(0,m.jsx)(i,{className:`mr-2 size-4`}),d(`backToSkillList`)]}),(0,m.jsx)(`div`,{className:`quickforge-settings-row-main min-w-0`,children:(0,m.jsx)(`div`,{className:`quickforge-settings-row-title truncate`,children:P?.displayName||P?.name||M})})]}),(0,m.jsx)(`div`,{className:`p-4`,children:I?(0,m.jsxs)(`div`,{className:`quickforge-settings-empty-row inline-flex items-center gap-2`,children:[(0,m.jsx)(n,{className:`size-4 animate-spin`}),d(`loading`)]}):R?(0,m.jsx)(`div`,{className:`quickforge-settings-alert quickforge-settings-warning-attached`,children:R}):P?(0,m.jsxs)(m.Fragment,{children:[P.description?(0,m.jsx)(`div`,{className:`quickforge-settings-row-description mb-3`,children:P.description}):null,(0,m.jsxs)(`div`,{className:`quickforge-settings-meta mb-3`,children:[P.version?(0,m.jsxs)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:[`v`,P.version]}):null,P.source?(0,m.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:P.source}):null,P.compatibility?(0,m.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:P.compatibility}):null,P.allowedTools?(0,m.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:P.allowedTools}):null,P.license?(0,m.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:P.license}):null,P.tags?.map(e=>(0,m.jsx)(`span`,{className:`quickforge-settings-badge quickforge-settings-badge-muted`,children:e},e))]}),P.triggers?.length?(0,m.jsxs)(`div`,{className:`quickforge-settings-row-description mb-3`,children:[`Triggers: `,P.triggers.join(`, `)]}):null,P.instructions?(0,m.jsx)(`pre`,{className:`whitespace-pre-wrap break-words rounded-md border border-border bg-muted/30 px-4 py-3 font-mono text-sm leading-6 text-foreground/80`,children:P.instructions}):(0,m.jsx)(`div`,{className:`quickforge-settings-empty-row`,children:d(`noSkillContent`)})]}):null})]});return c?(0,m.jsx)(`div`,{className:`quickforge-settings-stack`,children:(0,m.jsx)(`section`,{className:`quickforge-settings-section`,"aria-label":K,children:M?Y:(0,m.jsxs)(m.Fragment,{children:[C.length?(0,m.jsx)(`div`,{className:`px-5 pt-4`,children:(0,m.jsxs)(`span`,{className:`quickforge-settings-row-description break-all`,children:[d(`skillSearchPaths`),`: `,C.join(` · `)]})}):null,J]})})}):(0,m.jsx)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4`,onClick:e=>{e.target===e.currentTarget&&!D&&V()},children:(0,m.jsxs)(`div`,{className:`flex max-h-[85vh] w-full max-w-2xl flex-col rounded-lg border border-border bg-background shadow-quickforge`,children:[(0,m.jsxs)(`div`,{className:`quickforge-settings-toolbar`,children:[(0,m.jsxs)(`div`,{className:`quickforge-settings-row-main`,children:[(0,m.jsxs)(`div`,{className:`quickforge-settings-row-title`,children:[K,(0,m.jsx)(l,{label:q})]}),(0,m.jsx)(`div`,{className:`quickforge-settings-row-description`,children:q}),C.length?(0,m.jsxs)(`div`,{className:`quickforge-settings-row-description break-all`,children:[d(`skillSearchPaths`),`: `,C.join(` · `)]}):null]}),(0,m.jsx)(`button`,{type:`button`,className:`quickforge-settings-icon-action`,onClick:V,disabled:D,"aria-label":d(`close`),children:(0,m.jsx)(s,{className:`size-4`})})]}),(0,m.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:M?Y:J})]})})}function _({open:e,scope:t,project:n,onOpenChange:r,onSaved:i}){return(0,m.jsx)(g,{active:e,scope:t,project:n,onClose:()=>r(!1),onSaved:i})}export{f as n,_ as t};
|
package/dist/index.html
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<meta name="apple-mobile-web-app-title" content="QuickForge" />
|
|
12
12
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
13
13
|
<title>速构 QuickForge</title>
|
|
14
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
+
<script type="module" crossorigin src="/assets/index-DxNzlPmc.js"></script>
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-DWdDZTNf.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/pi-ai-Cr3rpCXT.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="/assets/lit-vendor-Dr3cpBGF.js">
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
<link rel="modulepreload" crossorigin href="/assets/icons-C7j5jdKo.js">
|
|
21
21
|
<link rel="modulepreload" crossorigin href="/assets/react-vendor-VqdnQHHS.js">
|
|
22
22
|
<link rel="modulepreload" crossorigin href="/assets/logger-B65Akg8A.js">
|
|
23
|
-
<link rel="modulepreload" crossorigin href="/assets/index-
|
|
24
|
-
<link rel="modulepreload" crossorigin href="/assets/skills-dialog-
|
|
25
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
23
|
+
<link rel="modulepreload" crossorigin href="/assets/index-DxNzlPmc.js">
|
|
24
|
+
<link rel="modulepreload" crossorigin href="/assets/skills-dialog-CmVLi_h6.js">
|
|
25
|
+
<link rel="stylesheet" crossorigin href="/assets/index-HVxfqXfB.css">
|
|
26
26
|
</head>
|
|
27
27
|
<body>
|
|
28
28
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -99,12 +99,7 @@ export async function handleProjectApi(req, res, url) {
|
|
|
99
99
|
|
|
100
100
|
if (req.method === 'POST' && url.pathname.startsWith('/api/project/') && url.pathname.endsWith('/open-in-explorer')) {
|
|
101
101
|
const id = decodeSegment(url.pathname.split('/').filter(Boolean)[2])
|
|
102
|
-
const selected = config
|
|
103
|
-
if (!selected) {
|
|
104
|
-
const error = new Error('Unknown project')
|
|
105
|
-
error.statusCode = 404
|
|
106
|
-
throw error
|
|
107
|
-
}
|
|
102
|
+
const selected = resolveRequestedProject(config, id, getDefaultWorkspaceRoot())
|
|
108
103
|
await openPathInFileManager(selected.path)
|
|
109
104
|
sendJson(res, 200, { ok: true })
|
|
110
105
|
return
|
|
@@ -112,12 +107,7 @@ export async function handleProjectApi(req, res, url) {
|
|
|
112
107
|
|
|
113
108
|
if (req.method === 'POST' && url.pathname.startsWith('/api/project/') && url.pathname.endsWith('/open-in-vscode')) {
|
|
114
109
|
const id = decodeSegment(url.pathname.split('/').filter(Boolean)[2])
|
|
115
|
-
const selected = config
|
|
116
|
-
if (!selected) {
|
|
117
|
-
const error = new Error('Unknown project')
|
|
118
|
-
error.statusCode = 404
|
|
119
|
-
throw error
|
|
120
|
-
}
|
|
110
|
+
const selected = resolveRequestedProject(config, id, getDefaultWorkspaceRoot())
|
|
121
111
|
await openPathInVSCode(selected.path)
|
|
122
112
|
sendJson(res, 200, { ok: true })
|
|
123
113
|
return
|
|
@@ -125,12 +115,7 @@ export async function handleProjectApi(req, res, url) {
|
|
|
125
115
|
|
|
126
116
|
if (req.method === 'POST' && url.pathname.startsWith('/api/project/') && url.pathname.endsWith('/open-in-idea')) {
|
|
127
117
|
const id = decodeSegment(url.pathname.split('/').filter(Boolean)[2])
|
|
128
|
-
const selected = config
|
|
129
|
-
if (!selected) {
|
|
130
|
-
const error = new Error('Unknown project')
|
|
131
|
-
error.statusCode = 404
|
|
132
|
-
throw error
|
|
133
|
-
}
|
|
118
|
+
const selected = resolveRequestedProject(config, id, getDefaultWorkspaceRoot())
|
|
134
119
|
await openPathInIDEA(selected.path)
|
|
135
120
|
sendJson(res, 200, { ok: true })
|
|
136
121
|
return
|
|
@@ -131,6 +131,22 @@ async function findExistingFile(candidates) {
|
|
|
131
131
|
return undefined
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
+
export function createExternalAppEnv(source = process.env) {
|
|
135
|
+
const env = { ...source }
|
|
136
|
+
delete env.ELECTRON_RUN_AS_NODE
|
|
137
|
+
delete env.ELECTRON_NO_ATTACH_CONSOLE
|
|
138
|
+
delete env.ATOM_SHELL_INTERNAL_RUN_AS_NODE
|
|
139
|
+
return env
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function createVSCodeOpenArgs(targetPath, platform = process.platform) {
|
|
143
|
+
return platform === 'win32' ? ['--reuse-window', targetPath] : [targetPath]
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function shouldHideVSCodeLauncherWindow(command, platform = process.platform) {
|
|
147
|
+
return platform === 'win32' && path.win32.basename(command).toLowerCase() === 'cmd.exe'
|
|
148
|
+
}
|
|
149
|
+
|
|
134
150
|
async function findIntelliJIdeaExecutable() {
|
|
135
151
|
const roots = [
|
|
136
152
|
process.env.LOCALAPPDATA ? path.join(process.env.LOCALAPPDATA, 'Programs') : undefined,
|
|
@@ -206,10 +222,10 @@ export async function openPathInVSCode(targetPath) {
|
|
|
206
222
|
const codeExecutable = await findExistingFile(candidates)
|
|
207
223
|
if (codeExecutable) {
|
|
208
224
|
command = codeExecutable
|
|
209
|
-
args =
|
|
225
|
+
args = createVSCodeOpenArgs(resolved)
|
|
210
226
|
} else {
|
|
211
227
|
command = 'cmd.exe'
|
|
212
|
-
args = ['/d', '/s', '/c', 'start', '""', '/b', 'code', resolved]
|
|
228
|
+
args = ['/d', '/s', '/c', 'start', '""', '/b', 'code', '--reuse-window', resolved]
|
|
213
229
|
}
|
|
214
230
|
}
|
|
215
231
|
|
|
@@ -217,8 +233,9 @@ export async function openPathInVSCode(targetPath) {
|
|
|
217
233
|
const child = spawn(command, args, {
|
|
218
234
|
detached: true,
|
|
219
235
|
stdio: 'ignore',
|
|
220
|
-
windowsHide:
|
|
236
|
+
windowsHide: shouldHideVSCodeLauncherWindow(command),
|
|
221
237
|
shell: false,
|
|
238
|
+
env: createExternalAppEnv(),
|
|
222
239
|
})
|
|
223
240
|
child.once('error', (error) => {
|
|
224
241
|
error.statusCode = 500
|