@minimalcorp/tsunagi 0.1.6 → 0.1.8

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 (43) hide show
  1. package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  2. package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
  3. package/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
  5. package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  12. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +1 -1
  13. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  14. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  15. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  16. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  17. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  18. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  19. package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
  20. package/.next/standalone/apps/web/.next/server/app/index.rsc +1 -1
  21. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  22. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
  23. package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  24. package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
  25. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  26. package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
  27. package/.next/standalone/apps/web/.next/server/app/settings.rsc +1 -1
  28. package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  29. package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  30. package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  31. package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  32. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  33. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  34. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
  35. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  36. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  37. package/.next/standalone/apps/web/.next/server/server-reference-manifest.js +1 -1
  38. package/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
  39. package/dist/cli.js +22 -18
  40. package/package.json +2 -1
  41. /package/.next/standalone/apps/web/.next/static/{jO4RXUMamVXsFB7dG8arz → haxinjoLVmLKqf8KiMFfd}/_buildManifest.js +0 -0
  42. /package/.next/standalone/apps/web/.next/static/{jO4RXUMamVXsFB7dG8arz → haxinjoLVmLKqf8KiMFfd}/_clientMiddlewareManifest.js +0 -0
  43. /package/.next/standalone/apps/web/.next/static/{jO4RXUMamVXsFB7dG8arz → haxinjoLVmLKqf8KiMFfd}/_ssgManifest.js +0 -0
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "node": {},
3
3
  "edge": {},
4
- "encryptionKey": "7NY7F7s6rJeRw3kqwLCwIp0NTa+bSSib7Zr5hW5LnjM="
4
+ "encryptionKey": "1+olOQLC6zrDvdeldaHNeo7WGbMQmi3p2q0eq6fYNqc="
5
5
  }
package/dist/cli.js CHANGED
@@ -25,27 +25,15 @@ import { acquireSingleInstanceLock } from './single-instance-lock.js';
25
25
  * <pkg>/prisma.config.ts
26
26
  * <pkg>/tsunagi-marketplace/plugins/tsunagi-plugin/.claude-plugin/plugin.json
27
27
  */
28
- if (process.platform !== 'darwin' && process.platform !== 'linux') {
29
- console.error(`[tsunagi] Unsupported platform: ${process.platform}`);
30
- console.error('[tsunagi] Tsunagi currently supports macOS and Linux only.');
31
- process.exit(1);
32
- }
33
- acquireSingleInstanceLock();
34
- const DIST_DIR = path.dirname(fileURLToPath(import.meta.url));
35
- const PACKAGE_ROOT = path.resolve(DIST_DIR, '..');
36
- const AUTO_MIGRATE_JS = path.join(DIST_DIR, 'auto-migrate.js');
37
- const FASTIFY_ENTRY_JS = path.join(DIST_DIR, 'server', 'index.js');
38
- const NEXT_STANDALONE_ENTRY = path.join(PACKAGE_ROOT, '.next', 'standalone', 'apps', 'web', 'server.js');
39
- const DOCS_DIR = path.join(PACKAGE_ROOT, 'docs');
40
- const DOCS_PORT = 2793;
41
- const isDebug = !!process.env.TSUNAGI_DEBUG;
42
- const isDocker = fs.existsSync('/.dockerenv');
43
28
  // ---------------------------------------------------------------------------
44
29
  // Braille-dots spinner
45
30
  // ---------------------------------------------------------------------------
46
31
  const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
47
32
  function createSpinner(message) {
48
33
  let i = 0;
34
+ // Write first frame immediately so it shows even during spawnSync/execSync blocking
35
+ process.stdout.write(`\r${SPINNER_FRAMES[0]} ${message}`);
36
+ i++;
49
37
  const timer = setInterval(() => {
50
38
  process.stdout.write(`\r${SPINNER_FRAMES[i % SPINNER_FRAMES.length]} ${message}`);
51
39
  i++;
@@ -58,6 +46,22 @@ function createSpinner(message) {
58
46
  },
59
47
  };
60
48
  }
49
+ if (process.platform !== 'darwin' && process.platform !== 'linux') {
50
+ console.error(`[tsunagi] Unsupported platform: ${process.platform}`);
51
+ console.error('[tsunagi] Tsunagi currently supports macOS and Linux only.');
52
+ process.exit(1);
53
+ }
54
+ let spinner = createSpinner('Initializing...');
55
+ acquireSingleInstanceLock();
56
+ const DIST_DIR = path.dirname(fileURLToPath(import.meta.url));
57
+ const PACKAGE_ROOT = path.resolve(DIST_DIR, '..');
58
+ const AUTO_MIGRATE_JS = path.join(DIST_DIR, 'auto-migrate.js');
59
+ const FASTIFY_ENTRY_JS = path.join(DIST_DIR, 'server', 'index.js');
60
+ const NEXT_STANDALONE_ENTRY = path.join(PACKAGE_ROOT, '.next', 'standalone', 'apps', 'web', 'server.js');
61
+ const DOCS_DIR = path.join(PACKAGE_ROOT, 'docs');
62
+ const DOCS_PORT = 2793;
63
+ const isDebug = !!process.env.TSUNAGI_DEBUG;
64
+ const isDocker = fs.existsSync('/.dockerenv');
61
65
  // ---------------------------------------------------------------------------
62
66
  // ASCII art
63
67
  // ---------------------------------------------------------------------------
@@ -96,8 +100,7 @@ runAutoMigrate();
96
100
  // ---------------------------------------------------------------------------
97
101
  // Phase 2: Plugin lifecycle
98
102
  // ---------------------------------------------------------------------------
99
- const pluginResult = ensureCleanPluginState();
100
- console.log(pluginResult === 'clean' ? 'clean installed tsunagi plugin' : 'installed tsunagi plugin');
103
+ ensureCleanPluginState();
101
104
  // ---------------------------------------------------------------------------
102
105
  // Docs static file server
103
106
  // ---------------------------------------------------------------------------
@@ -179,7 +182,6 @@ function verifyArtifact(p, label) {
179
182
  verifyArtifact(FASTIFY_ENTRY_JS, 'Fastify server artifact');
180
183
  verifyArtifact(NEXT_STANDALONE_ENTRY, 'Next.js standalone artifact');
181
184
  const PORT = process.env.PORT ?? '2791';
182
- const spinner = createSpinner('Initializing...');
183
185
  const fastifyChild = spawn(process.execPath, [FASTIFY_ENTRY_JS], {
184
186
  stdio: ['inherit', 'pipe', 'pipe'],
185
187
  cwd: PACKAGE_ROOT,
@@ -255,6 +257,7 @@ function shutdown(code) {
255
257
  return;
256
258
  shuttingDown = true;
257
259
  spinner.stop();
260
+ const cleanupSpinner = createSpinner('Cleaning up...');
258
261
  for (const child of [fastifyChild, nextChild]) {
259
262
  if (child && !child.killed && child.exitCode === null) {
260
263
  try {
@@ -267,6 +270,7 @@ function shutdown(code) {
267
270
  }
268
271
  docsServer?.close();
269
272
  cleanupPluginState();
273
+ cleanupSpinner.stop();
270
274
  process.exit(code);
271
275
  }
272
276
  process.on('SIGINT', () => shutdown(0));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Multi-repo GitHub project management with Claude AI integration, designed for visualizing and controlling AI-driven development locally.",
5
5
  "keywords": [
6
6
  "tsunagi",
@@ -58,6 +58,7 @@
58
58
  },
59
59
  "dependencies": {
60
60
  "@fastify/cors": "^11.2.0",
61
+ "dotenv": "^17.2.3",
61
62
  "@libsql/client": "0.8.1",
62
63
  "@modelcontextprotocol/sdk": "^1.27.1",
63
64
  "@prisma/adapter-libsql": "^7.3.0",