@sharpee/devkit 1.0.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 (73) hide show
  1. package/cli.d.ts +3 -0
  2. package/cli.d.ts.map +1 -0
  3. package/cli.js +219 -0
  4. package/cli.js.map +1 -0
  5. package/commands/browser.d.ts +10 -0
  6. package/commands/browser.d.ts.map +1 -0
  7. package/commands/browser.js +107 -0
  8. package/commands/browser.js.map +1 -0
  9. package/commands/build.d.ts +38 -0
  10. package/commands/build.d.ts.map +1 -0
  11. package/commands/build.js +165 -0
  12. package/commands/build.js.map +1 -0
  13. package/commands/bundle.d.ts +9 -0
  14. package/commands/bundle.d.ts.map +1 -0
  15. package/commands/bundle.js +46 -0
  16. package/commands/bundle.js.map +1 -0
  17. package/commands/clean.d.ts +7 -0
  18. package/commands/clean.d.ts.map +1 -0
  19. package/commands/clean.js +31 -0
  20. package/commands/clean.js.map +1 -0
  21. package/commands/register.d.ts +5 -0
  22. package/commands/register.d.ts.map +1 -0
  23. package/commands/register.js +45 -0
  24. package/commands/register.js.map +1 -0
  25. package/commands/test-npm.d.ts +34 -0
  26. package/commands/test-npm.d.ts.map +1 -0
  27. package/commands/test-npm.js +155 -0
  28. package/commands/test-npm.js.map +1 -0
  29. package/commands/verify.d.ts +7 -0
  30. package/commands/verify.d.ts.map +1 -0
  31. package/commands/verify.js +27 -0
  32. package/commands/verify.js.map +1 -0
  33. package/commands/zifmia.d.ts +10 -0
  34. package/commands/zifmia.d.ts.map +1 -0
  35. package/commands/zifmia.js +56 -0
  36. package/commands/zifmia.js.map +1 -0
  37. package/consumer-gen.d.ts +49 -0
  38. package/consumer-gen.d.ts.map +1 -0
  39. package/consumer-gen.js +137 -0
  40. package/consumer-gen.js.map +1 -0
  41. package/index.d.ts +29 -0
  42. package/index.d.ts.map +1 -0
  43. package/index.js +55 -0
  44. package/index.js.map +1 -0
  45. package/package.json +42 -0
  46. package/registry.d.ts +33 -0
  47. package/registry.d.ts.map +1 -0
  48. package/registry.js +81 -0
  49. package/registry.js.map +1 -0
  50. package/repo.d.ts +64 -0
  51. package/repo.d.ts.map +1 -0
  52. package/repo.js +185 -0
  53. package/repo.js.map +1 -0
  54. package/standalone/build-browser.d.ts +10 -0
  55. package/standalone/build-browser.d.ts.map +1 -0
  56. package/standalone/build-browser.js +208 -0
  57. package/standalone/build-browser.js.map +1 -0
  58. package/standalone/build.d.ts +8 -0
  59. package/standalone/build.d.ts.map +1 -0
  60. package/standalone/build.js +319 -0
  61. package/standalone/build.js.map +1 -0
  62. package/standalone/ifid.d.ts +2 -0
  63. package/standalone/ifid.d.ts.map +1 -0
  64. package/standalone/ifid.js +71 -0
  65. package/standalone/ifid.js.map +1 -0
  66. package/standalone/init-browser.d.ts +10 -0
  67. package/standalone/init-browser.d.ts.map +1 -0
  68. package/standalone/init-browser.js +194 -0
  69. package/standalone/init-browser.js.map +1 -0
  70. package/standalone/init.d.ts +10 -0
  71. package/standalone/init.d.ts.map +1 -0
  72. package/standalone/init.js +183 -0
  73. package/standalone/init.js.map +1 -0
@@ -0,0 +1,319 @@
1
+ "use strict";
2
+ /**
3
+ * CLI: sharpee build
4
+ *
5
+ * Builds a .sharpee story bundle and browser client from a story project.
6
+ * With --test, also compiles the story and runs transcript tests.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.runBuildCommand = runBuildCommand;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const child_process_1 = require("child_process");
46
+ const fflate_1 = require("fflate");
47
+ const build_browser_1 = require("./build-browser");
48
+ function readRecursive(dir, base = '') {
49
+ const entries = {};
50
+ for (const item of fs.readdirSync(dir)) {
51
+ const full = path.join(dir, item);
52
+ const rel = base ? `${base}/${item}` : item;
53
+ if (fs.statSync(full).isDirectory()) {
54
+ Object.assign(entries, readRecursive(full, rel));
55
+ }
56
+ else {
57
+ entries[rel] = new Uint8Array(fs.readFileSync(full));
58
+ }
59
+ }
60
+ return entries;
61
+ }
62
+ /**
63
+ * Find transcript files matching a glob pattern in a directory.
64
+ * Returns sorted file paths.
65
+ */
66
+ function findTranscriptFiles(dir, pattern) {
67
+ if (!fs.existsSync(dir))
68
+ return [];
69
+ const files = [];
70
+ for (const entry of fs.readdirSync(dir)) {
71
+ if (entry.endsWith('.transcript')) {
72
+ // Simple glob: 'wt-*.transcript' matches files starting with 'wt-'
73
+ if (!pattern || entry.match(new RegExp('^' + pattern.replace(/\*/g, '.*') + '$'))) {
74
+ files.push(path.join(dir, entry));
75
+ }
76
+ }
77
+ }
78
+ return files.sort();
79
+ }
80
+ async function runBuildCommand(args, projectDirArg) {
81
+ if (args.includes('--help') || args.includes('-h')) {
82
+ showHelp();
83
+ return;
84
+ }
85
+ const runTests = args.includes('--test');
86
+ const verbose = args.includes('--verbose') || args.includes('-v');
87
+ const stopOnFailure = args.includes('--stop-on-failure');
88
+ // Default to cwd (author in their project); a registered story name resolves to its dir.
89
+ const projectDir = projectDirArg || process.cwd();
90
+ const packagePath = path.join(projectDir, 'package.json');
91
+ if (!fs.existsSync(packagePath)) {
92
+ console.error('Error: No package.json found. Run from a story project directory.');
93
+ process.exit(1);
94
+ }
95
+ const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
96
+ const config = pkg.sharpee || {};
97
+ const storyName = config.title?.toLowerCase().replace(/\s+/g, '-') || pkg.name?.replace(/^@.*\//, '') || 'story';
98
+ const storySrc = path.join(projectDir, 'src', 'index.ts');
99
+ if (!fs.existsSync(storySrc)) {
100
+ console.error('Error: src/index.ts not found.');
101
+ process.exit(1);
102
+ }
103
+ console.log(`\nBuilding: ${config.title || storyName}\n`);
104
+ // --- Compile TypeScript (needed for both bundle and testing) ---
105
+ console.log('--- Compiling TypeScript ---\n');
106
+ const tsconfigPath = path.join(projectDir, 'tsconfig.json');
107
+ try {
108
+ (0, child_process_1.execSync)('npx tsc', { cwd: projectDir, stdio: 'pipe' });
109
+ console.log(' TypeScript compiled successfully\n');
110
+ }
111
+ catch (error) {
112
+ console.error(' TypeScript compilation failed');
113
+ if (error.stdout)
114
+ console.error(error.stdout.toString());
115
+ if (error.stderr)
116
+ console.error(error.stderr.toString());
117
+ process.exit(1);
118
+ }
119
+ // --- .sharpee bundle ---
120
+ console.log('--- Story Bundle (.sharpee) ---\n');
121
+ const distDir = path.join(projectDir, 'dist');
122
+ fs.mkdirSync(distDir, { recursive: true });
123
+ // 1. esbuild story → ESM with @sharpee/* external
124
+ const storyJsPath = path.join(distDir, 'story.js');
125
+ const tsconfigArg = fs.existsSync(tsconfigPath) ? `--tsconfig=${tsconfigPath}` : '';
126
+ try {
127
+ (0, child_process_1.execSync)(`npx esbuild "${storySrc}" --bundle --platform=browser --format=esm --target=es2020 --outfile="${storyJsPath}" --external:@sharpee/* ${tsconfigArg}`, { cwd: projectDir, stdio: 'pipe' });
128
+ console.log(' story.js');
129
+ }
130
+ catch (error) {
131
+ console.error(' Failed to build story.js');
132
+ if (error.stderr)
133
+ console.error(error.stderr.toString());
134
+ process.exit(1);
135
+ }
136
+ // 2. Generate meta.json
137
+ const meta = {
138
+ format: 'sharpee-story',
139
+ formatVersion: 1,
140
+ id: pkg.name,
141
+ title: config.title || pkg.name,
142
+ author: config.author || 'Unknown',
143
+ version: pkg.version,
144
+ description: config.headline || pkg.description || '',
145
+ sharpeeVersion: '>=0.9.0',
146
+ ifid: config.ifid || '',
147
+ hasAssets: fs.existsSync(path.join(projectDir, 'assets')),
148
+ hasTheme: fs.existsSync(path.join(projectDir, 'theme.css')),
149
+ preferredTheme: config.preferredTheme || 'classic-light',
150
+ };
151
+ // 3. Assemble zip contents
152
+ const zipEntries = {};
153
+ zipEntries['story.js'] = new Uint8Array(fs.readFileSync(storyJsPath));
154
+ zipEntries['meta.json'] = (0, fflate_1.strToU8)(JSON.stringify(meta, null, 2) + '\n');
155
+ const assetsDir = path.join(projectDir, 'assets');
156
+ if (fs.existsSync(assetsDir)) {
157
+ const assetEntries = readRecursive(assetsDir, 'assets');
158
+ Object.assign(zipEntries, assetEntries);
159
+ console.log(` assets/ (${Object.keys(assetEntries).length} files)`);
160
+ }
161
+ const themePath = path.join(projectDir, 'theme.css');
162
+ if (fs.existsSync(themePath)) {
163
+ zipEntries['theme.css'] = new Uint8Array(fs.readFileSync(themePath));
164
+ console.log(' theme.css');
165
+ }
166
+ // 4. Create .sharpee zip
167
+ const zipped = (0, fflate_1.zipSync)(zipEntries);
168
+ const outFile = path.join(distDir, `${storyName}.sharpee`);
169
+ fs.writeFileSync(outFile, zipped);
170
+ const sizeKb = (fs.statSync(outFile).size / 1024).toFixed(1);
171
+ console.log(` meta.json`);
172
+ console.log(`\n Output: ${path.relative(projectDir, outFile)} (${sizeKb} KB)\n`);
173
+ // Clean up temp story.js
174
+ fs.unlinkSync(storyJsPath);
175
+ // --- Browser client ---
176
+ console.log('--- Browser Client ---\n');
177
+ const browserEntry = path.join(projectDir, 'src', 'browser-entry.ts');
178
+ if (fs.existsSync(browserEntry)) {
179
+ await (0, build_browser_1.runBuildBrowserCommand)(args.filter(a => a !== '--help' && a !== '-h' && a !== '--test' && a !== '--verbose' && a !== '-v' && a !== '--stop-on-failure'), projectDir);
180
+ }
181
+ else {
182
+ console.log(' Skipped (no src/browser-entry.ts)\n');
183
+ console.log(' Run "sharpee init-browser" to add browser support.\n');
184
+ }
185
+ // --- Run transcript tests ---
186
+ if (runTests) {
187
+ console.log('--- Running Transcript Tests ---\n');
188
+ await runTranscriptTests(projectDir, { verbose, stopOnFailure });
189
+ }
190
+ console.log('Build complete!\n');
191
+ }
192
+ /**
193
+ * Run transcript tests for a story project.
194
+ * Loads the compiled story from dist/, finds transcript files, and runs them.
195
+ */
196
+ async function runTranscriptTests(projectDir, options) {
197
+ // Lazy-load transcript-tester to avoid import issues when not testing
198
+ const { loadStory, parseTranscriptFile, runTranscript, reportTranscript, reportTestRun, getExitCode } = require("../../transcript-tester/index.js");
199
+ const { TranscriptResult, TestRunResult } = require("../../transcript-tester/index.js");
200
+ // Find transcript files
201
+ const walkthroughDir = path.join(projectDir, 'walkthroughs');
202
+ const unitTestDir = path.join(projectDir, 'tests', 'transcripts');
203
+ const walkthroughs = findTranscriptFiles(walkthroughDir, 'wt-*.transcript');
204
+ const unitTests = findTranscriptFiles(unitTestDir, '*.transcript');
205
+ if (walkthroughs.length === 0 && unitTests.length === 0) {
206
+ console.log(' No transcript files found.\n');
207
+ console.log(' Place walkthroughs in walkthroughs/wt-*.transcript');
208
+ console.log(' Place unit tests in tests/transcripts/*.transcript\n');
209
+ return;
210
+ }
211
+ // Load the story from compiled dist/
212
+ let game;
213
+ try {
214
+ game = await loadStory(projectDir);
215
+ }
216
+ catch (error) {
217
+ console.error(` Failed to load story: ${error.message}`);
218
+ console.error(' Make sure TypeScript compiled successfully (dist/index.js exists).\n');
219
+ process.exit(1);
220
+ }
221
+ const allResults = [];
222
+ let totalPassed = 0;
223
+ let totalFailed = 0;
224
+ let totalExpectedFailures = 0;
225
+ let totalSkipped = 0;
226
+ let totalDuration = 0;
227
+ // Run walkthrough chain (state persists between transcripts)
228
+ if (walkthroughs.length > 0) {
229
+ console.log(` Walkthroughs: ${walkthroughs.length} files (chained)\n`);
230
+ for (const wtPath of walkthroughs) {
231
+ const transcript = parseTranscriptFile(wtPath);
232
+ const result = await runTranscript(transcript, game, {
233
+ verbose: options.verbose,
234
+ stopOnFailure: options.stopOnFailure,
235
+ savesDirectory: path.join(projectDir, '.test-saves'),
236
+ });
237
+ reportTranscript(result, { verbose: options.verbose });
238
+ allResults.push(result);
239
+ totalPassed += result.passed;
240
+ totalFailed += result.failed;
241
+ totalExpectedFailures += result.expectedFailures;
242
+ totalSkipped += result.skipped;
243
+ totalDuration += result.duration;
244
+ if (options.stopOnFailure && result.failed > 0) {
245
+ break;
246
+ }
247
+ }
248
+ }
249
+ // Run unit tests (each gets a fresh game instance)
250
+ if (unitTests.length > 0 && !(options.stopOnFailure && totalFailed > 0)) {
251
+ console.log(`\n Unit tests: ${unitTests.length} files\n`);
252
+ for (const utPath of unitTests) {
253
+ // Create fresh game for each unit test
254
+ let unitGame;
255
+ try {
256
+ unitGame = await loadStory(projectDir);
257
+ }
258
+ catch (error) {
259
+ console.error(` Failed to reload story for unit test: ${error.message}`);
260
+ continue;
261
+ }
262
+ const transcript = parseTranscriptFile(utPath);
263
+ const result = await runTranscript(transcript, unitGame, {
264
+ verbose: options.verbose,
265
+ stopOnFailure: options.stopOnFailure,
266
+ savesDirectory: path.join(projectDir, '.test-saves'),
267
+ });
268
+ reportTranscript(result, { verbose: options.verbose });
269
+ allResults.push(result);
270
+ totalPassed += result.passed;
271
+ totalFailed += result.failed;
272
+ totalExpectedFailures += result.expectedFailures;
273
+ totalSkipped += result.skipped;
274
+ totalDuration += result.duration;
275
+ if (options.stopOnFailure && result.failed > 0) {
276
+ break;
277
+ }
278
+ }
279
+ }
280
+ // Report summary
281
+ const testRunResult = {
282
+ transcripts: allResults,
283
+ totalPassed,
284
+ totalFailed,
285
+ totalExpectedFailures,
286
+ totalSkipped,
287
+ totalDuration,
288
+ };
289
+ reportTestRun(testRunResult);
290
+ if (totalFailed > 0) {
291
+ process.exit(1);
292
+ }
293
+ }
294
+ function showHelp() {
295
+ console.log(`
296
+ sharpee build - Build story bundle, browser client, and run tests
297
+
298
+ Usage: sharpee build [options]
299
+
300
+ Options:
301
+ --test Compile story and run transcript tests after building
302
+ --verbose, -v Show detailed test output
303
+ --stop-on-failure Stop on first test failure
304
+ --no-minify Skip minification (browser client)
305
+ --no-sourcemap Skip source map generation (browser client)
306
+
307
+ Output:
308
+ dist/<story>.sharpee Story bundle for Zifmia runner
309
+ dist/web/ Browser client (if browser-entry.ts exists)
310
+
311
+ Test files:
312
+ walkthroughs/wt-*.transcript Walkthrough chain (state persists between files)
313
+ tests/transcripts/*.transcript Unit tests (fresh game per file)
314
+
315
+ Run from a story project directory with a package.json containing
316
+ a "sharpee" config block.
317
+ `);
318
+ }
319
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../../../../repos/sharpee/packages/devkit/src/standalone/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runIfidCommand(args: string[]): void;
2
+ //# sourceMappingURL=ifid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifid.d.ts","sourceRoot":"","sources":["../../../../../../repos/sharpee/packages/devkit/src/standalone/ifid.ts"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmBnD"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ // packages/sharpee/src/cli/ifid.ts
3
+ // IFID CLI commands
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.runIfidCommand = runIfidCommand;
6
+ const core_1 = require("../../core/index.js");
7
+ function runIfidCommand(args) {
8
+ const subcommand = args[0];
9
+ switch (subcommand) {
10
+ case 'generate':
11
+ handleGenerate();
12
+ break;
13
+ case 'validate':
14
+ handleValidate(args.slice(1));
15
+ break;
16
+ case undefined:
17
+ case 'help':
18
+ showHelp();
19
+ break;
20
+ default:
21
+ console.error(`Unknown ifid subcommand: ${subcommand}`);
22
+ showHelp();
23
+ process.exit(1);
24
+ }
25
+ }
26
+ function handleGenerate() {
27
+ const ifid = (0, core_1.generateIfid)();
28
+ console.log(ifid);
29
+ }
30
+ function handleValidate(args) {
31
+ const ifid = args[0];
32
+ if (!ifid) {
33
+ console.error('Usage: sharpee ifid validate <ifid>');
34
+ process.exit(1);
35
+ }
36
+ const isValid = (0, core_1.validateIfid)(ifid);
37
+ if (isValid) {
38
+ console.log(`Valid IFID: ${ifid}`);
39
+ }
40
+ else {
41
+ // Try normalizing (uppercase conversion)
42
+ const normalized = (0, core_1.normalizeIfid)(ifid);
43
+ if (normalized) {
44
+ console.log(`Valid after normalization:`);
45
+ console.log(` Original: ${ifid}`);
46
+ console.log(` Normalized: ${normalized}`);
47
+ }
48
+ else {
49
+ console.error(`Invalid IFID: ${ifid}`);
50
+ console.error('IFID requirements:');
51
+ console.error(' - Length: 8-63 characters');
52
+ console.error(' - Characters: A-Z, 0-9, and hyphens only');
53
+ console.error(' - Recommended: UUID format (uppercase)');
54
+ process.exit(1);
55
+ }
56
+ }
57
+ }
58
+ function showHelp() {
59
+ console.log(`
60
+ sharpee ifid - IFID utilities
61
+
62
+ Commands:
63
+ generate Generate a new IFID (UUID format)
64
+ validate <ifid> Validate an IFID string
65
+
66
+ Examples:
67
+ sharpee ifid generate
68
+ sharpee ifid validate A1B2C3D4-E5F6-7890-ABCD-EF1234567890
69
+ `);
70
+ }
71
+ //# sourceMappingURL=ifid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifid.js","sourceRoot":"","sources":["../../../../../../../repos/sharpee/packages/devkit/src/standalone/ifid.ts"],"names":[],"mappings":";AAAA,mCAAmC;AACnC,oBAAoB;;AAIpB,wCAmBC;AArBD,wCAA0E;AAE1E,SAAgB,cAAc,CAAC,IAAc;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3B,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,UAAU;YACb,cAAc,EAAE,CAAC;YACjB,MAAM;QACR,KAAK,UAAU;YACb,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,SAAS,CAAC;QACf,KAAK,MAAM;YACT,QAAQ,EAAE,CAAC;YACX,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;YACxD,QAAQ,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,IAAA,mBAAY,GAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,cAAc,CAAC,IAAc;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAErB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,mBAAY,EAAC,IAAI,CAAC,CAAC;IAEnC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,yCAAyC;QACzC,MAAM,UAAU,GAAG,IAAA,oBAAa,EAAC,IAAI,CAAC,CAAC;QACvC,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUb,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CLI: sharpee init-browser
3
+ *
4
+ * Adds browser client files to an existing Sharpee story project.
5
+ */
6
+ /**
7
+ * Run the init-browser command
8
+ */
9
+ export declare function runInitBrowserCommand(args: string[]): Promise<void>;
10
+ //# sourceMappingURL=init-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-browser.d.ts","sourceRoot":"","sources":["../../../../../../repos/sharpee/packages/devkit/src/standalone/init-browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6DH;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgGzE"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ /**
3
+ * CLI: sharpee init-browser
4
+ *
5
+ * Adds browser client files to an existing Sharpee story project.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.runInitBrowserCommand = runInitBrowserCommand;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ // In source: src/cli/ → ../../templates. In npm publish: cli/ → ../templates.
45
+ const TEMPLATES_DIR = fs.existsSync(path.join(__dirname, '..', 'templates', 'browser'))
46
+ ? path.join(__dirname, '..', 'templates', 'browser')
47
+ : path.join(__dirname, '..', '..', 'templates', 'browser');
48
+ /**
49
+ * Read story info from package.json or index.ts
50
+ */
51
+ function getProjectInfo(projectDir) {
52
+ // Try package.json first
53
+ const packagePath = path.join(projectDir, 'package.json');
54
+ if (fs.existsSync(packagePath)) {
55
+ try {
56
+ const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
57
+ return {
58
+ storyId: pkg.name || 'my-story',
59
+ storyTitle: pkg.description || pkg.name || 'My Story',
60
+ };
61
+ }
62
+ catch {
63
+ // Fall through
64
+ }
65
+ }
66
+ // Try reading from src/index.ts
67
+ const indexPath = path.join(projectDir, 'src', 'index.ts');
68
+ if (fs.existsSync(indexPath)) {
69
+ const content = fs.readFileSync(indexPath, 'utf-8');
70
+ const idMatch = content.match(/id:\s*['"]([^'"]+)['"]/);
71
+ const titleMatch = content.match(/title:\s*['"]([^'"]+)['"]/);
72
+ if (idMatch || titleMatch) {
73
+ return {
74
+ storyId: idMatch?.[1] || 'my-story',
75
+ storyTitle: titleMatch?.[1] || 'My Story',
76
+ };
77
+ }
78
+ }
79
+ return null;
80
+ }
81
+ /**
82
+ * Read template file and replace placeholders
83
+ */
84
+ function processTemplate(templatePath, info) {
85
+ const content = fs.readFileSync(templatePath, 'utf-8');
86
+ return content
87
+ .replace(/\{\{STORY_ID\}\}/g, info.storyId)
88
+ .replace(/\{\{STORY_TITLE\}\}/g, info.storyTitle);
89
+ }
90
+ /**
91
+ * Run the init-browser command
92
+ */
93
+ async function runInitBrowserCommand(args) {
94
+ // Check for help
95
+ if (args.includes('--help') || args.includes('-h')) {
96
+ showHelp();
97
+ return;
98
+ }
99
+ const projectDir = process.cwd();
100
+ console.log('\n🌐 Adding browser client to your Sharpee project\n');
101
+ // Check if this is a Sharpee project
102
+ const info = getProjectInfo(projectDir);
103
+ if (!info) {
104
+ console.error('Error: This does not appear to be a Sharpee project.');
105
+ console.error('Make sure you have a package.json or src/index.ts with story config.');
106
+ console.error('\nRun "sharpee init" first to create a project.');
107
+ process.exit(1);
108
+ }
109
+ console.log(` Story: ${info.storyTitle} (${info.storyId})`);
110
+ // Check if browser-entry.ts already exists
111
+ const browserEntryPath = path.join(projectDir, 'src', 'browser-entry.ts');
112
+ if (fs.existsSync(browserEntryPath)) {
113
+ console.error('\nError: src/browser-entry.ts already exists.');
114
+ console.error('Remove it first if you want to regenerate.');
115
+ process.exit(1);
116
+ }
117
+ // Create browser directory for templates (optional, for customization)
118
+ const browserDir = path.join(projectDir, 'browser');
119
+ fs.mkdirSync(browserDir, { recursive: true });
120
+ // Copy browser-entry.ts template
121
+ const browserEntryTemplate = path.join(TEMPLATES_DIR, 'browser-entry.ts.template');
122
+ if (fs.existsSync(browserEntryTemplate)) {
123
+ const content = processTemplate(browserEntryTemplate, info);
124
+ fs.writeFileSync(browserEntryPath, content);
125
+ console.log(' āœ“ Created src/browser-entry.ts');
126
+ }
127
+ else {
128
+ console.error(' āœ— Template not found: browser-entry.ts.template');
129
+ process.exit(1);
130
+ }
131
+ // Copy HTML template
132
+ const htmlTemplate = path.join(TEMPLATES_DIR, 'index.html');
133
+ if (fs.existsSync(htmlTemplate)) {
134
+ const content = processTemplate(htmlTemplate, info);
135
+ fs.writeFileSync(path.join(browserDir, 'index.html'), content);
136
+ console.log(' āœ“ Created browser/index.html');
137
+ }
138
+ // Copy CSS
139
+ const cssTemplate = path.join(TEMPLATES_DIR, 'styles.css');
140
+ if (fs.existsSync(cssTemplate)) {
141
+ fs.copyFileSync(cssTemplate, path.join(browserDir, 'styles.css'));
142
+ console.log(' āœ“ Created browser/styles.css');
143
+ }
144
+ // Update package.json to add esbuild dev dependency and build script
145
+ const packagePath = path.join(projectDir, 'package.json');
146
+ if (fs.existsSync(packagePath)) {
147
+ try {
148
+ const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
149
+ // Add esbuild to devDependencies
150
+ pkg.devDependencies = pkg.devDependencies || {};
151
+ if (!pkg.devDependencies.esbuild) {
152
+ pkg.devDependencies.esbuild = '^0.20.0';
153
+ }
154
+ // Add build:browser script
155
+ pkg.scripts = pkg.scripts || {};
156
+ if (!pkg.scripts['build:browser']) {
157
+ pkg.scripts['build:browser'] = 'npx sharpee build-browser';
158
+ }
159
+ fs.writeFileSync(packagePath, JSON.stringify(pkg, null, 2) + '\n');
160
+ console.log(' āœ“ Updated package.json');
161
+ }
162
+ catch (e) {
163
+ console.warn(' ⚠ Could not update package.json');
164
+ }
165
+ }
166
+ console.log('\nāœ… Browser client added!\n');
167
+ console.log('Next steps:');
168
+ console.log(' npm install # Install esbuild');
169
+ console.log(' npm run build:browser # Build web bundle');
170
+ console.log('');
171
+ console.log('Output will be in dist/web/');
172
+ console.log('');
173
+ console.log('Customize the UI:');
174
+ console.log(' browser/index.html # HTML template');
175
+ console.log(' browser/styles.css # Styles');
176
+ console.log('');
177
+ }
178
+ function showHelp() {
179
+ console.log(`
180
+ sharpee init-browser - Add browser client to a Sharpee project
181
+
182
+ Usage: sharpee init-browser
183
+
184
+ This command adds the files needed to build a web browser version
185
+ of your interactive fiction game:
186
+
187
+ src/browser-entry.ts Entry point for browser bundle
188
+ browser/index.html HTML template
189
+ browser/styles.css Infocom-style CSS
190
+
191
+ Run this in the root of your Sharpee project directory.
192
+ `);
193
+ }
194
+ //# sourceMappingURL=init-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-browser.js","sourceRoot":"","sources":["../../../../../../../repos/sharpee/packages/devkit/src/standalone/init-browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CLI: sharpee init
3
+ *
4
+ * Creates a new Sharpee story project with the basic structure.
5
+ */
6
+ /**
7
+ * Run the init command
8
+ */
9
+ export declare function runInitCommand(args: string[]): Promise<void>;
10
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../../repos/sharpee/packages/devkit/src/standalone/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2DH;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFlE"}