carrick 0.3.53

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 (114) hide show
  1. package/LICENSE.md +99 -0
  2. package/README.md +79 -0
  3. package/bin/carrick.mjs +168 -0
  4. package/dist/channel.d.ts +16 -0
  5. package/dist/channel.js +37 -0
  6. package/dist/channel.js.map +1 -0
  7. package/dist/cli.d.ts +29 -0
  8. package/dist/cli.js +60 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/contract.d.ts +154 -0
  11. package/dist/contract.js +141 -0
  12. package/dist/contract.js.map +1 -0
  13. package/dist/diagnostics.d.ts +54 -0
  14. package/dist/diagnostics.js +199 -0
  15. package/dist/diagnostics.js.map +1 -0
  16. package/dist/hook/post-edit.d.ts +13 -0
  17. package/dist/hook/post-edit.js +76 -0
  18. package/dist/hook/post-edit.js.map +1 -0
  19. package/dist/hook/session-start.d.ts +2 -0
  20. package/dist/hook/session-start.js +44 -0
  21. package/dist/hook/session-start.js.map +1 -0
  22. package/dist/init/identity.d.ts +20 -0
  23. package/dist/init/identity.js +60 -0
  24. package/dist/init/identity.js.map +1 -0
  25. package/dist/init/repos.d.ts +19 -0
  26. package/dist/init/repos.js +46 -0
  27. package/dist/init/repos.js.map +1 -0
  28. package/dist/init/run.d.ts +11 -0
  29. package/dist/init/run.js +228 -0
  30. package/dist/init/run.js.map +1 -0
  31. package/dist/init/settings.d.ts +50 -0
  32. package/dist/init/settings.js +138 -0
  33. package/dist/init/settings.js.map +1 -0
  34. package/dist/log.d.ts +2 -0
  35. package/dist/log.js +35 -0
  36. package/dist/log.js.map +1 -0
  37. package/dist/native.d.ts +48 -0
  38. package/dist/native.js +127 -0
  39. package/dist/native.js.map +1 -0
  40. package/dist/render.d.ts +65 -0
  41. package/dist/render.js +334 -0
  42. package/dist/render.js.map +1 -0
  43. package/dist/root.d.ts +30 -0
  44. package/dist/root.js +82 -0
  45. package/dist/root.js.map +1 -0
  46. package/dist/server.d.ts +2 -0
  47. package/dist/server.js +255 -0
  48. package/dist/server.js.map +1 -0
  49. package/dist/templates.d.ts +18 -0
  50. package/dist/templates.js +66 -0
  51. package/dist/templates.js.map +1 -0
  52. package/package.json +72 -0
  53. package/plugin/.claude-plugin/plugin.json +6 -0
  54. package/plugin/.lsp.json +14 -0
  55. package/plugin/hooks/hooks.json +27 -0
  56. package/sidecar/dist/src/bundler.d.ts +141 -0
  57. package/sidecar/dist/src/bundler.js +680 -0
  58. package/sidecar/dist/src/capture/anchors.d.ts +61 -0
  59. package/sidecar/dist/src/capture/anchors.js +1132 -0
  60. package/sidecar/dist/src/capture/api.d.ts +378 -0
  61. package/sidecar/dist/src/capture/api.js +10 -0
  62. package/sidecar/dist/src/capture/augmentations.d.ts +20 -0
  63. package/sidecar/dist/src/capture/augmentations.js +60 -0
  64. package/sidecar/dist/src/capture/check-classify.d.ts +58 -0
  65. package/sidecar/dist/src/capture/check-classify.js +189 -0
  66. package/sidecar/dist/src/capture/check-deep.d.ts +32 -0
  67. package/sidecar/dist/src/capture/check-deep.js +91 -0
  68. package/sidecar/dist/src/capture/check-poison.d.ts +40 -0
  69. package/sidecar/dist/src/capture/check-poison.js +155 -0
  70. package/sidecar/dist/src/capture/check-probe.d.ts +70 -0
  71. package/sidecar/dist/src/capture/check-probe.js +147 -0
  72. package/sidecar/dist/src/capture/check-scrub.d.ts +31 -0
  73. package/sidecar/dist/src/capture/check-scrub.js +71 -0
  74. package/sidecar/dist/src/capture/check-workspace.d.ts +52 -0
  75. package/sidecar/dist/src/capture/check-workspace.js +218 -0
  76. package/sidecar/dist/src/capture/check.d.ts +39 -0
  77. package/sidecar/dist/src/capture/check.js +450 -0
  78. package/sidecar/dist/src/capture/deep-walk.d.ts +62 -0
  79. package/sidecar/dist/src/capture/deep-walk.js +243 -0
  80. package/sidecar/dist/src/capture/index.d.ts +36 -0
  81. package/sidecar/dist/src/capture/index.js +477 -0
  82. package/sidecar/dist/src/capture/lockfile.d.ts +48 -0
  83. package/sidecar/dist/src/capture/lockfile.js +490 -0
  84. package/sidecar/dist/src/capture/machinery.d.ts +59 -0
  85. package/sidecar/dist/src/capture/machinery.js +160 -0
  86. package/sidecar/dist/src/capture/node-builder.d.ts +37 -0
  87. package/sidecar/dist/src/capture/node-builder.js +123 -0
  88. package/sidecar/dist/src/capture/paths-rewrite.d.ts +34 -0
  89. package/sidecar/dist/src/capture/paths-rewrite.js +100 -0
  90. package/sidecar/dist/src/capture/self-check.d.ts +38 -0
  91. package/sidecar/dist/src/capture/self-check.js +317 -0
  92. package/sidecar/dist/src/capture/specifiers.d.ts +39 -0
  93. package/sidecar/dist/src/capture/specifiers.js +56 -0
  94. package/sidecar/dist/src/definition-resolver.d.ts +57 -0
  95. package/sidecar/dist/src/definition-resolver.js +153 -0
  96. package/sidecar/dist/src/index.d.ts +14 -0
  97. package/sidecar/dist/src/index.js +564 -0
  98. package/sidecar/dist/src/monorepo-builder.d.ts +129 -0
  99. package/sidecar/dist/src/monorepo-builder.js +584 -0
  100. package/sidecar/dist/src/project-loader.d.ts +130 -0
  101. package/sidecar/dist/src/project-loader.js +399 -0
  102. package/sidecar/dist/src/type-inferrer.d.ts +940 -0
  103. package/sidecar/dist/src/type-inferrer.js +3540 -0
  104. package/sidecar/dist/src/type-structural-expander.d.ts +61 -0
  105. package/sidecar/dist/src/type-structural-expander.js +283 -0
  106. package/sidecar/dist/src/type-text-canonicalizer.d.ts +40 -0
  107. package/sidecar/dist/src/type-text-canonicalizer.js +297 -0
  108. package/sidecar/dist/src/types.d.ts +669 -0
  109. package/sidecar/dist/src/types.js +5 -0
  110. package/sidecar/dist/src/validators.d.ts +2214 -0
  111. package/sidecar/dist/src/validators.js +336 -0
  112. package/sidecar/package.json +6 -0
  113. package/templates/carrick.json +7 -0
  114. package/templates/carrick.yml +45 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
package/dist/root.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ export declare const MARKER = ".carrick";
2
+ export type RootChoice = {
3
+ root: string;
4
+ /** Which candidate won: the client's folder, the env, an ancestor, or none. */
5
+ source: "client" | "project_dir" | "ancestor" | "fallback";
6
+ /** The workspace folder the client sent, when it sent one. */
7
+ clientRoot: string | null;
8
+ /** True when the client's folder is not the directory we are using. */
9
+ differs: boolean;
10
+ /** True when no candidate held `.carrick/`. */
11
+ markerFound: boolean;
12
+ };
13
+ export declare function hasMarker(dir: string, exists?: typeof defaultExists): boolean;
14
+ declare function defaultExists(target: string): boolean;
15
+ /** Every directory from `from` up to the filesystem root, nearest first. */
16
+ export declare function ancestors(from: string): string[];
17
+ export type ResolveRootInput = {
18
+ /** Workspace folder or rootUri path from the LSP client, when present. */
19
+ clientRoot?: string | null;
20
+ /** `CLAUDE_PROJECT_DIR`, when Claude Code set it. */
21
+ projectDir?: string | null;
22
+ /** The file being checked; its ancestors are the last resort. */
23
+ filePath?: string | null;
24
+ /** Injectable for tests. */
25
+ exists?: (target: string) => boolean;
26
+ };
27
+ export declare function resolveRoot(input: ResolveRootInput): RootChoice;
28
+ /** One line for the log when the client's folder is not the root we chose. */
29
+ export declare function rootNote(choice: RootChoice): string | null;
30
+ export {};
package/dist/root.js ADDED
@@ -0,0 +1,82 @@
1
+ // Which directory the workspace is, and how we decided.
2
+ //
3
+ // The root has to be the directory that holds `.carrick/`: the CLI reads its
4
+ // index from there, and every path it prints (`file`, `counterparts[].file`) is
5
+ // relative to it. Root the plugin one directory too deep and the CLI sees one
6
+ // service, reports nothing, and says so nowhere. The spike hit exactly that:
7
+ // Claude Code's rootUri follows the agent's shell cwd, so a `cd user-service`
8
+ // before the first edit moved it (runs/plugin-cd1, 2026-09-05).
9
+ //
10
+ // So the marker decides, not the client. Candidates are tried in order and the
11
+ // first one holding `.carrick/` wins; when the winner is not the directory the
12
+ // client sent, that is logged.
13
+ import fs from "node:fs";
14
+ import path from "node:path";
15
+ export const MARKER = ".carrick";
16
+ export function hasMarker(dir, exists = defaultExists) {
17
+ return exists(path.join(dir, MARKER));
18
+ }
19
+ function defaultExists(target) {
20
+ try {
21
+ return fs.existsSync(target);
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ /** Every directory from `from` up to the filesystem root, nearest first. */
28
+ export function ancestors(from) {
29
+ const out = [];
30
+ let current = path.resolve(from);
31
+ for (;;) {
32
+ out.push(current);
33
+ const parent = path.dirname(current);
34
+ if (parent === current)
35
+ return out;
36
+ current = parent;
37
+ }
38
+ }
39
+ export function resolveRoot(input) {
40
+ const exists = input.exists ?? defaultExists;
41
+ const clientRoot = input.clientRoot ? path.resolve(input.clientRoot) : null;
42
+ const projectDir = input.projectDir ? path.resolve(input.projectDir) : null;
43
+ const fileDir = input.filePath ? path.dirname(path.resolve(input.filePath)) : null;
44
+ const candidates = [];
45
+ if (clientRoot)
46
+ candidates.push({ dir: clientRoot, source: "client" });
47
+ if (projectDir)
48
+ candidates.push({ dir: projectDir, source: "project_dir" });
49
+ if (fileDir) {
50
+ for (const dir of ancestors(fileDir))
51
+ candidates.push({ dir, source: "ancestor" });
52
+ }
53
+ for (const candidate of candidates) {
54
+ if (hasMarker(candidate.dir, exists)) {
55
+ return {
56
+ root: candidate.dir,
57
+ source: candidate.source,
58
+ clientRoot,
59
+ differs: clientRoot !== null && clientRoot !== candidate.dir,
60
+ markerFound: true,
61
+ };
62
+ }
63
+ }
64
+ const fallback = clientRoot ?? projectDir ?? fileDir ?? process.cwd();
65
+ return {
66
+ root: fallback,
67
+ source: "fallback",
68
+ clientRoot,
69
+ differs: clientRoot !== null && clientRoot !== fallback,
70
+ markerFound: false,
71
+ };
72
+ }
73
+ /** One line for the log when the client's folder is not the root we chose. */
74
+ export function rootNote(choice) {
75
+ if (!choice.markerFound) {
76
+ return `no ${MARKER}/ above the file; using ${choice.root} and expecting the CLI to say it is not indexed`;
77
+ }
78
+ if (!choice.differs)
79
+ return null;
80
+ return `client workspace folder ${choice.clientRoot} has no ${MARKER}/; using ${choice.root} (${choice.source})`;
81
+ }
82
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export declare function feed(chunk: Buffer): void;
package/dist/server.js ADDED
@@ -0,0 +1,255 @@
1
+ #!/usr/bin/env node
2
+ // The Carrick language server: stdio, client-agnostic, read-only.
3
+ //
4
+ // It answers one question for every file a client opens or changes: what does
5
+ // the workspace index say about the routes and calls in this file, and does
6
+ // anything on the other side of them disagree. The answer comes from
7
+ // `carrick check <file> --json`; nothing is computed here.
8
+ //
9
+ // Client differences it is built for (verified on the 2026-09-05 spike, and on
10
+ // Claude Code 2.1.265 on 2026-09-09; see plugin/SMOKE.md section 1):
11
+ //
12
+ // * Claude Code sends `didOpen` only, with the post-edit text, and delivers
13
+ // diagnostics into the model one turn later. Editors send `didChange` too, so
14
+ // both are handled and `didChange` is debounced.
15
+ // * Claude Code starts this server lazily, and only when the Edit or Write tool
16
+ // touches a file whose extension the manifest claims. An edit the model makes
17
+ // through Bash starts nothing, on either channel, because the PostToolUse
18
+ // hook matches the same three tools. Editors open every file they show.
19
+ // * Claude Code runs one server per file extension: with another plugin's
20
+ // server already claiming `.ts`, this one is not used for it. Editors accept
21
+ // any number of diagnostic providers per file.
22
+ // * Claude Code drops `relatedInformation`; editors render it. Counterpart
23
+ // sites go in both places (see diagnostics.ts).
24
+ //
25
+ // stdout is protocol only. Every log line goes to stderr.
26
+ import path from "node:path";
27
+ import { fileURLToPath, pathToFileURL } from "node:url";
28
+ import { check } from "./cli.js";
29
+ import { resolveChannel } from "./channel.js";
30
+ import { toDiagnostics } from "./diagnostics.js";
31
+ import { createLogger } from "./log.js";
32
+ import { resolveRoot, rootNote } from "./root.js";
33
+ const NAME = "carrick";
34
+ const VERSION = "0.0.1";
35
+ /** Editors fire `didChange` on every keystroke; one check per pause is enough. */
36
+ const DEBOUNCE_MS = 400;
37
+ const log = createLogger("carrick-lsp");
38
+ function send(message) {
39
+ const body = Buffer.from(JSON.stringify({ jsonrpc: "2.0", ...message }), "utf8");
40
+ process.stdout.write(`Content-Length: ${body.length}\r\n\r\n`);
41
+ process.stdout.write(body);
42
+ }
43
+ // ------------------------------------------------------------------ state
44
+ let root = process.cwd();
45
+ let rootChoice = null;
46
+ let channel = resolveChannel({ hooksInstalled: false });
47
+ let clientName = "an unnamed client";
48
+ /** What each checked file last published to, so a clear is scoped to it. */
49
+ const publishedBy = new Map();
50
+ const debounces = new Map();
51
+ /** One check at a time: a burst of edits must not interleave two runs. */
52
+ let queue = Promise.resolve();
53
+ function enqueue(work) {
54
+ queue = queue.then(work).catch((error) => log("queue error", String(error)));
55
+ return queue;
56
+ }
57
+ function relative(file) {
58
+ return path.isAbsolute(file) ? path.relative(root, file) : file;
59
+ }
60
+ function publish(uriPath, diagnostics) {
61
+ send({
62
+ method: "textDocument/publishDiagnostics",
63
+ params: { uri: pathToFileURL(uriPath).toString(), diagnostics },
64
+ });
65
+ }
66
+ async function checkAndPublish(absFile) {
67
+ const relFile = relative(absFile);
68
+ const outcome = await check(relFile, { cwd: root });
69
+ if (!outcome.result) {
70
+ log("no answer for", relFile, outcome.failure ?? "");
71
+ return;
72
+ }
73
+ if (outcome.result.error) {
74
+ log("check", relFile, "->", outcome.result.error);
75
+ return;
76
+ }
77
+ const byFile = toDiagnostics(outcome.result, root, relFile);
78
+ log(`check ${relFile} -> ${[...byFile.values()].reduce((n, list) => n + list.length, 0)} diagnostic(s) across ${byFile.size} file(s) in ${outcome.ms}ms`);
79
+ // Clear only what THIS file's previous check flagged and no longer does: a
80
+ // check of another file legitimately returns nothing while its findings stand.
81
+ const previous = publishedBy.get(relFile) ?? new Set();
82
+ for (const stale of previous)
83
+ if (!byFile.has(stale))
84
+ byFile.set(stale, []);
85
+ publishedBy.set(relFile, new Set([...byFile.keys()].filter((file) => (byFile.get(file) ?? []).length > 0)));
86
+ for (const [file, diagnostics] of byFile)
87
+ publish(file, diagnostics);
88
+ }
89
+ function scheduleCheck(absFile, debounceMs) {
90
+ const existing = debounces.get(absFile);
91
+ if (existing)
92
+ clearTimeout(existing);
93
+ if (debounceMs === 0) {
94
+ void enqueue(() => checkAndPublish(absFile));
95
+ return;
96
+ }
97
+ debounces.set(absFile, setTimeout(() => {
98
+ debounces.delete(absFile);
99
+ void enqueue(() => checkAndPublish(absFile));
100
+ }, debounceMs));
101
+ }
102
+ function pathOf(params) {
103
+ const document = params?.["textDocument"];
104
+ if (!document?.uri)
105
+ return null;
106
+ try {
107
+ return fileURLToPath(document.uri);
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ // ------------------------------------------------------------------ protocol
114
+ function onInitialize(id, params) {
115
+ const folders = params["workspaceFolders"];
116
+ const folderUri = folders?.[0]?.uri ?? params["rootUri"];
117
+ let clientRoot = null;
118
+ if (folderUri) {
119
+ try {
120
+ clientRoot = fileURLToPath(folderUri);
121
+ }
122
+ catch {
123
+ clientRoot = null;
124
+ }
125
+ }
126
+ if (!clientRoot && typeof params["rootPath"] === "string") {
127
+ clientRoot = params["rootPath"];
128
+ }
129
+ const info = params["clientInfo"];
130
+ if (info?.name)
131
+ clientName = info.name;
132
+ rootChoice = resolveRoot({
133
+ clientRoot,
134
+ projectDir: process.env["CLAUDE_PROJECT_DIR"] ?? null,
135
+ filePath: clientRoot,
136
+ });
137
+ root = rootChoice.root;
138
+ const note = rootNote(rootChoice);
139
+ if (note)
140
+ log(note);
141
+ channel = resolveChannel({
142
+ hooksInstalled: process.argv.includes("--hooks-installed"),
143
+ });
144
+ if (channel.ignoredValue) {
145
+ log(`CARRICK_CHANNEL=${channel.ignoredValue} is not a channel; using ${channel.channel}`);
146
+ }
147
+ if (channel.channel !== "lsp") {
148
+ log(`the ${channel.channel} channel owns delivery in this install (${channel.source}), so this server publishes nothing`);
149
+ }
150
+ log(`initialized by ${clientName}, root ${root} (${rootChoice.source})`);
151
+ send({
152
+ id,
153
+ result: {
154
+ capabilities: {
155
+ textDocumentSync: { openClose: true, change: 1, save: { includeText: false } },
156
+ diagnosticProvider: {
157
+ identifier: NAME,
158
+ interFileDependencies: true,
159
+ workspaceDiagnostics: false,
160
+ },
161
+ },
162
+ serverInfo: { name: NAME, version: VERSION },
163
+ },
164
+ });
165
+ }
166
+ function handle(message) {
167
+ const { id, method, params } = message;
168
+ if (!method)
169
+ return;
170
+ switch (method) {
171
+ case "initialize":
172
+ onInitialize(id, params ?? {});
173
+ return;
174
+ case "initialized":
175
+ return;
176
+ case "shutdown":
177
+ send({ id, result: null });
178
+ return;
179
+ case "exit":
180
+ process.exit(0);
181
+ return;
182
+ case "textDocument/didOpen":
183
+ case "textDocument/didSave":
184
+ case "textDocument/didChange": {
185
+ if (channel.channel !== "lsp")
186
+ return;
187
+ const file = pathOf(params);
188
+ if (!file)
189
+ return;
190
+ scheduleCheck(file, method === "textDocument/didChange" ? DEBOUNCE_MS : 0);
191
+ return;
192
+ }
193
+ case "textDocument/diagnostic": {
194
+ // A pull-only client still gets an answer, and the same one.
195
+ const file = pathOf(params);
196
+ if (!file || channel.channel !== "lsp") {
197
+ send({ id, result: { kind: "full", items: [] } });
198
+ return;
199
+ }
200
+ void enqueue(async () => {
201
+ const outcome = await check(relative(file), { cwd: root });
202
+ const items = outcome.result
203
+ ? (toDiagnostics(outcome.result, root, relative(file)).get(path.resolve(file)) ?? [])
204
+ : [];
205
+ send({ id, result: { kind: "full", items } });
206
+ });
207
+ return;
208
+ }
209
+ default:
210
+ if (id !== undefined) {
211
+ send({ id, error: { code: -32601, message: `method not handled: ${method}` } });
212
+ }
213
+ return;
214
+ }
215
+ }
216
+ // ------------------------------------------------------------------ framing
217
+ let buffer = Buffer.alloc(0);
218
+ export function feed(chunk) {
219
+ buffer = Buffer.concat([buffer, chunk]);
220
+ for (;;) {
221
+ const separator = buffer.indexOf("\r\n\r\n");
222
+ if (separator === -1)
223
+ return;
224
+ const header = buffer.subarray(0, separator).toString("ascii");
225
+ const match = /Content-Length:\s*(\d+)/i.exec(header);
226
+ if (!match?.[1]) {
227
+ buffer = buffer.subarray(separator + 4);
228
+ continue;
229
+ }
230
+ const length = Number.parseInt(match[1], 10);
231
+ if (buffer.length < separator + 4 + length)
232
+ return;
233
+ const body = buffer.subarray(separator + 4, separator + 4 + length).toString("utf8");
234
+ buffer = buffer.subarray(separator + 4 + length);
235
+ let message;
236
+ try {
237
+ message = JSON.parse(body);
238
+ }
239
+ catch (error) {
240
+ log("unparseable message", String(error));
241
+ continue;
242
+ }
243
+ try {
244
+ handle(message);
245
+ }
246
+ catch (error) {
247
+ log("handler error", String(error));
248
+ }
249
+ }
250
+ }
251
+ process.stdin.on("data", (chunk) => feed(chunk));
252
+ process.on("uncaughtException", (error) => log("uncaught", String(error)));
253
+ process.on("unhandledRejection", (error) => log("unhandled rejection", String(error)));
254
+ log(`start pid ${process.pid} node ${process.version}`);
255
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type TemplateName = "workflow" | "carrick.json";
2
+ export declare const TEMPLATE_NAMES: TemplateName[];
3
+ /** Where a repo puts each one. */
4
+ export declare const TEMPLATE_PATHS: Record<TemplateName, string>;
5
+ export declare const DEFAULTS: Record<string, string>;
6
+ export declare function templateSource(name: TemplateName): string;
7
+ /**
8
+ * Render one template.
9
+ *
10
+ * Every placeholder must be filled: an unrendered `{{NAME}}` in a workflow is a
11
+ * file that looks written and does not run, so it throws rather than shipping.
12
+ */
13
+ export declare function renderTemplate(name: TemplateName, variables?: Record<string, string>): string;
14
+ /** Every file, ready to write, for a repo in a project. */
15
+ export declare function scaffoldFiles(variables?: Record<string, string>): Array<{
16
+ path: string;
17
+ contents: string;
18
+ }>;
@@ -0,0 +1,66 @@
1
+ // The files Carrick asks a repo to hold, as files.
2
+ //
3
+ // One renderer for both of the places that write them: `carrick init` here,
4
+ // and the hosted `scaffold` tool, which depends on this package at a pinned
5
+ // version and renders the same bytes (carrick#710). Scaffold parity used to be
6
+ // a rule and a review check; a shared template makes it structural, and a
7
+ // public template is one a user can read before running anything.
8
+ //
9
+ // Placeholders are `{{NAME}}`. Not `${{ }}`, which is GitHub Actions'
10
+ // own syntax and appears in the workflow this renders.
11
+ import fs from "node:fs";
12
+ import path from "node:path";
13
+ import { fileURLToPath } from "node:url";
14
+ const TEMPLATES = {
15
+ // Written to .github/workflows/carrick.yml.
16
+ workflow: { file: "carrick.yml", variables: ["ACTION_REF", "DEFAULT_BRANCH"] },
17
+ // Written to the repo root, for the scanning agent to fill in.
18
+ "carrick.json": { file: "carrick.json", variables: [] },
19
+ };
20
+ export const TEMPLATE_NAMES = Object.keys(TEMPLATES);
21
+ /** Where a repo puts each one. */
22
+ export const TEMPLATE_PATHS = {
23
+ workflow: ".github/workflows/carrick.yml",
24
+ "carrick.json": "carrick.json",
25
+ };
26
+ export const DEFAULTS = {
27
+ ACTION_REF: "carrick-tools/carrick@v1",
28
+ DEFAULT_BRANCH: "main",
29
+ };
30
+ function templatesDir() {
31
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "templates");
32
+ }
33
+ export function templateSource(name) {
34
+ return fs.readFileSync(path.join(templatesDir(), TEMPLATES[name].file), "utf8");
35
+ }
36
+ /**
37
+ * Render one template.
38
+ *
39
+ * Every placeholder must be filled: an unrendered `{{NAME}}` in a workflow is a
40
+ * file that looks written and does not run, so it throws rather than shipping.
41
+ */
42
+ export function renderTemplate(name, variables = {}) {
43
+ const template = TEMPLATES[name];
44
+ if (!template)
45
+ throw new Error(`no carrick template named ${name}`);
46
+ const values = { ...DEFAULTS, ...variables };
47
+ let rendered = templateSource(name);
48
+ for (const key of template.variables) {
49
+ const value = values[key];
50
+ if (value === undefined)
51
+ throw new Error(`${name} needs a value for ${key}`);
52
+ rendered = rendered.split(`{{${key}}}`).join(value);
53
+ }
54
+ const left = /\{\{([A-Z_]+)\}\}/.exec(rendered);
55
+ if (left)
56
+ throw new Error(`${name} still holds ${left[0]} after rendering`);
57
+ return rendered;
58
+ }
59
+ /** Every file, ready to write, for a repo in a project. */
60
+ export function scaffoldFiles(variables = {}) {
61
+ return TEMPLATE_NAMES.map((name) => ({
62
+ path: TEMPLATE_PATHS[name],
63
+ contents: renderTemplate(name, variables),
64
+ }));
65
+ }
66
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,+EAA+E;AAC/E,0EAA0E;AAC1E,kEAAkE;AAClE,EAAE;AACF,sEAAsE;AACtE,uDAAuD;AAEvD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAMzC,MAAM,SAAS,GAAmC;IAChD,4CAA4C;IAC5C,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC,EAAE;IAC9E,+DAA+D;IAC/D,cAAc,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,EAAE;CACxD,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAmB,CAAC;AAEvE,kCAAkC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAiC;IAC1D,QAAQ,EAAE,+BAA+B;IACzC,cAAc,EAAE,cAAc;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAA2B;IAC9C,UAAU,EAAE,0BAA0B;IACtC,cAAc,EAAE,MAAM;CACvB,CAAC;AAEF,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAkB,EAClB,YAAoC,EAAE;IAEtC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;IAC7C,IAAI,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAC7E,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,gBAAgB,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,aAAa,CAC3B,YAAoC,EAAE;IAEtC,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC;KAC1C,CAAC,CAAC,CAAC;AACN,CAAC"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "carrick",
3
+ "version": "0.3.53",
4
+ "description": "The API contract index for a TypeScript workspace: what the other services do with the routes and calls in the file you are editing, in your editor and in your agent's context",
5
+ "keywords": [
6
+ "typescript",
7
+ "monorepo",
8
+ "api",
9
+ "contracts",
10
+ "lsp",
11
+ "claude-code"
12
+ ],
13
+ "homepage": "https://carrick.tools",
14
+ "bugs": "https://github.com/carrick-tools/carrick/issues",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/carrick-tools/carrick.git",
18
+ "directory": "npm/carrick"
19
+ },
20
+ "license": "SEE LICENSE IN LICENSE.md",
21
+ "type": "module",
22
+ "bin": {
23
+ "carrick": "bin/carrick.mjs"
24
+ },
25
+ "exports": {
26
+ "./templates": {
27
+ "types": "./dist/templates.d.ts",
28
+ "default": "./dist/templates.js"
29
+ },
30
+ "./package.json": "./package.json"
31
+ },
32
+ "engines": {
33
+ "node": ">=24"
34
+ },
35
+ "files": [
36
+ "bin",
37
+ "dist",
38
+ "plugin",
39
+ "sidecar",
40
+ "templates",
41
+ "LICENSE.md"
42
+ ],
43
+ "scripts": {
44
+ "test": "tsc --noEmit && npm run build && node --test 'test/**/*.test.ts'",
45
+ "typecheck": "tsc --noEmit",
46
+ "selftest": "node test/selftest.ts",
47
+ "bundle": "node scripts/bundle-sidecar.mjs",
48
+ "prepack": "npm run build && node scripts/bundle-sidecar.mjs",
49
+ "build": "tsc -p tsconfig.build.json"
50
+ },
51
+ "dependencies": {
52
+ "pnpm": "10.34.5",
53
+ "ts-morph": "^25.0.1",
54
+ "typescript": "^5.8.0",
55
+ "zod": "^3.23.0"
56
+ },
57
+ "optionalDependencies": {
58
+ "@carrick-tools/cli-darwin-arm64": "0.3.53",
59
+ "@carrick-tools/cli-darwin-x64": "0.3.53",
60
+ "@carrick-tools/cli-linux-arm64": "0.3.53",
61
+ "@carrick-tools/cli-linux-x64": "0.3.53",
62
+ "@carrick-tools/cli-win32-x64": "0.3.53"
63
+ },
64
+ "devDependencies": {
65
+ "@types/node": "^24.13.3",
66
+ "typescript": "^5.9.2"
67
+ },
68
+ "publishConfig": {
69
+ "access": "public",
70
+ "provenance": true
71
+ }
72
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "carrick",
3
+ "description": "Puts the workspace index's answer about the file you just edited into the session: its routes and calls, who is on the other side of them, and any contract that no longer holds",
4
+ "version": "0.0.1",
5
+ "homepage": "https://carrick.tools"
6
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "carrick": {
3
+ "command": "carrick",
4
+ "args": ["lsp", "--stdio", "--hooks-installed"],
5
+ "extensionToLanguage": {
6
+ ".ts": "typescript",
7
+ ".tsx": "typescriptreact"
8
+ },
9
+ "transport": "stdio",
10
+ "diagnostics": true,
11
+ "restartOnCrash": true,
12
+ "startupTimeout": 30000
13
+ }
14
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "hooks": {
3
+ "PostToolUse": [
4
+ {
5
+ "matcher": "Write|Edit|MultiEdit",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "carrick hook post-edit",
10
+ "timeout": 15
11
+ }
12
+ ]
13
+ }
14
+ ],
15
+ "SessionStart": [
16
+ {
17
+ "hooks": [
18
+ {
19
+ "type": "command",
20
+ "command": "carrick hook session-start",
21
+ "timeout": 30
22
+ }
23
+ ]
24
+ }
25
+ ]
26
+ }
27
+ }