tylersong 1.0.4 → 1.0.6

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.
@@ -0,0 +1,119 @@
1
+ name: "Discord Notification"
2
+ description: "Send notification to Discord webhook"
3
+
4
+ inputs:
5
+ webhook-url:
6
+ description: "Discord webhook URL"
7
+ required: true
8
+ status:
9
+ description: "Status of the workflow (success, failure, cancelled)"
10
+ required: true
11
+ title:
12
+ description: "Notification title"
13
+ required: true
14
+ description:
15
+ description: "Notification description"
16
+ required: false
17
+ default: ""
18
+ color:
19
+ description: "Embed color (hex without #)"
20
+ required: false
21
+ default: "5865F2"
22
+ fields:
23
+ description: "Additional fields in JSON format"
24
+ required: false
25
+ default: "[]"
26
+
27
+ runs:
28
+ using: "composite"
29
+ steps:
30
+ - name: Set color based on status
31
+ shell: bash
32
+ id: color
33
+ run: |
34
+ case "${{ inputs.status }}" in
35
+ success)
36
+ echo "color=00FF00" >> $GITHUB_OUTPUT
37
+ echo "emoji=✅" >> $GITHUB_OUTPUT
38
+ ;;
39
+ failure)
40
+ echo "color=FF0000" >> $GITHUB_OUTPUT
41
+ echo "emoji=❌" >> $GITHUB_OUTPUT
42
+ ;;
43
+ cancelled)
44
+ echo "color=FFA500" >> $GITHUB_OUTPUT
45
+ echo "emoji=⚠️" >> $GITHUB_OUTPUT
46
+ ;;
47
+ *)
48
+ echo "color=${{ inputs.color }}" >> $GITHUB_OUTPUT
49
+ echo "emoji=ℹ️" >> $GITHUB_OUTPUT
50
+ ;;
51
+ esac
52
+
53
+ - name: Send Discord notification
54
+ shell: bash
55
+ env:
56
+ WEBHOOK_URL: ${{ inputs.webhook-url }}
57
+ STATUS: ${{ inputs.status }}
58
+ TITLE: ${{ inputs.title }}
59
+ DESCRIPTION: ${{ inputs.description }}
60
+ COLOR: ${{ steps.color.outputs.color }}
61
+ EMOJI: ${{ steps.color.outputs.emoji }}
62
+ FIELDS: ${{ inputs.fields }}
63
+ run: |
64
+ # 16진수 색상을 10진수로 변환
65
+ COLOR_DEC=$((16#$COLOR))
66
+
67
+ # 안전한 JSON 페이로드 생성 (임시 파일 사용)
68
+ TEMP_FILE=$(mktemp)
69
+
70
+ # 기본 구조 생성
71
+ jq -n \
72
+ --arg emoji "$EMOJI" \
73
+ --arg title "$TITLE" \
74
+ --arg description "$DESCRIPTION" \
75
+ --argjson color "$COLOR_DEC" \
76
+ '{
77
+ embeds: [{
78
+ title: ($emoji + " " + $title),
79
+ description: $description,
80
+ color: $color,
81
+ footer: {
82
+ text: "GitHub Actions",
83
+ icon_url: "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png"
84
+ },
85
+ timestamp: (now | strftime("%Y-%m-%dT%H:%M:%S.000Z"))
86
+ }]
87
+ }' > "$TEMP_FILE"
88
+
89
+ # fields가 비어있지 않으면 추가
90
+ if [ "$FIELDS" != "[]" ] && [ -n "$FIELDS" ]; then
91
+ jq --argjson fields "$FIELDS" '.embeds[0].fields = $fields' "$TEMP_FILE" > "${TEMP_FILE}.tmp" && mv "${TEMP_FILE}.tmp" "$TEMP_FILE"
92
+ fi
93
+
94
+ # Discord 웹훅으로 전송 (디버그 정보 포함)
95
+ echo "Sending payload:"
96
+ cat "$TEMP_FILE"
97
+ echo ""
98
+
99
+ RESPONSE=$(curl -s -w "%{http_code}" -H "Content-Type: application/json" \
100
+ -d @"$TEMP_FILE" \
101
+ "$WEBHOOK_URL")
102
+
103
+ HTTP_CODE="${RESPONSE: -3}"
104
+ RESPONSE_BODY="${RESPONSE%???}"
105
+
106
+ echo "HTTP Status: $HTTP_CODE"
107
+ echo "Response: $RESPONSE_BODY"
108
+
109
+ # 임시 파일 정리
110
+ rm -f "$TEMP_FILE"
111
+
112
+ # 상태 코드 확인
113
+ if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ]; then
114
+ echo "✅ Discord 알림 전송 성공"
115
+ else
116
+ echo "❌ Discord 알림 전송 실패: HTTP $HTTP_CODE"
117
+ echo "Response: $RESPONSE_BODY"
118
+ exit 1
119
+ fi
@@ -0,0 +1,41 @@
1
+ name: "Setup Runtime Environment"
2
+ description: "Setup Node.js or Bun runtime with dependencies"
3
+
4
+ inputs:
5
+ runtime:
6
+ description: "Runtime to setup (node or bun)"
7
+ required: true
8
+ node-version:
9
+ description: "Node.js version"
10
+ required: false
11
+ default: "20.x"
12
+ bun-version:
13
+ description: "Bun version"
14
+ required: false
15
+ default: "latest"
16
+
17
+ runs:
18
+ using: "composite"
19
+ steps:
20
+ - name: Setup Node.js
21
+ if: inputs.runtime == 'node'
22
+ uses: actions/setup-node@v4
23
+ with:
24
+ node-version: ${{ inputs.node-version }}
25
+ cache: "npm"
26
+
27
+ - name: Setup Bun
28
+ if: inputs.runtime == 'bun'
29
+ uses: oven-sh/setup-bun@v1
30
+ with:
31
+ bun-version: ${{ inputs.bun-version }}
32
+
33
+ - name: Install dependencies (Node.js)
34
+ if: inputs.runtime == 'node'
35
+ shell: bash
36
+ run: npm ci
37
+
38
+ - name: Install dependencies (Bun)
39
+ if: inputs.runtime == 'bun'
40
+ shell: bash
41
+ run: bun install
@@ -0,0 +1,176 @@
1
+ name: Continuous Integration
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ branches: [main, develop]
8
+
9
+ jobs:
10
+ test:
11
+ name: Test
12
+ runs-on: ubuntu-latest
13
+
14
+ strategy:
15
+ matrix:
16
+ runtime: [node, bun]
17
+
18
+ steps:
19
+ - name: Checkout code
20
+ uses: actions/checkout@v4
21
+
22
+ - name: Setup runtime environment
23
+ uses: ./.github/actions/setup-runtime
24
+ with:
25
+ runtime: ${{ matrix.runtime }}
26
+
27
+ - name: Run tests (Node.js)
28
+ if: matrix.runtime == 'node'
29
+ run: npm test
30
+
31
+ - name: Run tests (Bun)
32
+ if: matrix.runtime == 'bun'
33
+ run: bun test || echo "No bun tests specified"
34
+
35
+ - name: Test CLI functionality (Node.js)
36
+ if: matrix.runtime == 'node'
37
+ run: |
38
+ npm run build
39
+ node dist/index.js --version
40
+ node dist/index.js --help
41
+
42
+ - name: Test CLI functionality (Bun)
43
+ if: matrix.runtime == 'bun'
44
+ run: |
45
+ bun run build:bun
46
+ bun run dist/index.js --version
47
+ bun run dist/index.js --help
48
+
49
+ build:
50
+ name: Build & Upload Artifacts
51
+ runs-on: ubuntu-latest
52
+ needs: test
53
+
54
+ steps:
55
+ - name: Checkout code
56
+ uses: actions/checkout@v4
57
+
58
+ - name: Setup Node.js environment
59
+ uses: ./.github/actions/setup-runtime
60
+ with:
61
+ runtime: node
62
+
63
+ - name: Build TypeScript
64
+ run: npm run build
65
+
66
+ - name: Upload build artifacts
67
+ uses: actions/upload-artifact@v4
68
+ with:
69
+ name: dist-files-${{ github.sha }}
70
+ path: dist/
71
+ retention-days: 30
72
+
73
+ - name: Upload type definitions
74
+ uses: actions/upload-artifact@v4
75
+ with:
76
+ name: types-${{ github.sha }}
77
+ path: |
78
+ dist/*.d.ts
79
+ dist/*.d.ts.map
80
+ retention-days: 30
81
+
82
+ lint:
83
+ name: Code Quality
84
+ runs-on: ubuntu-latest
85
+
86
+ steps:
87
+ - name: Checkout code
88
+ uses: actions/checkout@v4
89
+
90
+ - name: Setup Node.js environment
91
+ uses: ./.github/actions/setup-runtime
92
+ with:
93
+ runtime: node
94
+
95
+ - name: Check TypeScript compilation
96
+ run: npx tsc --noEmit
97
+
98
+ - name: Check code formatting (if prettier is added)
99
+ run: echo "Add prettier check here if needed"
100
+
101
+ - name: Security audit
102
+ run: npm audit --audit-level=moderate
103
+
104
+ notify:
105
+ name: Notify Results
106
+ runs-on: ubuntu-latest
107
+ needs: [test, build, lint]
108
+ if: always()
109
+
110
+ steps:
111
+ - name: Checkout code
112
+ uses: actions/checkout@v4
113
+
114
+ - name: Determine overall status
115
+ id: status
116
+ run: |
117
+ if [ "${{ needs.test.result }}" == "success" ] && [ "${{ needs.build.result }}" == "success" ] && [ "${{ needs.lint.result }}" == "success" ]; then
118
+ echo "status=success" >> $GITHUB_OUTPUT
119
+ echo "title=CI 성공 🎉" >> $GITHUB_OUTPUT
120
+ echo "description=모든 테스트, 빌드, 린팅이 성공적으로 완료되었습니다." >> $GITHUB_OUTPUT
121
+ else
122
+ echo "status=failure" >> $GITHUB_OUTPUT
123
+ echo "title=CI 실패 💥" >> $GITHUB_OUTPUT
124
+ echo "description=CI 파이프라인에서 오류가 발생했습니다. 로그를 확인해주세요." >> $GITHUB_OUTPUT
125
+ fi
126
+
127
+ - name: Create fields JSON
128
+ id: fields
129
+ run: |
130
+ FIELDS=$(cat << EOF
131
+ [
132
+ {
133
+ "name": "브랜치",
134
+ "value": "${{ github.ref_name }}",
135
+ "inline": true
136
+ },
137
+ {
138
+ "name": "커밋",
139
+ "value": "[\`${GITHUB_SHA:0:7}\`](https://github.com/${{ github.repository }}/commit/${{ github.sha }})",
140
+ "inline": true
141
+ },
142
+ {
143
+ "name": "테스트",
144
+ "value": "${{ needs.test.result == 'success' && '✅ 성공' || '❌ 실패' }}",
145
+ "inline": true
146
+ },
147
+ {
148
+ "name": "빌드",
149
+ "value": "${{ needs.build.result == 'success' && '✅ 성공' || '❌ 실패' }}",
150
+ "inline": true
151
+ },
152
+ {
153
+ "name": "린팅",
154
+ "value": "${{ needs.lint.result == 'success' && '✅ 성공' || '❌ 실패' }}",
155
+ "inline": true
156
+ },
157
+ {
158
+ "name": "작업자",
159
+ "value": "${{ github.actor }}",
160
+ "inline": true
161
+ }
162
+ ]
163
+ EOF
164
+ )
165
+ echo "fields<<EOF" >> $GITHUB_OUTPUT
166
+ echo "$FIELDS" >> $GITHUB_OUTPUT
167
+ echo "EOF" >> $GITHUB_OUTPUT
168
+
169
+ - name: Send Discord notification
170
+ uses: ./.github/actions/discord-notify
171
+ with:
172
+ webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
173
+ status: ${{ steps.status.outputs.status }}
174
+ title: ${{ steps.status.outputs.title }}
175
+ description: ${{ steps.status.outputs.description }}
176
+ fields: ${{ steps.fields.outputs.fields }}
@@ -0,0 +1,320 @@
1
+ name: Publish to NPM
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ tags: ["v*"]
7
+ workflow_run:
8
+ workflows: ["Continuous Integration"]
9
+ types: [completed]
10
+ branches: [main]
11
+
12
+ permissions:
13
+ contents: write
14
+ packages: write
15
+
16
+ jobs:
17
+ check-ci:
18
+ name: Check CI Status
19
+ runs-on: ubuntu-latest
20
+ if: always()
21
+ outputs:
22
+ ci-success: ${{ steps.ci-check.outputs.success }}
23
+
24
+ steps:
25
+ - name: Check CI workflow status
26
+ id: ci-check
27
+ run: |
28
+ if [ "${{ github.event_name }}" == "workflow_run" ]; then
29
+ if [ "${{ github.event.workflow_run.conclusion }}" == "success" ]; then
30
+ echo "success=true" >> $GITHUB_OUTPUT
31
+ else
32
+ echo "success=false" >> $GITHUB_OUTPUT
33
+ exit 1
34
+ fi
35
+ else
36
+ # For push and tag events, assume CI will run or has run
37
+ echo "success=true" >> $GITHUB_OUTPUT
38
+ fi
39
+
40
+ auto-version:
41
+ name: Auto Version Update
42
+ runs-on: ubuntu-latest
43
+ if: |
44
+ (github.event_name == 'push' && github.ref == 'refs/heads/main') ||
45
+ (github.event_name == 'workflow_run' && needs.check-ci.outputs.ci-success == 'true')
46
+ needs:
47
+ - check-ci
48
+ outputs:
49
+ should-publish: ${{ steps.version-update.outputs.should-publish }}
50
+ current-version: ${{ steps.version-update.outputs.current-version }}
51
+ version-updated: ${{ steps.version-update.outputs.version-updated }}
52
+
53
+ steps:
54
+ - name: Checkout code
55
+ uses: actions/checkout@v4
56
+ with:
57
+ token: ${{ secrets.GITHUB_TOKEN }}
58
+ fetch-depth: 0
59
+
60
+ - name: Setup Node.js environment
61
+ uses: ./.github/actions/setup-runtime
62
+ with:
63
+ runtime: node
64
+
65
+ - name: Configure Git
66
+ run: |
67
+ git config user.name "github-actions[bot]"
68
+ git config user.email "github-actions[bot]@users.noreply.github.com"
69
+
70
+ - name: Auto version update and check
71
+ id: version-update
72
+ run: |
73
+ CURRENT_VERSION=$(node -p "require('./package.json').version")
74
+ PUBLISHED_VERSION=$(npm view tylersong version 2>/dev/null || echo "0.0.0")
75
+
76
+ echo "Current version: $CURRENT_VERSION"
77
+ echo "Published version: $PUBLISHED_VERSION"
78
+
79
+ # Tag push는 항상 배포 (버전 체크만)
80
+ if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
81
+ echo "should-publish=true" >> $GITHUB_OUTPUT
82
+ echo "current-version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
83
+ echo "version-updated=false" >> $GITHUB_OUTPUT
84
+ echo "Tag push detected: will publish without version update"
85
+ exit 0
86
+ fi
87
+
88
+ # 이미 같은 버전이 배포되어 있으면 자동으로 버전 업데이트
89
+ if [ "$CURRENT_VERSION" == "$PUBLISHED_VERSION" ]; then
90
+ echo "Same version exists, auto-updating version..."
91
+
92
+ # 최근 커밋 메시지 분석하여 semantic versioning 적용
93
+ LAST_COMMIT_MSG=$(git log -1 --pretty=%B)
94
+ echo "Last commit: $LAST_COMMIT_MSG"
95
+
96
+ # 커밋 메시지에 따라 버전 업데이트 타입 결정
97
+ if echo "$LAST_COMMIT_MSG" | grep -qE "BREAKING CHANGE|feat!|fix!"; then
98
+ VERSION_TYPE="major"
99
+ elif echo "$LAST_COMMIT_MSG" | grep -qE "^feat(\(.+\))?:"; then
100
+ VERSION_TYPE="minor"
101
+ else
102
+ VERSION_TYPE="patch"
103
+ fi
104
+
105
+ echo "Detected version type: $VERSION_TYPE"
106
+
107
+ # package.json 버전 업데이트
108
+ npm version $VERSION_TYPE --no-git-tag-version
109
+ NEW_VERSION=$(node -p "require('./package.json').version")
110
+
111
+ # TypeScript 소스 코드의 하드코딩된 버전도 업데이트
112
+ if [ -f "src/index.ts" ]; then
113
+ sed -i.bak "s/program\.version(\".*\")/program.version(\"$NEW_VERSION\")/g" src/index.ts
114
+ rm -f src/index.ts.bak
115
+ fi
116
+
117
+ echo "Updated version to: $NEW_VERSION"
118
+ echo "current-version=$NEW_VERSION" >> $GITHUB_OUTPUT
119
+ echo "should-publish=true" >> $GITHUB_OUTPUT
120
+ echo "version-updated=true" >> $GITHUB_OUTPUT
121
+
122
+ # 변경사항 커밋 및 푸시
123
+ git add package.json package-lock.json src/index.ts
124
+ git commit -m "chore: bump version to v$NEW_VERSION [skip ci]"
125
+ git push origin main
126
+
127
+ else
128
+ echo "Version already different: will publish"
129
+ echo "current-version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
130
+ echo "should-publish=true" >> $GITHUB_OUTPUT
131
+ echo "version-updated=false" >> $GITHUB_OUTPUT
132
+ fi
133
+
134
+ version-check:
135
+ name: Check Version Changes (for tags)
136
+ runs-on: ubuntu-latest
137
+ if: startsWith(github.ref, 'refs/tags/v')
138
+ outputs:
139
+ should-publish: ${{ steps.version-check.outputs.should-publish }}
140
+ current-version: ${{ steps.version-check.outputs.current-version }}
141
+
142
+ steps:
143
+ - name: Checkout code
144
+ uses: actions/checkout@v4
145
+
146
+ - name: Setup Node.js environment
147
+ uses: ./.github/actions/setup-runtime
148
+ with:
149
+ runtime: node
150
+
151
+ - name: Check version for tag
152
+ id: version-check
153
+ run: |
154
+ CURRENT_VERSION=$(node -p "require('./package.json').version")
155
+ echo "current-version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
156
+ echo "should-publish=true" >> $GITHUB_OUTPUT
157
+ echo "Tag push detected: will publish"
158
+
159
+ publish:
160
+ name: Publish Package
161
+ runs-on: ubuntu-latest
162
+ needs: [auto-version, version-check]
163
+ if: |
164
+ always() &&
165
+ (
166
+ (needs.auto-version.outputs.should-publish == 'true') ||
167
+ (needs.version-check.outputs.should-publish == 'true')
168
+ )
169
+
170
+ steps:
171
+ - name: Checkout code
172
+ uses: actions/checkout@v4
173
+
174
+ - name: Setup Node.js for publishing
175
+ uses: actions/setup-node@v4
176
+ with:
177
+ node-version: "20.x"
178
+ registry-url: "https://registry.npmjs.org/"
179
+ cache: "npm"
180
+
181
+ - name: Install dependencies
182
+ run: npm ci
183
+
184
+ - name: Build for publishing
185
+ run: npm run build
186
+
187
+ - name: Verify build artifacts
188
+ run: |
189
+ ls -la dist/
190
+ test -f dist/index.js || (echo "Build artifact missing!" && exit 1)
191
+
192
+ - name: Publish to NPM (Dry Run)
193
+ if: github.event_name == 'pull_request'
194
+ run: npm publish --dry-run
195
+ env:
196
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
197
+
198
+ - name: Publish to NPM
199
+ if: github.event_name != 'pull_request'
200
+ run: npm publish
201
+ env:
202
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
203
+
204
+ - name: Create GitHub Release
205
+ if: startsWith(github.ref, 'refs/tags/v')
206
+ uses: actions/github-script@v7
207
+ with:
208
+ github-token: ${{ secrets.GITHUB_TOKEN }}
209
+ script: |
210
+ const { owner, repo } = context.repo;
211
+ const tagName = context.ref.replace('refs/tags/', '');
212
+ const version = '${{ needs.auto-version.outputs.current-version || needs.version-check.outputs.current-version }}';
213
+
214
+ await github.rest.repos.createRelease({
215
+ owner,
216
+ repo,
217
+ tag_name: tagName,
218
+ name: `Release v${version}`,
219
+ body: `🚀 **tylersong CLI v${version}**
220
+
221
+ ### 설치
222
+ \`\`\`bash
223
+ npx tylersong
224
+ \`\`\`
225
+
226
+ ### 변경사항
227
+ 이 릴리스의 전체 변경사항은 [커밋 히스토리](https://github.com/${owner}/${repo}/commits/v${version})를 확인해주세요.`,
228
+ draft: false,
229
+ prerelease: false
230
+ });
231
+
232
+ notify:
233
+ name: Notification
234
+ runs-on: ubuntu-latest
235
+ needs: [publish, auto-version, version-check]
236
+ if: |
237
+ always() &&
238
+ (
239
+ (needs.auto-version.outputs.should-publish == 'true') ||
240
+ (needs.version-check.outputs.should-publish == 'true')
241
+ )
242
+
243
+ steps:
244
+ - name: Checkout code
245
+ uses: actions/checkout@v4
246
+
247
+ - name: Determine publish status
248
+ id: status
249
+ run: |
250
+ if [ "${{ needs.publish.result }}" == "success" ]; then
251
+ echo "status=success" >> $GITHUB_OUTPUT
252
+ echo "title=패키지 배포 성공 🚀" >> $GITHUB_OUTPUT
253
+ echo "description=tylersong v${{ needs.auto-version.outputs.current-version || needs.version-check.outputs.current-version }}이 NPM에 성공적으로 배포되었습니다!" >> $GITHUB_OUTPUT
254
+ else
255
+ echo "status=failure" >> $GITHUB_OUTPUT
256
+ echo "title=패키지 배포 실패 💥" >> $GITHUB_OUTPUT
257
+ echo "description=tylersong v${{ needs.auto-version.outputs.current-version || needs.version-check.outputs.current-version }} 배포 중 오류가 발생했습니다." >> $GITHUB_OUTPUT
258
+ fi
259
+
260
+ - name: Create fields JSON
261
+ id: fields
262
+ run: |
263
+ RELEASE_TYPE="${{ startsWith(github.ref, 'refs/tags/v') && 'Tag Release' || 'Auto Deploy' }}"
264
+ FIELDS=$(cat << EOF
265
+ [
266
+ {
267
+ "name": "버전",
268
+ "value": "v${{ needs.auto-version.outputs.current-version || needs.version-check.outputs.current-version }}",
269
+ "inline": true
270
+ },
271
+ {
272
+ "name": "배포 타입",
273
+ "value": "$RELEASE_TYPE",
274
+ "inline": true
275
+ },
276
+ {
277
+ "name": "브랜치/태그",
278
+ "value": "${{ github.ref_name }}",
279
+ "inline": true
280
+ },
281
+ {
282
+ "name": "NPM",
283
+ "value": "[tylersong 패키지](https://www.npmjs.com/package/tylersong)",
284
+ "inline": false
285
+ },
286
+ {
287
+ "name": "설치 명령어",
288
+ "value": "\`npx tylersong\`",
289
+ "inline": false
290
+ },
291
+ {
292
+ "name": "배포자",
293
+ "value": "${{ github.actor }}",
294
+ "inline": true
295
+ }
296
+ ]
297
+ EOF
298
+ )
299
+ echo "fields<<EOF" >> $GITHUB_OUTPUT
300
+ echo "$FIELDS" >> $GITHUB_OUTPUT
301
+ echo "EOF" >> $GITHUB_OUTPUT
302
+
303
+ - name: Send Discord notification
304
+ uses: ./.github/actions/discord-notify
305
+ with:
306
+ webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
307
+ status: ${{ steps.status.outputs.status }}
308
+ title: ${{ steps.status.outputs.title }}
309
+ description: ${{ steps.status.outputs.description }}
310
+ fields: ${{ steps.fields.outputs.fields }}
311
+
312
+ - name: Console output
313
+ run: |
314
+ if [ "${{ needs.publish.result }}" == "success" ]; then
315
+ echo "✅ Package v${{ needs.auto-version.outputs.current-version || needs.version-check.outputs.current-version }} published successfully!"
316
+ echo "📦 NPM: https://www.npmjs.com/package/tylersong"
317
+ else
318
+ echo "❌ Package publish failed!"
319
+ exit 1
320
+ fi