mstro-app 0.2.0 → 0.3.1

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 (153) hide show
  1. package/PRIVACY.md +126 -0
  2. package/README.md +24 -23
  3. package/bin/commands/login.js +79 -49
  4. package/bin/mstro.js +305 -39
  5. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  6. package/dist/server/cli/headless/claude-invoker.js +137 -30
  7. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  8. package/dist/server/cli/headless/mcp-config.js +2 -2
  9. package/dist/server/cli/headless/mcp-config.js.map +1 -1
  10. package/dist/server/cli/headless/runner.d.ts +6 -1
  11. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  12. package/dist/server/cli/headless/runner.js +59 -4
  13. package/dist/server/cli/headless/runner.js.map +1 -1
  14. package/dist/server/cli/headless/stall-assessor.d.ts +3 -1
  15. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  16. package/dist/server/cli/headless/stall-assessor.js +20 -1
  17. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  18. package/dist/server/cli/headless/tool-watchdog.d.ts +4 -1
  19. package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
  20. package/dist/server/cli/headless/tool-watchdog.js +30 -24
  21. package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
  22. package/dist/server/cli/headless/types.d.ts +20 -2
  23. package/dist/server/cli/headless/types.d.ts.map +1 -1
  24. package/dist/server/cli/improvisation-session-manager.d.ts +30 -3
  25. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  26. package/dist/server/cli/improvisation-session-manager.js +224 -31
  27. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  28. package/dist/server/index.js +6 -4
  29. package/dist/server/index.js.map +1 -1
  30. package/dist/server/mcp/bouncer-cli.js +53 -14
  31. package/dist/server/mcp/bouncer-cli.js.map +1 -1
  32. package/dist/server/mcp/bouncer-integration.d.ts +1 -1
  33. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  34. package/dist/server/mcp/bouncer-integration.js +70 -7
  35. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  36. package/dist/server/mcp/security-audit.d.ts +3 -3
  37. package/dist/server/mcp/security-audit.d.ts.map +1 -1
  38. package/dist/server/mcp/security-audit.js.map +1 -1
  39. package/dist/server/mcp/server.js +3 -2
  40. package/dist/server/mcp/server.js.map +1 -1
  41. package/dist/server/services/analytics.d.ts +2 -2
  42. package/dist/server/services/analytics.d.ts.map +1 -1
  43. package/dist/server/services/analytics.js +13 -1
  44. package/dist/server/services/analytics.js.map +1 -1
  45. package/dist/server/services/files.js +7 -7
  46. package/dist/server/services/files.js.map +1 -1
  47. package/dist/server/services/pathUtils.js +1 -1
  48. package/dist/server/services/pathUtils.js.map +1 -1
  49. package/dist/server/services/platform.d.ts +2 -2
  50. package/dist/server/services/platform.d.ts.map +1 -1
  51. package/dist/server/services/platform.js +13 -1
  52. package/dist/server/services/platform.js.map +1 -1
  53. package/dist/server/services/sentry.d.ts +1 -1
  54. package/dist/server/services/sentry.d.ts.map +1 -1
  55. package/dist/server/services/sentry.js.map +1 -1
  56. package/dist/server/services/terminal/pty-manager.d.ts +12 -0
  57. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
  58. package/dist/server/services/terminal/pty-manager.js +81 -6
  59. package/dist/server/services/terminal/pty-manager.js.map +1 -1
  60. package/dist/server/services/websocket/file-explorer-handlers.d.ts +5 -0
  61. package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -0
  62. package/dist/server/services/websocket/file-explorer-handlers.js +518 -0
  63. package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -0
  64. package/dist/server/services/websocket/file-utils.d.ts +4 -0
  65. package/dist/server/services/websocket/file-utils.d.ts.map +1 -1
  66. package/dist/server/services/websocket/file-utils.js +27 -8
  67. package/dist/server/services/websocket/file-utils.js.map +1 -1
  68. package/dist/server/services/websocket/git-handlers.d.ts +36 -0
  69. package/dist/server/services/websocket/git-handlers.d.ts.map +1 -0
  70. package/dist/server/services/websocket/git-handlers.js +797 -0
  71. package/dist/server/services/websocket/git-handlers.js.map +1 -0
  72. package/dist/server/services/websocket/git-pr-handlers.d.ts +4 -0
  73. package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -0
  74. package/dist/server/services/websocket/git-pr-handlers.js +299 -0
  75. package/dist/server/services/websocket/git-pr-handlers.js.map +1 -0
  76. package/dist/server/services/websocket/git-worktree-handlers.d.ts +4 -0
  77. package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -0
  78. package/dist/server/services/websocket/git-worktree-handlers.js +353 -0
  79. package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -0
  80. package/dist/server/services/websocket/handler-context.d.ts +32 -0
  81. package/dist/server/services/websocket/handler-context.d.ts.map +1 -0
  82. package/dist/server/services/websocket/handler-context.js +4 -0
  83. package/dist/server/services/websocket/handler-context.js.map +1 -0
  84. package/dist/server/services/websocket/handler.d.ts +27 -359
  85. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  86. package/dist/server/services/websocket/handler.js +68 -2329
  87. package/dist/server/services/websocket/handler.js.map +1 -1
  88. package/dist/server/services/websocket/index.d.ts +1 -1
  89. package/dist/server/services/websocket/index.d.ts.map +1 -1
  90. package/dist/server/services/websocket/index.js.map +1 -1
  91. package/dist/server/services/websocket/session-handlers.d.ts +10 -0
  92. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -0
  93. package/dist/server/services/websocket/session-handlers.js +508 -0
  94. package/dist/server/services/websocket/session-handlers.js.map +1 -0
  95. package/dist/server/services/websocket/settings-handlers.d.ts +6 -0
  96. package/dist/server/services/websocket/settings-handlers.d.ts.map +1 -0
  97. package/dist/server/services/websocket/settings-handlers.js +125 -0
  98. package/dist/server/services/websocket/settings-handlers.js.map +1 -0
  99. package/dist/server/services/websocket/tab-handlers.d.ts +10 -0
  100. package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -0
  101. package/dist/server/services/websocket/tab-handlers.js +131 -0
  102. package/dist/server/services/websocket/tab-handlers.js.map +1 -0
  103. package/dist/server/services/websocket/terminal-handlers.d.ts +9 -0
  104. package/dist/server/services/websocket/terminal-handlers.d.ts.map +1 -0
  105. package/dist/server/services/websocket/terminal-handlers.js +220 -0
  106. package/dist/server/services/websocket/terminal-handlers.js.map +1 -0
  107. package/dist/server/services/websocket/types.d.ts +63 -2
  108. package/dist/server/services/websocket/types.d.ts.map +1 -1
  109. package/dist/server/utils/agent-manager.d.ts +22 -2
  110. package/dist/server/utils/agent-manager.d.ts.map +1 -1
  111. package/dist/server/utils/agent-manager.js +2 -2
  112. package/dist/server/utils/agent-manager.js.map +1 -1
  113. package/dist/server/utils/port-manager.js.map +1 -1
  114. package/hooks/bouncer.sh +17 -3
  115. package/package.json +7 -3
  116. package/server/README.md +176 -159
  117. package/server/cli/headless/claude-invoker.ts +172 -43
  118. package/server/cli/headless/mcp-config.ts +8 -8
  119. package/server/cli/headless/runner.ts +57 -4
  120. package/server/cli/headless/stall-assessor.ts +25 -0
  121. package/server/cli/headless/tool-watchdog.ts +33 -25
  122. package/server/cli/headless/types.ts +11 -2
  123. package/server/cli/improvisation-session-manager.ts +285 -37
  124. package/server/index.ts +15 -13
  125. package/server/mcp/README.md +59 -67
  126. package/server/mcp/bouncer-cli.ts +73 -20
  127. package/server/mcp/bouncer-integration.ts +99 -16
  128. package/server/mcp/security-audit.ts +4 -4
  129. package/server/mcp/server.ts +6 -5
  130. package/server/services/analytics.ts +16 -4
  131. package/server/services/files.ts +13 -13
  132. package/server/services/pathUtils.ts +2 -2
  133. package/server/services/platform.ts +17 -6
  134. package/server/services/sentry.ts +1 -1
  135. package/server/services/terminal/pty-manager.ts +88 -11
  136. package/server/services/websocket/file-explorer-handlers.ts +587 -0
  137. package/server/services/websocket/file-utils.ts +28 -9
  138. package/server/services/websocket/git-handlers.ts +924 -0
  139. package/server/services/websocket/git-pr-handlers.ts +363 -0
  140. package/server/services/websocket/git-worktree-handlers.ts +403 -0
  141. package/server/services/websocket/handler-context.ts +44 -0
  142. package/server/services/websocket/handler.ts +85 -2680
  143. package/server/services/websocket/index.ts +1 -1
  144. package/server/services/websocket/session-handlers.ts +575 -0
  145. package/server/services/websocket/settings-handlers.ts +150 -0
  146. package/server/services/websocket/tab-handlers.ts +150 -0
  147. package/server/services/websocket/terminal-handlers.ts +277 -0
  148. package/server/services/websocket/types.ts +137 -0
  149. package/server/utils/agent-manager.ts +6 -6
  150. package/server/utils/port-manager.ts +1 -1
  151. package/bin/release.sh +0 -110
  152. package/server/services/platform.test.ts +0 -1304
  153. package/server/services/websocket/handler.test.ts +0 -20
@@ -55,6 +55,9 @@ export interface WebSocketMessage {
55
55
  | 'deleteFile'
56
56
  | 'renameFile'
57
57
  | 'notifyFileOpened'
58
+ | 'searchFileContents'
59
+ | 'cancelSearch'
60
+ | 'findDefinition'
58
61
  // Git message types
59
62
  | 'gitStatus'
60
63
  | 'gitStage'
@@ -62,12 +65,36 @@ export interface WebSocketMessage {
62
65
  | 'gitCommit'
63
66
  | 'gitCommitWithAI'
64
67
  | 'gitPush'
68
+ | 'gitPull'
65
69
  | 'gitLog'
66
70
  | 'gitDiscoverRepos'
67
71
  | 'gitSetDirectory'
68
72
  | 'gitGetRemoteInfo'
69
73
  | 'gitCreatePR'
70
74
  | 'gitGeneratePRDescription'
75
+ // Branch operations
76
+ | 'gitListBranches'
77
+ | 'gitCheckout'
78
+ | 'gitCreateBranch'
79
+ | 'gitDeleteBranch'
80
+ // Diff operations
81
+ | 'gitDiff'
82
+ // Tag operations
83
+ | 'gitListTags'
84
+ | 'gitCreateTag'
85
+ | 'gitPushTag'
86
+ // Worktree operations
87
+ | 'gitWorktreeList'
88
+ | 'gitWorktreeCreate'
89
+ | 'gitWorktreeRemove'
90
+ | 'tabWorktreeSwitch'
91
+ | 'gitWorktreePush'
92
+ | 'gitWorktreeCreatePR'
93
+ // Merge operations
94
+ | 'gitMergePreview'
95
+ | 'gitWorktreeMerge'
96
+ | 'gitMergeAbort'
97
+ | 'gitMergeComplete'
71
98
  // Session sync message types
72
99
  | 'getActiveTabs'
73
100
  | 'createTab'
@@ -81,6 +108,7 @@ export interface WebSocketMessage {
81
108
  | 'updateSettings';
82
109
  tabId?: string;
83
110
  terminalId?: string;
111
+ // biome-ignore lint/suspicious/noExplicitAny: message envelope carries heterogeneous payloads
84
112
  data?: any;
85
113
  /** Injected by server relay for sandboxed shared users (control + view) */
86
114
  _permission?: 'control' | 'view';
@@ -109,6 +137,7 @@ export interface WebSocketResponse {
109
137
  | 'tabInitialized'
110
138
  | 'approvalRequired'
111
139
  | 'toolUse'
140
+ | 'streamingTokens'
112
141
  | 'notificationSummary'
113
142
  | 'terminalOutput'
114
143
  | 'terminalReady'
@@ -124,6 +153,10 @@ export interface WebSocketResponse {
124
153
  | 'fileRenamed'
125
154
  | 'fileOpened'
126
155
  | 'fileContentChanged'
156
+ | 'contentSearchResults'
157
+ | 'contentSearchComplete'
158
+ | 'contentSearchError'
159
+ | 'definitionResult'
127
160
  // Terminal sync response types
128
161
  | 'terminalCreated'
129
162
  | 'terminalClosed'
@@ -134,6 +167,7 @@ export interface WebSocketResponse {
134
167
  | 'gitCommitted'
135
168
  | 'gitCommitMessage'
136
169
  | 'gitPushed'
170
+ | 'gitPulled'
137
171
  | 'gitLog'
138
172
  | 'gitError'
139
173
  | 'gitReposDiscovered'
@@ -141,6 +175,29 @@ export interface WebSocketResponse {
141
175
  | 'gitRemoteInfo'
142
176
  | 'gitPRCreated'
143
177
  | 'gitPRDescription'
178
+ // Branch response types
179
+ | 'gitBranchList'
180
+ | 'gitCheckedOut'
181
+ | 'gitBranchCreated'
182
+ | 'gitBranchDeleted'
183
+ // Diff response types
184
+ | 'gitDiffResult'
185
+ // Tag response types
186
+ | 'gitTagList'
187
+ | 'gitTagCreated'
188
+ | 'gitTagPushed'
189
+ // Worktree response types
190
+ | 'gitWorktreeListResult'
191
+ | 'gitWorktreeCreated'
192
+ | 'gitWorktreeRemoved'
193
+ | 'tabWorktreeSwitched'
194
+ | 'gitWorktreePushed'
195
+ | 'gitWorktreePRCreated'
196
+ // Merge response types
197
+ | 'gitMergePreviewResult'
198
+ | 'gitWorktreeMergeResult'
199
+ | 'gitMergeAborted'
200
+ | 'gitMergeCompleted'
144
201
  // Session sync response types
145
202
  | 'activeTabs'
146
203
  | 'tabCreated'
@@ -155,6 +212,7 @@ export interface WebSocketResponse {
155
212
  | 'settingsUpdated';
156
213
  tabId?: string;
157
214
  terminalId?: string;
215
+ // biome-ignore lint/suspicious/noExplicitAny: message envelope carries heterogeneous payloads
158
216
  data?: any;
159
217
  }
160
218
 
@@ -372,3 +430,82 @@ export interface GitDirectorySetResponse {
372
430
  /** Whether the directory is valid (contains .git) */
373
431
  isValid: boolean;
374
432
  }
433
+
434
+ // ============================================================================
435
+ // Branch Types
436
+ // ============================================================================
437
+
438
+ export interface GitBranchEntry {
439
+ /** Branch name, e.g. "feat/auth" or "origin/main" */
440
+ name: string;
441
+ /** Short commit hash */
442
+ shortHash: string;
443
+ /** Whether this is a remote branch */
444
+ isRemote: boolean;
445
+ /** Whether this is the currently checked out branch */
446
+ isCurrent: boolean;
447
+ /** Tracking branch, e.g. "origin/feat/auth" */
448
+ upstream?: string;
449
+ }
450
+
451
+ // ============================================================================
452
+ // Tag Types
453
+ // ============================================================================
454
+
455
+ export interface GitTagEntry {
456
+ /** Tag name */
457
+ name: string;
458
+ /** Short commit hash */
459
+ shortHash: string;
460
+ /** Creation date (ISO string) */
461
+ date: string;
462
+ /** Tag message (empty for lightweight tags) */
463
+ message: string;
464
+ }
465
+
466
+ // ============================================================================
467
+ // Worktree Types
468
+ // ============================================================================
469
+
470
+ export interface WorktreeInfo {
471
+ /** Absolute path to the worktree directory */
472
+ path: string;
473
+ /** Branch checked out in this worktree */
474
+ branch: string;
475
+ /** HEAD commit hash */
476
+ head: string;
477
+ /** Whether this is the main working tree */
478
+ isMain: boolean;
479
+ /** Whether this is a bare repository */
480
+ isBare: boolean;
481
+ /** Whether this worktree can be pruned */
482
+ prunable?: boolean;
483
+ }
484
+
485
+ // ============================================================================
486
+ // Merge Types
487
+ // ============================================================================
488
+
489
+ export interface MergePreviewResult {
490
+ /** Whether the merge can be done cleanly */
491
+ clean: boolean;
492
+ /** List of conflicting file paths */
493
+ conflicts: string[];
494
+ /** Diff stat summary */
495
+ stat: string;
496
+ /** List of commits to be merged */
497
+ commits: { hash: string; message: string }[];
498
+ /** Number of commits ahead */
499
+ ahead: number;
500
+ }
501
+
502
+ export interface WorktreeMergeResult {
503
+ /** Whether the merge succeeded */
504
+ success: boolean;
505
+ /** Merge commit hash (if successful) */
506
+ mergeCommit?: string;
507
+ /** Error message (if failed) */
508
+ error?: string;
509
+ /** List of conflicting files (if conflicts) */
510
+ conflictFiles?: string[];
511
+ }
@@ -289,14 +289,14 @@ export class AgentManager {
289
289
  /**
290
290
  * Extract agent names from a score object
291
291
  */
292
- extractAgentNamesFromScore(score: any): string[] {
292
+ extractAgentNamesFromScore(score: { movements?: Array<{ musicians?: Array<{ type?: string; config?: { agent?: string }; role?: string }> }> }): string[] {
293
293
  if (!Array.isArray(score.movements)) return [];
294
294
 
295
- const names = (score.movements as any[])
295
+ const names = score.movements
296
296
  .flatMap(m => Array.isArray(m.musicians) ? m.musicians : [])
297
- .filter((m: any) => m.type === 'custom')
298
- .map((m: any) => m.config?.agent || m.role)
299
- .filter(Boolean);
297
+ .filter(m => m.type === 'custom')
298
+ .map(m => m.config?.agent || m.role)
299
+ .filter(Boolean) as string[];
300
300
 
301
301
  return [...new Set<string>(names)];
302
302
  }
@@ -304,7 +304,7 @@ export class AgentManager {
304
304
  /**
305
305
  * Ensure all agents required by a score are available
306
306
  */
307
- async ensureScoreAgentsAvailable(score: any, workingDir: string): Promise<Map<string, AgentInfo>> {
307
+ async ensureScoreAgentsAvailable(score: { movements?: Array<{ musicians?: Array<{ type?: string; config?: { agent?: string }; role?: string }> }> }, workingDir: string): Promise<Map<string, AgentInfo>> {
308
308
  const agentNames = this.extractAgentNamesFromScore(score);
309
309
  const results = new Map<string, AgentInfo>();
310
310
 
@@ -20,7 +20,7 @@ async function isPortAvailable(port: number): Promise<boolean> {
20
20
  return new Promise((resolve) => {
21
21
  const server = createServer()
22
22
 
23
- server.once('error', (err: any) => {
23
+ server.once('error', (err: NodeJS.ErrnoException) => {
24
24
  if (err.code === 'EADDRINUSE') {
25
25
  resolve(false)
26
26
  } else {
package/bin/release.sh DELETED
@@ -1,110 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- # Release script for mstro
5
- # Usage: ./bin/release.sh [major|minor|patch]
6
- #
7
- # This script:
8
- # 1. Bumps the version in package.json
9
- # 2. Updates CHANGELOG.md with git commits since last tag
10
- # 3. Commits the changes
11
- # 4. Creates a git tag
12
- # 5. Pushes to GitHub (branch + tag)
13
- #
14
- # After push, run `npm publish` to publish to npmjs.
15
-
16
- BUMP_TYPE="${1:-patch}"
17
-
18
- if [[ "$BUMP_TYPE" != "major" && "$BUMP_TYPE" != "minor" && "$BUMP_TYPE" != "patch" ]]; then
19
- echo "Usage: $0 [major|minor|patch]"
20
- exit 1
21
- fi
22
-
23
- # Ensure we're in the cli directory
24
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
25
- CLI_DIR="$(dirname "$SCRIPT_DIR")"
26
- cd "$CLI_DIR"
27
-
28
- # Ensure working directory is clean
29
- if [[ -n "$(git status --porcelain)" ]]; then
30
- echo "Error: Working directory is not clean. Commit or stash changes first."
31
- exit 1
32
- fi
33
-
34
- # Get current version
35
- CURRENT_VERSION=$(node -e "console.log(require('./package.json').version)")
36
- echo "Current version: $CURRENT_VERSION"
37
-
38
- # Calculate new version
39
- IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
40
- case "$BUMP_TYPE" in
41
- major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;;
42
- minor) MINOR=$((MINOR + 1)); PATCH=0 ;;
43
- patch) PATCH=$((PATCH + 1)) ;;
44
- esac
45
- NEW_VERSION="$MAJOR.$MINOR.$PATCH"
46
- echo "New version: $NEW_VERSION"
47
-
48
- # Get the last tag (or first commit if no tags)
49
- LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || git rev-list --max-parents=0 HEAD)
50
-
51
- # Generate changelog entry from git commits
52
- CHANGELOG_ENTRY="## $NEW_VERSION ($(date +%Y-%m-%d))\n\n"
53
- COMMITS=$(git log "$LAST_TAG"..HEAD --pretty=format:"- %s" --no-merges 2>/dev/null || git log --pretty=format:"- %s" --no-merges)
54
-
55
- if [[ -z "$COMMITS" ]]; then
56
- CHANGELOG_ENTRY+="- Release $NEW_VERSION\n"
57
- else
58
- CHANGELOG_ENTRY+="$COMMITS\n"
59
- fi
60
-
61
- # Update CHANGELOG.md
62
- if [[ -f CHANGELOG.md ]]; then
63
- # Insert new entry after the header
64
- EXISTING=$(cat CHANGELOG.md)
65
- {
66
- echo "# Changelog"
67
- echo ""
68
- echo -e "$CHANGELOG_ENTRY"
69
- # Strip the first line (# Changelog) and any leading blank lines from existing
70
- echo "$EXISTING" | tail -n +2
71
- } > CHANGELOG.md
72
- else
73
- {
74
- echo "# Changelog"
75
- echo ""
76
- echo -e "$CHANGELOG_ENTRY"
77
- } > CHANGELOG.md
78
- fi
79
-
80
- # Bump version in package.json (without npm creating a git tag)
81
- npm version "$NEW_VERSION" --no-git-tag-version
82
-
83
- echo ""
84
- echo "Updated:"
85
- echo " - package.json: $CURRENT_VERSION -> $NEW_VERSION"
86
- echo " - CHANGELOG.md: added $NEW_VERSION entry"
87
-
88
- # Commit and tag
89
- git add package.json package-lock.json CHANGELOG.md
90
- git commit -m "release: v$NEW_VERSION"
91
- git tag -a "v$NEW_VERSION" -m "v$NEW_VERSION"
92
-
93
- echo ""
94
- echo "Created commit and tag v$NEW_VERSION"
95
-
96
- # Push
97
- echo ""
98
- read -rp "Push to origin? (y/N) " CONFIRM
99
- if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
100
- git push origin HEAD
101
- git push origin "v$NEW_VERSION"
102
- echo ""
103
- echo "Pushed to GitHub. Now run 'npm publish' to publish to npmjs."
104
- else
105
- echo ""
106
- echo "Skipped push. Run manually:"
107
- echo " git push origin HEAD"
108
- echo " git push origin v$NEW_VERSION"
109
- echo " npm publish"
110
- fi