ai-inference-stepper 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.
- package/.env.example +169 -0
- package/.eslintrc.cjs +23 -0
- package/.github/workflows/ci.yml +51 -0
- package/.github/workflows/keep-alive.yml +22 -0
- package/.github/workflows/publish.yml +34 -0
- package/ARCHITECTURE.md +594 -0
- package/Dockerfile +16 -0
- package/LICENSE +28 -0
- package/README.md +261 -0
- package/dist/alerts/discord.d.ts +19 -0
- package/dist/alerts/discord.d.ts.map +1 -0
- package/dist/alerts/discord.js +70 -0
- package/dist/alerts/discord.js.map +1 -0
- package/dist/cache/redisCache.d.ts +45 -0
- package/dist/cache/redisCache.d.ts.map +1 -0
- package/dist/cache/redisCache.js +171 -0
- package/dist/cache/redisCache.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +251 -0
- package/dist/config.js.map +1 -0
- package/dist/fallback/templateFallback.d.ts +7 -0
- package/dist/fallback/templateFallback.d.ts.map +1 -0
- package/dist/fallback/templateFallback.js +29 -0
- package/dist/fallback/templateFallback.js.map +1 -0
- package/dist/index.d.ts +121 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +10 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +44 -0
- package/dist/logging.js.map +1 -0
- package/dist/metrics/metrics.d.ts +22 -0
- package/dist/metrics/metrics.d.ts.map +1 -0
- package/dist/metrics/metrics.js +78 -0
- package/dist/metrics/metrics.js.map +1 -0
- package/dist/providers/factory.d.ts +11 -0
- package/dist/providers/factory.d.ts.map +1 -0
- package/dist/providers/factory.js +52 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/hfSpace.adapter.d.ts +21 -0
- package/dist/providers/hfSpace.adapter.d.ts.map +1 -0
- package/dist/providers/hfSpace.adapter.js +110 -0
- package/dist/providers/hfSpace.adapter.js.map +1 -0
- package/dist/providers/httpTemplate.adapter.d.ts +42 -0
- package/dist/providers/httpTemplate.adapter.d.ts.map +1 -0
- package/dist/providers/httpTemplate.adapter.js +98 -0
- package/dist/providers/httpTemplate.adapter.js.map +1 -0
- package/dist/providers/promptBuilder.d.ts +34 -0
- package/dist/providers/promptBuilder.d.ts.map +1 -0
- package/dist/providers/promptBuilder.js +315 -0
- package/dist/providers/promptBuilder.js.map +1 -0
- package/dist/providers/provider.interface.d.ts +45 -0
- package/dist/providers/provider.interface.d.ts.map +1 -0
- package/dist/providers/provider.interface.js +47 -0
- package/dist/providers/provider.interface.js.map +1 -0
- package/dist/providers/specs.d.ts +18 -0
- package/dist/providers/specs.d.ts.map +1 -0
- package/dist/providers/specs.js +326 -0
- package/dist/providers/specs.js.map +1 -0
- package/dist/providers/unified.adapter.d.ts +37 -0
- package/dist/providers/unified.adapter.d.ts.map +1 -0
- package/dist/providers/unified.adapter.js +141 -0
- package/dist/providers/unified.adapter.js.map +1 -0
- package/dist/queue/producer.d.ts +30 -0
- package/dist/queue/producer.d.ts.map +1 -0
- package/dist/queue/producer.js +87 -0
- package/dist/queue/producer.js.map +1 -0
- package/dist/queue/worker.d.ts +9 -0
- package/dist/queue/worker.d.ts.map +1 -0
- package/dist/queue/worker.js +137 -0
- package/dist/queue/worker.js.map +1 -0
- package/dist/server/app.d.ts +4 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +394 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/start.d.ts +16 -0
- package/dist/server/start.d.ts.map +1 -0
- package/dist/server/start.js +45 -0
- package/dist/server/start.js.map +1 -0
- package/dist/stepper/orchestrator.d.ts +22 -0
- package/dist/stepper/orchestrator.d.ts.map +1 -0
- package/dist/stepper/orchestrator.js +333 -0
- package/dist/stepper/orchestrator.js.map +1 -0
- package/dist/types.d.ts +216 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/redaction.d.ts +9 -0
- package/dist/utils/redaction.d.ts.map +1 -0
- package/dist/utils/redaction.js +41 -0
- package/dist/utils/redaction.js.map +1 -0
- package/dist/utils/safeRequest.d.ts +38 -0
- package/dist/utils/safeRequest.d.ts.map +1 -0
- package/dist/utils/safeRequest.js +104 -0
- package/dist/utils/safeRequest.js.map +1 -0
- package/dist/validation/report.schema.d.ts +48 -0
- package/dist/validation/report.schema.d.ts.map +1 -0
- package/dist/validation/report.schema.js +72 -0
- package/dist/validation/report.schema.js.map +1 -0
- package/dist/webhooks/delivery.d.ts +31 -0
- package/dist/webhooks/delivery.d.ts.map +1 -0
- package/dist/webhooks/delivery.js +102 -0
- package/dist/webhooks/delivery.js.map +1 -0
- package/docs/assets/architecture.png +0 -0
- package/package.json +75 -0
- package/render.yaml +25 -0
- package/src/alerts/README.md +25 -0
- package/src/alerts/discord.ts +86 -0
- package/src/cache/How redis caching works in package stepper.md +971 -0
- package/src/cache/README.md +51 -0
- package/src/cache/redisCache.ts +194 -0
- package/src/ci/deploy.sh +36 -0
- package/src/cli.ts +9 -0
- package/src/config.ts +265 -0
- package/src/fallback/templateFallback.ts +32 -0
- package/src/index.ts +246 -0
- package/src/logging.ts +46 -0
- package/src/metrics/README.md +24 -0
- package/src/metrics/metrics.ts +84 -0
- package/src/providers/How the providers interact.md +121 -0
- package/src/providers/README.md +121 -0
- package/src/providers/factory.ts +57 -0
- package/src/providers/hfSpace.adapter.ts +119 -0
- package/src/providers/httpTemplate.adapter.ts +138 -0
- package/src/providers/promptBuilder.ts +330 -0
- package/src/providers/provider.interface.ts +73 -0
- package/src/providers/specs.ts +366 -0
- package/src/providers/unified.adapter.ts +172 -0
- package/src/queue/How queue works in package stepper.md +149 -0
- package/src/queue/README.md +41 -0
- package/src/queue/producer.ts +108 -0
- package/src/queue/worker.ts +170 -0
- package/src/server/app.ts +451 -0
- package/src/server/start.ts +68 -0
- package/src/stepper/Dockerfile +48 -0
- package/src/stepper/How orchestrator works in package stepper.md +746 -0
- package/src/stepper/README.md +43 -0
- package/src/stepper/orchestrator.ts +437 -0
- package/src/types.ts +238 -0
- package/src/utils/redaction.ts +50 -0
- package/src/utils/safeRequest.ts +140 -0
- package/src/validation/README.md +25 -0
- package/src/validation/report.schema.ts +96 -0
- package/src/webhooks/delivery.ts +162 -0
- package/tests/integration/full-flow.test.ts +192 -0
- package/tests/unit/alerts/discord.test.ts +119 -0
- package/tests/unit/cache.test.ts +87 -0
- package/tests/unit/orchestrator-fallback.test.ts +92 -0
- package/tests/unit/orchestrator.test.ts +105 -0
- package/tests/unit/providers/factory.test.ts +161 -0
- package/tests/unit/providers/unified.adapter.test.ts +206 -0
- package/tests/unit/utils/redaction.test.ts +140 -0
- package/tests/unit/utils/safeRequest.test.ts +164 -0
- package/tsconfig.json +26 -0
package/.env.example
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Node environment
|
|
2
|
+
NODE_ENV=development
|
|
3
|
+
|
|
4
|
+
# Server configuration
|
|
5
|
+
PORT=3001
|
|
6
|
+
LOG_LEVEL=debug
|
|
7
|
+
# Trust proxy for proper IP detection (1=single proxy, true=any, or specific IPs)
|
|
8
|
+
# Required when behind nginx, ELB, Cloudflare, etc.
|
|
9
|
+
TRUST_PROXY=1
|
|
10
|
+
|
|
11
|
+
# Redis configuration
|
|
12
|
+
REDIS_URL=redis://localhost:6379
|
|
13
|
+
REDIS_KEY_PREFIX=stepper:
|
|
14
|
+
|
|
15
|
+
# Cache configuration
|
|
16
|
+
CACHE_TTL_SECONDS=604800
|
|
17
|
+
CACHE_STALE_THRESHOLD=86400
|
|
18
|
+
CACHE_STALE_WHILE_REVALIDATE=true
|
|
19
|
+
|
|
20
|
+
# Queue configuration
|
|
21
|
+
QUEUE_NAME=report-generation
|
|
22
|
+
QUEUE_CONCURRENCY=5
|
|
23
|
+
|
|
24
|
+
# Webhook configuration
|
|
25
|
+
WEBHOOK_ENABLED=true
|
|
26
|
+
# Must match API's WEBHOOK_SECRET - Generate with: openssl rand -hex 32
|
|
27
|
+
WEBHOOK_SECRET=your-webhook-secret-here
|
|
28
|
+
WEBHOOK_MAX_RETRIES=3
|
|
29
|
+
WEBHOOK_RETRY_DELAY_MS=5000
|
|
30
|
+
|
|
31
|
+
# Retry configuration
|
|
32
|
+
RETRY_MAX_ATTEMPTS=3
|
|
33
|
+
RETRY_BASE_DELAY_MS=500
|
|
34
|
+
RETRY_MAX_JITTER_MS=300
|
|
35
|
+
RETRY_RATE_LIMIT_FALLBACK=7200
|
|
36
|
+
|
|
37
|
+
# Circuit breaker configuration
|
|
38
|
+
CIRCUIT_FAILURE_THRESHOLD=5
|
|
39
|
+
CIRCUIT_WINDOW_SECONDS=300
|
|
40
|
+
CIRCUIT_COOLDOWN_SECONDS=300
|
|
41
|
+
|
|
42
|
+
# Security - Sensitive Data Redaction
|
|
43
|
+
REDACT_BEFORE_SEND=true
|
|
44
|
+
|
|
45
|
+
# Security - CORS (Cross-Origin Resource Sharing)
|
|
46
|
+
CORS_ENABLED=true
|
|
47
|
+
CORS_ALLOWED_ORIGINS=https://yourdomain.com,https://app.yourdomain.com
|
|
48
|
+
CORS_ALLOW_CREDENTIALS=false
|
|
49
|
+
|
|
50
|
+
# Security - Rate Limiting
|
|
51
|
+
RATE_LIMIT_ENABLED=true
|
|
52
|
+
RATE_LIMIT_WINDOW_MS=900000
|
|
53
|
+
RATE_LIMIT_MAX_REQUESTS=100
|
|
54
|
+
RATE_LIMIT_MAX_PER_USER=50
|
|
55
|
+
RATE_LIMIT_SKIP_HEALTH=true
|
|
56
|
+
|
|
57
|
+
# Security - Helmet (Security Headers)
|
|
58
|
+
HELMET_ENABLED=true
|
|
59
|
+
|
|
60
|
+
# Security - API Key Authentication
|
|
61
|
+
API_KEY_ENABLED=false
|
|
62
|
+
API_KEY_HEADER=x-api-key
|
|
63
|
+
STEPPER_API_KEY=your_secret_api_key_here
|
|
64
|
+
API_KEY_SKIP_HEALTH=true
|
|
65
|
+
|
|
66
|
+
# Alerts (optional)
|
|
67
|
+
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/your_webhook_url
|
|
68
|
+
|
|
69
|
+
# --- Provider Configurations ---
|
|
70
|
+
|
|
71
|
+
# Hugging Face Space
|
|
72
|
+
HF_SPACE_ENABLED=false
|
|
73
|
+
HF_SPACE_URL=https://your-space-name.hf.space
|
|
74
|
+
HF_SPACE_API_KEY=your_hf_api_key_here
|
|
75
|
+
HF_SPACE_RPS=3
|
|
76
|
+
HF_SPACE_CONCURRENCY=1
|
|
77
|
+
HF_SPACE_TIMEOUT=30000
|
|
78
|
+
|
|
79
|
+
# Google Gemini
|
|
80
|
+
GEMINI_ENABLED=false
|
|
81
|
+
GEMINI_API_KEY=your_gemini_api_key_here
|
|
82
|
+
GEMINI_BASE_URL=https://generativelanguage.googleapis.com
|
|
83
|
+
GEMINI_MODEL=gemini-pro
|
|
84
|
+
GEMINI_RPS=10
|
|
85
|
+
GEMINI_CONCURRENCY=4
|
|
86
|
+
GEMINI_TIMEOUT=15000
|
|
87
|
+
|
|
88
|
+
# OpenAI
|
|
89
|
+
OPENAI_ENABLED=false
|
|
90
|
+
OPENAI_API_KEY=your_openai_key_here
|
|
91
|
+
OPENAI_BASE_URL=https://api.openai.com
|
|
92
|
+
OPENAI_MODEL=gpt-4-turbo-preview
|
|
93
|
+
OPENAI_TIMEOUT=30000
|
|
94
|
+
OPENAI_RPS=5
|
|
95
|
+
OPENAI_CONCURRENCY=2
|
|
96
|
+
|
|
97
|
+
# Anthropic Claude
|
|
98
|
+
ANTHROPIC_ENABLED=false
|
|
99
|
+
ANTHROPIC_API_KEY=your_anthropic_key_here
|
|
100
|
+
ANTHROPIC_BASE_URL=https://api.anthropic.com
|
|
101
|
+
ANTHROPIC_MODEL=claude-3-5-sonnet-20241022
|
|
102
|
+
ANTHROPIC_TIMEOUT=30000
|
|
103
|
+
ANTHROPIC_RPS=5
|
|
104
|
+
ANTHROPIC_CONCURRENCY=2
|
|
105
|
+
|
|
106
|
+
# Cohere
|
|
107
|
+
COHERE_ENABLED=false
|
|
108
|
+
COHERE_API_KEY=your_cohere_key_here
|
|
109
|
+
COHERE_BASE_URL=https://api.cohere.ai
|
|
110
|
+
COHERE_MODEL=command-r-plus
|
|
111
|
+
COHERE_TIMEOUT=20000
|
|
112
|
+
COHERE_RPS=5
|
|
113
|
+
COHERE_CONCURRENCY=2
|
|
114
|
+
|
|
115
|
+
# DeepSeek
|
|
116
|
+
DEEPSEEK_ENABLED=false
|
|
117
|
+
DEEPSEEK_API_KEY=your_deepseek_key_here
|
|
118
|
+
DEEPSEEK_BASE_URL=https://api.deepseek.com
|
|
119
|
+
DEEPSEEK_MODEL=deepseek-chat
|
|
120
|
+
DEEPSEEK_TIMEOUT=20000
|
|
121
|
+
DEEPSEEK_RPS=5
|
|
122
|
+
DEEPSEEK_CONCURRENCY=2
|
|
123
|
+
|
|
124
|
+
# Groq
|
|
125
|
+
GROQ_ENABLED=false
|
|
126
|
+
GROQ_API_KEY=your_groq_key_here
|
|
127
|
+
GROQ_BASE_URL=https://api.groq.com/openai
|
|
128
|
+
GROQ_MODEL=mixtral-8x7b-32768
|
|
129
|
+
GROQ_TIMEOUT=10000
|
|
130
|
+
GROQ_RPS=10
|
|
131
|
+
GROQ_CONCURRENCY=4
|
|
132
|
+
|
|
133
|
+
# OpenRouter
|
|
134
|
+
OPENROUTER_ENABLED=false
|
|
135
|
+
OPENROUTER_API_KEY=your_openrouter_key_here
|
|
136
|
+
OPENROUTER_BASE_URL=https://openrouter.ai/api
|
|
137
|
+
OPENROUTER_MODEL=anthropic/claude-3.5-sonnet
|
|
138
|
+
OPENROUTER_TIMEOUT=30000
|
|
139
|
+
OPENROUTER_RPS=5
|
|
140
|
+
OPENROUTER_CONCURRENCY=2
|
|
141
|
+
OPENROUTER_REFERER=https://commitdiary.com
|
|
142
|
+
OPENROUTER_TITLE=CommitDiary Stepper
|
|
143
|
+
|
|
144
|
+
# Mistral AI
|
|
145
|
+
MISTRAL_ENABLED=false
|
|
146
|
+
MISTRAL_API_KEY=your_key
|
|
147
|
+
MISTRAL_BASE_URL=https://api.mistral.ai
|
|
148
|
+
MISTRAL_MODEL=mistral-large-latest
|
|
149
|
+
MISTRAL_TIMEOUT=15000
|
|
150
|
+
MISTRAL_RPS=5
|
|
151
|
+
MISTRAL_CONCURRENCY=2
|
|
152
|
+
|
|
153
|
+
# Perplexity AI
|
|
154
|
+
PERPLEXITY_ENABLED=false
|
|
155
|
+
PERPLEXITY_API_KEY=your_key
|
|
156
|
+
PERPLEXITY_BASE_URL=https://api.perplexity.ai
|
|
157
|
+
PERPLEXITY_MODEL=llama-3.1-sonar-large-128k-online
|
|
158
|
+
PERPLEXITY_TIMEOUT=20000
|
|
159
|
+
PERPLEXITY_RPS=5
|
|
160
|
+
PERPLEXITY_CONCURRENCY=2
|
|
161
|
+
|
|
162
|
+
# Together AI
|
|
163
|
+
TOGETHER_ENABLED=false
|
|
164
|
+
TOGETHER_API_KEY=your_key
|
|
165
|
+
TOGETHER_BASE_URL=https://api.together.xyz
|
|
166
|
+
TOGETHER_MODEL=meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo
|
|
167
|
+
TOGETHER_TIMEOUT=20000
|
|
168
|
+
TOGETHER_RPS=5
|
|
169
|
+
TOGETHER_CONCURRENCY=2
|
package/.eslintrc.cjs
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
parser: '@typescript-eslint/parser',
|
|
3
|
+
parserOptions: {
|
|
4
|
+
ecmaVersion: 2022,
|
|
5
|
+
sourceType: 'module',
|
|
6
|
+
project: './tsconfig.json',
|
|
7
|
+
},
|
|
8
|
+
plugins: ['@typescript-eslint'],
|
|
9
|
+
extends: [
|
|
10
|
+
'eslint:recommended',
|
|
11
|
+
'plugin:@typescript-eslint/recommended',
|
|
12
|
+
],
|
|
13
|
+
rules: {
|
|
14
|
+
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
|
|
15
|
+
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
16
|
+
'@typescript-eslint/no-explicit-any': 'error',
|
|
17
|
+
'no-console': 'warn',
|
|
18
|
+
},
|
|
19
|
+
env: {
|
|
20
|
+
node: true,
|
|
21
|
+
es2022: true,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, develop]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
services:
|
|
14
|
+
redis:
|
|
15
|
+
image: redis:7-alpine
|
|
16
|
+
ports:
|
|
17
|
+
- 6379:6379
|
|
18
|
+
options: >-
|
|
19
|
+
--health-cmd "redis-cli ping"
|
|
20
|
+
--health-interval 10s
|
|
21
|
+
--health-timeout 5s
|
|
22
|
+
--health-retries 5
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
|
|
27
|
+
- name: Setup Node.js
|
|
28
|
+
uses: actions/setup-node@v4
|
|
29
|
+
with:
|
|
30
|
+
node-version: '18'
|
|
31
|
+
|
|
32
|
+
- name: Install pnpm
|
|
33
|
+
run: npm install -g pnpm
|
|
34
|
+
|
|
35
|
+
- name: Install dependencies
|
|
36
|
+
run: pnpm install # Removed --frozen-lockfile until you push a fresh lockfile
|
|
37
|
+
|
|
38
|
+
- name: Lint
|
|
39
|
+
run: pnpm lint
|
|
40
|
+
|
|
41
|
+
- name: Type check
|
|
42
|
+
run: pnpm typecheck
|
|
43
|
+
|
|
44
|
+
- name: Build
|
|
45
|
+
run: pnpm build
|
|
46
|
+
|
|
47
|
+
- name: Test
|
|
48
|
+
run: pnpm test
|
|
49
|
+
env:
|
|
50
|
+
REDIS_URL: redis://localhost:6379
|
|
51
|
+
NODE_ENV: test
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: Render Keep-Alive
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
# Run every 10 minutes to prevent Render free tier from sleeping
|
|
6
|
+
- cron: "*/10 * * * *"
|
|
7
|
+
workflow_dispatch: # Allows manual triggering for testing
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
ping:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- name: Ping Render Service
|
|
14
|
+
run: |
|
|
15
|
+
URL="${{ secrets.RENDER_APP_URL }}"
|
|
16
|
+
if [ -z "$URL" ]; then
|
|
17
|
+
echo "Error: RENDER_APP_URL secret is not set."
|
|
18
|
+
echo "Please go to Settings > Secrets and variables > Actions and add RENDER_APP_URL (e.g., https://your-app.onrender.com)"
|
|
19
|
+
exit 1
|
|
20
|
+
fi
|
|
21
|
+
echo "Pinging $URL/health..."
|
|
22
|
+
curl -f -s "$URL/health" || echo "Ping failed, but that's okay (server might be starting up)."
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
release:
|
|
6
|
+
types: [published]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
id-token: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
publish:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- name: Checkout
|
|
17
|
+
uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Setup Node
|
|
20
|
+
uses: actions/setup-node@v4
|
|
21
|
+
with:
|
|
22
|
+
node-version: 20
|
|
23
|
+
registry-url: https://registry.npmjs.org/
|
|
24
|
+
|
|
25
|
+
- name: Install
|
|
26
|
+
run: npm install
|
|
27
|
+
|
|
28
|
+
- name: Build
|
|
29
|
+
run: npm run build
|
|
30
|
+
|
|
31
|
+
- name: Publish
|
|
32
|
+
run: npm publish --access public
|
|
33
|
+
env:
|
|
34
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|