craftdriver 1.7.0 → 1.9.0

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 (234) hide show
  1. package/CHANGELOG.md +25 -12
  2. package/README.md +16 -6
  3. package/dist/cli/agentSession.d.ts +62 -0
  4. package/dist/cli/agentSession.d.ts.map +1 -0
  5. package/dist/cli/agentSession.js +100 -0
  6. package/dist/cli/agentSession.js.map +1 -0
  7. package/dist/cli/artifactPaths.d.ts +42 -0
  8. package/dist/cli/artifactPaths.d.ts.map +1 -0
  9. package/dist/cli/artifactPaths.js +144 -0
  10. package/dist/cli/artifactPaths.js.map +1 -0
  11. package/dist/cli/bounds.d.ts +88 -0
  12. package/dist/cli/bounds.d.ts.map +1 -0
  13. package/dist/cli/bounds.js +128 -0
  14. package/dist/cli/bounds.js.map +1 -0
  15. package/dist/cli/client.d.ts +3 -0
  16. package/dist/cli/client.d.ts.map +1 -1
  17. package/dist/cli/client.js +24 -8
  18. package/dist/cli/client.js.map +1 -1
  19. package/dist/cli/daemon.d.ts +3 -0
  20. package/dist/cli/daemon.d.ts.map +1 -1
  21. package/dist/cli/daemon.js +152 -39
  22. package/dist/cli/daemon.js.map +1 -1
  23. package/dist/cli/defaults.d.ts +23 -3
  24. package/dist/cli/defaults.d.ts.map +1 -1
  25. package/dist/cli/defaults.js +50 -5
  26. package/dist/cli/defaults.js.map +1 -1
  27. package/dist/cli/dispatcher.d.ts +54 -11
  28. package/dist/cli/dispatcher.d.ts.map +1 -1
  29. package/dist/cli/dispatcher.js +851 -54
  30. package/dist/cli/dispatcher.js.map +1 -1
  31. package/dist/cli/index.d.ts.map +1 -1
  32. package/dist/cli/index.js +305 -56
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/init.d.ts +14 -14
  35. package/dist/cli/init.d.ts.map +1 -1
  36. package/dist/cli/init.js +328 -180
  37. package/dist/cli/init.js.map +1 -1
  38. package/dist/cli/journal.d.ts +153 -0
  39. package/dist/cli/journal.d.ts.map +1 -0
  40. package/dist/cli/journal.js +252 -0
  41. package/dist/cli/journal.js.map +1 -0
  42. package/dist/cli/lineReader.d.ts +33 -0
  43. package/dist/cli/lineReader.d.ts.map +1 -0
  44. package/dist/cli/lineReader.js +66 -0
  45. package/dist/cli/lineReader.js.map +1 -0
  46. package/dist/cli/locatorCandidates.d.ts +44 -0
  47. package/dist/cli/locatorCandidates.d.ts.map +1 -0
  48. package/dist/cli/locatorCandidates.js +190 -0
  49. package/dist/cli/locatorCandidates.js.map +1 -0
  50. package/dist/cli/mcp/artifacts.d.ts +39 -1
  51. package/dist/cli/mcp/artifacts.d.ts.map +1 -1
  52. package/dist/cli/mcp/artifacts.js +104 -9
  53. package/dist/cli/mcp/artifacts.js.map +1 -1
  54. package/dist/cli/mcp/bounds.d.ts +65 -0
  55. package/dist/cli/mcp/bounds.d.ts.map +1 -0
  56. package/dist/cli/mcp/bounds.js +124 -0
  57. package/dist/cli/mcp/bounds.js.map +1 -0
  58. package/dist/cli/mcp/params.d.ts +38 -0
  59. package/dist/cli/mcp/params.d.ts.map +1 -0
  60. package/dist/cli/mcp/params.js +174 -0
  61. package/dist/cli/mcp/params.js.map +1 -0
  62. package/dist/cli/mcp/server.d.ts +94 -16
  63. package/dist/cli/mcp/server.d.ts.map +1 -1
  64. package/dist/cli/mcp/server.js +304 -150
  65. package/dist/cli/mcp/server.js.map +1 -1
  66. package/dist/cli/mcp/tools.d.ts +62 -17
  67. package/dist/cli/mcp/tools.d.ts.map +1 -1
  68. package/dist/cli/mcp/tools.js +373 -158
  69. package/dist/cli/mcp/tools.js.map +1 -1
  70. package/dist/cli/pageSemantics.d.ts +6 -0
  71. package/dist/cli/pageSemantics.d.ts.map +1 -0
  72. package/dist/cli/pageSemantics.js +6 -0
  73. package/dist/cli/pageSemantics.js.map +1 -0
  74. package/dist/cli/parseArgs.d.ts +6 -18
  75. package/dist/cli/parseArgs.d.ts.map +1 -1
  76. package/dist/cli/parseArgs.js +689 -45
  77. package/dist/cli/parseArgs.js.map +1 -1
  78. package/dist/cli/protocol.d.ts +8 -0
  79. package/dist/cli/protocol.d.ts.map +1 -1
  80. package/dist/cli/selector.d.ts +3 -3
  81. package/dist/cli/selector.d.ts.map +1 -1
  82. package/dist/cli/selector.js +6 -9
  83. package/dist/cli/selector.js.map +1 -1
  84. package/dist/cli/sessionRegistry.d.ts +42 -0
  85. package/dist/cli/sessionRegistry.d.ts.map +1 -0
  86. package/dist/cli/sessionRegistry.js +99 -0
  87. package/dist/cli/sessionRegistry.js.map +1 -0
  88. package/dist/cli/snapshot.d.ts +100 -19
  89. package/dist/cli/snapshot.d.ts.map +1 -1
  90. package/dist/cli/snapshot.js +295 -108
  91. package/dist/cli/snapshot.js.map +1 -1
  92. package/dist/cli/stateStore.d.ts +50 -0
  93. package/dist/cli/stateStore.d.ts.map +1 -0
  94. package/dist/cli/stateStore.js +122 -0
  95. package/dist/cli/stateStore.js.map +1 -0
  96. package/dist/index.d.ts +3 -2
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +1 -0
  99. package/dist/index.js.map +1 -1
  100. package/dist/lib/a11y.d.ts +6 -2
  101. package/dist/lib/a11y.d.ts.map +1 -1
  102. package/dist/lib/a11y.js +3 -1
  103. package/dist/lib/a11y.js.map +1 -1
  104. package/dist/lib/bidi/evaluate.d.ts +11 -0
  105. package/dist/lib/bidi/evaluate.d.ts.map +1 -0
  106. package/dist/lib/bidi/evaluate.js +25 -0
  107. package/dist/lib/bidi/evaluate.js.map +1 -0
  108. package/dist/lib/bidi/index.d.ts +1 -1
  109. package/dist/lib/bidi/index.d.ts.map +1 -1
  110. package/dist/lib/bidi/index.js +2 -2
  111. package/dist/lib/bidi/index.js.map +1 -1
  112. package/dist/lib/bidi/logs.d.ts +3 -0
  113. package/dist/lib/bidi/logs.d.ts.map +1 -1
  114. package/dist/lib/bidi/logs.js +7 -0
  115. package/dist/lib/bidi/logs.js.map +1 -1
  116. package/dist/lib/bidi/network.d.ts +14 -1
  117. package/dist/lib/bidi/network.d.ts.map +1 -1
  118. package/dist/lib/bidi/network.js +45 -7
  119. package/dist/lib/bidi/network.js.map +1 -1
  120. package/dist/lib/bidi/storage.d.ts +30 -6
  121. package/dist/lib/bidi/storage.d.ts.map +1 -1
  122. package/dist/lib/bidi/storage.js +190 -45
  123. package/dist/lib/bidi/storage.js.map +1 -1
  124. package/dist/lib/bidi/types.d.ts +9 -2
  125. package/dist/lib/bidi/types.d.ts.map +1 -1
  126. package/dist/lib/browser.d.ts +7 -4
  127. package/dist/lib/browser.d.ts.map +1 -1
  128. package/dist/lib/browser.js +186 -65
  129. package/dist/lib/browser.js.map +1 -1
  130. package/dist/lib/browserContext.d.ts +58 -24
  131. package/dist/lib/browserContext.d.ts.map +1 -1
  132. package/dist/lib/browserContext.js +300 -99
  133. package/dist/lib/browserContext.js.map +1 -1
  134. package/dist/lib/by.d.ts +68 -30
  135. package/dist/lib/by.d.ts.map +1 -1
  136. package/dist/lib/by.js +54 -23
  137. package/dist/lib/by.js.map +1 -1
  138. package/dist/lib/clearFastPath.d.ts.map +1 -1
  139. package/dist/lib/clearFastPath.js +2 -0
  140. package/dist/lib/clearFastPath.js.map +1 -1
  141. package/dist/lib/clickFastPath.d.ts.map +1 -1
  142. package/dist/lib/clickFastPath.js +2 -0
  143. package/dist/lib/clickFastPath.js.map +1 -1
  144. package/dist/lib/driver.d.ts +26 -0
  145. package/dist/lib/driver.d.ts.map +1 -1
  146. package/dist/lib/driver.js +123 -4
  147. package/dist/lib/driver.js.map +1 -1
  148. package/dist/lib/elementHandle.d.ts +13 -10
  149. package/dist/lib/elementHandle.d.ts.map +1 -1
  150. package/dist/lib/elementHandle.js +119 -50
  151. package/dist/lib/elementHandle.js.map +1 -1
  152. package/dist/lib/errors.d.ts +12 -0
  153. package/dist/lib/errors.d.ts.map +1 -1
  154. package/dist/lib/errors.js +12 -0
  155. package/dist/lib/errors.js.map +1 -1
  156. package/dist/lib/expect.d.ts +10 -0
  157. package/dist/lib/expect.d.ts.map +1 -1
  158. package/dist/lib/expect.js +76 -49
  159. package/dist/lib/expect.js.map +1 -1
  160. package/dist/lib/fillFastPath.d.ts.map +1 -1
  161. package/dist/lib/fillFastPath.js +2 -0
  162. package/dist/lib/fillFastPath.js.map +1 -1
  163. package/dist/lib/frame.d.ts.map +1 -1
  164. package/dist/lib/frame.js +29 -17
  165. package/dist/lib/frame.js.map +1 -1
  166. package/dist/lib/initScript.d.ts +9 -0
  167. package/dist/lib/initScript.d.ts.map +1 -0
  168. package/dist/lib/initScript.js +14 -0
  169. package/dist/lib/initScript.js.map +1 -0
  170. package/dist/lib/locator.d.ts +21 -54
  171. package/dist/lib/locator.d.ts.map +1 -1
  172. package/dist/lib/locator.js +165 -208
  173. package/dist/lib/locator.js.map +1 -1
  174. package/dist/lib/page.d.ts +22 -0
  175. package/dist/lib/page.d.ts.map +1 -1
  176. package/dist/lib/page.js +71 -13
  177. package/dist/lib/page.js.map +1 -1
  178. package/dist/lib/pageSemantics.d.ts +42 -0
  179. package/dist/lib/pageSemantics.d.ts.map +1 -0
  180. package/dist/lib/pageSemantics.js +216 -0
  181. package/dist/lib/pageSemantics.js.map +1 -0
  182. package/dist/lib/query.d.ts +68 -0
  183. package/dist/lib/query.d.ts.map +1 -0
  184. package/dist/lib/query.js +590 -0
  185. package/dist/lib/query.js.map +1 -0
  186. package/dist/lib/secureFile.d.ts +8 -0
  187. package/dist/lib/secureFile.d.ts.map +1 -0
  188. package/dist/lib/secureFile.js +67 -0
  189. package/dist/lib/secureFile.js.map +1 -0
  190. package/dist/lib/sessionStateValidation.d.ts +35 -0
  191. package/dist/lib/sessionStateValidation.d.ts.map +1 -0
  192. package/dist/lib/sessionStateValidation.js +223 -0
  193. package/dist/lib/sessionStateValidation.js.map +1 -0
  194. package/dist/lib/shadowRoot.d.ts +21 -0
  195. package/dist/lib/shadowRoot.d.ts.map +1 -0
  196. package/dist/lib/shadowRoot.js +29 -0
  197. package/dist/lib/shadowRoot.js.map +1 -0
  198. package/dist/lib/shadowRootLocator.d.ts +31 -0
  199. package/dist/lib/shadowRootLocator.d.ts.map +1 -0
  200. package/dist/lib/shadowRootLocator.js +55 -0
  201. package/dist/lib/shadowRootLocator.js.map +1 -0
  202. package/dist/lib/timing.d.ts +2 -2
  203. package/dist/lib/timing.js +2 -2
  204. package/dist/lib/tracing.d.ts +2 -1
  205. package/dist/lib/tracing.d.ts.map +1 -1
  206. package/dist/lib/tracing.js +12 -1
  207. package/dist/lib/tracing.js.map +1 -1
  208. package/docs/accessibility.md +9 -1
  209. package/docs/agents.md +56 -61
  210. package/docs/api-reference.md +5 -1
  211. package/docs/browser-api.md +27 -7
  212. package/docs/browser-context.md +21 -15
  213. package/docs/cli.md +353 -30
  214. package/docs/error-codes.md +7 -4
  215. package/docs/getting-started.md +6 -1
  216. package/docs/index.md +1 -1
  217. package/docs/mcp.md +136 -65
  218. package/docs/public/examples/agent-actions.html +48 -0
  219. package/docs/public/examples/agent-debug.html +86 -0
  220. package/docs/public/examples/agent-late-mutation.html +18 -0
  221. package/docs/public/examples/agent-ref-shift.html +33 -0
  222. package/docs/public/examples/iframe-child.html +12 -1
  223. package/docs/public/examples/shadow-dom.html +137 -0
  224. package/docs/recipes/login-once-reuse-session.md +33 -5
  225. package/docs/selectors.md +61 -0
  226. package/docs/session-management.md +80 -12
  227. package/docs/why-craftdriver.md +1 -1
  228. package/package.json +5 -3
  229. package/skills/craftdriver/SKILL.md +59 -75
  230. package/skills/craftdriver/agents/openai.yaml +4 -0
  231. package/skills/craftdriver/cheatsheet.md +18 -4
  232. package/skills/craftdriver/cli.md +194 -68
  233. package/skills/craftdriver/patterns.md +17 -8
  234. package/skills/craftdriver/workflow.md +149 -0
package/dist/cli/init.js CHANGED
@@ -1,192 +1,340 @@
1
- /**
2
- * `craftdriver init <flavor>` write an agent-guide file into the
3
- * current project. Each flavor maps to one or more well-known paths
4
- * that a specific AI assistant reads on every turn.
5
- *
6
- * One body of text, N filenames. Adapters can prepend a flavor-specific
7
- * header (e.g. Cursor's `.mdc` frontmatter) but the rules below the
8
- * header are identical across flavors so every agent on a team gets the
9
- * same instructions.
10
- */
11
- import { existsSync, mkdirSync, writeFileSync } from 'fs';
12
- import { dirname, join, relative } from 'path';
13
- export const SUPPORTED_FLAVORS = [
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, writeFileSync, } from 'node:fs';
3
+ import { dirname, join, relative, resolve, sep } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ export const LEGACY_FLAVORS = [
14
6
  'agents',
15
7
  'copilot',
16
8
  'claude',
17
9
  'cursor',
18
10
  'gemini',
11
+ 'all',
19
12
  ];
20
- /**
21
- * Map a flavor to the paths it writes, relative to the project root.
22
- * Keep this small and conventional — anything more specific belongs in
23
- * each tool's own docs.
24
- */
25
- function targetsFor(flavor) {
26
- switch (flavor) {
27
- case 'agents':
28
- // AGENTS.md is the cross-tool convention picked up by Codex,
29
- // OpenCode, Aider, Amp, and also Cursor.
30
- return [{ path: 'AGENTS.md' }];
31
- case 'copilot':
32
- return [{ path: '.github/copilot-instructions.md' }];
33
- case 'claude':
34
- return [{ path: 'CLAUDE.md' }];
35
- case 'cursor':
36
- return [
37
- {
38
- path: '.cursor/rules/craftdriver.mdc',
39
- header: '---\n' +
40
- 'description: craftdriver agent rules for browser automation tests\n' +
41
- 'globs: ["**/*.{ts,tsx,js,jsx}"]\n' +
42
- 'alwaysApply: true\n' +
43
- '---\n\n',
44
- },
45
- ];
46
- case 'gemini':
47
- return [{ path: 'GEMINI.md' }];
48
- }
49
- }
50
- /** Single source of truth for the body each adapter writes. */
51
- export function buildBody() {
52
- return `# Working with craftdriver
53
-
54
- This project uses [craftdriver](https://www.npmjs.com/package/craftdriver),
55
- a BiDi-first WebDriver library for Node.js. Follow these rules whenever
56
- you write or modify browser-automation code in this repo.
57
-
58
- ## Use craftdriver, not raw Selenium or Playwright
59
-
60
- \`\`\`ts
61
- import { Browser, By, expect } from 'craftdriver';
62
-
63
- const browser = await Browser.launch({ browserName: 'chrome' });
64
- await browser.navigateTo('https://example.com/login');
65
- await browser.fill('#username', 'alice');
66
- await browser.click('button[type=submit]');
67
- await expect(browser.locator('#welcome')).toHaveText(/welcome/i);
68
- await browser.quit();
69
- \`\`\`
70
-
71
- The public surface is whatever \`src/index.ts\` of \`craftdriver\` re-exports.
72
- Anything under \`craftdriver/src/lib/\` is internal — do not import it.
73
-
74
- ## Selector preference order
75
-
76
- Prefer stable, semantic locators. They survive DOM refactors; CSS and
77
- XPath break the moment markup shifts.
78
-
79
- \`\`\`
80
- By.testId > By.role({ name }) > By.labelText >
81
- By.text({ exact: true }) > By.css > By.xpath
82
- \`\`\`
83
-
84
- String selectors passed directly to \`browser.click('…')\` etc. are
85
- treated as CSS. Use \`By.*\` helpers or \`browser.getBy*()\` when you
86
- want a semantic locator.
87
-
88
- ## Auto-waiting — do not add sleeps
89
-
90
- Every action and every \`expect(locator).to…()\` already waits up to the
91
- default timeout (30 s in-library, 5 s on the CLI). **Never** add
92
- \`setTimeout\`, \`sleep\`, or hand-rolled \`while (…) { … }\` retry loops.
93
- They are footguns: actions wait for the right condition; sleeps wait
94
- for the wrong amount of time.
95
-
96
- \`\`\`ts
97
- // Good
98
- await expect(browser.locator('#status')).toHaveText('Ready');
99
-
100
- // Bad
101
- await new Promise(r => setTimeout(r, 2000));
102
- expect(await browser.text('#status')).toBe('Ready');
103
- \`\`\`
104
-
105
- ## Errors carry a stable \`code\`
106
-
107
- Every error thrown by the public API is a \`CraftdriverError\` with a
108
- stable \`code\` field. Match on the code, not the prose:
109
-
110
- \`\`\`ts
111
- import { CraftdriverError, ErrorCode } from 'craftdriver';
112
-
113
- try {
114
- await browser.click('#submit');
115
- } catch (e) {
116
- if (e instanceof CraftdriverError && e.code === ErrorCode.NO_MATCH) {
117
- // selector matched zero elements — fix the selector
118
- }
119
- }
120
- \`\`\`
121
-
122
- Common codes: \`NO_MATCH\`, \`TIMEOUT_WAITING_VISIBLE\`,
123
- \`TIMEOUT_WAITING_STATE\`, \`TIMEOUT_WAITING_LOAD\`, \`EXPECT_MISMATCH\`,
124
- \`INVALID_ARGUMENT\`, \`UNSUPPORTED\`. Full list in
125
- \`node_modules/craftdriver/docs/error-codes.md\`.
126
-
127
- ## CLI for exploration and agent loops
128
-
129
- For ad-hoc probing from a shell including agent-driven loops —
130
- craftdriver ships a \`craftdriver\` binary:
131
-
132
- \`\`\`bash
133
- npx craftdriver daemon start
134
- npx craftdriver go http://127.0.0.1:8080/login.html
135
- npx craftdriver exists '#submit' # 0-wait probe; exit 0 = match
136
- npx craftdriver fill '#username' alice
137
- npx craftdriver click 'button[type=submit]'
138
- npx craftdriver text '#welcome'
139
- npx craftdriver daemon stop
140
- \`\`\`
141
-
142
- Selectors are CSS by default; switch with \`prefix=value\`
143
- (\`role=button[name=Submit]\`, \`text=Sign In\`, \`label=Email\`,
144
- \`testid=login-btn\`, \`xpath=…\`). Exit codes: \`0\` success,
145
- \`1\` assertion/timeout/no-match, \`2\` usage error.
146
-
147
- Probe before acting on a guess: \`craftdriver exists …\` is a 0-wait
148
- check that returns immediately. Don't \`click\` a hallucinated selector
149
- and burn the full timeout.
150
-
151
- Full reference: \`node_modules/craftdriver/docs/cli.md\`.
152
-
153
- ## Pointers
154
-
155
- - \`node_modules/craftdriver/docs/api-reference.md\` — every public
156
- symbol, one row each. Read this before inventing a method.
157
- - \`node_modules/craftdriver/docs/error-codes.md\` every error code,
158
- when it fires, recommended recovery.
159
- - \`node_modules/craftdriver/docs/cli.md\` full CLI reference.
160
- - \`node_modules/craftdriver/skills/craftdriver/\` — agent-facing SKILL
161
- pack: \`SKILL.md\` (always-on rules), \`cheatsheet.md\` (writing tests),
162
- \`patterns.md\` (login/upload/network-wait recipes), \`cli.md\` (CLI from
163
- an agent's POV).
164
- `;
165
- }
166
- /**
167
- * Resolve the flavor list, render the body once, and write each target.
168
- * Returns the list of paths so the caller can print a summary.
169
- */
170
- export function runInit(opts) {
171
- const flavors = opts.flavor === 'all' ? [...SUPPORTED_FLAVORS] : [opts.flavor];
172
- const body = buildBody();
173
- const written = [];
174
- const skipped = [];
175
- for (const flavor of flavors) {
176
- for (const target of targetsFor(flavor)) {
177
- const abs = join(opts.cwd, target.path);
178
- if (existsSync(abs) && !opts.force) {
179
- skipped.push(relative(opts.cwd, abs));
180
- continue;
13
+ export const SUPPORTED_FLAVORS = ['codex'];
14
+ export const MCP_CONFIG_SNIPPET = `[mcp_servers.craftdriver]
15
+ command = "npx"
16
+ args = ["--no-install", "craftdriver", "mcp"]`;
17
+ const MANIFEST_NAME = '.craftdriver-manifest.json';
18
+ const MANIFEST_SCHEMA_VERSION = 1;
19
+ /** Install the package-shipped project skill without inspecting user config. */
20
+ export function runInit(options) {
21
+ if (isLegacyFlavor(options.flavor)) {
22
+ throw new Error(`init ${options.flavor} no longer writes repository instruction files; ` +
23
+ 'use `craftdriver init codex` to install the project-local skill');
24
+ }
25
+ if (options.force) {
26
+ throw new Error('--force is not supported because CraftDriver never overwrites user content');
27
+ }
28
+ const projectRoot = findProjectRoot(options.cwd);
29
+ const destination = join(projectRoot, '.agents', 'skills', 'craftdriver');
30
+ const packageRoot = fileURLToPath(new URL('../../', import.meta.url));
31
+ const packageJson = readJsonFile(join(packageRoot, 'package.json'), 'CraftDriver package.json');
32
+ const version = readVersion(packageJson);
33
+ const sourceRoot = join(packageRoot, 'skills', 'craftdriver');
34
+ const sourceFiles = collectSourceFiles(sourceRoot);
35
+ if (!sourceFiles.some((file) => file.relativePath === 'SKILL.md')) {
36
+ throw new Error(`CraftDriver skill source is missing SKILL.md at ${sourceRoot}`);
37
+ }
38
+ assertSafeDestinationAncestors(projectRoot);
39
+ const manifest = createManifest(version, sourceFiles);
40
+ const state = inspectDestination(destination, manifest);
41
+ const dryRun = options.dryRun === true;
42
+ const files = sourceFiles.map((file) => file.relativePath);
43
+ const common = {
44
+ projectRoot,
45
+ destination,
46
+ files,
47
+ dryRun,
48
+ ...(options.mcp ? { mcpSnippet: MCP_CONFIG_SNIPPET } : {}),
49
+ };
50
+ if (state === 'unchanged')
51
+ return { ...common, status: 'unchanged' };
52
+ if (dryRun) {
53
+ return { ...common, status: state === 'missing' ? 'would-install' : 'would-update' };
54
+ }
55
+ installAtomically(destination, sourceFiles, manifest, state === 'owned');
56
+ return { ...common, status: state === 'missing' ? 'installed' : 'updated' };
57
+ }
58
+ function isLegacyFlavor(flavor) {
59
+ return LEGACY_FLAVORS.includes(flavor);
60
+ }
61
+ function findProjectRoot(cwd) {
62
+ let current;
63
+ try {
64
+ current = realpathSync(resolve(cwd));
65
+ }
66
+ catch {
67
+ throw new Error(`cannot resolve current directory: ${cwd}`);
68
+ }
69
+ while (true) {
70
+ const marker = join(current, 'package.json');
71
+ if (existsSync(marker)) {
72
+ const stat = lstatSync(marker);
73
+ if (stat.isSymbolicLink() || !stat.isFile()) {
74
+ throw new Error(`project marker must be a regular file: ${marker}`);
75
+ }
76
+ return current;
77
+ }
78
+ const parent = dirname(current);
79
+ if (parent === current) {
80
+ throw new Error('no project root found; run `craftdriver init codex` below a package.json');
81
+ }
82
+ current = parent;
83
+ }
84
+ }
85
+ function readJsonFile(path, label) {
86
+ let raw;
87
+ try {
88
+ const stat = lstatSync(path);
89
+ if (stat.isSymbolicLink() || !stat.isFile())
90
+ throw new Error('not a regular file');
91
+ raw = readFileSync(path, 'utf8');
92
+ }
93
+ catch (error) {
94
+ throw new Error(`cannot read ${label} at ${path}: ${messageOf(error)}`);
95
+ }
96
+ try {
97
+ return JSON.parse(raw);
98
+ }
99
+ catch {
100
+ throw new Error(`invalid JSON in ${label} at ${path}`);
101
+ }
102
+ }
103
+ function readVersion(value) {
104
+ if (!isPlainObject(value) || typeof value.version !== 'string' || value.version.length === 0) {
105
+ throw new Error('CraftDriver package.json has no valid version');
106
+ }
107
+ return value.version;
108
+ }
109
+ function collectSourceFiles(sourceRoot) {
110
+ let rootStat;
111
+ try {
112
+ rootStat = lstatSync(sourceRoot);
113
+ }
114
+ catch {
115
+ throw new Error(`CraftDriver skill source is missing: ${sourceRoot}`);
116
+ }
117
+ if (rootStat.isSymbolicLink() || !rootStat.isDirectory()) {
118
+ throw new Error(`CraftDriver skill source must be a regular directory: ${sourceRoot}`);
119
+ }
120
+ const files = [];
121
+ const visit = (directory, prefix = '') => {
122
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
123
+ const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;
124
+ const absolutePath = join(directory, entry.name);
125
+ const stat = lstatSync(absolutePath);
126
+ if (stat.isSymbolicLink()) {
127
+ throw new Error(`CraftDriver skill source contains a symbolic link: ${relativePath}`);
128
+ }
129
+ if (stat.isDirectory())
130
+ visit(absolutePath, relativePath);
131
+ else if (stat.isFile()) {
132
+ files.push({ relativePath, absolutePath, hash: sha256(readFileSync(absolutePath)) });
133
+ }
134
+ else {
135
+ throw new Error(`CraftDriver skill source is not a regular file: ${relativePath}`);
136
+ }
137
+ }
138
+ };
139
+ visit(sourceRoot);
140
+ return files.sort((a, b) => compareText(a.relativePath, b.relativePath));
141
+ }
142
+ function createManifest(version, sourceFiles) {
143
+ return {
144
+ schemaVersion: MANIFEST_SCHEMA_VERSION,
145
+ craftdriverVersion: version,
146
+ files: Object.fromEntries(sourceFiles.map((file) => [file.relativePath, file.hash])),
147
+ };
148
+ }
149
+ function assertSafeDestinationAncestors(projectRoot) {
150
+ let current = projectRoot;
151
+ for (const segment of ['.agents', 'skills']) {
152
+ current = join(current, segment);
153
+ if (!existsSync(current))
154
+ continue;
155
+ const stat = lstatSync(current);
156
+ if (stat.isSymbolicLink()) {
157
+ throw new Error(`refusing symbolic link in skill destination: ${relative(projectRoot, current)}`);
158
+ }
159
+ if (!stat.isDirectory()) {
160
+ throw new Error(`skill destination parent is not a directory: ${relative(projectRoot, current)}`);
161
+ }
162
+ }
163
+ }
164
+ function inspectDestination(destination, sourceManifest) {
165
+ if (!existsSync(destination))
166
+ return 'missing';
167
+ const destinationStat = lstatSync(destination);
168
+ if (destinationStat.isSymbolicLink()) {
169
+ throw new Error(`refusing symbolic link at skill destination: ${destination}`);
170
+ }
171
+ if (!destinationStat.isDirectory()) {
172
+ throw new Error(`skill destination is not a directory: ${destination}`);
173
+ }
174
+ const manifestPath = join(destination, MANIFEST_NAME);
175
+ if (!existsSync(manifestPath)) {
176
+ throw new Error(`refusing unowned skill destination without ${MANIFEST_NAME}: ${destination}`);
177
+ }
178
+ const installedManifest = parseManifest(readJsonFile(manifestPath, 'skill ownership manifest'));
179
+ const installedPaths = collectInstalledPaths(destination);
180
+ const actualFiles = installedPaths.files;
181
+ const owned = new Set([...Object.keys(installedManifest.files), MANIFEST_NAME]);
182
+ const ownedDirectories = ownedDirectoryPaths(Object.keys(installedManifest.files));
183
+ const conflicts = [];
184
+ for (const path of actualFiles)
185
+ if (!owned.has(path))
186
+ conflicts.push(path);
187
+ for (const path of installedPaths.directories) {
188
+ if (!ownedDirectories.has(path))
189
+ conflicts.push(path);
190
+ }
191
+ for (const [path, expectedHash] of Object.entries(installedManifest.files)) {
192
+ if (!actualFiles.has(path)) {
193
+ conflicts.push(path);
194
+ continue;
195
+ }
196
+ const absolutePath = safeOwnedPath(destination, path);
197
+ if (sha256(readFileSync(absolutePath)) !== expectedHash)
198
+ conflicts.push(path);
199
+ }
200
+ if (conflicts.length > 0) {
201
+ throw new Error(`refusing to overwrite user-edited or unowned skill files: ${[...new Set(conflicts)].sort().join(', ')}`);
202
+ }
203
+ const sameVersion = installedManifest.craftdriverVersion === sourceManifest.craftdriverVersion;
204
+ const sameFiles = recordsEqual(installedManifest.files, sourceManifest.files);
205
+ return sameVersion && sameFiles ? 'unchanged' : 'owned';
206
+ }
207
+ function parseManifest(value) {
208
+ if (!isPlainObject(value) ||
209
+ value.schemaVersion !== MANIFEST_SCHEMA_VERSION ||
210
+ typeof value.craftdriverVersion !== 'string' ||
211
+ !isPlainObject(value.files)) {
212
+ throw new Error(`invalid ${MANIFEST_NAME}`);
213
+ }
214
+ const files = {};
215
+ for (const [path, hash] of Object.entries(value.files)) {
216
+ if (!isSafeRelativePath(path) || typeof hash !== 'string' || !/^[a-f0-9]{64}$/.test(hash)) {
217
+ throw new Error(`invalid ${MANIFEST_NAME} entry: ${path}`);
218
+ }
219
+ files[path] = hash;
220
+ }
221
+ if (Object.keys(files).length === 0)
222
+ throw new Error(`invalid ${MANIFEST_NAME}: no files`);
223
+ return {
224
+ schemaVersion: MANIFEST_SCHEMA_VERSION,
225
+ craftdriverVersion: value.craftdriverVersion,
226
+ files,
227
+ };
228
+ }
229
+ function collectInstalledPaths(destination) {
230
+ const files = new Set();
231
+ const directories = new Set();
232
+ const visit = (directory, prefix = '') => {
233
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
234
+ const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;
235
+ const absolutePath = join(directory, entry.name);
236
+ const stat = lstatSync(absolutePath);
237
+ if (stat.isSymbolicLink()) {
238
+ throw new Error(`refusing symbolic link in installed skill: ${relativePath}`);
181
239
  }
182
- const content = (target.header ?? '') + body;
183
- if (!opts.dryRun) {
184
- mkdirSync(dirname(abs), { recursive: true });
185
- writeFileSync(abs, content, 'utf8');
240
+ if (stat.isDirectory()) {
241
+ directories.add(relativePath);
242
+ visit(absolutePath, relativePath);
186
243
  }
187
- written.push(relative(opts.cwd, abs));
244
+ else if (stat.isFile())
245
+ files.add(relativePath);
246
+ else
247
+ throw new Error(`installed skill path is not a regular file: ${relativePath}`);
248
+ }
249
+ };
250
+ visit(destination);
251
+ return { files, directories };
252
+ }
253
+ function ownedDirectoryPaths(files) {
254
+ const directories = new Set();
255
+ for (const file of files) {
256
+ const segments = file.split('/');
257
+ for (let i = 1; i < segments.length; i++) {
258
+ directories.add(segments.slice(0, i).join('/'));
259
+ }
260
+ }
261
+ return directories;
262
+ }
263
+ function safeOwnedPath(root, relativePath) {
264
+ if (!isSafeRelativePath(relativePath))
265
+ throw new Error(`invalid owned path: ${relativePath}`);
266
+ const absolutePath = resolve(root, ...relativePath.split('/'));
267
+ const fromRoot = relative(root, absolutePath);
268
+ if (fromRoot.startsWith(`..${sep}`) || fromRoot === '..' || resolve(root) === absolutePath) {
269
+ throw new Error(`owned path escapes skill destination: ${relativePath}`);
270
+ }
271
+ const stat = lstatSync(absolutePath);
272
+ if (stat.isSymbolicLink() || !stat.isFile()) {
273
+ throw new Error(`owned path is not a regular file: ${relativePath}`);
274
+ }
275
+ return absolutePath;
276
+ }
277
+ function isSafeRelativePath(path) {
278
+ return (path.length > 0 &&
279
+ path.length <= 240 &&
280
+ !path.startsWith('/') &&
281
+ !path.includes('\\') &&
282
+ path.split('/').every((segment) => segment.length > 0 && segment !== '.' && segment !== '..') &&
283
+ path !== MANIFEST_NAME);
284
+ }
285
+ function installAtomically(destination, sourceFiles, manifest, replacing) {
286
+ const parent = dirname(destination);
287
+ mkdirSync(parent, { recursive: true });
288
+ const suffix = `${process.pid}-${randomBytes(6).toString('hex')}`;
289
+ const stage = join(parent, `.craftdriver-stage-${suffix}`);
290
+ const backup = join(parent, `.craftdriver-backup-${suffix}`);
291
+ let destinationMoved = false;
292
+ try {
293
+ mkdirSync(stage, { mode: 0o700 });
294
+ for (const file of sourceFiles) {
295
+ const target = join(stage, ...file.relativePath.split('/'));
296
+ mkdirSync(dirname(target), { recursive: true });
297
+ copyFileSync(file.absolutePath, target);
298
+ }
299
+ writeFileSync(join(stage, MANIFEST_NAME), `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
300
+ if (inspectDestination(stage, manifest) !== 'unchanged') {
301
+ throw new Error('staged CraftDriver skill failed validation');
302
+ }
303
+ if (replacing) {
304
+ renameSync(destination, backup);
305
+ destinationMoved = true;
188
306
  }
307
+ renameSync(stage, destination);
308
+ if (destinationMoved) {
309
+ rmSync(backup, { recursive: true, force: false });
310
+ destinationMoved = false;
311
+ }
312
+ }
313
+ catch (error) {
314
+ if (existsSync(stage))
315
+ rmSync(stage, { recursive: true, force: true });
316
+ if (destinationMoved && !existsSync(destination) && existsSync(backup)) {
317
+ renameSync(backup, destination);
318
+ destinationMoved = false;
319
+ }
320
+ throw error;
189
321
  }
190
- return { written, skipped, dryRun: opts.dryRun === true };
322
+ }
323
+ function recordsEqual(a, b) {
324
+ const aEntries = Object.entries(a).sort(([left], [right]) => compareText(left, right));
325
+ const bEntries = Object.entries(b).sort(([left], [right]) => compareText(left, right));
326
+ return JSON.stringify(aEntries) === JSON.stringify(bEntries);
327
+ }
328
+ function compareText(left, right) {
329
+ return left < right ? -1 : left > right ? 1 : 0;
330
+ }
331
+ function sha256(value) {
332
+ return createHash('sha256').update(value).digest('hex');
333
+ }
334
+ function isPlainObject(value) {
335
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
336
+ }
337
+ function messageOf(value) {
338
+ return value instanceof Error ? value.message : String(value);
191
339
  }
192
340
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAI/C,MAAM,CAAC,MAAM,iBAAiB,GAA0C;IACtE,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;CACT,CAAC;AAQF;;;;GAIG;AACH,SAAS,UAAU,CAAC,MAA8B;IAChD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,6DAA6D;YAC7D,yCAAyC;YACzC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,CAAC;QACvD,KAAK,QAAQ;YACX,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO;gBACL;oBACE,IAAI,EAAE,+BAA+B;oBACrC,MAAM,EACJ,OAAO;wBACP,uEAAuE;wBACvE,mCAAmC;wBACnC,qBAAqB;wBACrB,SAAS;iBACZ;aACF,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,SAAS;IACvB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgHR,CAAC;AACF,CAAC;AAkBD;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAiB;IACvC,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBACtC,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7C,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}