@hitch42/applet 0.1.0-beta.2 → 0.1.0-beta.9

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 (55) hide show
  1. package/dist/_internal/server.d.ts +14 -1
  2. package/dist/_internal/server.js +23 -74
  3. package/dist/applet.js +53 -29
  4. package/dist/build-BfbTbt_r.js +2 -0
  5. package/dist/{build-BRkmrUcj.js → build-CAb26kMY.js} +30 -14
  6. package/dist/ci-5qWl7lT3.js +68 -0
  7. package/dist/client.d.ts +3 -3
  8. package/dist/{contract-DMrpbaLJ.d.ts → contract-rP_eV9PK.d.ts} +1 -1
  9. package/dist/{deploy-DKB-Tef7.js → deploy-D_OFJ6-Q.js} +193 -30
  10. package/dist/email-DBTVhNB_.js +62 -0
  11. package/dist/generate-BgepN4-b.js +2 -0
  12. package/dist/{generate-BFmIzHaR.js → generate-CBPnHoqX.js} +40 -18
  13. package/dist/index.d.ts +122 -11
  14. package/dist/index.js +141 -26
  15. package/dist/{init-CQRsnd3i.js → init-tfzwuYnk.js} +12 -8
  16. package/dist/load-config-BYSxDVAl.js +27 -0
  17. package/dist/login-C7RKmmTe.js +12 -0
  18. package/dist/{logs-m00pzr_O.js → logs-DgjgAxj2.js} +3 -3
  19. package/dist/{manifest-DyoJ1MIL.js → manifest-Bp87Uz0a.js} +6 -0
  20. package/dist/{manifest-BQCAxATS.d.ts → manifest-DD_SGkS6.d.ts} +5 -0
  21. package/dist/me-BW7Paary.js +32 -0
  22. package/dist/{project-CEmDnlKa.js → project-D6XHllmC.js} +32 -20
  23. package/dist/prompt-ChS-grYO.js +29 -0
  24. package/dist/react.d.ts +1 -1
  25. package/dist/react.js +40 -42
  26. package/dist/schedules-dhU1yyFr.js +42 -0
  27. package/dist/server.d.ts +3 -3
  28. package/dist/telephony-protocol-D-nf3Gca.d.ts +76 -0
  29. package/dist/telephony.d.ts +77 -0
  30. package/dist/telephony.js +607 -0
  31. package/dist/{upload-YbRKEqR6.d.ts → upload-DKZzz5kW.d.ts} +6 -6
  32. package/dist/{variables-CP7Ce3Np.js → variables-Bwnr7oxf.js} +3 -28
  33. package/dist/vite.d.ts +1 -1
  34. package/dist/vite.js +464 -30
  35. package/dist/workflow-engine-MogejNfF.js +117 -0
  36. package/dist/{auth-DaVK0k5R.js → workspace-XVtM12ZC.js} +44 -4
  37. package/package.json +7 -1
  38. package/scaffold/.agents/skills/hitch-applets/SKILL.md +34 -15
  39. package/scaffold/.agents/skills/hitch-applets/references/email-tracking.md +49 -0
  40. package/scaffold/.agents/skills/hitch-applets/references/files.md +3 -3
  41. package/scaffold/.agents/skills/hitch-applets/references/manifest.md +21 -2
  42. package/scaffold/.agents/skills/hitch-applets/references/performance.md +74 -0
  43. package/scaffold/.agents/skills/hitch-applets/references/records.md +30 -8
  44. package/scaffold/.agents/skills/hitch-applets/references/schedules.md +7 -2
  45. package/scaffold/.agents/skills/hitch-applets/references/server.md +0 -3
  46. package/scaffold/.agents/skills/hitch-applets/references/workflows.md +11 -3
  47. package/scaffold/.agents/skills/hitch-cli/SKILL.md +129 -0
  48. package/scaffold/.agents/skills/hitch-data/SKILL.md +51 -0
  49. package/scaffold/.agents/skills/hitch-data/references/attributes.md +121 -0
  50. package/scaffold/.agents/skills/hitch-data/references/limits.md +64 -0
  51. package/scaffold/.agents/skills/hitch-theory/SKILL.md +150 -0
  52. package/scaffold/.github/workflows/hitch.yml +15 -0
  53. package/dist/build-CMluoV6q.js +0 -2
  54. package/dist/generate-CefnB-bp.js +0 -2
  55. package/dist/load-config-BnxocLAQ.js +0 -56
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import { i as registerHitchContract, t as uploadFile } from "./upload-DRbVhuDm.js";
2
- import { n as appletManifestSchema, r as appletSourceDefinitionSchema, t as appletDefinitionSchema } from "./manifest-DyoJ1MIL.js";
2
+ import { a as emailTagsSchema, c as listEmailTrackersInputSchema, d as markEmailTrackerSentInputSchema, i as emailTagKeySchema, l as listEmailTrackersOutputSchema, n as createEmailPixelOutputSchema, o as emailTrackerSchema, r as emailContract, s as getEmailTrackerInputSchema, t as createEmailPixelInputSchema } from "./email-DBTVhNB_.js";
3
+ import { n as meSchema, t as meContract } from "./me-BW7Paary.js";
4
+ import { n as appletManifestSchema, r as appletSourceDefinitionSchema, t as appletDefinitionSchema } from "./manifest-Bp87Uz0a.js";
3
5
  import { oc } from "@orpc/contract";
4
6
  import { z } from "zod";
5
7
  //#region src/hitch/contract.ts
@@ -78,34 +80,147 @@ const filesContract = {
78
80
  }).input(fileIdInputSchema).output(getFileOutputSchema)
79
81
  };
80
82
  //#endregion
81
- //#region src/hitch/me.ts
82
- const personSchema = z.object({
83
+ //#region src/hitch/telephony.ts
84
+ const hitchPhoneNumberSchema = z.object({
83
85
  id: z.uuid(),
84
- firstName: z.string(),
85
- lastName: z.string(),
86
- email: z.email()
86
+ e164: z.string(),
87
+ label: z.string(),
88
+ enabled: z.boolean(),
89
+ canRead: z.boolean(),
90
+ canSend: z.boolean(),
91
+ canCall: z.boolean(),
92
+ voiceEnabled: z.boolean()
93
+ });
94
+ const hitchCallSchema = z.object({
95
+ id: z.uuid(),
96
+ numberId: z.uuid(),
97
+ direction: z.enum(["inbound", "outbound"]),
98
+ status: z.enum([
99
+ "starting",
100
+ "ringing",
101
+ "active",
102
+ "ended",
103
+ "missed",
104
+ "failed"
105
+ ]),
106
+ from: z.string(),
107
+ to: z.string(),
108
+ userId: z.uuid().nullable(),
109
+ answeredAt: z.string().nullable(),
110
+ endedAt: z.string().nullable(),
111
+ durationSeconds: z.number().nullable(),
112
+ voicemailSeconds: z.number().nullable(),
113
+ hangupCause: z.string().nullable(),
114
+ record: z.boolean(),
115
+ hasRecording: z.boolean(),
116
+ transcriptStatus: z.enum([
117
+ "pending",
118
+ "done",
119
+ "failed"
120
+ ]).nullable(),
121
+ transcript: z.object({ segments: z.array(z.object({
122
+ side: z.enum(["member", "customer"]),
123
+ speaker: z.number(),
124
+ start: z.number(),
125
+ end: z.number(),
126
+ text: z.string()
127
+ })) }).nullable(),
128
+ createdAt: z.string()
129
+ });
130
+ const hitchMessageSchema = z.object({
131
+ id: z.uuid(),
132
+ numberId: z.uuid(),
133
+ direction: z.enum(["inbound", "outbound"]),
134
+ status: z.enum([
135
+ "pending",
136
+ "unknown",
137
+ "accepted",
138
+ "sent",
139
+ "delivered",
140
+ "unconfirmed",
141
+ "failed",
142
+ "received"
143
+ ]),
144
+ from: z.string(),
145
+ to: z.string(),
146
+ body: z.string().nullable(),
147
+ redacted: z.boolean(),
148
+ userId: z.uuid().nullable(),
149
+ appletId: z.uuid().nullable(),
150
+ requestId: z.string().nullable(),
151
+ errorCode: z.string().nullable(),
152
+ errorDetail: z.string().nullable(),
153
+ statusAt: z.string().nullable(),
154
+ createdAt: z.string()
155
+ });
156
+ const listHitchNumbersOutputSchema = z.object({ data: z.array(hitchPhoneNumberSchema) });
157
+ const listHitchMessagesOutputSchema = z.object({
158
+ data: z.array(hitchMessageSchema),
159
+ nextCursor: z.string().nullable()
160
+ });
161
+ const listHitchCallsOutputSchema = z.object({
162
+ data: z.array(hitchCallSchema),
163
+ nextCursor: z.string().nullable()
87
164
  });
88
- const membershipSchema = z.object({
89
- orgId: z.uuid(),
90
- code: z.string(),
91
- name: z.string(),
92
- iconFileId: z.uuid().nullable(),
93
- role: z.enum(["member", "owner"]),
94
- capabilities: z.array(z.string())
165
+ const idInputSchema = z.object({ id: z.uuid() });
166
+ const listInputFields = {
167
+ numberId: z.uuid().optional(),
168
+ userId: z.uuid().optional(),
169
+ direction: z.enum(["inbound", "outbound"]).optional(),
170
+ since: z.iso.datetime().optional(),
171
+ until: z.iso.datetime().optional(),
172
+ cursor: z.string().optional(),
173
+ limit: z.number().int().min(1).max(200).optional()
174
+ };
175
+ const listHitchMessagesInputSchema = z.object(listInputFields);
176
+ const listHitchCallsInputSchema = z.object({
177
+ ...listInputFields,
178
+ status: z.enum([
179
+ "starting",
180
+ "ringing",
181
+ "active",
182
+ "ended",
183
+ "missed",
184
+ "failed"
185
+ ]).optional()
95
186
  });
96
- const meSchema = z.object({
97
- person: personSchema,
98
- memberships: z.array(membershipSchema),
99
- organization: z.object({
100
- id: z.uuid(),
101
- code: z.string()
102
- }).nullable(),
103
- multiOrg: z.boolean()
187
+ const sendHitchMessageInputSchema = z.object({
188
+ numberId: z.uuid(),
189
+ to: z.string(),
190
+ body: z.string().min(1).max(1600),
191
+ requestId: z.string().min(1).max(200).optional()
104
192
  });
105
- const meContract = { get: oc.route({
106
- method: "GET",
107
- path: "/v1/me"
108
- }).input(z.void()).output(meSchema) };
193
+ const telephonyContract = {
194
+ calls: {
195
+ get: oc.route({
196
+ method: "GET",
197
+ path: "/v1/telephony/calls/{id}"
198
+ }).input(idInputSchema).output(hitchCallSchema),
199
+ list: oc.route({
200
+ method: "GET",
201
+ path: "/v1/telephony/calls"
202
+ }).input(listHitchCallsInputSchema).output(listHitchCallsOutputSchema)
203
+ },
204
+ numbers: { list: oc.route({
205
+ method: "GET",
206
+ path: "/v1/telephony/numbers"
207
+ }).input(z.void()).output(listHitchNumbersOutputSchema) },
208
+ messages: {
209
+ get: oc.route({
210
+ method: "GET",
211
+ path: "/v1/telephony/messages/{id}"
212
+ }).input(idInputSchema).output(hitchMessageSchema),
213
+ list: oc.route({
214
+ method: "GET",
215
+ path: "/v1/telephony/messages"
216
+ }).input(listHitchMessagesInputSchema).output(listHitchMessagesOutputSchema),
217
+ send: oc.route({
218
+ method: "POST",
219
+ path: "/v1/telephony/messages",
220
+ successStatus: 201
221
+ }).input(sendHitchMessageInputSchema).output(hitchMessageSchema)
222
+ }
223
+ };
109
224
  //#endregion
110
225
  //#region src/hitch/teams.ts
111
226
  const teamSchema = z.object({
@@ -133,4 +248,4 @@ const teamsContract = {
133
248
  }).input(teamIdInputSchema).output(teamMembersOutputSchema) }
134
249
  };
135
250
  //#endregion
136
- export { appletDefinitionSchema, appletManifestSchema, appletSourceDefinitionSchema, createFileOutputSchema, fileSchema, filesContract, getFileOutputSchema, meContract, meSchema, pruneContract, registerHitchContract, teamMemberSchema, teamSchema, teamsContract, uploadFile };
251
+ export { appletDefinitionSchema, appletManifestSchema, appletSourceDefinitionSchema, createEmailPixelInputSchema, createEmailPixelOutputSchema, createFileOutputSchema, emailContract, emailTagKeySchema, emailTagsSchema, emailTrackerSchema, fileSchema, filesContract, getEmailTrackerInputSchema, getFileOutputSchema, hitchMessageSchema, hitchPhoneNumberSchema, listEmailTrackersInputSchema, listEmailTrackersOutputSchema, listHitchMessagesInputSchema, listHitchMessagesOutputSchema, listHitchNumbersOutputSchema, markEmailTrackerSentInputSchema, meContract, meSchema, pruneContract, registerHitchContract, sendHitchMessageInputSchema, teamMemberSchema, teamSchema, teamsContract, telephonyContract, uploadFile };
@@ -1,8 +1,8 @@
1
- import { a as ORG_CODE_PATTERN, i as APPLET_CODE_PATTERN } from "./manifest-DyoJ1MIL.js";
2
- import { i as resolveInstanceUrl, r as resolveAuthForOrg } from "./auth-DaVK0k5R.js";
3
- import { n as runGenerate } from "./generate-BFmIzHaR.js";
4
- import { n as loadAppletSourceDefinition, r as readWorkspaceConfig } from "./load-config-BnxocLAQ.js";
5
- import { a as writeWorkspaceSupport, i as writeAppletSupport, n as loadCliManifest, t as assertWorkspaceCli } from "./project-CEmDnlKa.js";
1
+ import { a as ORG_CODE_PATTERN, i as APPLET_CODE_PATTERN } from "./manifest-Bp87Uz0a.js";
2
+ import { d as resolveInstanceUrl, i as readWorkspaceConfig, u as resolveAuthForOrg } from "./workspace-XVtM12ZC.js";
3
+ import { n as runGenerate } from "./generate-CBPnHoqX.js";
4
+ import { n as loadAppletSourceDefinition } from "./load-config-BYSxDVAl.js";
5
+ import { a as writeAppletSupport, n as loadCliManifest, o as writeWorkspaceSupport, t as assertWorkspaceCli } from "./project-D6XHllmC.js";
6
6
  import { access, cp, mkdir, readdir, writeFile } from "node:fs/promises";
7
7
  import { relative, resolve } from "node:path";
8
8
  import { spawn } from "node:child_process";
@@ -23,8 +23,11 @@ async function assertTargetIsAvailable(paths, targetType) {
23
23
  if (existingPath !== void 0) throw new Error(`Refusing to initialize ${targetType}: ${existingPath} already exists.`);
24
24
  }
25
25
  async function assertDirectoryIsEmpty(path) {
26
- const [entry] = await readdir(path);
27
- if (entry !== void 0) throw new Error(`Refusing to initialize a workspace: ${path} is not empty (${entry} exists).`);
26
+ const entries = await readdir(path);
27
+ if (entries.length > 0) {
28
+ const [entry] = entries;
29
+ throw new Error(`Refusing to initialize a workspace: ${path} is not empty (${entry} exists).`);
30
+ }
28
31
  }
29
32
  async function installDependencies(target, install) {
30
33
  if (!install) return "skipped";
@@ -33,7 +36,8 @@ async function installDependencies(target, install) {
33
36
  let finished = false;
34
37
  const child = spawn("pnpm", ["install"], {
35
38
  cwd: target,
36
- stdio: "inherit"
39
+ stdio: "inherit",
40
+ shell: process.platform === "win32"
37
41
  });
38
42
  child.once("error", (error) => {
39
43
  finished = true;
@@ -0,0 +1,27 @@
1
+ import { r as appletSourceDefinitionSchema } from "./manifest-Bp87Uz0a.js";
2
+ import { t as resolveWorkspaceOrg } from "./workspace-XVtM12ZC.js";
3
+ import { existsSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ import { loadConfigFromFile } from "vite";
6
+ //#region src/typegen/load-config.ts
7
+ async function loadAppletSourceDefinition(root) {
8
+ const path = resolve(root, "applet.manifest.ts");
9
+ if (!existsSync(path)) throw new Error(`No applet manifest found at ${path}.`);
10
+ const loaded = await loadConfigFromFile({
11
+ command: "build",
12
+ mode: "production"
13
+ }, path, root);
14
+ if (loaded === null) throw new Error(`No applet manifest found at ${path}.`);
15
+ const parsed = appletSourceDefinitionSchema.safeParse(loaded.config);
16
+ if (!parsed.success) throw new Error(`Invalid applet manifest at ${loaded.path}: ${parsed.error.message}`);
17
+ return parsed.data;
18
+ }
19
+ async function loadAppletConfig(root) {
20
+ const { dependencies: _dependencies, devDependencies: _devDependencies, ...definition } = await loadAppletSourceDefinition(root);
21
+ return {
22
+ org: resolveWorkspaceOrg(root),
23
+ ...definition
24
+ };
25
+ }
26
+ //#endregion
27
+ export { loadAppletSourceDefinition as n, loadAppletConfig as t };
@@ -0,0 +1,12 @@
1
+ import { a as loginWithDevice, d as resolveInstanceUrl, o as AuthenticationError, r as findWorkspaceConfig } from "./workspace-XVtM12ZC.js";
2
+ //#region src/login.ts
3
+ async function runLogin(options) {
4
+ if (process.env.HITCH_API_KEY !== void 0) throw new AuthenticationError("HITCH_API_KEY is set — unset it to manage stored logins.");
5
+ const { me, membership } = await loginWithDevice(await resolveInstanceUrl(), {
6
+ expectedOrg: findWorkspaceConfig(process.cwd())?.org,
7
+ noBrowser: options.noBrowser
8
+ });
9
+ console.log(`Signed in as ${me.person.email} to ${membership.name}.`);
10
+ }
11
+ //#endregion
12
+ export { runLogin };
@@ -1,6 +1,6 @@
1
- import { i as APPLET_CODE_PATTERN } from "./manifest-DyoJ1MIL.js";
2
- import { t as fetchWithOrgAuth } from "./auth-DaVK0k5R.js";
3
- import { i as resolveWorkspaceOrg, r as readWorkspaceConfig, t as loadAppletConfig } from "./load-config-BnxocLAQ.js";
1
+ import { i as APPLET_CODE_PATTERN } from "./manifest-Bp87Uz0a.js";
2
+ import { i as readWorkspaceConfig, n as fetchWithOrgAuth, t as resolveWorkspaceOrg } from "./workspace-XVtM12ZC.js";
3
+ import { t as loadAppletConfig } from "./load-config-BYSxDVAl.js";
4
4
  import { z } from "zod";
5
5
  //#region src/logs.ts
6
6
  const LOG_LEVELS = [
@@ -63,6 +63,8 @@ const appletManifestShape = {
63
63
  org: z.string().regex(ORG_CODE_PATTERN, "must start with a lowercase letter, end with a letter or number, and contain only lowercase letters, numbers, and non-consecutive hyphens"),
64
64
  name: nameSchema,
65
65
  code: codeSchema,
66
+ requiresChangeset: z.uuid().optional(),
67
+ telephony: z.strictObject({ events: z.array(z.literal("message.received")).min(1).refine((events) => new Set(events).size === events.length).readonly() }).optional(),
66
68
  schedules: appletManifestSchedulesSchema.optional(),
67
69
  variables: appletManifestVariablesSchema.optional(),
68
70
  objects: appletManifestObjectsSchema
@@ -94,6 +96,8 @@ const appletManifestSchema = z.strictObject(appletManifestShape).superRefine(che
94
96
  const appletDefinitionSchema = z.strictObject({
95
97
  name: appletManifestShape.name,
96
98
  code: appletManifestShape.code,
99
+ requiresChangeset: appletManifestShape.requiresChangeset,
100
+ telephony: appletManifestShape.telephony,
97
101
  schedules: appletManifestShape.schedules,
98
102
  variables: appletManifestShape.variables,
99
103
  objects: appletManifestShape.objects
@@ -161,6 +165,8 @@ const checkSourcePackages = (manifest, context) => {
161
165
  const appletSourceDefinitionSchema = z.strictObject({
162
166
  name: appletManifestShape.name,
163
167
  code: appletManifestShape.code,
168
+ requiresChangeset: appletManifestShape.requiresChangeset,
169
+ telephony: appletManifestShape.telephony,
164
170
  schedules: appletManifestShape.schedules,
165
171
  variables: appletManifestShape.variables,
166
172
  objects: appletManifestShape.objects,
@@ -32,6 +32,11 @@ interface AppletManifest {
32
32
  org: string;
33
33
  name: string;
34
34
  code: string;
35
+ /** This code needs the schema as of this changeset. */
36
+ requiresChangeset?: string;
37
+ telephony?: {
38
+ events: readonly "message.received"[];
39
+ };
35
40
  schedules?: readonly {
36
41
  code: string;
37
42
  name: string;
@@ -0,0 +1,32 @@
1
+ import { oc } from "@orpc/contract";
2
+ import { z } from "zod";
3
+ //#region src/hitch/me.ts
4
+ const personSchema = z.object({
5
+ id: z.uuid(),
6
+ firstName: z.string(),
7
+ lastName: z.string(),
8
+ email: z.email()
9
+ });
10
+ const membershipSchema = z.object({
11
+ orgId: z.uuid(),
12
+ code: z.string(),
13
+ name: z.string(),
14
+ iconFileId: z.uuid().nullable(),
15
+ role: z.enum(["member", "owner"]),
16
+ capabilities: z.array(z.string())
17
+ });
18
+ const meSchema = z.object({
19
+ person: personSchema,
20
+ memberships: z.array(membershipSchema),
21
+ organization: z.object({
22
+ id: z.uuid(),
23
+ code: z.string()
24
+ }).nullable(),
25
+ multiOrg: z.boolean()
26
+ });
27
+ const meContract = { get: oc.route({
28
+ method: "GET",
29
+ path: "/v1/me"
30
+ }).input(z.void()).output(meSchema) };
31
+ //#endregion
32
+ export { meSchema as n, meContract as t };
@@ -1,4 +1,5 @@
1
- import { n as loadAppletSourceDefinition, r as readWorkspaceConfig } from "./load-config-BnxocLAQ.js";
1
+ import { i as readWorkspaceConfig } from "./workspace-XVtM12ZC.js";
2
+ import { n as loadAppletSourceDefinition } from "./load-config-BYSxDVAl.js";
2
3
  import { z } from "zod";
3
4
  import { existsSync } from "node:fs";
4
5
  import { cp, mkdir, readFile, rm, symlink, writeFile } from "node:fs/promises";
@@ -50,11 +51,11 @@ const cliManifestSchema = z.object({
50
51
  async function loadCliManifest(options) {
51
52
  const result = cliManifestSchema.safeParse(JSON.parse(await readFile(new URL("../package.json", import.meta.url), "utf8")));
52
53
  if (!result.success) {
53
- const issue = result.error.issues[0];
54
+ const issue = result.error.issues.at(0);
54
55
  if (issue === void 0) throw new Error("Invalid CLI package manifest.");
55
56
  throw new Error(`Invalid CLI package manifest field "${issue.path.join(".")}": ${issue.message}.`);
56
57
  }
57
- const catalogEntry = [...Object.entries(result.data.dependencies).map(([name, value]) => [`dependencies.${name}`, value]), ...Object.entries(result.data.peerDependencies).map(([name, value]) => [`peerDependencies.${name}`, value])].find(([, value]) => value?.startsWith("catalog:"));
58
+ const catalogEntry = [...Object.entries(result.data.dependencies).map(([name, value]) => [`dependencies.${name}`, value]), ...Object.entries(result.data.peerDependencies).map(([name, value]) => [`peerDependencies.${name}`, value])].find(([, value]) => value.startsWith("catalog:"));
58
59
  if (catalogEntry !== void 0) {
59
60
  if (options?.allowDevelopment === true) return void 0;
60
61
  throw new Error(`Invalid CLI package manifest field "${catalogEntry[0]}": "catalog:" identifies an unpublished development build. Run the published @hitch42/applet CLI instead.`);
@@ -127,8 +128,14 @@ minimumReleaseAgeExclude:
127
128
  }
128
129
  const GITIGNORE_START = "# BEGIN Hitch generated files";
129
130
  const GITIGNORE_END = "# END Hitch generated files";
131
+ const SKILLS = [
132
+ "hitch-applets",
133
+ "hitch-cli",
134
+ "hitch-data",
135
+ "hitch-theory"
136
+ ];
130
137
  const GITIGNORE = `${GITIGNORE_START}
131
- /.agents/skills/hitch-applets/
138
+ ${SKILLS.map((skill) => `/.agents/skills/${skill}/`).join("\n")}
132
139
  /.node-version
133
140
  /AGENTS.md
134
141
  /CLAUDE.md
@@ -169,16 +176,21 @@ async function writeWorkspaceSupport(root, config, cli) {
169
176
  const resolvedCli = cli ?? await loadCliManifest();
170
177
  if (resolvedCli === void 0) throw new Error("The CLI package manifest is not published.");
171
178
  assertWorkspaceCli(config, resolvedCli);
172
- const skillTarget = resolve(root, ".agents/skills/hitch-applets");
179
+ const deployWorkflowTarget = resolve(root, ".github/workflows/hitch.yml");
173
180
  const agents = await readFile(new URL("../scaffold/AGENTS.md", import.meta.url), "utf8");
174
- await Promise.all([mkdir(resolve(root, ".agents/skills"), { recursive: true }), rm(skillTarget, {
175
- force: true,
176
- recursive: true
177
- })]);
178
181
  await Promise.all([
179
- cp(new URL("../scaffold/.agents/skills/hitch-applets", import.meta.url), skillTarget, { recursive: true }),
182
+ mkdir(resolve(root, ".agents/skills"), { recursive: true }),
183
+ config.githubWorkflow === false ? void 0 : mkdir(resolve(root, ".github/workflows"), { recursive: true }),
184
+ ...SKILLS.map((skill) => rm(resolve(root, ".agents/skills", skill), {
185
+ force: true,
186
+ recursive: true
187
+ }))
188
+ ]);
189
+ await Promise.all([
190
+ ...SKILLS.map((skill) => cp(new URL(`../scaffold/.agents/skills/${skill}`, import.meta.url), resolve(root, ".agents/skills", skill), { recursive: true })),
180
191
  writeFile(resolve(root, "package.json"), `${JSON.stringify(workspacePackage(config.org), null, 2)}\n`),
181
192
  writeFile(resolve(root, "pnpm-workspace.yaml"), workspaceFile(resolvedCli)),
193
+ config.githubWorkflow === false || existsSync(deployWorkflowTarget) ? void 0 : cp(new URL("../scaffold/.github/workflows/hitch.yml", import.meta.url), deployWorkflowTarget),
182
194
  writeFile(resolve(root, ".node-version"), "24\n"),
183
195
  writeGitignore(root),
184
196
  writeFile(resolve(root, "AGENTS.md"), agents)
@@ -330,17 +342,17 @@ export default defineConfig({
330
342
  hasClient ? writeFile(resolve(root, "components.json"), await readFile(new URL("../scaffold/applet/components.json", import.meta.url), "utf8")) : void 0
331
343
  ]);
332
344
  }
333
- async function prepareAppletProject(appletRoot = process.cwd()) {
334
- const definition = await loadAppletSourceDefinition(appletRoot);
335
- const workspaceRoot = dirname(dirname(resolve(appletRoot)));
345
+ async function prepareAppletProjects(workspaceRoot, appletRoots) {
346
+ const definitions = await Promise.all(appletRoots.map((root) => loadAppletSourceDefinition(root)));
336
347
  const workspace = readWorkspaceConfig(workspaceRoot);
337
- if (workspace === void 0) throw new Error(`No Hitch workspace found for ${appletRoot}.`);
348
+ if (workspace === void 0) throw new Error(`No Hitch workspace found at ${workspaceRoot}.`);
338
349
  const cli = await loadCliManifest({ allowDevelopment: true });
339
- await Promise.all([cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, workspace, cli), writeAppletSupport(appletRoot, definition)]);
340
- return {
341
- definition,
342
- workspaceRoot
343
- };
350
+ await Promise.all([cli === void 0 ? void 0 : writeWorkspaceSupport(workspaceRoot, workspace, cli), ...appletRoots.map((root, index) => writeAppletSupport(root, definitions[index]))]);
351
+ }
352
+ async function prepareAppletProject(appletRoot = process.cwd()) {
353
+ const workspaceRoot = dirname(dirname(resolve(appletRoot)));
354
+ await prepareAppletProjects(workspaceRoot, [appletRoot]);
355
+ return workspaceRoot;
344
356
  }
345
357
  //#endregion
346
- export { writeWorkspaceSupport as a, writeAppletSupport as i, loadCliManifest as n, prepareAppletProject as r, assertWorkspaceCli as t };
358
+ export { writeAppletSupport as a, prepareAppletProjects as i, loadCliManifest as n, writeWorkspaceSupport as o, prepareAppletProject as r, assertWorkspaceCli as t };
@@ -0,0 +1,29 @@
1
+ import { Writable } from "node:stream";
2
+ import { createInterface } from "node:readline";
3
+ //#region src/prompt.ts
4
+ function question(prompt, hidden = false) {
5
+ return new Promise((resolveAnswer, rejectAnswer) => {
6
+ let muted = false;
7
+ const output = hidden ? new Writable({ write(chunk, encoding, callback) {
8
+ if (!muted) process.stdout.write(chunk, encoding);
9
+ callback();
10
+ } }) : process.stdout;
11
+ const readline = createInterface({
12
+ input: process.stdin,
13
+ output,
14
+ terminal: true
15
+ });
16
+ readline.once("error", rejectAnswer);
17
+ if (hidden) {
18
+ process.stdout.write(prompt);
19
+ muted = true;
20
+ }
21
+ readline.question(hidden ? "" : prompt, (answer) => {
22
+ readline.close();
23
+ if (hidden) process.stdout.write("\n");
24
+ resolveAnswer(answer);
25
+ });
26
+ });
27
+ }
28
+ //#endregion
29
+ export { question as t };
package/dist/react.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as UploadedHitchFile } from "./upload-YbRKEqR6.js";
1
+ import { a as UploadedHitchFile } from "./upload-DKZzz5kW.js";
2
2
  import { ReactElement } from "react";
3
3
  import "@tiptap/core";
4
4
  //#region src/react/markdown.d.ts