cistack 5.5.0 → 6.1.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 (63) hide show
  1. package/.github/dependabot.yml +42 -0
  2. package/.github/workflows/ci.yml +2 -1
  3. package/.github/workflows/pipeline.yml +250 -0
  4. package/README.md +4 -0
  5. package/package.json +7 -2
  6. package/product-site/.github/dependabot.yml +27 -0
  7. package/product-site/.github/workflows/pipeline.yml +202 -0
  8. package/product-site/.lighthouserc.json +22 -0
  9. package/product-site/README.md +1 -0
  10. package/product-site/app/[lang]/layout.tsx +95 -0
  11. package/product-site/app/[lang]/page.tsx +19 -0
  12. package/product-site/app/favicon.ico +0 -0
  13. package/product-site/app/globals.css +228 -0
  14. package/product-site/app/manifest.ts +20 -0
  15. package/product-site/app/robots.ts +12 -0
  16. package/product-site/app/sitemap.ts +12 -0
  17. package/product-site/components/CanvasText.tsx +219 -0
  18. package/product-site/components/CopyButton.tsx +85 -0
  19. package/product-site/components/HomeClient.tsx +985 -0
  20. package/product-site/components/InstallToggle.tsx +87 -0
  21. package/product-site/components/MotionRevealClient.tsx +53 -0
  22. package/product-site/components/TerminalCard.tsx +61 -0
  23. package/product-site/components/TerminalCardMotion.tsx +317 -0
  24. package/product-site/components/ui/accordion.tsx +74 -0
  25. package/product-site/components/ui/badge.tsx +52 -0
  26. package/product-site/components/ui/button.tsx +60 -0
  27. package/product-site/components/ui/card.tsx +103 -0
  28. package/product-site/components/ui/checkbox.tsx +29 -0
  29. package/product-site/components/ui/separator.tsx +25 -0
  30. package/product-site/components/ui/table.tsx +116 -0
  31. package/product-site/components/ui/tabs.tsx +82 -0
  32. package/product-site/components.json +25 -0
  33. package/product-site/dictionaries/br.json +137 -0
  34. package/product-site/dictionaries/cn.json +137 -0
  35. package/product-site/dictionaries/de.json +137 -0
  36. package/product-site/dictionaries/en.json +137 -0
  37. package/product-site/dictionaries/es.json +182 -0
  38. package/product-site/dictionaries/fr.json +182 -0
  39. package/product-site/dictionaries/pt.json +137 -0
  40. package/product-site/eslint.config.mjs +18 -0
  41. package/product-site/lib/dictionaries.ts +18 -0
  42. package/product-site/lib/dictionary-types.ts +3 -0
  43. package/product-site/lib/utils.ts +6 -0
  44. package/product-site/middleware.ts +39 -0
  45. package/product-site/next.config.mjs +14 -0
  46. package/product-site/package-lock.json +14201 -0
  47. package/product-site/package.json +41 -0
  48. package/product-site/postcss.config.mjs +7 -0
  49. package/product-site/public/file.svg +1 -0
  50. package/product-site/public/globe.svg +1 -0
  51. package/product-site/public/next.svg +1 -0
  52. package/product-site/public/og-image.png +0 -0
  53. package/product-site/public/vercel.svg +1 -0
  54. package/product-site/public/window.svg +1 -0
  55. package/product-site/scripts/sync-i18n.mjs +58 -0
  56. package/product-site/tsconfig.json +34 -0
  57. package/product-site/types/negotiator.d.ts +14 -0
  58. package/product-site/vercel.json +5 -0
  59. package/src/analyzers/codebase.js +53 -0
  60. package/src/detectors/framework.js +6 -6
  61. package/src/detectors/testing.js +37 -5
  62. package/src/generators/workflow.js +3 -63
  63. package/tests/run.js +38 -63
@@ -0,0 +1,42 @@
1
+ # Generated by cistack — https://github.com/cistack
2
+ # Dependabot configuration — auto-update dependencies weekly
3
+
4
+ version: 2
5
+
6
+ updates:
7
+ - package-ecosystem: npm
8
+ directory: /
9
+ schedule:
10
+ interval: weekly
11
+ day: monday
12
+ open-pull-requests-limit: 10
13
+ groups:
14
+ root-dev-dependencies:
15
+ dependency-type: development
16
+ update-types:
17
+ - minor
18
+ - patch
19
+
20
+ - package-ecosystem: npm
21
+ directory: /product-site
22
+ schedule:
23
+ interval: weekly
24
+ day: monday
25
+ open-pull-requests-limit: 10
26
+ groups:
27
+ product-site-dev-dependencies:
28
+ dependency-type: development
29
+ update-types:
30
+ - minor
31
+ - patch
32
+
33
+ - package-ecosystem: github-actions
34
+ directory: /
35
+ schedule:
36
+ interval: weekly
37
+ day: monday
38
+ open-pull-requests-limit: 10
39
+ groups:
40
+ github-actions-updates:
41
+ patterns:
42
+ - '*'
@@ -13,7 +13,7 @@ concurrency:
13
13
 
14
14
  jobs:
15
15
  test:
16
- name: Node ${{ matrix.node-version }}
16
+ name: CLI · Node ${{ matrix.node-version }}
17
17
  runs-on: ubuntu-latest
18
18
  strategy:
19
19
  fail-fast: false
@@ -32,6 +32,7 @@ jobs:
32
32
  with:
33
33
  node-version: ${{ matrix.node-version }}
34
34
  cache: npm
35
+ cache-dependency-path: package-lock.json
35
36
 
36
37
  - name: Install dependencies
37
38
  run: npm ci
@@ -0,0 +1,250 @@
1
+ # Generated by cistack v6.0.0 — https://github.com/cistack
2
+ # Unified Pipeline: ci, deploy
3
+ # Required secrets: VERCEL_TOKEN, VERCEL_ORG_ID, VERCEL_PROJECT_ID
4
+ # Add these at: Settings → Secrets and Variables → Actions
5
+ # Dependabot remains in .github/dependabot.yml
6
+
7
+ name: Pipeline
8
+
9
+ 'on':
10
+ push:
11
+ branches:
12
+ - main
13
+ pull_request:
14
+ branches:
15
+ - main
16
+ workflow_dispatch: {}
17
+
18
+ concurrency:
19
+ group: ${{ github.workflow }}-${{ github.ref }}
20
+ cancel-in-progress: true
21
+
22
+ jobs:
23
+ ci_lint:
24
+ name: 🔍 Lint & Format
25
+ runs-on: ubuntu-latest
26
+ if: >-
27
+ (github.event_name == 'push' && (github.ref_name == 'main')) || (github.event_name == 'pull_request' &&
28
+ (github.base_ref == 'main'))
29
+ env:
30
+ CI: 'true'
31
+ steps:
32
+ - name: Checkout code
33
+ uses: actions/checkout@v4
34
+ with:
35
+ fetch-depth: 0
36
+
37
+ - name: Set up Node.js
38
+ uses: actions/setup-node@v4
39
+ with:
40
+ node-version: '20'
41
+ cache: npm
42
+ cache-dependency-path: product-site/package-lock.json
43
+
44
+ - name: Install dependencies
45
+ working-directory: product-site
46
+ run: npm ci
47
+
48
+ - name: Lint
49
+ working-directory: product-site
50
+ run: npm run lint -- .
51
+
52
+ - name: Typecheck
53
+ working-directory: product-site
54
+ run: npm run typecheck
55
+
56
+ ci_build:
57
+ name: 🏗️ Build
58
+ runs-on: ubuntu-latest
59
+ needs:
60
+ - ci_lint
61
+ if: >-
62
+ (github.event_name == 'push' && (github.ref_name == 'main')) || (github.event_name == 'pull_request' &&
63
+ (github.base_ref == 'main'))
64
+ env:
65
+ NODE_ENV: production
66
+ steps:
67
+ - name: Checkout code
68
+ uses: actions/checkout@v4
69
+ with:
70
+ fetch-depth: 0
71
+
72
+ - name: Set up Node.js
73
+ uses: actions/setup-node@v4
74
+ with:
75
+ node-version: '20'
76
+ cache: npm
77
+ cache-dependency-path: product-site/package-lock.json
78
+
79
+ - name: Install dependencies
80
+ working-directory: product-site
81
+ run: npm ci
82
+
83
+ - name: Build
84
+ working-directory: product-site
85
+ run: npm run build:ci
86
+ env:
87
+ NODE_ENV: production
88
+
89
+ - name: Upload build artifact
90
+ uses: actions/upload-artifact@v4
91
+ with:
92
+ name: product-site-build-output
93
+ path: product-site/.next
94
+ retention-days: 1
95
+
96
+ deploy_deploy:
97
+ name: 🚀 Deploy → Vercel (Production)
98
+ runs-on: ubuntu-latest
99
+ environment: production
100
+ needs: [ci_build]
101
+ if: >-
102
+ ((github.event_name == 'push' && (github.ref_name == 'main')) || (github.event_name == 'pull_request' &&
103
+ (github.base_ref == 'main')) || github.event_name == 'workflow_dispatch') && (github.event_name == 'push' ||
104
+ github.event_name == 'workflow_dispatch')
105
+ steps:
106
+ - name: Checkout code
107
+ uses: actions/checkout@v4
108
+ with:
109
+ fetch-depth: 0
110
+
111
+ - name: Set up Node.js
112
+ uses: actions/setup-node@v4
113
+ with:
114
+ node-version: '20'
115
+ cache: npm
116
+ cache-dependency-path: product-site/package-lock.json
117
+
118
+ - name: Install dependencies
119
+ working-directory: product-site
120
+ run: npm ci
121
+
122
+ - name: Install Vercel CLI
123
+ run: npm install -g vercel
124
+
125
+ - name: Validate Vercel credentials
126
+ run: >-
127
+ test -n "$VERCEL_TOKEN" || (echo "Missing VERCEL_TOKEN secret. Add it in GitHub Actions secrets, or Dependabot
128
+ secrets for Dependabot PRs." && exit 1)
129
+
130
+ test -n "$VERCEL_ORG_ID" || (echo "Missing VERCEL_ORG_ID secret. Add it in GitHub Actions secrets, or
131
+ Dependabot secrets for Dependabot PRs." && exit 1)
132
+
133
+ test -n "$VERCEL_PROJECT_ID" || (echo "Missing VERCEL_PROJECT_ID secret. Add it in GitHub Actions secrets, or
134
+ Dependabot secrets for Dependabot PRs." && exit 1)
135
+ env:
136
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
137
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
138
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
139
+
140
+ - name: Pull Vercel environment
141
+ working-directory: product-site
142
+ run: vercel pull --yes --environment=production --token="$VERCEL_TOKEN"
143
+ env:
144
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
145
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
146
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
147
+
148
+ - name: Build project
149
+ working-directory: product-site
150
+ run: vercel build --prod --token="$VERCEL_TOKEN"
151
+ env:
152
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
153
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
154
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
155
+
156
+ - name: Deploy to Vercel
157
+ id: deploy
158
+ working-directory: product-site
159
+ run: >-
160
+ vercel deploy --prebuilt --prod --token="$VERCEL_TOKEN" > deployment_url.txt && echo "DEPLOYMENT_URL=$(cat
161
+ deployment_url.txt)" >> $GITHUB_ENV
162
+ env:
163
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
164
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
165
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
166
+
167
+ deploy_preview:
168
+ name: ✨ Deploy → Vercel (Preview)
169
+ runs-on: ubuntu-latest
170
+ environment: preview
171
+ needs: [ci_build]
172
+ if: >-
173
+ ((github.event_name == 'push' && (github.ref_name == 'main')) || (github.event_name == 'pull_request' &&
174
+ (github.base_ref == 'main')) || github.event_name == 'workflow_dispatch') && (github.event_name == 'pull_request'
175
+ && github.event.pull_request.head.repo.full_name == github.repository)
176
+ steps:
177
+ - name: Checkout code
178
+ uses: actions/checkout@v4
179
+ with:
180
+ fetch-depth: 0
181
+
182
+ - name: Set up Node.js
183
+ uses: actions/setup-node@v4
184
+ with:
185
+ node-version: '20'
186
+ cache: npm
187
+ cache-dependency-path: product-site/package-lock.json
188
+
189
+ - name: Install dependencies
190
+ working-directory: product-site
191
+ run: npm ci
192
+
193
+ - name: Install Vercel CLI
194
+ run: npm install -g vercel
195
+
196
+ - name: Validate Vercel credentials
197
+ run: >-
198
+ test -n "$VERCEL_TOKEN" || (echo "Missing VERCEL_TOKEN secret. Add it in GitHub Actions secrets, or Dependabot
199
+ secrets for Dependabot PRs." && exit 1)
200
+
201
+ test -n "$VERCEL_ORG_ID" || (echo "Missing VERCEL_ORG_ID secret. Add it in GitHub Actions secrets, or
202
+ Dependabot secrets for Dependabot PRs." && exit 1)
203
+
204
+ test -n "$VERCEL_PROJECT_ID" || (echo "Missing VERCEL_PROJECT_ID secret. Add it in GitHub Actions secrets, or
205
+ Dependabot secrets for Dependabot PRs." && exit 1)
206
+ env:
207
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
208
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
209
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
210
+
211
+ - name: Pull Vercel environment
212
+ working-directory: product-site
213
+ run: vercel pull --yes --environment=preview --token="$VERCEL_TOKEN"
214
+ env:
215
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
216
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
217
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
218
+
219
+ - name: Build project
220
+ working-directory: product-site
221
+ run: vercel build --token="$VERCEL_TOKEN"
222
+ env:
223
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
224
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
225
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
226
+
227
+ - name: Deploy to Vercel
228
+ id: deploy
229
+ working-directory: product-site
230
+ run: >-
231
+ vercel deploy --prebuilt --token="$VERCEL_TOKEN" > deployment_url.txt && echo "DEPLOYMENT_URL=$(cat
232
+ deployment_url.txt)" >> $GITHUB_ENV
233
+ env:
234
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
235
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
236
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
237
+
238
+ - name: Comment PR
239
+ if: always() && github.actor != 'dependabot[bot]'
240
+ uses: actions/github-script@v7
241
+ with:
242
+ script: |-
243
+ const deploymentUrl = process.env.DEPLOYMENT_URL;
244
+ if (!deploymentUrl) return;
245
+ github.rest.issues.createComment({
246
+ issue_number: context.issue.number,
247
+ owner: context.repo.owner,
248
+ repo: context.repo.repo,
249
+ body: '🚀 **Deployment Preview Ready!**\n\n[View Preview](' + deploymentUrl + ')'
250
+ });
package/README.md CHANGED
@@ -28,6 +28,10 @@ npm install -g cistack
28
28
 
29
29
  `cistack` supports Node.js 16+, and the project itself is continuously verified on Node.js 18, 20, and 22 in GitHub Actions.
30
30
 
31
+ ## Product site
32
+
33
+ A standalone Next.js marketing app for the product lives in [product-site](/Users/edwinvs/Desktop/NPM/ciflow/product-site/README.md).
34
+
31
35
  ## CLI Usage
32
36
 
33
37
  ### Generate workflows
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cistack",
3
- "version": "5.5.0",
3
+ "version": "6.1.0",
4
4
  "description": "Automatically generate GitHub Actions CI/CD pipelines by analysing your codebase",
5
5
  "main": "src/index.js",
6
6
  "types": "index.d.ts",
@@ -10,7 +10,12 @@
10
10
  "scripts": {
11
11
  "start": "node bin/ciflow.js",
12
12
  "test": "node tests/run.js",
13
- "test:smoke": "node bin/ciflow.js generate --path . --dry-run --no-prompt"
13
+ "test:smoke": "node bin/ciflow.js generate --path . --dry-run --no-prompt",
14
+ "site:dev": "npm --prefix product-site run dev",
15
+ "site:build": "npm --prefix product-site run build:ci",
16
+ "site:start": "npm --prefix product-site run start",
17
+ "site:lint": "npm --prefix product-site run lint -- .",
18
+ "site:typecheck": "npm --prefix product-site run typecheck"
14
19
  },
15
20
  "keywords": [
16
21
  "github-actions",
@@ -0,0 +1,27 @@
1
+ # Generated by cistack — https://github.com/cistack
2
+ # Dependabot configuration — auto-update dependencies weekly
3
+
4
+ version: 2
5
+ updates:
6
+ - package-ecosystem: npm
7
+ directory: /
8
+ schedule:
9
+ interval: weekly
10
+ day: monday
11
+ open-pull-requests-limit: 10
12
+ groups:
13
+ dev-dependencies:
14
+ dependency-type: development
15
+ update-types:
16
+ - minor
17
+ - patch
18
+ - package-ecosystem: github-actions
19
+ directory: /
20
+ schedule:
21
+ interval: weekly
22
+ day: monday
23
+ open-pull-requests-limit: 10
24
+ groups:
25
+ github-actions-updates:
26
+ patterns:
27
+ - '*'
@@ -0,0 +1,202 @@
1
+ # Generated by cistack v6.0.0 — https://github.com/cistack
2
+ # Unified Pipeline: ci, deploy
3
+ # Required secrets: VERCEL_TOKEN, VERCEL_ORG_ID, VERCEL_PROJECT_ID
4
+ # Add these at: Settings → Secrets and Variables → Actions
5
+ # Dependabot remains in .github/dependabot.yml
6
+
7
+ name: Pipeline
8
+ 'on':
9
+ push:
10
+ branches:
11
+ - main
12
+ pull_request:
13
+ branches:
14
+ - main
15
+ workflow_dispatch: {}
16
+ concurrency:
17
+ group: ${{ github.workflow }}-${{ github.ref }}
18
+ cancel-in-progress: true
19
+ jobs:
20
+ ci_lint:
21
+ name: 🔍 Lint & Format
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - name: Checkout code
25
+ uses: actions/checkout@v4
26
+ with:
27
+ fetch-depth: 0
28
+ - name: Set up Node.js
29
+ uses: actions/setup-node@v4
30
+ with:
31
+ node-version: '20'
32
+ cache: npm
33
+ - name: Install dependencies
34
+ run: npm ci
35
+ - name: Lint
36
+ run: npm run lint
37
+ env:
38
+ CI: 'true'
39
+ if: >-
40
+ (github.event_name == 'push' && (github.ref_name == 'main')) || (github.event_name == 'pull_request' &&
41
+ (github.base_ref == 'main'))
42
+ ci_build:
43
+ name: 🏗️ Build
44
+ runs-on: ubuntu-latest
45
+ needs:
46
+ - ci_lint
47
+ steps:
48
+ - name: Checkout code
49
+ uses: actions/checkout@v4
50
+ with:
51
+ fetch-depth: 0
52
+ - name: Set up Node.js
53
+ uses: actions/setup-node@v4
54
+ with:
55
+ node-version: '20'
56
+ cache: npm
57
+ - name: Install dependencies
58
+ run: npm ci
59
+ - name: Build
60
+ run: npm run build
61
+ env:
62
+ NODE_ENV: production
63
+ - name: Upload build artifact
64
+ uses: actions/upload-artifact@v4
65
+ with:
66
+ name: build-output
67
+ path: .next
68
+ retention-days: 1
69
+ env:
70
+ NODE_ENV: production
71
+ if: >-
72
+ (github.event_name == 'push' && (github.ref_name == 'main')) || (github.event_name == 'pull_request' &&
73
+ (github.base_ref == 'main'))
74
+ deploy_deploy:
75
+ name: 🚀 Deploy → Vercel (Production)
76
+ if: >-
77
+ ((github.event_name == 'push' && (github.ref_name == 'main')) || (github.event_name == 'pull_request' &&
78
+ (github.base_ref == 'main')) || github.event_name == 'workflow_dispatch') && (github.event_name == 'push' ||
79
+ github.event_name == 'workflow_dispatch')
80
+ runs-on: ubuntu-latest
81
+ environment: production
82
+ steps:
83
+ - name: Checkout code
84
+ uses: actions/checkout@v4
85
+ with:
86
+ fetch-depth: 0
87
+ - name: Set up Node.js
88
+ uses: actions/setup-node@v4
89
+ with:
90
+ node-version: '20'
91
+ cache: npm
92
+ - name: Install dependencies
93
+ run: npm ci
94
+ - name: Install Vercel CLI
95
+ run: npm install -g vercel
96
+ - name: Validate Vercel credentials
97
+ run: >-
98
+ test -n "$VERCEL_TOKEN" || (echo "Missing VERCEL_TOKEN secret. Add it in GitHub Actions secrets, or Dependabot
99
+ secrets for Dependabot PRs." && exit 1)
100
+
101
+ test -n "$VERCEL_ORG_ID" || (echo "Missing VERCEL_ORG_ID secret. Add it in GitHub Actions secrets, or
102
+ Dependabot secrets for Dependabot PRs." && exit 1)
103
+
104
+ test -n "$VERCEL_PROJECT_ID" || (echo "Missing VERCEL_PROJECT_ID secret. Add it in GitHub Actions secrets, or
105
+ Dependabot secrets for Dependabot PRs." && exit 1)
106
+ env:
107
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
108
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
109
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
110
+ - name: Pull Vercel environment
111
+ run: vercel pull --yes --environment=production --token="$VERCEL_TOKEN"
112
+ env:
113
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
114
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
115
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
116
+ - name: Build project
117
+ run: vercel build --prod --token="$VERCEL_TOKEN"
118
+ env:
119
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
120
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
121
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
122
+ - name: Deploy to Vercel
123
+ id: deploy
124
+ run: >-
125
+ vercel deploy --prebuilt --prod --token="$VERCEL_TOKEN" > deployment_url.txt && echo "DEPLOYMENT_URL=$(cat
126
+ deployment_url.txt)" >> $GITHUB_ENV
127
+ env:
128
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
129
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
130
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
131
+ deploy_preview:
132
+ name: ✨ Deploy → Vercel (Preview)
133
+ if: >-
134
+ ((github.event_name == 'push' && (github.ref_name == 'main')) || (github.event_name == 'pull_request' &&
135
+ (github.base_ref == 'main')) || github.event_name == 'workflow_dispatch') && (github.event_name == 'pull_request'
136
+ && github.event.pull_request.head.repo.full_name == github.repository)
137
+ runs-on: ubuntu-latest
138
+ environment: preview
139
+ steps:
140
+ - name: Checkout code
141
+ uses: actions/checkout@v4
142
+ with:
143
+ fetch-depth: 0
144
+ - name: Set up Node.js
145
+ uses: actions/setup-node@v4
146
+ with:
147
+ node-version: '20'
148
+ cache: npm
149
+ - name: Install dependencies
150
+ run: npm ci
151
+ - name: Install Vercel CLI
152
+ run: npm install -g vercel
153
+ - name: Validate Vercel credentials
154
+ run: >-
155
+ test -n "$VERCEL_TOKEN" || (echo "Missing VERCEL_TOKEN secret. Add it in GitHub Actions secrets, or Dependabot
156
+ secrets for Dependabot PRs." && exit 1)
157
+
158
+ test -n "$VERCEL_ORG_ID" || (echo "Missing VERCEL_ORG_ID secret. Add it in GitHub Actions secrets, or
159
+ Dependabot secrets for Dependabot PRs." && exit 1)
160
+
161
+ test -n "$VERCEL_PROJECT_ID" || (echo "Missing VERCEL_PROJECT_ID secret. Add it in GitHub Actions secrets, or
162
+ Dependabot secrets for Dependabot PRs." && exit 1)
163
+ env:
164
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
165
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
166
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
167
+ - name: Pull Vercel environment
168
+ run: vercel pull --yes --environment=preview --token="$VERCEL_TOKEN"
169
+ env:
170
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
171
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
172
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
173
+ - name: Build project
174
+ run: vercel build --token="$VERCEL_TOKEN"
175
+ env:
176
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
177
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
178
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
179
+ - name: Deploy to Vercel
180
+ id: deploy
181
+ run: >-
182
+ vercel deploy --prebuilt --token="$VERCEL_TOKEN" > deployment_url.txt && echo "DEPLOYMENT_URL=$(cat
183
+ deployment_url.txt)" >> $GITHUB_ENV
184
+ env:
185
+ VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
186
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
187
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
188
+ - name: Comment PR
189
+ if: always() && github.actor != 'dependabot[bot]'
190
+ uses: actions/github-script@v7
191
+ with:
192
+ script: |2-
193
+
194
+ const deploymentUrl = process.env.DEPLOYMENT_URL;
195
+ if (!deploymentUrl) return;
196
+ github.rest.issues.createComment({
197
+ issue_number: context.issue.number,
198
+ owner: context.repo.owner,
199
+ repo: context.repo.repo,
200
+ body: '🚀 **Deployment Preview Ready!**\n\n[View Preview](' + deploymentUrl + ')'
201
+ });
202
+
@@ -0,0 +1,22 @@
1
+ {
2
+ "ci": {
3
+ "collect": {
4
+ "numberOfRuns": 1,
5
+ "startServerCommand": "npm run start",
6
+ "startServerReadyPattern": "Ready",
7
+ "startServerReadyTimeout": 120000,
8
+ "url": [
9
+ "http://localhost:3000/en"
10
+ ]
11
+ },
12
+ "assert": {
13
+ "preset": "lighthouse:recommended",
14
+ "assertions": {
15
+ "forced-reflow-insight": "warn",
16
+ "legacy-javascript-insight": "warn",
17
+ "network-dependency-tree-insight": "warn",
18
+ "unused-javascript": "warn"
19
+ }
20
+ }
21
+ }
22
+ }
@@ -0,0 +1 @@
1
+ For codebase of cistack project navigate to https://github.com/edwinvakayil/cistack
@@ -0,0 +1,95 @@
1
+ import type { Metadata } from "next";
2
+ import { DM_Sans, Geist_Mono, Fira_Code } from "next/font/google";
3
+ import "../globals.css";
4
+
5
+ const dmSans = DM_Sans({
6
+ variable: "--font-dm-sans",
7
+ subsets: ["latin"],
8
+ });
9
+
10
+ const geistMono = Geist_Mono({
11
+ variable: "--font-geist-mono",
12
+ subsets: ["latin"],
13
+ });
14
+
15
+ const firaCode = Fira_Code({
16
+ variable: "--font-fira-code",
17
+ subsets: ["latin"],
18
+ });
19
+
20
+ export const metadata: Metadata = {
21
+ metadataBase: new URL("https://cistack.edwinvakayil.info"),
22
+ title: {
23
+ default: "cistack | Automated GitHub Actions for Your Stack",
24
+ template: "%s | cistack"
25
+ },
26
+ description: "cistack deep-scans your repository to generate production-ready GitHub Actions workflows instantly. Supports 30+ frameworks and 12+ platforms with security-first defaults.",
27
+ keywords: ["github actions", "automation", "ci/cd", "devops", "workflow generator", "nextjs", "docker", "vercel", "aws", "firebase", "automated testing", "pipeline automation", "github workflow", "devops tools"],
28
+ authors: [{ name: "Edwin Vakayil", url: "https://www.edwinvakayil.info/" }],
29
+ creator: "Edwin Vakayil",
30
+ publisher: "Edwin Vakayil",
31
+ alternates: {
32
+ canonical: "/",
33
+ },
34
+ openGraph: {
35
+ title: "cistack | Automated GitHub Actions for Your Stack",
36
+ description: "Deep-scans your codebase to generate production-grade CI/CD pipelines in seconds. Support for 30+ frameworks.",
37
+ url: "https://cistack.edwinvakayil.info",
38
+ siteName: "cistack",
39
+ images: [
40
+ {
41
+ url: "/og-image.png",
42
+ width: 1200,
43
+ height: 630,
44
+ alt: "cistack - Automated GitHub Actions",
45
+ },
46
+ ],
47
+ locale: "en_US",
48
+ type: "website",
49
+ },
50
+ twitter: {
51
+ card: "summary_large_image",
52
+ title: "cistack | Professional Workflow Automation",
53
+ description: "Generate hardened GitHub Actions for any stack instantly. 30+ frameworks supported.",
54
+ creator: "@edwinvakayil",
55
+ images: ["/og-image.png"],
56
+ },
57
+ robots: {
58
+ index: true,
59
+ follow: true,
60
+ googleBot: {
61
+ index: true,
62
+ follow: true,
63
+ 'max-video-preview': -1,
64
+ 'max-image-preview': 'large',
65
+ 'max-snippet': -1,
66
+ },
67
+ },
68
+ category: 'technology',
69
+ };
70
+
71
+ export async function generateStaticParams() {
72
+ return [{ lang: 'en' }, { lang: 'fr' }, { lang: 'es' }, { lang: 'pt' }, { lang: 'br' }, { lang: 'de' }, { lang: 'cn' }];
73
+ }
74
+
75
+ export default async function RootLayout({
76
+ children,
77
+ params
78
+ }: {
79
+ children: React.ReactNode;
80
+ params: Promise<{ lang: string }>;
81
+ }) {
82
+ const { lang } = await params;
83
+ return (
84
+ <html
85
+ lang={lang}
86
+ className={`${dmSans.variable} ${geistMono.variable} ${firaCode.variable} h-full antialiased`}
87
+ >
88
+ <head>
89
+ <link rel="preconnect" href="https://registry.npmjs.org" />
90
+ <link rel="preconnect" href="https://api.npmjs.org" />
91
+ </head>
92
+ <body className="min-h-full flex flex-col">{children}</body>
93
+ </html>
94
+ );
95
+ }