@waishnav/devspace 1.0.0 → 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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -9
  3. package/dist/config.js +16 -7
  4. package/dist/review-checkpoints.js +4 -4
  5. package/dist/server.js +15 -15
  6. package/dist/ui/.vite/manifest.json +280 -280
  7. package/dist/ui/assets/{angular-html-Di31D1W0.js → angular-html-B_77pPm_.js} +1 -1
  8. package/dist/ui/assets/{angular-ts-BKuSFrBS.js → angular-ts-tGBi7sOr.js} +1 -1
  9. package/dist/ui/assets/{apl-DgqYbYoh.js → apl-CtVPpGgP.js} +1 -1
  10. package/dist/ui/assets/{astro-B19gi6Os.js → astro-CALPYvnG.js} +1 -1
  11. package/dist/ui/assets/{blade-BKHjA4oS.js → blade-Bh4eBXdk.js} +1 -1
  12. package/dist/ui/assets/{c-FjyGimBn.js → c-BGkebjQE.js} +1 -1
  13. package/dist/ui/assets/{cobol-DlmtgjjX.js → cobol-f7rP2PjR.js} +1 -1
  14. package/dist/ui/assets/{coffee-BlTKLwcf.js → coffee-E4OhMc7W.js} +1 -1
  15. package/dist/ui/assets/{cpp-DtVUwoaa.js → cpp-Cr_J6lB2.js} +1 -1
  16. package/dist/ui/assets/{crystal-C0TLGTHr.js → crystal-B_TFXhon.js} +1 -1
  17. package/dist/ui/assets/{css-FssmIjiX.js → css-DDMxq-4J.js} +1 -1
  18. package/dist/ui/assets/{edge-_m-12TBz.js → edge-Bxqhgg5I.js} +1 -1
  19. package/dist/ui/assets/{elixir-RKJED3b7.js → elixir-WrSbgJJ1.js} +1 -1
  20. package/dist/ui/assets/{elm-CzMSD9Oq.js → elm-BXBWJ4Kz.js} +1 -1
  21. package/dist/ui/assets/{erb-Cqpp-3vK.js → erb-D0iMw9rO.js} +1 -1
  22. package/dist/ui/assets/{git-rebase-DLS2r2oj.js → git-rebase-BOrZ-_iR.js} +1 -1
  23. package/dist/ui/assets/{glimmer-js-B1t-JGK1.js → glimmer-js-PCWk96O8.js} +1 -1
  24. package/dist/ui/assets/{glimmer-ts-CazygCNf.js → glimmer-ts-4pYwX8pC.js} +1 -1
  25. package/dist/ui/assets/{glsl-gBg2vKZ-.js → glsl-CDyKZvZX.js} +1 -1
  26. package/dist/ui/assets/{graphql-C8u6MNtl.js → graphql-8sIw92YT.js} +1 -1
  27. package/dist/ui/assets/{hack-CgKuqejW.js → hack-Ci96Zcew.js} +1 -1
  28. package/dist/ui/assets/{haml-I5WU4_Rg.js → haml-4uzh6End.js} +1 -1
  29. package/dist/ui/assets/{handlebars-DGf6O3Q6.js → handlebars-B6Eq7QV8.js} +1 -1
  30. package/dist/ui/assets/{heavy-payload-Bp6srDbj.js → heavy-payload--bwRtRpo.js} +1 -1
  31. package/dist/ui/assets/{html-BrIuweS5.js → html-C29wL7bm.js} +1 -1
  32. package/dist/ui/assets/{html-derivative-CflP_1S6.js → html-derivative-Cmd90ilz.js} +1 -1
  33. package/dist/ui/assets/{http-qgGkv9Ds.js → http-Bdr_R0Kw.js} +1 -1
  34. package/dist/ui/assets/{hurl-CantyQ5z.js → hurl-CiTPn-zH.js} +1 -1
  35. package/dist/ui/assets/{java-DqStxnBY.js → java-C03kBuJH.js} +1 -1
  36. package/dist/ui/assets/{javascript-CJ1ZUMNM.js → javascript-135g9Wwx.js} +1 -1
  37. package/dist/ui/assets/{jinja-Ta-y-8tW.js → jinja-CPpiEHqV.js} +1 -1
  38. package/dist/ui/assets/{jison-DZStAtdf.js → jison-qabCQzwp.js} +1 -1
  39. package/dist/ui/assets/{json-Bfn_pgvS.js → json-CtRj9Trp.js} +1 -1
  40. package/dist/ui/assets/{jsx-CFi5D1JI.js → jsx-Ccuy5Wm3.js} +1 -1
  41. package/dist/ui/assets/{julia-CmuPb_FV.js → julia-Fwya-MwM.js} +1 -1
  42. package/dist/ui/assets/{just-xoDaYyy4.js → just-c9YEH7Gf.js} +1 -1
  43. package/dist/ui/assets/{latex-C7jbQT4s.js → latex-D9xoD6UX.js} +1 -1
  44. package/dist/ui/assets/{liquid-DyVckOju.js → liquid-BKZLZSHN.js} +1 -1
  45. package/dist/ui/assets/{lua-CQGEo-kr.js → lua-CBD2zNyC.js} +1 -1
  46. package/dist/ui/assets/{marko-CF3FIlcL.js → marko-Dkgf9bj3.js} +1 -1
  47. package/dist/ui/assets/{mdc-DJfBh8KU.js → mdc-BUgUKiX3.js} +1 -1
  48. package/dist/ui/assets/{nginx-CmN5T-d3.js → nginx-CAaav4Zh.js} +1 -1
  49. package/dist/ui/assets/{nim-a_705mqZ.js → nim-CTjWWztL.js} +1 -1
  50. package/dist/ui/assets/{perl-BFxFi55O.js → perl-DTM5zgH4.js} +1 -1
  51. package/dist/ui/assets/{php-C9Uf0Vo_.js → php-dqfFDbWm.js} +1 -1
  52. package/dist/ui/assets/{pug-DQIrtlYh.js → pug-4f_clTm2.js} +1 -1
  53. package/dist/ui/assets/{qml-CpI_Asuw.js → qml-BFeWjFRL.js} +1 -1
  54. package/dist/ui/assets/{r-hYZdyIMH.js → r-ei1iNvHm.js} +1 -1
  55. package/dist/ui/assets/{razor-CbXx350T.js → razor-jj95jncJ.js} +1 -1
  56. package/dist/ui/assets/{regexp-BdfO5R2u.js → regexp-0joUf3Cn.js} +1 -1
  57. package/dist/ui/assets/{review-payload-CC-3-Lb9.js → review-payload-DxI2fTnP.js} +1 -1
  58. package/dist/ui/assets/{rst-CP6mAm3Y.js → rst-BMbcN8--.js} +1 -1
  59. package/dist/ui/assets/{ruby-8tjXzrRr.js → ruby-BQx0xtOB.js} +1 -1
  60. package/dist/ui/assets/{sas-rqWHY37U.js → sas-C_Fl1EyP.js} +1 -1
  61. package/dist/ui/assets/{scss-aGYgGui9.js → scss-5vaLJPJl.js} +1 -1
  62. package/dist/ui/assets/{shellscript-CYr5JWBI.js → shellscript-p_y7YCYP.js} +1 -1
  63. package/dist/ui/assets/{shellsession-CO3ljRR7.js → shellsession-ChZkMp2K.js} +1 -1
  64. package/dist/ui/assets/{soy-C4_rLmHV.js → soy-im25cA8U.js} +1 -1
  65. package/dist/ui/assets/{sql-2jcbKHJ9.js → sql-BzvG6ssm.js} +1 -1
  66. package/dist/ui/assets/{stata-Dbr0lM_v.js → stata-CwSzNM20.js} +1 -1
  67. package/dist/ui/assets/{surrealql-Cp0eMxMo.js → surrealql-BWzKhI6S.js} +1 -1
  68. package/dist/ui/assets/{svelte-BfsT9lcS.js → svelte-NMlQHjaa.js} +1 -1
  69. package/dist/ui/assets/{templ-BBOwNqeW.js → templ-1W11KGSL.js} +1 -1
  70. package/dist/ui/assets/{tex-CPmn_RsX.js → tex-CTxN8q2c.js} +1 -1
  71. package/dist/ui/assets/{ts-tags-DMILlUz_.js → ts-tags-B6prphu-.js} +1 -1
  72. package/dist/ui/assets/{tsx-CUP2Lfiz.js → tsx-Daks24y9.js} +1 -1
  73. package/dist/ui/assets/{twig-DEZ_7SDX.js → twig-C0KeCxch.js} +1 -1
  74. package/dist/ui/assets/{typescript-DhaMQEhQ.js → typescript-37-dkCwp.js} +1 -1
  75. package/dist/ui/assets/{useFileDiffInstance-Bo6irrE6.js → useFileDiffInstance--R0_ywL_.js} +3 -3
  76. package/dist/ui/assets/{vue-CAaS6wtt.js → vue-Ba-v02vP.js} +1 -1
  77. package/dist/ui/assets/{vue-html-D3Etensv.js → vue-html-D2UmbuN7.js} +1 -1
  78. package/dist/ui/assets/{vue-vine-DNRKj0Lh.js → vue-vine-ZftUW_ID.js} +1 -1
  79. package/dist/ui/assets/{workspace-app-BLeU1qC_.js → workspace-app-CsMiGtz9.js} +4 -4
  80. package/dist/ui/assets/{xml-M-X6I2aP.js → xml-DrhRYxTS.js} +1 -1
  81. package/dist/ui/assets/{xsl-CR0ZlrL7.js → xsl-DvbIvBcQ.js} +1 -1
  82. package/dist/ui/assets/{yaml-pI4xDDgj.js → yaml-oktUYAzQ.js} +1 -1
  83. package/dist/ui/workspace-app.html +1 -1
  84. package/docs/chatgpt-coding-workflow.md +22 -22
  85. package/docs/configuration.md +13 -10
  86. package/docs/gotchas.md +5 -4
  87. package/package.json +2 -4
  88. package/scripts/dev-server.mjs +120 -0
  89. package/scripts/build-release.mjs +0 -89
  90. package/scripts/ensure-native-deps.mjs +0 -29
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Waishnav
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -65,12 +65,12 @@ After the MCP client connects, ChatGPT can open a project with
65
65
  DevSpace provides tools for:
66
66
 
67
67
  - reading, writing, and editing files inside the opened workspace
68
- - searching files and listing directories
68
+ - running shell-backed search and directory inspection in the default minimal tool mode
69
69
  - running shell commands for tests, builds, git, and package scripts
70
70
  - opening isolated Git worktrees when you want parallel work
71
71
  - loading `AGENTS.md` and `CLAUDE.md` instructions
72
72
  - exposing local agent skills from your skill folders
73
- - showing ChatGPT Apps review cards for aggregate diffs
73
+ - showing ChatGPT Apps tool cards, with an opt-in aggregate `show_changes` card
74
74
 
75
75
  The default local endpoint is:
76
76
 
@@ -132,15 +132,9 @@ For working on DevSpace itself:
132
132
 
133
133
  ```bash
134
134
  npm install --include=dev
135
+ npm run dev
135
136
  npm run typecheck
136
137
  npm test
137
138
  npm run build
138
139
  npm run start
139
140
  ```
140
-
141
- For long-running local server processes, build an immutable release copy:
142
-
143
- ```bash
144
- npm run release:build
145
- npm run release:start
146
- ```
package/dist/config.js CHANGED
@@ -45,7 +45,16 @@ function parseBoolean(value) {
45
45
  return ["1", "true", "yes", "on"].includes(value?.toLowerCase() ?? "");
46
46
  }
47
47
  function parseMinimalTools(env) {
48
- return env.DEVSPACE_TOOL_MODE === "minimal" || parseBoolean(env.DEVSPACE_MINIMAL_TOOLS);
48
+ if (env.DEVSPACE_TOOL_MODE === "minimal")
49
+ return true;
50
+ if (env.DEVSPACE_TOOL_MODE === "full")
51
+ return false;
52
+ if (env.DEVSPACE_TOOL_MODE) {
53
+ throw new Error(`Invalid DEVSPACE_TOOL_MODE: ${env.DEVSPACE_TOOL_MODE}`);
54
+ }
55
+ if (env.DEVSPACE_MINIMAL_TOOLS !== undefined)
56
+ return parseBoolean(env.DEVSPACE_MINIMAL_TOOLS);
57
+ return true;
49
58
  }
50
59
  function parseLogLevel(value) {
51
60
  if (!value || value === "info")
@@ -85,10 +94,10 @@ function parsePositiveInteger(value, fallback, name) {
85
94
  return parsed;
86
95
  }
87
96
  function parseToolNaming(value) {
88
- if (!value || value === "legacy")
89
- return "legacy";
90
- if (value === "short")
97
+ if (!value || value === "short")
91
98
  return "short";
99
+ if (value === "legacy")
100
+ return "legacy";
92
101
  throw new Error(`Invalid DEVSPACE_TOOL_NAMING: ${value}`);
93
102
  }
94
103
  function parseLoggingConfig(env) {
@@ -103,9 +112,9 @@ function parseLoggingConfig(env) {
103
112
  };
104
113
  }
105
114
  function parseWidgetMode(value) {
106
- if (!value || value === "changes")
107
- return "changes";
108
- if (value === "off" || value === "full")
115
+ if (!value || value === "full")
116
+ return "full";
117
+ if (value === "off" || value === "changes")
109
118
  return value;
110
119
  throw new Error(`Invalid DEVSPACE_WIDGETS: ${value}`);
111
120
  }
@@ -13,7 +13,7 @@ export function createReviewCheckpointManager() {
13
13
  try {
14
14
  const eligibility = await getGitEligibility(root);
15
15
  if (!eligibility.ok || !eligibility.gitRoot) {
16
- state.diagnostic = eligibility.message ?? "review_changes requires a Git workspace in this version.";
16
+ state.diagnostic = eligibility.message ?? "show_changes requires a Git workspace in this version.";
17
17
  return;
18
18
  }
19
19
  state.gitRoot = eligibility.gitRoot;
@@ -25,14 +25,14 @@ export function createReviewCheckpointManager() {
25
25
  state.diagnostic = error instanceof Error ? error.message : String(error);
26
26
  }
27
27
  },
28
- async reviewChanges({ workspaceId, root, since = "last_review", markReviewed = true }) {
28
+ async reviewChanges({ workspaceId, root, since = "last_shown", markReviewed = true }) {
29
29
  let state = states.get(workspaceId);
30
30
  if (!state) {
31
31
  await this.initializeWorkspace({ workspaceId, root });
32
32
  state = states.get(workspaceId);
33
33
  }
34
34
  if (!state?.gitRoot) {
35
- throw new Error(state?.diagnostic ?? "review_changes requires a Git workspace in this version.");
35
+ throw new Error(state?.diagnostic ?? "show_changes requires a Git workspace in this version.");
36
36
  }
37
37
  const baselineRef = since === "workspace_open" ? state.openRef : state.baselineRef;
38
38
  const baseline = (await git(state.gitRoot, ["rev-parse", "--verify", `${baselineRef}^{commit}`])).stdout.trim();
@@ -50,7 +50,7 @@ export function createReviewCheckpointManager() {
50
50
  }
51
51
  return {
52
52
  result: summary.files === 0
53
- ? `No changes since ${since === "workspace_open" ? "workspace open" : "last review"}.`
53
+ ? `No changes since ${since === "workspace_open" ? "workspace open" : "last shown changes"}.`
54
54
  : `Changed ${summary.files} ${summary.files === 1 ? "file" : "files"} (+${summary.additions} -${summary.removals}).`,
55
55
  summary,
56
56
  files,
package/dist/server.js CHANGED
@@ -45,7 +45,7 @@ function shouldAttachWidget(mode, kind) {
45
45
  case "off":
46
46
  return false;
47
47
  case "changes":
48
- return kind === "workspace" || kind === "review_changes";
48
+ return kind === "workspace" || kind === "show_changes";
49
49
  case "full":
50
50
  return true;
51
51
  }
@@ -93,10 +93,10 @@ function serverInstructions(config, toolNames) {
93
93
  ? `When ${toolNames.openWorkspace} returns available skills and a task matches a skill, use ${toolNames.read} to read that skill's path before proceeding. Skill paths may be outside the workspace, but ${toolNames.read} only permits advertised SKILL.md files and files under already-loaded skill directories. `
94
94
  : "";
95
95
  const agentsMd = `Follow instructions returned by ${toolNames.openWorkspace}. Before working under a path listed in availableAgentsFiles, use ${toolNames.read} to inspect that instruction file and follow it. `;
96
- const review = config.widgets === "changes"
97
- ? " After completing a coherent set of file modifications, call review_changes once to show the user an aggregate diff review."
96
+ const showChanges = config.widgets === "changes"
97
+ ? " After creating, editing, or overwriting files, call show_changes once after the related file changes are complete so the user can see the aggregate diff."
98
98
  : "";
99
- return `Use DevSpace as a local coding workspace. Call ${toolNames.openWorkspace} once per project folder or worktree to obtain a workspaceId. Reuse that same workspaceId for all later file, search, edit, write, review, and shell tools in that folder; do not call ${toolNames.openWorkspace} again unless switching folders/worktrees, changing checkout/worktree mode, the workspaceId is rejected as unknown, or the user explicitly asks to reopen. ${agentsMd}${skills}${inspection}Prefer ${toolNames.edit} for targeted modifications, ${toolNames.write} only for new files or complete rewrites, and ${toolNames.shell} for tests, builds, git inspection, package scripts, and commands that are better executed by the shell. Do not create or modify files with ${toolNames.shell}; avoid shell redirection, heredocs, tee, sed -i, perl -i, node/python/ruby scripts, or any command whose purpose is to write project files.${review}`;
99
+ return `Use DevSpace as a local coding workspace. Call ${toolNames.openWorkspace} once per project folder or worktree to obtain a workspaceId. Reuse that same workspaceId for all later file, search, edit, write, show-changes, and shell tools in that folder; do not call ${toolNames.openWorkspace} again unless switching folders/worktrees, changing checkout/worktree mode, the workspaceId is rejected as unknown, or the user explicitly asks to reopen. ${agentsMd}${skills}${inspection}Prefer ${toolNames.edit} for targeted modifications, ${toolNames.write} only for new files or complete rewrites, and ${toolNames.shell} for tests, builds, git inspection, package scripts, and commands that are better executed by the shell. Do not create or modify files with ${toolNames.shell}; avoid shell redirection, heredocs, tee, sed -i, perl -i, node/python/ruby scripts, or any command whose purpose is to write project files.${showChanges}`;
100
100
  }
101
101
  function resultOutputSchema(extra = {}) {
102
102
  return {
@@ -328,7 +328,7 @@ function createMcpServer(config, workspaces, reviewCheckpoints) {
328
328
  });
329
329
  registerAppTool(server, "open_workspace", {
330
330
  title: "Open workspace",
331
- description: "Open a local project directory as a coding workspace. Call this once per project folder or worktree before reading, editing, searching, writing, reviewing, or running commands. Reuse the returned workspaceId for later calls in the same folder; do not call open_workspace again unless switching folders/worktrees, changing checkout/worktree mode, the workspaceId is rejected as unknown, or the user explicitly asks to reopen. By default this opens the actual checkout; set mode=\"worktree\" when the user asks for an isolated or parallel coding session. Returns a workspaceId, loaded root project instructions, and nested instruction file paths the model should read before working in those directories.",
331
+ description: "Open a local project directory as a coding workspace. Call this once per project folder or worktree before reading, editing, searching, writing, showing changes, or running commands. Reuse the returned workspaceId for later calls in the same folder; do not call open_workspace again unless switching folders/worktrees, changing checkout/worktree mode, the workspaceId is rejected as unknown, or the user explicitly asks to reopen. By default this opens the actual checkout; set mode=\"worktree\" when the user asks for an isolated or parallel coding session. Returns a workspaceId, loaded root project instructions, and nested instruction file paths the model should read before working in those directories.",
332
332
  inputSchema: {
333
333
  path: z
334
334
  .string()
@@ -669,24 +669,24 @@ function createMcpServer(config, workspaces, reviewCheckpoints) {
669
669
  };
670
670
  });
671
671
  if (config.widgets === "changes") {
672
- registerAppTool(server, "review_changes", {
673
- title: "Review changes",
674
- description: "Review aggregate file changes in an open workspace since the last review checkpoint or since the workspace was opened. Use this after a coherent set of file modifications to show a single diff review card.",
672
+ registerAppTool(server, "show_changes", {
673
+ title: "Show changes",
674
+ description: "Show aggregate file changes in an open workspace since the last shown checkpoint or since the workspace was opened. After you create, edit, or overwrite files, call this once when the related file changes are complete so the user can inspect the combined diff.",
675
675
  inputSchema: {
676
676
  workspaceId: z
677
677
  .string()
678
678
  .describe("Workspace identifier returned by open_workspace."),
679
679
  since: z
680
- .enum(["last_review", "workspace_open"])
680
+ .enum(["last_shown", "workspace_open"])
681
681
  .optional()
682
- .describe("Defaults to last_review. Use workspace_open to compare against the initial open_workspace checkpoint."),
682
+ .describe("Defaults to last_shown. Use workspace_open to compare against the initial open_workspace checkpoint."),
683
683
  markReviewed: z
684
684
  .boolean()
685
685
  .optional()
686
- .describe("Defaults to true. When true, advances the last_review checkpoint to the current workspace state."),
686
+ .describe("Defaults to true. When true, advances the last shown checkpoint to the current workspace state."),
687
687
  },
688
688
  outputSchema: resultOutputSchema(),
689
- ...toolWidgetDescriptorMeta(config, "review_changes"),
689
+ ...toolWidgetDescriptorMeta(config, "show_changes"),
690
690
  annotations: { readOnlyHint: true },
691
691
  }, async ({ workspaceId, since, markReviewed }) => {
692
692
  const startedAt = performance.now();
@@ -694,12 +694,12 @@ function createMcpServer(config, workspaces, reviewCheckpoints) {
694
694
  const review = await reviewCheckpoints.reviewChanges({
695
695
  workspaceId,
696
696
  root: workspace.root,
697
- since: since ?? "last_review",
697
+ since: since ?? "last_shown",
698
698
  markReviewed: markReviewed ?? true,
699
699
  });
700
700
  const content = [textBlock(review.result)];
701
701
  logToolCall(config, {
702
- tool: "review_changes",
702
+ tool: "show_changes",
703
703
  workspaceId,
704
704
  success: true,
705
705
  durationMs: Math.round(performance.now() - startedAt),
@@ -707,7 +707,7 @@ function createMcpServer(config, workspaces, reviewCheckpoints) {
707
707
  return {
708
708
  content,
709
709
  _meta: {
710
- tool: "review_changes",
710
+ tool: "show_changes",
711
711
  card: {
712
712
  workspaceId,
713
713
  summary: review.summary,