dsh-gufa-code 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -2
  3. package/client.js +11548 -0
  4. package/cordis.patch.yml +8 -0
  5. package/docs/icon-180.png +0 -0
  6. package/docs/icon.svg +18 -0
  7. package/docs/market-submission.md +32 -0
  8. package/docs/screenshot-ide.jpg +0 -0
  9. package/host/assets.js +31 -0
  10. package/host/chat.js +523 -0
  11. package/host/context.js +438 -0
  12. package/host/dev.js +35 -0
  13. package/host/fs.js +306 -0
  14. package/host/git.js +532 -0
  15. package/host/project.js +305 -0
  16. package/host/ssh.js +54 -0
  17. package/host/terminal-pty.js +237 -0
  18. package/host/terminal.js +947 -0
  19. package/icon.svg +18 -0
  20. package/index.js +63 -0
  21. package/locale/en.json +121 -0
  22. package/locale/zh.json +121 -0
  23. package/package.json +67 -4
  24. package/screenshots.json +3 -0
  25. package/scripts/build-client.mjs +38 -0
  26. package/scripts/selftest-client.mjs +457 -0
  27. package/scripts/selftest-host.mjs +197 -0
  28. package/scripts/selftest-http.mjs +284 -0
  29. package/scripts/selftest-router.mjs +101 -0
  30. package/scripts/selftest-terminal-client.mjs +314 -0
  31. package/scripts/selftest-terminal-pty.mjs +190 -0
  32. package/scripts/selftest-terminal.mjs +351 -0
  33. package/scripts/test-chat-render.mjs +702 -0
  34. package/scripts/test-chat.mjs +761 -0
  35. package/scripts/test-editor.mjs +516 -0
  36. package/scripts/verify-workspace-sessions.mjs +135 -0
  37. package/src/client/00-core.js +1686 -0
  38. package/src/client/10-icons.js +205 -0
  39. package/src/client/20-editor.js +1318 -0
  40. package/src/client/30-terminal.js +1510 -0
  41. package/src/client/40-chat.js +1184 -0
  42. package/src/client/46-gitgraph.js +278 -0
  43. package/src/client/50-panels.js +916 -0
  44. package/src/client/55-backdrop.js +508 -0
  45. package/src/client/60-dock.js +662 -0
  46. package/src/client/85-shortcuts.js +516 -0
  47. package/src/client/90-app.js +2272 -0
  48. package/src/client/99-main.js +449 -0
  49. package/vendor/monaco/LICENSE +21 -0
  50. package/vendor/monaco/ThirdPartyNotices.txt +448 -0
  51. package/vendor/monaco/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  52. package/vendor/monaco/vs/base/worker/workerMain.js +31 -0
  53. package/vendor/monaco/vs/basic-languages/abap/abap.js +10 -0
  54. package/vendor/monaco/vs/basic-languages/apex/apex.js +10 -0
  55. package/vendor/monaco/vs/basic-languages/azcli/azcli.js +10 -0
  56. package/vendor/monaco/vs/basic-languages/bat/bat.js +10 -0
  57. package/vendor/monaco/vs/basic-languages/bicep/bicep.js +11 -0
  58. package/vendor/monaco/vs/basic-languages/cameligo/cameligo.js +10 -0
  59. package/vendor/monaco/vs/basic-languages/clojure/clojure.js +10 -0
  60. package/vendor/monaco/vs/basic-languages/coffee/coffee.js +10 -0
  61. package/vendor/monaco/vs/basic-languages/cpp/cpp.js +10 -0
  62. package/vendor/monaco/vs/basic-languages/csharp/csharp.js +10 -0
  63. package/vendor/monaco/vs/basic-languages/csp/csp.js +10 -0
  64. package/vendor/monaco/vs/basic-languages/css/css.js +12 -0
  65. package/vendor/monaco/vs/basic-languages/cypher/cypher.js +10 -0
  66. package/vendor/monaco/vs/basic-languages/dart/dart.js +10 -0
  67. package/vendor/monaco/vs/basic-languages/dockerfile/dockerfile.js +10 -0
  68. package/vendor/monaco/vs/basic-languages/ecl/ecl.js +10 -0
  69. package/vendor/monaco/vs/basic-languages/elixir/elixir.js +10 -0
  70. package/vendor/monaco/vs/basic-languages/flow9/flow9.js +10 -0
  71. package/vendor/monaco/vs/basic-languages/freemarker2/freemarker2.js +12 -0
  72. package/vendor/monaco/vs/basic-languages/fsharp/fsharp.js +10 -0
  73. package/vendor/monaco/vs/basic-languages/go/go.js +10 -0
  74. package/vendor/monaco/vs/basic-languages/graphql/graphql.js +10 -0
  75. package/vendor/monaco/vs/basic-languages/handlebars/handlebars.js +10 -0
  76. package/vendor/monaco/vs/basic-languages/hcl/hcl.js +10 -0
  77. package/vendor/monaco/vs/basic-languages/html/html.js +10 -0
  78. package/vendor/monaco/vs/basic-languages/ini/ini.js +10 -0
  79. package/vendor/monaco/vs/basic-languages/java/java.js +10 -0
  80. package/vendor/monaco/vs/basic-languages/javascript/javascript.js +10 -0
  81. package/vendor/monaco/vs/basic-languages/julia/julia.js +10 -0
  82. package/vendor/monaco/vs/basic-languages/kotlin/kotlin.js +10 -0
  83. package/vendor/monaco/vs/basic-languages/less/less.js +11 -0
  84. package/vendor/monaco/vs/basic-languages/lexon/lexon.js +10 -0
  85. package/vendor/monaco/vs/basic-languages/liquid/liquid.js +10 -0
  86. package/vendor/monaco/vs/basic-languages/lua/lua.js +10 -0
  87. package/vendor/monaco/vs/basic-languages/m3/m3.js +10 -0
  88. package/vendor/monaco/vs/basic-languages/markdown/markdown.js +10 -0
  89. package/vendor/monaco/vs/basic-languages/mdx/mdx.js +10 -0
  90. package/vendor/monaco/vs/basic-languages/mips/mips.js +10 -0
  91. package/vendor/monaco/vs/basic-languages/msdax/msdax.js +10 -0
  92. package/vendor/monaco/vs/basic-languages/mysql/mysql.js +10 -0
  93. package/vendor/monaco/vs/basic-languages/objective-c/objective-c.js +10 -0
  94. package/vendor/monaco/vs/basic-languages/pascal/pascal.js +10 -0
  95. package/vendor/monaco/vs/basic-languages/pascaligo/pascaligo.js +10 -0
  96. package/vendor/monaco/vs/basic-languages/perl/perl.js +10 -0
  97. package/vendor/monaco/vs/basic-languages/pgsql/pgsql.js +10 -0
  98. package/vendor/monaco/vs/basic-languages/php/php.js +10 -0
  99. package/vendor/monaco/vs/basic-languages/pla/pla.js +10 -0
  100. package/vendor/monaco/vs/basic-languages/postiats/postiats.js +10 -0
  101. package/vendor/monaco/vs/basic-languages/powerquery/powerquery.js +10 -0
  102. package/vendor/monaco/vs/basic-languages/powershell/powershell.js +10 -0
  103. package/vendor/monaco/vs/basic-languages/protobuf/protobuf.js +11 -0
  104. package/vendor/monaco/vs/basic-languages/pug/pug.js +10 -0
  105. package/vendor/monaco/vs/basic-languages/python/python.js +10 -0
  106. package/vendor/monaco/vs/basic-languages/qsharp/qsharp.js +10 -0
  107. package/vendor/monaco/vs/basic-languages/r/r.js +10 -0
  108. package/vendor/monaco/vs/basic-languages/razor/razor.js +10 -0
  109. package/vendor/monaco/vs/basic-languages/redis/redis.js +10 -0
  110. package/vendor/monaco/vs/basic-languages/redshift/redshift.js +10 -0
  111. package/vendor/monaco/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
  112. package/vendor/monaco/vs/basic-languages/ruby/ruby.js +10 -0
  113. package/vendor/monaco/vs/basic-languages/rust/rust.js +10 -0
  114. package/vendor/monaco/vs/basic-languages/sb/sb.js +10 -0
  115. package/vendor/monaco/vs/basic-languages/scala/scala.js +10 -0
  116. package/vendor/monaco/vs/basic-languages/scheme/scheme.js +10 -0
  117. package/vendor/monaco/vs/basic-languages/scss/scss.js +12 -0
  118. package/vendor/monaco/vs/basic-languages/shell/shell.js +10 -0
  119. package/vendor/monaco/vs/basic-languages/solidity/solidity.js +10 -0
  120. package/vendor/monaco/vs/basic-languages/sophia/sophia.js +10 -0
  121. package/vendor/monaco/vs/basic-languages/sparql/sparql.js +10 -0
  122. package/vendor/monaco/vs/basic-languages/sql/sql.js +10 -0
  123. package/vendor/monaco/vs/basic-languages/st/st.js +10 -0
  124. package/vendor/monaco/vs/basic-languages/swift/swift.js +13 -0
  125. package/vendor/monaco/vs/basic-languages/systemverilog/systemverilog.js +10 -0
  126. package/vendor/monaco/vs/basic-languages/tcl/tcl.js +10 -0
  127. package/vendor/monaco/vs/basic-languages/twig/twig.js +10 -0
  128. package/vendor/monaco/vs/basic-languages/typescript/typescript.js +10 -0
  129. package/vendor/monaco/vs/basic-languages/typespec/typespec.js +10 -0
  130. package/vendor/monaco/vs/basic-languages/vb/vb.js +10 -0
  131. package/vendor/monaco/vs/basic-languages/wgsl/wgsl.js +307 -0
  132. package/vendor/monaco/vs/basic-languages/xml/xml.js +10 -0
  133. package/vendor/monaco/vs/basic-languages/yaml/yaml.js +10 -0
  134. package/vendor/monaco/vs/editor/editor.main.css +8 -0
  135. package/vendor/monaco/vs/editor/editor.main.js +798 -0
  136. package/vendor/monaco/vs/language/css/cssMode.js +13 -0
  137. package/vendor/monaco/vs/language/css/cssWorker.js +77 -0
  138. package/vendor/monaco/vs/language/html/htmlMode.js +13 -0
  139. package/vendor/monaco/vs/language/html/htmlWorker.js +454 -0
  140. package/vendor/monaco/vs/language/json/jsonMode.js +19 -0
  141. package/vendor/monaco/vs/language/json/jsonWorker.js +42 -0
  142. package/vendor/monaco/vs/language/typescript/tsMode.js +20 -0
  143. package/vendor/monaco/vs/language/typescript/tsWorker.js +51328 -0
  144. package/vendor/monaco/vs/loader.js +11 -0
  145. package/vendor/monaco/vs/nls.messages.de.js +21 -0
  146. package/vendor/monaco/vs/nls.messages.es.js +21 -0
  147. package/vendor/monaco/vs/nls.messages.fr.js +19 -0
  148. package/vendor/monaco/vs/nls.messages.it.js +19 -0
  149. package/vendor/monaco/vs/nls.messages.ja.js +21 -0
  150. package/vendor/monaco/vs/nls.messages.ko.js +19 -0
  151. package/vendor/monaco/vs/nls.messages.ru.js +21 -0
  152. package/vendor/monaco/vs/nls.messages.zh-cn.js +21 -0
  153. package/vendor/monaco/vs/nls.messages.zh-tw.js +19 -0
  154. package/vendor/xterm/LICENSE +21 -0
  155. package/vendor/xterm/LICENSE.addon-fit +19 -0
  156. package/vendor/xterm/addon-fit.js +2 -0
  157. package/vendor/xterm/xterm.css +285 -0
  158. package/vendor/xterm/xterm.js +2 -0
package/icon.svg ADDED
@@ -0,0 +1,18 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-label="古法编程 Gufa Code">
2
+ <defs>
3
+ <linearGradient id="gufaSeal" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#d0573f"/>
5
+ <stop offset="0.55" stop-color="#b33a2c"/>
6
+ <stop offset="1" stop-color="#8c211b"/>
7
+ </linearGradient>
8
+ </defs>
9
+ <rect x="6" y="6" width="116" height="116" rx="28" fill="url(#gufaSeal)"/>
10
+ <rect x="15" y="15" width="98" height="98" rx="21" fill="none" stroke="#f7e9d8" stroke-opacity="0.78" stroke-width="3.5"/>
11
+ <g fill="#fbeee0">
12
+ <rect x="32" y="32" width="64" height="9.5" rx="2.5"/>
13
+ <rect x="58.5" y="32" width="11" height="30" rx="2"/>
14
+ <path fill-rule="evenodd" d="M40 62 h48 a4 4 0 0 1 4 4 v27 a4 4 0 0 1 -4 4 h-48 a4 4 0 0 1 -4 -4 v-27 a4 4 0 0 1 4 -4 z m8 10 h32 v19 h-32 z"/>
15
+ </g>
16
+ <path d="M27 101 l-7 -6 7 -6" fill="none" stroke="#f7e9d8" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" opacity="0.8"/>
17
+ <path d="M101 101 l7 -6 -7 -6" fill="none" stroke="#f7e9d8" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" opacity="0.8"/>
18
+ </svg>
package/index.js ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * dsh-gufa-code「古法编程」Host 半入口。
3
+ *
4
+ * 能力:项目 / 文件 / Git / SSH / 终端 / AI 聊天 / 静态资产,统一走 host/context.js 的
5
+ * router(鉴权、项目白名单、WebSocket、SSE)。
6
+ *
7
+ * Host 模块按「代(generation)」动态 import:每次请求前比较 host/*.js 的 mtime,
8
+ * 变化时重新 import 并整体替换旧 scope —— 因此修改 host 代码后无需重启 Harness。
9
+ */
10
+ import { statSync } from 'node:fs'
11
+ import { dirname, join } from 'node:path'
12
+ import { fileURLToPath } from 'node:url'
13
+ import { createRouter, ProjectRegistry } from './host/context.js'
14
+
15
+ const HOST_DIR = join(dirname(fileURLToPath(import.meta.url)), 'host')
16
+ const MODULE_FILES = ['assets.js', 'dev.js', 'project.js', 'fs.js', 'git.js', 'ssh.js', 'terminal.js', 'chat.js']
17
+
18
+ function existingModuleFiles() {
19
+ return MODULE_FILES.filter((name) => {
20
+ try {
21
+ statSync(join(HOST_DIR, name))
22
+ return true
23
+ } catch {
24
+ return false
25
+ }
26
+ })
27
+ }
28
+
29
+ /** host 目录内容签名:文件 mtimeMs 变化即触发重载。 */
30
+ function hostSignature() {
31
+ try {
32
+ return existingModuleFiles()
33
+ .map((name) => `${name}:${statSync(join(HOST_DIR, name)).mtimeMs}`)
34
+ .join('|')
35
+ } catch {
36
+ return 'unknown'
37
+ }
38
+ }
39
+
40
+ export const name = 'dsh-gufa-code'
41
+ export const inject = ['webServer', 'connection']
42
+
43
+ /** @param {import('@deepseek-ai/cordis').Context} ctx */
44
+ export function apply(ctx) {
45
+ const router = createRouter(ctx)
46
+ const env = { ctx, projects: new ProjectRegistry() }
47
+ let generation = 0
48
+
49
+ const load = async () => {
50
+ const current = ++generation
51
+ const { scope, registrar } = router.createScope()
52
+ for (const file of existingModuleFiles()) {
53
+ const url = new URL(`./host/${file}`, import.meta.url)
54
+ url.searchParams.set('gufa', String(current))
55
+ const module = await import(url.href)
56
+ if (typeof module.register === 'function') module.register(registrar, env)
57
+ }
58
+ router.installScope(scope)
59
+ }
60
+
61
+ router.setReloader(load, hostSignature)
62
+ router.mount()
63
+ }
package/locale/en.json ADDED
@@ -0,0 +1,121 @@
1
+ {
2
+ "meta": {
3
+ "title": "Gufa Code · AI Copilot",
4
+ "description": "One-click VS Code-style IDE inside DSH: Monaco editor, file tree, create/open projects, Git, SSH, real terminal, and an AI chat panel that assists hand-written code."
5
+ },
6
+ "panel": {
7
+ "label": "Gufa Code"
8
+ },
9
+ "app": {
10
+ "title": "Gufa Code",
11
+ "subtitle": "CLASSIC CODING",
12
+ "newProject": "New project",
13
+ "openProject": "Open project",
14
+ "refresh": "Refresh",
15
+ "exit": "Leave Gufa Code",
16
+ "exitHint": "Back to DSH conversation",
17
+ "openFolder": "Open folder",
18
+ "noProject": "No project opened",
19
+ "noProjectHint": "Open a folder or create a project to start classic coding.",
20
+ "projectName": "Project name",
21
+ "parentFolder": "Parent folder",
22
+ "cancel": "Cancel",
23
+ "confirm": "OK",
24
+ "create": "Create",
25
+ "loading": "Loading…",
26
+ "error": "Something went wrong",
27
+ "retry": "Retry",
28
+ "hostStale": "Plugin upgraded: the Host is still an older build. The editor and AI chat already work; quit and reopen DeepSeek Harness to enable the real terminal."
29
+ },
30
+ "activity": {
31
+ "explorer": "Explorer",
32
+ "git": "Source control",
33
+ "ssh": "SSH",
34
+ "terminal": "Terminal",
35
+ "chat": "Gufa AI",
36
+ "collapseChat": "Collapse AI panel",
37
+ "expandChat": "Expand AI panel",
38
+ "settings": "Settings"
39
+ },
40
+ "explorer": {
41
+ "empty": "Folder is empty",
42
+ "newFile": "New file",
43
+ "newFolder": "New folder",
44
+ "rename": "Rename",
45
+ "delete": "Delete",
46
+ "fileName": "File name",
47
+ "folderName": "Folder name",
48
+ "deleteConfirm": "Delete this file/folder?",
49
+ "gitClean": "Clean",
50
+ "modified": "Modified"
51
+ },
52
+ "git": {
53
+ "branch": "Branch",
54
+ "changes": "Changes",
55
+ "noRepo": "This project is not a Git repository",
56
+ "noChanges": "Working tree clean",
57
+ "stage": "Stage",
58
+ "unstage": "Unstage",
59
+ "stageAll": "Stage all",
60
+ "commitPlaceholder": "Commit message (Ctrl+Enter to commit)",
61
+ "commit": "Commit",
62
+ "committed": "Committed",
63
+ "refresh": "Refresh"
64
+ },
65
+ "ssh": {
66
+ "hosts": "SSH hosts",
67
+ "noHosts": "No hosts in ~/.ssh/config",
68
+ "connect": "Connect",
69
+ "connectHint": "Click a host to run ssh in the terminal",
70
+ "configHint": "Add Host entries in ~/.ssh/config, then refresh"
71
+ },
72
+ "terminal": {
73
+ "new": "New terminal",
74
+ "close": "Close terminal",
75
+ "clear": "Clear",
76
+ "exited": "Process exited",
77
+ "session": "Terminal"
78
+ },
79
+ "editor": {
80
+ "noFile": "Open or create a file to start editing",
81
+ "noFileHint": "Pick a file in the explorer on the left",
82
+ "saved": "Saved",
83
+ "unsaved": "Unsaved",
84
+ "saveConflict": "File changed on disk; reopen before saving",
85
+ "binary": "Binary file cannot be edited as text",
86
+ "tooLarge": "File too large to open"
87
+ },
88
+ "chat": {
89
+ "title": "Gufa AI",
90
+ "newChat": "New chat",
91
+ "history": "History",
92
+ "noHistory": "No history yet",
93
+ "deleteChat": "Delete chat",
94
+ "inputPlaceholder": "Ask the AI, or have it explain the code on the left… (Enter to send, Shift+Enter for newline)",
95
+ "send": "Send",
96
+ "stop": "Stop",
97
+ "you": "You",
98
+ "assistant": "Gufa AI",
99
+ "thinking": "Thinking…",
100
+ "emptyTitle": "Gufa AI assistant",
101
+ "emptyHint": "I help you write code by hand: explain, spot bugs, add comments, suggest ideas.",
102
+ "attachFile": "Attach current file",
103
+ "insert": "Insert into editor",
104
+ "copy": "Copy",
105
+ "copied": "Copied",
106
+ "error": "Request failed",
107
+ "quickExplain": "Explain this code",
108
+ "quickBug": "Find issues",
109
+ "quickComment": "Add comments",
110
+ "quickRefactor": "Refactor ideas",
111
+ "contextLabel": "Context"
112
+ },
113
+ "status": {
114
+ "lines": "lines",
115
+ "col": "col",
116
+ "ln": "Ln",
117
+ "saved": "Saved",
118
+ "dirty": "Unsaved",
119
+ "noGit": "No Git repo"
120
+ }
121
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,121 @@
1
+ {
2
+ "meta": {
3
+ "title": "古法编程 · AI 辅助",
4
+ "description": "一键进入 VS Code 风格 IDE:Monaco 编辑器、文件树、新建/打开项目、Git、SSH、真实终端,右侧 AI 聊天辅助手写代码。"
5
+ },
6
+ "panel": {
7
+ "label": "古法编程"
8
+ },
9
+ "app": {
10
+ "title": "古法编程",
11
+ "subtitle": "GUFA CODE",
12
+ "newProject": "新建项目",
13
+ "openProject": "打开项目",
14
+ "refresh": "刷新",
15
+ "exit": "退出古法编程",
16
+ "exitHint": "返回 DSH 对话",
17
+ "openFolder": "打开文件夹",
18
+ "noProject": "尚未打开项目",
19
+ "noProjectHint": "打开一个文件夹,或新建一个项目,开始古法编程。",
20
+ "projectName": "项目名",
21
+ "parentFolder": "父目录",
22
+ "cancel": "取消",
23
+ "confirm": "确定",
24
+ "create": "创建",
25
+ "loading": "加载中…",
26
+ "error": "出错了",
27
+ "retry": "重试",
28
+ "hostStale": "插件已升级:当前 Host 仍是旧版本。AI 对话与编辑器已可用;请退出并重新打开 DeepSeek Harness 以启用真实终端。"
29
+ },
30
+ "activity": {
31
+ "explorer": "资源管理器",
32
+ "git": "源代码管理",
33
+ "ssh": "SSH 远程",
34
+ "terminal": "终端",
35
+ "chat": "古法 AI 助手",
36
+ "collapseChat": "收起 AI 面板",
37
+ "expandChat": "展开 AI 面板",
38
+ "settings": "设置"
39
+ },
40
+ "explorer": {
41
+ "empty": "目录为空",
42
+ "newFile": "新建文件",
43
+ "newFolder": "新建文件夹",
44
+ "rename": "重命名",
45
+ "delete": "删除",
46
+ "fileName": "文件名",
47
+ "folderName": "文件夹名",
48
+ "deleteConfirm": "确定删除该文件/目录?",
49
+ "gitClean": "无改动",
50
+ "modified": "已修改"
51
+ },
52
+ "git": {
53
+ "branch": "分支",
54
+ "changes": "更改",
55
+ "noRepo": "当前项目不是 Git 仓库",
56
+ "noChanges": "工作区干净",
57
+ "stage": "暂存",
58
+ "unstage": "取消暂存",
59
+ "stageAll": "全部暂存",
60
+ "commitPlaceholder": "提交信息(Ctrl+Enter 提交)",
61
+ "commit": "提交",
62
+ "committed": "已提交",
63
+ "refresh": "刷新"
64
+ },
65
+ "ssh": {
66
+ "hosts": "SSH 主机",
67
+ "noHosts": "~/.ssh/config 中没有主机配置",
68
+ "connect": "连接",
69
+ "connectHint": "点击主机将在终端中执行 ssh 连接",
70
+ "configHint": "在 ~/.ssh/config 中添加 Host 配置后刷新"
71
+ },
72
+ "terminal": {
73
+ "new": "新建终端",
74
+ "close": "关闭终端",
75
+ "clear": "清空",
76
+ "exited": "进程已退出",
77
+ "session": "终端"
78
+ },
79
+ "editor": {
80
+ "noFile": "选择或新建一个文件开始编辑",
81
+ "noFileHint": "左侧资源管理器中打开文件",
82
+ "saved": "已保存",
83
+ "unsaved": "未保存",
84
+ "saveConflict": "文件已在磁盘上被修改,请重新打开后再保存",
85
+ "binary": "二进制文件,无法以文本编辑",
86
+ "tooLarge": "文件过大,无法打开"
87
+ },
88
+ "chat": {
89
+ "title": "古法 AI",
90
+ "newChat": "新建对话",
91
+ "history": "历史对话",
92
+ "noHistory": "暂无历史对话",
93
+ "deleteChat": "删除对话",
94
+ "inputPlaceholder": "问问 AI,或让它解释左侧代码…(Enter 发送,Shift+Enter 换行)",
95
+ "send": "发送",
96
+ "stop": "停止",
97
+ "you": "你",
98
+ "assistant": "古法 AI",
99
+ "thinking": "思考中…",
100
+ "emptyTitle": "古法 AI 助手",
101
+ "emptyHint": "我在这里辅助你手写代码:解释、找错、补注释、给思路。",
102
+ "attachFile": "附带当前文件",
103
+ "insert": "插入到编辑器",
104
+ "copy": "复制",
105
+ "copied": "已复制",
106
+ "error": "请求失败",
107
+ "quickExplain": "解释当前代码",
108
+ "quickBug": "查找潜在问题",
109
+ "quickComment": "补充注释",
110
+ "quickRefactor": "重构建议",
111
+ "contextLabel": "上下文"
112
+ },
113
+ "status": {
114
+ "lines": "行",
115
+ "col": "列",
116
+ "ln": "行",
117
+ "saved": "已保存",
118
+ "dirty": "未保存",
119
+ "noGit": "非 Git 仓库"
120
+ }
121
+ }
package/package.json CHANGED
@@ -1,6 +1,69 @@
1
1
  {
2
2
  "name": "dsh-gufa-code",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.1",
4
+ "description": "古法编程 · AI 辅助:在 DSH Web 界面一键进入 VS Code 风格 IDE(Monaco 编辑器、文件树、Git、SSH、真实终端与右侧 AI 聊天)",
5
+ "icon": "icon.svg",
6
+ "keywords": [
7
+ "dsh",
8
+ "dsh-plugin",
9
+ "plugin",
10
+ "ide",
11
+ "vscode",
12
+ "monaco",
13
+ "cursor",
14
+ "ai",
15
+ "terminal",
16
+ "git"
17
+ ],
18
+ "type": "module",
19
+ "main": "./index.js",
20
+ "exports": {
21
+ ".": "./index.js",
22
+ "./client": "./client.js",
23
+ "./locale/*.json": "./locale/*.json",
24
+ "./icon": "./icon.svg"
25
+ },
26
+ "files": [
27
+ "index.js",
28
+ "client.js",
29
+ "host",
30
+ "vendor",
31
+ "src",
32
+ "scripts",
33
+ "cordis.patch.yml",
34
+ "locale/*.json",
35
+ "icon.svg",
36
+ "README.md",
37
+ "LICENSE",
38
+ "docs",
39
+ "screenshots.json"
40
+ ],
41
+ "dependencies": {
42
+ "ws": "^8.22.0"
43
+ },
44
+ "dsh": {
45
+ "bundle": {
46
+ "patch": "./cordis.patch.yml"
47
+ },
48
+ "client": {
49
+ "platform": "web",
50
+ "immediately": true
51
+ }
52
+ },
53
+ "license": "MIT",
54
+ "author": "Jeff nan",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/liujiangnanchenjbguo/dsh-gufa-code.git"
58
+ },
59
+ "homepage": "https://github.com/liujiangnanchenjbguo/dsh-gufa-code#readme",
60
+ "bugs": {
61
+ "url": "https://github.com/liujiangnanchenjbguo/dsh-gufa-code/issues"
62
+ },
63
+ "engines": {
64
+ "dsh": ">=0.2.1-rc.1"
65
+ },
66
+ "publishConfig": {
67
+ "access": "public"
68
+ }
69
+ }
@@ -0,0 +1,3 @@
1
+ [
2
+ "docs/screenshot-ide.jpg"
3
+ ]
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 把 src/client/*.js 按文件名顺序拼接成单个浏览器产物 client.js。
4
+ * 每个零件文件都在 lazy-CJS factory 函数体内执行,共享 React / h / hooks / G。
5
+ */
6
+ import { readFileSync, readdirSync, writeFileSync } from 'node:fs'
7
+ import { dirname, join, resolve } from 'node:path'
8
+ import { fileURLToPath } from 'node:url'
9
+
10
+ const root = resolve(dirname(fileURLToPath(import.meta.url)), '..')
11
+ const partsDir = join(root, 'src', 'client')
12
+ const files = readdirSync(partsDir).filter((name) => name.endsWith('.js')).sort()
13
+ if (files.length === 0) {
14
+ console.error('build-client: src/client 下没有零件文件')
15
+ process.exit(1)
16
+ }
17
+
18
+ const header = `window.__ModuleLoader__.load({
19
+ id: 'dsh-gufa-code',
20
+ factory(require) {
21
+ const React = require('react')
22
+ const h = React.createElement
23
+ const { useState, useEffect, useRef, useMemo, useCallback, useLayoutEffect } = React
24
+ `
25
+
26
+ const body = files
27
+ .map((name) => `\n/* ─────────────────────── ${name} ─────────────────────── */\n${readFileSync(join(partsDir, name), 'utf8')}`)
28
+ .join('\n')
29
+
30
+ const footer = `
31
+ },
32
+ })
33
+ `
34
+
35
+ const output = header + body + footer
36
+ writeFileSync(join(root, 'client.js'), output, 'utf8')
37
+ console.log(`build-client: ${files.length} parts -> client.js (${(Buffer.byteLength(output) / 1024).toFixed(1)} KB)`)
38
+ if (process.argv.includes('--list')) console.log(files.join('\n'))