@cursor/july 0.1.41 → 0.1.43

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 (195) hide show
  1. package/AGENTS.md +10 -3
  2. package/dist/bin/agent-serve.js +3 -1
  3. package/dist/channels/github/api.d.ts +5 -0
  4. package/dist/channels/github/api.d.ts.map +1 -1
  5. package/dist/channels/github/api.js +18 -0
  6. package/dist/channels/github/defaults.d.ts +4 -5
  7. package/dist/channels/github/defaults.d.ts.map +1 -1
  8. package/dist/channels/github/defaults.js +27 -1
  9. package/dist/channels/github/github-channel.d.ts.map +1 -1
  10. package/dist/channels/github/github-channel.js +28 -5
  11. package/dist/channels/github/index.d.ts +1 -0
  12. package/dist/channels/github/index.d.ts.map +1 -1
  13. package/dist/channels/github/index.js +1 -0
  14. package/dist/channels/github/progress.d.ts +54 -0
  15. package/dist/channels/github/progress.d.ts.map +1 -0
  16. package/dist/channels/github/progress.js +168 -0
  17. package/dist/channels/github/state.d.ts +2 -0
  18. package/dist/channels/github/state.d.ts.map +1 -1
  19. package/dist/channels/github/state.js +1 -1
  20. package/dist/channels/github/types.d.ts +8 -4
  21. package/dist/channels/github/types.d.ts.map +1 -1
  22. package/dist/channels/slack/slack-channel.d.ts +4 -0
  23. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  24. package/dist/channels/slack/slack-channel.js +4 -0
  25. package/dist/docs/404.html +2 -2
  26. package/dist/docs/ab.html +4 -4
  27. package/dist/docs/assets/{app.mIw24pb1.js → app.DsTLo2j1.js} +1 -1
  28. package/dist/docs/assets/chunks/@localSearchIndexroot.BZx4pmZL.js +1 -0
  29. package/dist/docs/assets/chunks/{VPLocalSearchBox.hOzpPwrG.js → VPLocalSearchBox.DoVfutcV.js} +1 -1
  30. package/dist/docs/assets/chunks/{theme.BtFhUYmh.js → theme.DtuVtKkc.js} +2 -2
  31. package/dist/docs/assets/{deployment.md.BHVjVqRa.js → deployment.md.Cdp4rTE4.js} +1 -1
  32. package/dist/docs/assets/{guides_github.md.R2QlpR75.js → guides_github.md.DSg0j9qj.js} +29 -3
  33. package/dist/docs/assets/{guides_github.md.R2QlpR75.lean.js → guides_github.md.DSg0j9qj.lean.js} +1 -1
  34. package/dist/docs/assets/guides_opentelemetry.md.DmyUwC5R.js +20 -0
  35. package/dist/docs/assets/guides_opentelemetry.md.DmyUwC5R.lean.js +1 -0
  36. package/dist/docs/assets/{index.md.BKpbkCa6.js → index.md.CMc5FP7E.js} +2 -1
  37. package/dist/docs/assets/{reference_channels.md.BIabFUAI.js → reference_channels.md.MN8iDy8V.js} +1 -1
  38. package/dist/docs/assets/reference_hooks.md.4cbRRIIu.js +14 -0
  39. package/dist/docs/assets/{reference_hooks.md.BHeG-vjK.lean.js → reference_hooks.md.4cbRRIIu.lean.js} +1 -1
  40. package/dist/docs/assets/{reference_project-layout.md._XdeMahr.js → reference_project-layout.md.D3MdHM2z.js} +2 -1
  41. package/dist/docs/assets/templates_triage.md.CConZt1z.js +11 -0
  42. package/dist/docs/assets/templates_triage.md.CConZt1z.lean.js +1 -0
  43. package/dist/docs/building-with-agents.html +5 -5
  44. package/dist/docs/concepts.html +5 -5
  45. package/dist/docs/deployment.html +6 -6
  46. package/dist/docs/evals.html +4 -4
  47. package/dist/docs/example-agents/approval-buddy.html +4 -4
  48. package/dist/docs/example-agents/benny.html +4 -4
  49. package/dist/docs/example-agents/bugbot.html +4 -4
  50. package/dist/docs/example-agents/codebase-wiki.html +4 -4
  51. package/dist/docs/example-agents/codeowners-review.html +4 -4
  52. package/dist/docs/example-agents/concierge.html +4 -4
  53. package/dist/docs/example-agents/fsd.html +4 -4
  54. package/dist/docs/example-agents/index.html +5 -5
  55. package/dist/docs/example-agents/knowledge-base.html +4 -4
  56. package/dist/docs/example-agents/oncall.html +4 -4
  57. package/dist/docs/example-agents/security-reviewer.html +4 -4
  58. package/dist/docs/example-agents/slack-agent.html +4 -4
  59. package/dist/docs/example-agents/weather-agent.html +4 -4
  60. package/dist/docs/guides/agent-to-agent.html +4 -4
  61. package/dist/docs/guides/cloud-runtime.html +5 -5
  62. package/dist/docs/guides/github.html +33 -7
  63. package/dist/docs/guides/human-in-the-loop.html +4 -4
  64. package/dist/docs/guides/mcp-oauth.html +4 -4
  65. package/dist/docs/guides/opentelemetry.html +44 -0
  66. package/dist/docs/guides/slack.html +4 -4
  67. package/dist/docs/guides/webhooks.html +4 -4
  68. package/dist/docs/hashmap.json +1 -1
  69. package/dist/docs/hillclimbing.html +4 -4
  70. package/dist/docs/index.html +7 -6
  71. package/dist/docs/quickstart.html +4 -4
  72. package/dist/docs/reference/agent-config.html +4 -4
  73. package/dist/docs/reference/artifacts.html +4 -4
  74. package/dist/docs/reference/channels.html +6 -6
  75. package/dist/docs/reference/cli.html +4 -4
  76. package/dist/docs/reference/connections.html +4 -4
  77. package/dist/docs/reference/hooks.html +9 -7
  78. package/dist/docs/reference/http-api.html +4 -4
  79. package/dist/docs/reference/instructions.html +4 -4
  80. package/dist/docs/reference/playground.html +4 -4
  81. package/dist/docs/reference/project-layout.html +7 -6
  82. package/dist/docs/reference/prompt.html +4 -4
  83. package/dist/docs/reference/schedules.html +4 -4
  84. package/dist/docs/reference/sessions.html +4 -4
  85. package/dist/docs/reference/skills.html +4 -4
  86. package/dist/docs/reference/subagents.html +4 -4
  87. package/dist/docs/reference/tools.html +4 -4
  88. package/dist/docs/scaffolding-agents.html +4 -4
  89. package/dist/docs/storage.html +4 -4
  90. package/dist/docs/templates/triage.html +35 -0
  91. package/dist/docs/troubleshooting.html +4 -4
  92. package/dist/hooks.d.ts +3 -1
  93. package/dist/hooks.d.ts.map +1 -1
  94. package/dist/hooks.js +3 -1
  95. package/dist/index.d.ts +2 -0
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +1 -0
  98. package/dist/internal/cli-ax.d.ts +1 -0
  99. package/dist/internal/cli-ax.d.ts.map +1 -1
  100. package/dist/internal/cli-ax.js +18 -3
  101. package/dist/internal/discovery.d.ts.map +1 -1
  102. package/dist/internal/discovery.js +36 -4
  103. package/dist/internal/distribution.d.ts.map +1 -1
  104. package/dist/internal/distribution.js +1 -0
  105. package/dist/internal/init-project.d.ts +24 -0
  106. package/dist/internal/init-project.d.ts.map +1 -1
  107. package/dist/internal/init-project.js +126 -7
  108. package/dist/internal/otel/attrs.d.ts +7 -0
  109. package/dist/internal/otel/attrs.d.ts.map +1 -0
  110. package/dist/internal/otel/attrs.js +13 -0
  111. package/dist/internal/otel/collector.d.ts +16 -0
  112. package/dist/internal/otel/collector.d.ts.map +1 -0
  113. package/dist/internal/otel/collector.js +564 -0
  114. package/dist/internal/otel/config.d.ts +42 -0
  115. package/dist/internal/otel/config.d.ts.map +1 -0
  116. package/dist/internal/otel/config.js +236 -0
  117. package/dist/internal/otel/http.d.ts +11 -0
  118. package/dist/internal/otel/http.d.ts.map +1 -0
  119. package/dist/internal/otel/http.js +97 -0
  120. package/dist/internal/otel/runtime.d.ts +21 -0
  121. package/dist/internal/otel/runtime.d.ts.map +1 -0
  122. package/dist/internal/otel/runtime.js +188 -0
  123. package/dist/internal/server.d.ts.map +1 -1
  124. package/dist/internal/server.js +25 -1
  125. package/dist/internal/session-engine.d.ts +10 -1
  126. package/dist/internal/session-engine.d.ts.map +1 -1
  127. package/dist/internal/session-engine.js +36 -2
  128. package/dist/memory.d.ts +4 -0
  129. package/dist/memory.d.ts.map +1 -1
  130. package/dist/memory.js +4 -0
  131. package/dist/otel.d.ts +88 -0
  132. package/dist/otel.d.ts.map +1 -0
  133. package/dist/otel.js +64 -0
  134. package/dist/playground/assets/{index-B3HBneZZ.js → index-D-DIYQzw.js} +31 -31
  135. package/dist/playground/assets/index-DQTH622f.css +1 -0
  136. package/dist/playground/index.html +2 -2
  137. package/dist/types.d.ts +31 -4
  138. package/dist/types.d.ts.map +1 -1
  139. package/docs/README.md +3 -0
  140. package/docs/deployment.md +2 -1
  141. package/docs/guides/github.md +79 -6
  142. package/docs/guides/opentelemetry.md +184 -0
  143. package/docs/reference/channels.md +3 -1
  144. package/docs/reference/hooks.md +25 -5
  145. package/docs/reference/project-layout.md +2 -0
  146. package/docs/templates/triage.md +147 -0
  147. package/package.json +23 -1
  148. package/skills/create-agent/SKILL.md +2 -2
  149. package/skills/debug/SKILL.md +4 -0
  150. package/skills/framework-map/SKILL.md +2 -0
  151. package/skills/otel/SKILL.md +80 -0
  152. package/src/bin/agent-serve.ts +3 -1
  153. package/src/channels/github/api.ts +22 -0
  154. package/src/channels/github/defaults.ts +27 -6
  155. package/src/channels/github/github-channel.ts +27 -1
  156. package/src/channels/github/index.ts +1 -0
  157. package/src/channels/github/progress.ts +243 -0
  158. package/src/channels/github/state.ts +3 -0
  159. package/src/channels/github/types.ts +8 -4
  160. package/src/channels/slack/slack-channel.ts +4 -0
  161. package/src/hooks.ts +3 -1
  162. package/src/index.ts +6 -0
  163. package/src/internal/cli-ax.ts +19 -1
  164. package/src/internal/discovery.ts +59 -4
  165. package/src/internal/distribution.ts +1 -0
  166. package/src/internal/init-project.ts +150 -7
  167. package/src/internal/otel/attrs.ts +18 -0
  168. package/src/internal/otel/collector.ts +796 -0
  169. package/src/internal/otel/config.ts +307 -0
  170. package/src/internal/otel/http.ts +126 -0
  171. package/src/internal/otel/runtime.ts +271 -0
  172. package/src/internal/server.ts +38 -1
  173. package/src/internal/session-engine.ts +52 -0
  174. package/src/memory.ts +4 -0
  175. package/src/otel.ts +155 -0
  176. package/src/types.ts +29 -4
  177. package/templates/triage/README.md +48 -0
  178. package/templates/triage/agent/agent.ts +14 -0
  179. package/templates/triage/agent/channels/intake.ts +20 -0
  180. package/templates/triage/agent/channels/slack.ts +3 -0
  181. package/templates/triage/agent/hooks/memory.ts +3 -0
  182. package/templates/triage/agent/instructions.md +27 -0
  183. package/templates/triage/agent/skills/triage-rubric.md +43 -0
  184. package/templates/triage/agent/tools/record_triage.ts +23 -0
  185. package/templates/triage/evals/evals.config.ts +5 -0
  186. package/templates/triage/evals/triage.eval.ts +43 -0
  187. package/templates/triage/package.json +18 -0
  188. package/templates/triage/tsconfig.json +12 -0
  189. package/dist/docs/assets/chunks/@localSearchIndexroot.BA7V8dEJ.js +0 -1
  190. package/dist/docs/assets/reference_hooks.md.BHeG-vjK.js +0 -12
  191. package/dist/playground/assets/index-Bqk9nplh.css +0 -1
  192. /package/dist/docs/assets/{deployment.md.BHVjVqRa.lean.js → deployment.md.Cdp4rTE4.lean.js} +0 -0
  193. /package/dist/docs/assets/{index.md.BKpbkCa6.lean.js → index.md.CMc5FP7E.lean.js} +0 -0
  194. /package/dist/docs/assets/{reference_channels.md.BIabFUAI.lean.js → reference_channels.md.MN8iDy8V.lean.js} +0 -0
  195. /package/dist/docs/assets/{reference_project-layout.md._XdeMahr.lean.js → reference_project-layout.md.D3MdHM2z.lean.js} +0 -0
@@ -3,13 +3,14 @@
3
3
  */
4
4
 
5
5
  import { spawn } from "node:child_process";
6
- import { existsSync } from "node:fs";
7
- import { mkdir, writeFile } from "node:fs/promises";
6
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
7
+ import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
8
8
  import { basename, dirname, join, relative, resolve } from "node:path";
9
9
  import type { ModelSetting } from "../types.js";
10
10
  import {
11
11
  CLI_COMMAND_NAME,
12
12
  PACKAGE_NAME,
13
+ packageRootDir,
13
14
  packageVersion,
14
15
  } from "./distribution.js";
15
16
  import {
@@ -25,6 +26,7 @@ export interface InitProjectOptions {
25
26
  name?: string;
26
27
  /** Model id override written into agent.ts. */
27
28
  model?: string;
29
+ templateDir?: string;
28
30
  }
29
31
 
30
32
  export type InitFileAction = "create" | "exist";
@@ -44,6 +46,99 @@ export interface InitProjectResult {
44
46
  skipped: string[];
45
47
  }
46
48
 
49
+ export function availableTemplates(): string[] {
50
+ const templatesDir = join(packageRootDir(), "templates");
51
+ try {
52
+ return readdirSync(templatesDir, { withFileTypes: true })
53
+ .filter((entry) => entry.isDirectory())
54
+ .map((entry) => entry.name)
55
+ .sort();
56
+ } catch (error) {
57
+ if (hasErrorCode(error, "ENOENT")) {
58
+ return [];
59
+ }
60
+ throw error;
61
+ }
62
+ }
63
+
64
+ export type TemplateResolution =
65
+ | { ok: true; name: string; dir: string }
66
+ | { ok: false; message: string };
67
+
68
+ export function resolveTemplate(name: string): TemplateResolution {
69
+ if (!/^[a-z][a-z0-9-]*$/.test(name)) {
70
+ return {
71
+ ok: false,
72
+ message: "template name must match /^[a-z][a-z0-9-]*$/",
73
+ };
74
+ }
75
+ const available = availableTemplates();
76
+ if (!available.includes(name)) {
77
+ const detail =
78
+ available.length === 0
79
+ ? "no templates ship with this build"
80
+ : `available: ${available.join(", ")}`;
81
+ return {
82
+ ok: false,
83
+ message: `unknown template "${name}" (${detail})`,
84
+ };
85
+ }
86
+ return {
87
+ ok: true,
88
+ name,
89
+ dir: join(packageRootDir(), "templates", name),
90
+ };
91
+ }
92
+
93
+ export type InitTargetCheck = { ok: true } | { ok: false; message: string };
94
+
95
+ /**
96
+ * Re-init must keep the mode the project was scaffolded with: template
97
+ * scaffolds stamp `cursorAgentTemplate` into package.json, and a mismatch
98
+ * here would silently mix default-scaffold files into a template project
99
+ * (or the reverse).
100
+ */
101
+ export function checkInitTarget(
102
+ rootDir: string,
103
+ template: string | undefined
104
+ ): InitTargetCheck {
105
+ const pkgPath = join(rootDir, "package.json");
106
+ if (!existsSync(pkgPath)) {
107
+ return { ok: true };
108
+ }
109
+ let marker: string | undefined;
110
+ try {
111
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8")) as {
112
+ cursorAgentTemplate?: unknown;
113
+ };
114
+ marker =
115
+ typeof pkg.cursorAgentTemplate === "string"
116
+ ? pkg.cursorAgentTemplate
117
+ : undefined;
118
+ } catch {
119
+ marker = undefined;
120
+ }
121
+ if (marker === template) {
122
+ return { ok: true };
123
+ }
124
+ if (template === undefined) {
125
+ return {
126
+ ok: false,
127
+ message: `${rootDir} was scaffolded from the "${marker}" template; re-run with --template ${marker}`,
128
+ };
129
+ }
130
+ if (marker === undefined) {
131
+ return {
132
+ ok: false,
133
+ message: `${rootDir} already has a package.json without template provenance; re-run init without --template, or scaffold into a fresh directory`,
134
+ };
135
+ }
136
+ return {
137
+ ok: false,
138
+ message: `${rootDir} was scaffolded from the "${marker}" template, not "${template}"`,
139
+ };
140
+ }
141
+
47
142
  const DEFAULT_MODEL: ModelSetting = {
48
143
  id: "grok-4.5",
49
144
  params: [
@@ -73,13 +168,15 @@ export async function initProject(
73
168
  options: InitProjectOptions
74
169
  ): Promise<InitProjectResult> {
75
170
  const rootDir = resolve(options.dir);
76
- const name = options.name ?? basename(rootDir);
171
+ const projectName = basename(rootDir);
172
+ const name = options.name ?? projectName;
77
173
  const model = formatModelLiteral(options.model ?? DEFAULT_MODEL);
78
- const agentDir = join(rootDir, "agent");
79
- await mkdir(agentDir, { recursive: true });
80
174
 
81
175
  const files: InitFileEntry[] = [];
82
- const write = async (rel: string, contents: string): Promise<void> => {
176
+ const write = async (
177
+ rel: string,
178
+ contents: string | Uint8Array
179
+ ): Promise<void> => {
83
180
  const abs = join(rootDir, rel);
84
181
  await mkdir(dirname(abs), { recursive: true });
85
182
  try {
@@ -95,6 +192,47 @@ export async function initProject(
95
192
  }
96
193
  };
97
194
 
195
+ if (options.templateDir !== undefined) {
196
+ const templateDir = options.templateDir;
197
+ const entries = await readdir(templateDir, {
198
+ recursive: true,
199
+ withFileTypes: true,
200
+ });
201
+ const relativePaths = entries
202
+ .filter((entry) => entry.isFile())
203
+ .map((entry) => relative(templateDir, join(entry.parentPath, entry.name)))
204
+ .sort();
205
+ for (const rel of relativePaths) {
206
+ const source = join(templateDir, rel);
207
+ if (rel === "package.json") {
208
+ const packageJson: {
209
+ name: string;
210
+ dependencies: Record<string, string>;
211
+ [key: string]: unknown;
212
+ } = JSON.parse(await readFile(source, "utf8"));
213
+ packageJson.name = projectName;
214
+ packageJson.dependencies[PACKAGE_NAME] = `^${packageVersion()}`;
215
+ packageJson.cursorAgentTemplate = basename(templateDir);
216
+ await write(rel, `${JSON.stringify(packageJson, null, 2)}\n`);
217
+ } else {
218
+ await write(rel, await readFile(source));
219
+ }
220
+ }
221
+ return {
222
+ rootDir,
223
+ files,
224
+ created: files
225
+ .filter((entry) => entry.action === "create")
226
+ .map((entry) => entry.path),
227
+ skipped: files
228
+ .filter((entry) => entry.action === "exist")
229
+ .map((entry) => entry.path),
230
+ };
231
+ }
232
+
233
+ const agentDir = join(rootDir, "agent");
234
+ await mkdir(agentDir, { recursive: true });
235
+
98
236
  await write(
99
237
  "package.json",
100
238
  `${JSON.stringify(
@@ -209,11 +347,15 @@ export default memoryHook();
209
347
  }
210
348
 
211
349
  export function isEexist(error: unknown): boolean {
350
+ return hasErrorCode(error, "EEXIST");
351
+ }
352
+
353
+ function hasErrorCode(error: unknown, code: string): boolean {
212
354
  return (
213
355
  error !== null &&
214
356
  typeof error === "object" &&
215
357
  "code" in error &&
216
- (error as { code: string }).code === "EEXIST"
358
+ error.code === code
217
359
  );
218
360
  }
219
361
 
@@ -598,6 +740,7 @@ export function printInitGuide(): void {
598
740
 
599
741
  Scaffold a project, then open the playground:
600
742
  npx ${PACKAGE_NAME} init ./my-agent # installs deps + puts agent-sdk on PATH
743
+ npx ${PACKAGE_NAME} init ./my-triage --template triage # start from a template (agent-sdk templates: triage)
601
744
  cd ./my-agent && ${CLI_COMMAND_NAME} dev
602
745
 
603
746
  Recommended loop once the project exists (from the project directory):
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Build OTel attribute maps without conditional spreads. `undefined` values
3
+ * are dropped (the OTel API rejects them).
4
+ */
5
+
6
+ export type AttrValue = string | number | boolean;
7
+
8
+ export function attrs(
9
+ input: Record<string, AttrValue | undefined>
10
+ ): Record<string, AttrValue> {
11
+ const out: Record<string, AttrValue> = {};
12
+ for (const [key, value] of Object.entries(input)) {
13
+ if (value !== undefined) {
14
+ out[key] = value;
15
+ }
16
+ }
17
+ return out;
18
+ }