@hatchway/cli 0.50.71 → 0.50.73

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.
package/bin/hatchway.js CHANGED
@@ -7,14 +7,12 @@ import { dirname, resolve } from 'path';
7
7
  const __filename = fileURLToPath(import.meta.url);
8
8
  const __dirname = dirname(__filename);
9
9
 
10
- // Paths relative to this bin script
11
- const instrumentPath = resolve(__dirname, '../dist/instrument.js');
10
+ // Path relative to this bin script
12
11
  const cliPath = resolve(__dirname, '../dist/cli/index.js');
13
12
 
14
- // Spawn node with --import flag for proper ESM instrumentation
15
13
  const child = spawn(
16
14
  process.execPath, // Use the same Node.js binary
17
- ['--import', instrumentPath, cliPath, ...process.argv.slice(2)],
15
+ [cliPath, ...process.argv.slice(2)],
18
16
  {
19
17
  stdio: 'inherit',
20
18
  env: process.env,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hatchway/cli",
3
- "version": "0.50.71",
3
+ "version": "0.50.73",
4
4
  "description": "Hatchway CLI - Build AI-powered apps with Claude. Just run: npx @hatchway/cli runner",
5
5
  "private": false,
6
6
  "type": "module",
@@ -43,7 +43,7 @@
43
43
  "scripts": {
44
44
  "dev": "RUNNER_WS_URL=ws://localhost:3000/ws/runner RUNNER_SHARED_SECRET=${RUNNER_SHARED_SECRET:-dev-secret} tsx src/index.ts",
45
45
  "dev:cli": "tsx src/cli/index.ts",
46
- "build": "rollup -c && cp templates.json dist/ && rm -rf dist/lib/skills/platform-plugin && mkdir -p dist/lib/skills && cp -R src/lib/skills/platform-plugin dist/lib/skills/platform-plugin",
46
+ "build": "rm -rf dist && rollup -c && cp templates.json dist/ && rm -rf dist/lib/skills/platform-plugin && mkdir -p dist/lib/skills && cp -R src/lib/skills/platform-plugin dist/lib/skills/platform-plugin",
47
47
  "build:tsc": "tsc -p tsconfig.json",
48
48
  "start": "RUNNER_WS_URL=ws://localhost:3000/ws/runner RUNNER_SHARED_SECRET=${RUNNER_SHARED_SECRET:-dev-secret} node dist/index.js",
49
49
  "cli": "node dist/cli/index.js"
@@ -51,9 +51,7 @@
51
51
  "dependencies": {
52
52
  "@anthropic-ai/claude-agent-sdk": "^0.3.181",
53
53
  "@clack/prompts": "^0.11.0",
54
- "@hatchway/agent-core": "workspace:*",
55
54
  "@hatchway/droid-sdk": "^1.0.0",
56
- "@hatchway/opencode-client": "workspace:*",
57
55
  "@openai/codex-sdk": "^0.141.0",
58
56
  "chalk": "^5.6.2",
59
57
  "commander": "^14.0.1",
@@ -62,16 +60,11 @@
62
60
  "drizzle-orm": "^0.45.2",
63
61
  "express": "^5.1.0",
64
62
  "http-proxy": "^1.18.1",
65
- "ink": "^6.3.1",
66
- "ink-select-input": "^6.2.0",
67
- "ink-spinner": "^5.0.0",
68
- "ink-text-input": "^6.0.0",
69
63
  "inquirer": "^12.9.6",
70
64
  "jsonc-parser": "^3.3.1",
71
65
  "ora": "^9.0.0",
72
66
  "pg": "^8.13.1",
73
67
  "picocolors": "^1.1.1",
74
- "react": "19.2.7",
75
68
  "simple-git": "^3.32.3",
76
69
  "ws": "^8.18.0",
77
70
  "zod": "^4.0.0"
@@ -1,27 +0,0 @@
1
- // Hatchway CLI - Built with Rollup
2
- import { j as jsxRuntimeExports, B as Box, T as Text, c as colors } from './theme-NAQBkisB.js';
3
- import 'node:stream';
4
- import 'node:process';
5
- import 'chalk';
6
- import 'node:events';
7
-
8
- /**
9
- * ASCII art banner component - centered with cyan/purple gradient
10
- * Each line is padded to exactly the same width for perfect alignment
11
- */
12
- function Banner() {
13
- // Full banner lines - HATCH in cyan, WAY in purple
14
- // All lines padded to same total width for consistent centering
15
- const lines = [
16
- { hatch: '██╗ ██╗ █████╗ ████████╗ ██████╗██╗ ██╗', way: '██╗ ██╗ █████╗ ██╗ ██╗' },
17
- { hatch: '██║ ██║██╔══██╗╚══██╔══╝██╔════╝██║ ██║', way: '██║ ██║██╔══██╗╚██╗ ██╔╝' },
18
- { hatch: '███████║███████║ ██║ ██║ ███████║', way: '██║ █╗ ██║███████║ ╚████╔╝ ' },
19
- { hatch: '██╔══██║██╔══██║ ██║ ██║ ██╔══██║', way: '██║███╗██║██╔══██║ ╚██╔╝ ' },
20
- { hatch: '██║ ██║██║ ██║ ██║ ╚██████╗██║ ██║', way: '╚███╔███╔╝██║ ██║ ██║ ' },
21
- { hatch: '╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝', way: ' ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ' },
22
- ];
23
- return (jsxRuntimeExports.jsx(Box, { flexDirection: "column", alignItems: "center", children: lines.map((line, index) => (jsxRuntimeExports.jsxs(Box, { children: [jsxRuntimeExports.jsx(Text, { color: colors.cyan, children: line.hatch }), jsxRuntimeExports.jsx(Text, { color: colors.brightPurple, children: line.way })] }, index))) }));
24
- }
25
-
26
- export { Banner as B };
27
- //# sourceMappingURL=Banner-B4nm86qK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Banner-B4nm86qK.js","sources":["../../src/cli/tui/components/Banner.tsx"],"sourcesContent":["import { Box, Text } from 'ink';\nimport { colors } from '../theme.js';\n\n/**\n * ASCII art banner component - centered with cyan/purple gradient\n * Each line is padded to exactly the same width for perfect alignment\n */\nexport function Banner() {\n // Full banner lines - HATCH in cyan, WAY in purple\n // All lines padded to same total width for consistent centering\n const lines = [\n { hatch: '██╗ ██╗ █████╗ ████████╗ ██████╗██╗ ██╗', way: '██╗ ██╗ █████╗ ██╗ ██╗' },\n { hatch: '██║ ██║██╔══██╗╚══██╔══╝██╔════╝██║ ██║', way: '██║ ██║██╔══██╗╚██╗ ██╔╝' },\n { hatch: '███████║███████║ ██║ ██║ ███████║', way: '██║ █╗ ██║███████║ ╚████╔╝ ' },\n { hatch: '██╔══██║██╔══██║ ██║ ██║ ██╔══██║', way: '██║███╗██║██╔══██║ ╚██╔╝ ' },\n { hatch: '██║ ██║██║ ██║ ██║ ╚██████╗██║ ██║', way: '╚███╔███╔╝██║ ██║ ██║ ' },\n { hatch: '╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝', way: ' ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ' },\n ];\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\">\n {lines.map((line, index) => (\n <Box key={index}>\n <Text color={colors.cyan}>{line.hatch}</Text>\n <Text color={colors.brightPurple}>{line.way}</Text>\n </Box>\n ))}\n </Box>\n );\n}\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;AAGA;;;AAGG;SACa,MAAM,GAAA;;;AAGpB,IAAA,MAAM,KAAK,GAAG;AACZ,QAAA,EAAE,KAAK,EAAE,2CAA2C,EAAE,GAAG,EAAE,6BAA6B,EAAE;AAC1F,QAAA,EAAE,KAAK,EAAE,2CAA2C,EAAE,GAAG,EAAE,6BAA6B,EAAE;AAC1F,QAAA,EAAE,KAAK,EAAE,2CAA2C,EAAE,GAAG,EAAE,6BAA6B,EAAE;AAC1F,QAAA,EAAE,KAAK,EAAE,2CAA2C,EAAE,GAAG,EAAE,6BAA6B,EAAE;AAC1F,QAAA,EAAE,KAAK,EAAE,2CAA2C,EAAE,GAAG,EAAE,6BAA6B,EAAE;AAC1F,QAAA,EAAE,KAAK,EAAE,2CAA2C,EAAE,GAAG,EAAE,6BAA6B,EAAE;KAC3F;AAED,IAAA,QACEA,qBAAA,CAAC,GAAG,EAAA,EAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAA,QAAA,EAC5C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MACrBC,sBAAA,CAAC,GAAG,EAAA,EAAA,QAAA,EAAA,CACFD,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAA,QAAA,EAAG,IAAI,CAAC,KAAK,EAAA,CAAQ,EAC7CA,qBAAA,CAAC,IAAI,EAAA,EAAC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAA,QAAA,EAAG,IAAI,CAAC,GAAG,EAAA,CAAQ,CAAA,EAAA,EAF3C,KAAK,CAGT,CACP,CAAC,EAAA,CACE;AAEV;;;;"}
@@ -1,119 +0,0 @@
1
- // Hatchway CLI - Built with Rollup
2
- import { r as reactExports, u as useInput, R as React, T as Text } from './theme-NAQBkisB.js';
3
- import 'node:stream';
4
- import 'node:process';
5
- import chalk from 'chalk';
6
- import 'node:events';
7
-
8
- function TextInput({ value: originalValue, placeholder = '', focus = true, mask, highlightPastedText = false, showCursor = true, onChange, onSubmit, }) {
9
- const [state, setState] = reactExports.useState({
10
- cursorOffset: (originalValue || '').length,
11
- cursorWidth: 0,
12
- });
13
- const { cursorOffset, cursorWidth } = state;
14
- reactExports.useEffect(() => {
15
- setState(previousState => {
16
- if (!focus || !showCursor) {
17
- return previousState;
18
- }
19
- const newValue = originalValue || '';
20
- if (previousState.cursorOffset > newValue.length - 1) {
21
- return {
22
- cursorOffset: newValue.length,
23
- cursorWidth: 0,
24
- };
25
- }
26
- return previousState;
27
- });
28
- }, [originalValue, focus, showCursor]);
29
- const cursorActualWidth = highlightPastedText ? cursorWidth : 0;
30
- const value = mask ? mask.repeat(originalValue.length) : originalValue;
31
- let renderedValue = value;
32
- let renderedPlaceholder = placeholder ? chalk.grey(placeholder) : undefined;
33
- // Fake mouse cursor, because it's too inconvenient to deal with actual cursor and ansi escapes
34
- if (showCursor && focus) {
35
- renderedPlaceholder =
36
- placeholder.length > 0
37
- ? chalk.inverse(placeholder[0]) + chalk.grey(placeholder.slice(1))
38
- : chalk.inverse(' ');
39
- renderedValue = value.length > 0 ? '' : chalk.inverse(' ');
40
- let i = 0;
41
- for (const char of value) {
42
- renderedValue +=
43
- i >= cursorOffset - cursorActualWidth && i <= cursorOffset
44
- ? chalk.inverse(char)
45
- : char;
46
- i++;
47
- }
48
- if (value.length > 0 && cursorOffset === value.length) {
49
- renderedValue += chalk.inverse(' ');
50
- }
51
- }
52
- useInput((input, key) => {
53
- if (key.upArrow ||
54
- key.downArrow ||
55
- (key.ctrl && input === 'c') ||
56
- key.tab ||
57
- (key.shift && key.tab)) {
58
- return;
59
- }
60
- if (key.return) {
61
- if (onSubmit) {
62
- onSubmit(originalValue);
63
- }
64
- return;
65
- }
66
- let nextCursorOffset = cursorOffset;
67
- let nextValue = originalValue;
68
- let nextCursorWidth = 0;
69
- if (key.leftArrow) {
70
- if (showCursor) {
71
- nextCursorOffset--;
72
- }
73
- }
74
- else if (key.rightArrow) {
75
- if (showCursor) {
76
- nextCursorOffset++;
77
- }
78
- }
79
- else if (key.backspace || key.delete) {
80
- if (cursorOffset > 0) {
81
- nextValue =
82
- originalValue.slice(0, cursorOffset - 1) +
83
- originalValue.slice(cursorOffset, originalValue.length);
84
- nextCursorOffset--;
85
- }
86
- }
87
- else {
88
- nextValue =
89
- originalValue.slice(0, cursorOffset) +
90
- input +
91
- originalValue.slice(cursorOffset, originalValue.length);
92
- nextCursorOffset += input.length;
93
- if (input.length > 1) {
94
- nextCursorWidth = input.length;
95
- }
96
- }
97
- if (cursorOffset < 0) {
98
- nextCursorOffset = 0;
99
- }
100
- if (cursorOffset > originalValue.length) {
101
- nextCursorOffset = originalValue.length;
102
- }
103
- setState({
104
- cursorOffset: nextCursorOffset,
105
- cursorWidth: nextCursorWidth,
106
- });
107
- if (nextValue !== originalValue) {
108
- onChange(nextValue);
109
- }
110
- }, { isActive: focus });
111
- return (React.createElement(Text, null, placeholder
112
- ? value.length > 0
113
- ? renderedValue
114
- : renderedPlaceholder
115
- : renderedValue));
116
- }
117
-
118
- export { TextInput as T };
119
- //# sourceMappingURL=index-DCC6HGdr.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DCC6HGdr.js","sources":["../../../../node_modules/.pnpm/ink-text-input@6.0.0_ink@6.5.1_@types+react@19.2.7_react@19.1.0__react@19.1.0/node_modules/ink-text-input/build/index.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { Text, useInput } from 'ink';\nimport chalk from 'chalk';\nfunction TextInput({ value: originalValue, placeholder = '', focus = true, mask, highlightPastedText = false, showCursor = true, onChange, onSubmit, }) {\n const [state, setState] = useState({\n cursorOffset: (originalValue || '').length,\n cursorWidth: 0,\n });\n const { cursorOffset, cursorWidth } = state;\n useEffect(() => {\n setState(previousState => {\n if (!focus || !showCursor) {\n return previousState;\n }\n const newValue = originalValue || '';\n if (previousState.cursorOffset > newValue.length - 1) {\n return {\n cursorOffset: newValue.length,\n cursorWidth: 0,\n };\n }\n return previousState;\n });\n }, [originalValue, focus, showCursor]);\n const cursorActualWidth = highlightPastedText ? cursorWidth : 0;\n const value = mask ? mask.repeat(originalValue.length) : originalValue;\n let renderedValue = value;\n let renderedPlaceholder = placeholder ? chalk.grey(placeholder) : undefined;\n // Fake mouse cursor, because it's too inconvenient to deal with actual cursor and ansi escapes\n if (showCursor && focus) {\n renderedPlaceholder =\n placeholder.length > 0\n ? chalk.inverse(placeholder[0]) + chalk.grey(placeholder.slice(1))\n : chalk.inverse(' ');\n renderedValue = value.length > 0 ? '' : chalk.inverse(' ');\n let i = 0;\n for (const char of value) {\n renderedValue +=\n i >= cursorOffset - cursorActualWidth && i <= cursorOffset\n ? chalk.inverse(char)\n : char;\n i++;\n }\n if (value.length > 0 && cursorOffset === value.length) {\n renderedValue += chalk.inverse(' ');\n }\n }\n useInput((input, key) => {\n if (key.upArrow ||\n key.downArrow ||\n (key.ctrl && input === 'c') ||\n key.tab ||\n (key.shift && key.tab)) {\n return;\n }\n if (key.return) {\n if (onSubmit) {\n onSubmit(originalValue);\n }\n return;\n }\n let nextCursorOffset = cursorOffset;\n let nextValue = originalValue;\n let nextCursorWidth = 0;\n if (key.leftArrow) {\n if (showCursor) {\n nextCursorOffset--;\n }\n }\n else if (key.rightArrow) {\n if (showCursor) {\n nextCursorOffset++;\n }\n }\n else if (key.backspace || key.delete) {\n if (cursorOffset > 0) {\n nextValue =\n originalValue.slice(0, cursorOffset - 1) +\n originalValue.slice(cursorOffset, originalValue.length);\n nextCursorOffset--;\n }\n }\n else {\n nextValue =\n originalValue.slice(0, cursorOffset) +\n input +\n originalValue.slice(cursorOffset, originalValue.length);\n nextCursorOffset += input.length;\n if (input.length > 1) {\n nextCursorWidth = input.length;\n }\n }\n if (cursorOffset < 0) {\n nextCursorOffset = 0;\n }\n if (cursorOffset > originalValue.length) {\n nextCursorOffset = originalValue.length;\n }\n setState({\n cursorOffset: nextCursorOffset,\n cursorWidth: nextCursorWidth,\n });\n if (nextValue !== originalValue) {\n onChange(nextValue);\n }\n }, { isActive: focus });\n return (React.createElement(Text, null, placeholder\n ? value.length > 0\n ? renderedValue\n : renderedPlaceholder\n : renderedValue));\n}\nexport default TextInput;\nexport function UncontrolledTextInput({ initialValue = '', ...props }) {\n const [value, setValue] = useState(initialValue);\n return React.createElement(TextInput, { ...props, value: value, onChange: setValue });\n}\n//# sourceMappingURL=index.js.map"],"names":["useState","useEffect"],"mappings":"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","x_google_ignoreList":[0]}