@hailer/mcp 1.1.12 → 1.1.13
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/CHANGELOG.md +0 -7
- package/{.claude → dist}/CLAUDE.md +2 -2
- package/dist/app.js +18 -5
- package/dist/bot/bot-config.d.ts +10 -1
- package/dist/bot/bot-config.js +64 -3
- package/dist/bot/bot-manager.d.ts +2 -0
- package/dist/bot/bot-manager.js +9 -2
- package/dist/bot/bot.d.ts +33 -0
- package/dist/bot/bot.js +461 -160
- package/dist/bot/services/message-classifier.js +17 -0
- package/dist/bot/services/permission-guard.d.ts +52 -0
- package/dist/bot/services/permission-guard.js +149 -0
- package/dist/bot/services/types.d.ts +5 -0
- package/dist/bot/services/typing-indicator.d.ts +6 -1
- package/dist/bot/services/typing-indicator.js +19 -3
- package/dist/cli.js +0 -0
- package/dist/config.d.ts +6 -1
- package/dist/config.js +43 -0
- package/dist/core.js +3 -6
- package/dist/lib/discussion-lock.d.ts +42 -0
- package/dist/lib/discussion-lock.js +110 -0
- package/dist/mcp/UserContextCache.d.ts +5 -0
- package/dist/mcp/UserContextCache.js +51 -19
- package/dist/mcp/hailer-clients.d.ts +19 -1
- package/dist/mcp/hailer-clients.js +158 -24
- package/dist/mcp/session-store.d.ts +68 -0
- package/dist/mcp/session-store.js +169 -0
- package/dist/mcp/signal-handler.js +2 -0
- package/dist/mcp/tool-registry.d.ts +17 -4
- package/dist/mcp/tool-registry.js +37 -7
- package/dist/mcp/tools/activity.js +99 -7
- package/dist/mcp/tools/app-scaffold.js +304 -336
- package/dist/mcp/tools/bot-config/constants.d.ts +23 -0
- package/dist/mcp/tools/bot-config/constants.js +94 -0
- package/dist/mcp/tools/bot-config/core.d.ts +253 -0
- package/dist/mcp/tools/bot-config/core.js +2456 -0
- package/dist/mcp/tools/bot-config/index.d.ts +10 -0
- package/dist/mcp/tools/bot-config/index.js +59 -0
- package/dist/mcp/tools/bot-config/tools.d.ts +7 -0
- package/dist/mcp/tools/bot-config/tools.js +15 -0
- package/dist/mcp/tools/bot-config/types.d.ts +50 -0
- package/dist/mcp/tools/bot-config/types.js +6 -0
- package/dist/mcp/tools/bug-fixer-tools.d.ts +45 -0
- package/dist/mcp/tools/bug-fixer-tools.js +1096 -0
- package/dist/mcp/tools/company.d.ts +9 -0
- package/dist/mcp/tools/company.js +88 -0
- package/dist/mcp/tools/discussion.js +68 -0
- package/dist/mcp/tools/document.d.ts +11 -0
- package/dist/mcp/tools/document.js +741 -0
- package/dist/mcp/tools/investigate.d.ts +9 -0
- package/dist/mcp/tools/investigate.js +254 -0
- package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
- package/dist/mcp/tools/workflow-permissions.js +204 -0
- package/dist/mcp/tools/workflow.js +57 -18
- package/dist/mcp/utils/index.d.ts +2 -0
- package/dist/mcp/utils/index.js +12 -1
- package/dist/mcp/utils/role-utils.d.ts +74 -0
- package/dist/mcp/utils/role-utils.js +151 -0
- package/dist/mcp/utils/types.d.ts +43 -1
- package/dist/mcp/utils/types.js +14 -0
- package/dist/mcp/webhook-handler.d.ts +4 -0
- package/dist/mcp/webhook-handler.js +8 -0
- package/dist/mcp-server.d.ts +23 -2
- package/dist/mcp-server.js +639 -127
- package/dist/plugins/vipunen/client.d.ts +150 -0
- package/dist/plugins/vipunen/client.js +535 -0
- package/dist/plugins/vipunen/config/schema-config.json +19 -0
- package/dist/plugins/vipunen/config/schema-doc.json +22 -0
- package/dist/plugins/vipunen/index.d.ts +41 -0
- package/dist/plugins/vipunen/index.js +88 -0
- package/dist/plugins/vipunen/tools.d.ts +26 -0
- package/dist/plugins/vipunen/tools.js +501 -0
- package/dist/stdio-server.d.ts +14 -0
- package/dist/stdio-server.js +101 -0
- package/package.json +2 -1
- package/.claude/agents/agent-ada-skill-builder.md +0 -94
- package/.claude/agents/agent-alejandro-function-fields.md +0 -342
- package/.claude/agents/agent-bjorn-config-audit.md +0 -103
- package/.claude/agents/agent-builder-agent-creator.md +0 -130
- package/.claude/agents/agent-code-simplifier.md +0 -53
- package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
- package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
- package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
- package/.claude/agents/agent-helga-workflow-config.md +0 -204
- package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
- package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
- package/.claude/agents/agent-ivan-monolith.md +0 -154
- package/.claude/agents/agent-kenji-data-reader.md +0 -86
- package/.claude/agents/agent-lars-code-inspector.md +0 -102
- package/.claude/agents/agent-marco-mockup-builder.md +0 -110
- package/.claude/agents/agent-marcus-api-documenter.md +0 -323
- package/.claude/agents/agent-marketplace-publisher.md +0 -280
- package/.claude/agents/agent-marketplace-reviewer.md +0 -309
- package/.claude/agents/agent-permissions-handler.md +0 -208
- package/.claude/agents/agent-simple-writer.md +0 -48
- package/.claude/agents/agent-svetlana-code-review.md +0 -171
- package/.claude/agents/agent-tanya-test-runner.md +0 -333
- package/.claude/agents/agent-ui-designer.md +0 -100
- package/.claude/agents/agent-viktor-sql-insights.md +0 -212
- package/.claude/agents/agent-web-search.md +0 -55
- package/.claude/agents/agent-yevgeni-discussions.md +0 -45
- package/.claude/agents/agent-zara-zapier.md +0 -159
- package/.claude/commands/app-squad.md +0 -135
- package/.claude/commands/audit-squad.md +0 -158
- package/.claude/commands/autoplan.md +0 -563
- package/.claude/commands/cleanup-squad.md +0 -98
- package/.claude/commands/config-squad.md +0 -106
- package/.claude/commands/crud-squad.md +0 -87
- package/.claude/commands/data-squad.md +0 -97
- package/.claude/commands/debug-squad.md +0 -303
- package/.claude/commands/doc-squad.md +0 -65
- package/.claude/commands/handoff.md +0 -137
- package/.claude/commands/health.md +0 -49
- package/.claude/commands/help.md +0 -29
- package/.claude/commands/help:agents.md +0 -151
- package/.claude/commands/help:commands.md +0 -78
- package/.claude/commands/help:faq.md +0 -79
- package/.claude/commands/help:plugins.md +0 -50
- package/.claude/commands/help:skills.md +0 -93
- package/.claude/commands/help:tools.md +0 -75
- package/.claude/commands/hotfix-squad.md +0 -112
- package/.claude/commands/integration-squad.md +0 -82
- package/.claude/commands/janitor-squad.md +0 -167
- package/.claude/commands/learn-auto.md +0 -120
- package/.claude/commands/learn.md +0 -120
- package/.claude/commands/mcp-list.md +0 -27
- package/.claude/commands/onboard-squad.md +0 -140
- package/.claude/commands/plan-workspace.md +0 -732
- package/.claude/commands/prd.md +0 -130
- package/.claude/commands/project-status.md +0 -82
- package/.claude/commands/publish.md +0 -138
- package/.claude/commands/recap.md +0 -69
- package/.claude/commands/restore.md +0 -64
- package/.claude/commands/review-squad.md +0 -152
- package/.claude/commands/save.md +0 -24
- package/.claude/commands/stats.md +0 -19
- package/.claude/commands/swarm.md +0 -210
- package/.claude/commands/tool-builder.md +0 -39
- package/.claude/commands/ws-pull.md +0 -44
- package/.claude/hooks/_shared-memory.cjs +0 -305
- package/.claude/hooks/_utils.cjs +0 -108
- package/.claude/hooks/agent-failure-detector.cjs +0 -383
- package/.claude/hooks/agent-usage-logger.cjs +0 -204
- package/.claude/hooks/app-edit-guard.cjs +0 -494
- package/.claude/hooks/auto-learn.cjs +0 -304
- package/.claude/hooks/bash-guard.cjs +0 -272
- package/.claude/hooks/builder-mode-manager.cjs +0 -354
- package/.claude/hooks/bulk-activity-guard.cjs +0 -271
- package/.claude/hooks/context-watchdog.cjs +0 -230
- package/.claude/hooks/delegation-reminder.cjs +0 -465
- package/.claude/hooks/design-system-lint.cjs +0 -271
- package/.claude/hooks/post-scaffold-hook.cjs +0 -181
- package/.claude/hooks/prompt-guard.cjs +0 -354
- package/.claude/hooks/publish-template-guard.cjs +0 -147
- package/.claude/hooks/session-start.cjs +0 -35
- package/.claude/hooks/shared-memory-writer.cjs +0 -147
- package/.claude/hooks/skill-injector.cjs +0 -140
- package/.claude/hooks/skill-usage-logger.cjs +0 -258
- package/.claude/hooks/src-edit-guard.cjs +0 -240
- package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
- package/.claude/settings.json +0 -257
- package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
- package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
- package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
- package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
- package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
- package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
- package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
- package/.claude/skills/agent-structure/SKILL.md +0 -98
- package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
- package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
- package/.claude/skills/delegation-routing/SKILL.md +0 -202
- package/.claude/skills/frontend-design/SKILL.md +0 -254
- package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
- package/.claude/skills/hailer-api-client/SKILL.md +0 -518
- package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
- package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
- package/.claude/skills/hailer-design-system/SKILL.md +0 -235
- package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
- package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
- package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
- package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
- package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
- package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
- package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
- package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
- package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
- package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
- package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
- package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
- package/.claude/skills/integration-patterns/SKILL.md +0 -421
- package/.claude/skills/json-only-output/SKILL.md +0 -72
- package/.claude/skills/lsp-setup/SKILL.md +0 -160
- package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
- package/.claude/skills/optional-parameters/SKILL.md +0 -72
- package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
- package/.claude/skills/testing-patterns/SKILL.md +0 -630
- package/.claude/skills/tool-builder/SKILL.md +0 -250
- package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
- package/.claude/skills/tool-response-verification/SKILL.md +0 -92
- package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
- package/.mcp.json +0 -13
- package/.opencode/agent/agent-ada-skill-builder.md +0 -35
- package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
- package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
- package/.opencode/agent/agent-builder-agent-creator.md +0 -39
- package/.opencode/agent/agent-code-simplifier.md +0 -31
- package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
- package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
- package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
- package/.opencode/agent/agent-helga-workflow-config.md +0 -203
- package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
- package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
- package/.opencode/agent/agent-ivan-monolith.md +0 -46
- package/.opencode/agent/agent-kenji-data-reader.md +0 -53
- package/.opencode/agent/agent-lars-code-inspector.md +0 -28
- package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
- package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
- package/.opencode/agent/agent-marketplace-publisher.md +0 -44
- package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
- package/.opencode/agent/agent-permissions-handler.md +0 -50
- package/.opencode/agent/agent-simple-writer.md +0 -45
- package/.opencode/agent/agent-svetlana-code-review.md +0 -39
- package/.opencode/agent/agent-tanya-test-runner.md +0 -57
- package/.opencode/agent/agent-ui-designer.md +0 -56
- package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
- package/.opencode/agent/agent-web-search.md +0 -42
- package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
- package/.opencode/agent/agent-zara-zapier.md +0 -53
- package/.opencode/commands/app-squad.md +0 -135
- package/.opencode/commands/audit-squad.md +0 -158
- package/.opencode/commands/autoplan.md +0 -563
- package/.opencode/commands/cleanup-squad.md +0 -98
- package/.opencode/commands/config-squad.md +0 -106
- package/.opencode/commands/crud-squad.md +0 -87
- package/.opencode/commands/data-squad.md +0 -97
- package/.opencode/commands/debug-squad.md +0 -303
- package/.opencode/commands/doc-squad.md +0 -65
- package/.opencode/commands/handoff.md +0 -137
- package/.opencode/commands/health.md +0 -49
- package/.opencode/commands/help-agents.md +0 -151
- package/.opencode/commands/help-commands.md +0 -32
- package/.opencode/commands/help-faq.md +0 -29
- package/.opencode/commands/help-plugins.md +0 -28
- package/.opencode/commands/help-skills.md +0 -7
- package/.opencode/commands/help-tools.md +0 -40
- package/.opencode/commands/help.md +0 -28
- package/.opencode/commands/hotfix-squad.md +0 -112
- package/.opencode/commands/integration-squad.md +0 -82
- package/.opencode/commands/janitor-squad.md +0 -167
- package/.opencode/commands/learn-auto.md +0 -120
- package/.opencode/commands/learn.md +0 -120
- package/.opencode/commands/mcp-list.md +0 -27
- package/.opencode/commands/onboard-squad.md +0 -140
- package/.opencode/commands/plan-workspace.md +0 -732
- package/.opencode/commands/prd.md +0 -131
- package/.opencode/commands/project-status.md +0 -82
- package/.opencode/commands/publish.md +0 -138
- package/.opencode/commands/recap.md +0 -69
- package/.opencode/commands/restore.md +0 -64
- package/.opencode/commands/review-squad.md +0 -152
- package/.opencode/commands/save.md +0 -24
- package/.opencode/commands/stats.md +0 -19
- package/.opencode/commands/swarm.md +0 -210
- package/.opencode/commands/tool-builder.md +0 -39
- package/.opencode/commands/ws-pull.md +0 -44
- package/.opencode/opencode.json +0 -28
- package/SESSION-HANDOFF.md +0 -68
- package/inbox/2026-03-04-bot-config-patterns.md +0 -24
- package/scripts/postinstall.cjs +0 -64
- package/scripts/test-hal-tools.ts +0 -154
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: lsp-setup
|
|
3
|
-
description: How to set up LSP (Language Server Protocol) for Claude Code - enables code intelligence for Lars and other agents
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
triggers:
|
|
6
|
-
- LSP not available
|
|
7
|
-
- typescript-language-server
|
|
8
|
-
- code intelligence setup
|
|
9
|
-
- Lars can't find unused code
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# LSP Setup for Claude Code
|
|
13
|
-
|
|
14
|
-
LSP (Language Server Protocol) enables code intelligence features like go-to-definition, find-references, and accurate dead code detection.
|
|
15
|
-
|
|
16
|
-
## Why LSP?
|
|
17
|
-
|
|
18
|
-
Without LSP, agents like Lars must guess about code usage via grep/file reads. With LSP:
|
|
19
|
-
- **Accurate dead code detection** - knows if exports are used elsewhere
|
|
20
|
-
- **Type error detection** - without running compiler
|
|
21
|
-
- **Find all references** - across entire codebase
|
|
22
|
-
- **Go to definition** - jump to where symbols are defined
|
|
23
|
-
|
|
24
|
-
## Requirements
|
|
25
|
-
|
|
26
|
-
Three things needed for LSP to work:
|
|
27
|
-
|
|
28
|
-
| Requirement | How to Check | How to Install |
|
|
29
|
-
|-------------|--------------|----------------|
|
|
30
|
-
| `ENABLE_LSP_TOOL=1` | Check `.claude/settings.json` | Add to env section |
|
|
31
|
-
| `typescript-lsp` plugin | `claude plugin list` | `claude plugin install typescript-lsp@claude-plugins-official` |
|
|
32
|
-
| Language server binary | `which typescript-language-server` | `npm install -g typescript-language-server typescript` |
|
|
33
|
-
|
|
34
|
-
## Setup Steps
|
|
35
|
-
|
|
36
|
-
### Step 1: Install the language server binary
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
npm install -g typescript-language-server typescript
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Verify:
|
|
43
|
-
```bash
|
|
44
|
-
typescript-language-server --version
|
|
45
|
-
# Should show version like: 5.1.3
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Step 2: Install Claude Code plugin
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
claude plugin install typescript-lsp@claude-plugins-official
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
Verify:
|
|
55
|
-
```bash
|
|
56
|
-
claude plugin list
|
|
57
|
-
# Should show: typescript-lsp@claude-plugins-official ✔ enabled
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Step 3: Ensure settings.json has LSP enabled
|
|
61
|
-
|
|
62
|
-
Check `.claude/settings.json` (project) or `~/.claude/settings.json` (global):
|
|
63
|
-
|
|
64
|
-
```json
|
|
65
|
-
{
|
|
66
|
-
"env": {
|
|
67
|
-
"ENABLE_LSP_TOOL": "1"
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
### Step 4: Restart Claude
|
|
73
|
-
|
|
74
|
-
LSP plugin activates on Claude restart:
|
|
75
|
-
```bash
|
|
76
|
-
claude -c
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### Step 5: Test
|
|
80
|
-
|
|
81
|
-
Ask Lars to find unused code in a TypeScript file:
|
|
82
|
-
```
|
|
83
|
-
Find unused code in src/App.tsx
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Or test LSP directly:
|
|
87
|
-
```
|
|
88
|
-
Use LSP documentSymbol on src/App.tsx
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Supported File Types
|
|
92
|
-
|
|
93
|
-
The `typescript-lsp` plugin supports:
|
|
94
|
-
- `.ts`, `.tsx` - TypeScript + React
|
|
95
|
-
- `.js`, `.jsx` - JavaScript + React
|
|
96
|
-
- `.mts`, `.cts` - TypeScript ES modules / CommonJS
|
|
97
|
-
- `.mjs`, `.cjs` - JavaScript ES modules / CommonJS
|
|
98
|
-
|
|
99
|
-
## LSP Operations Available
|
|
100
|
-
|
|
101
|
-
| Operation | Purpose |
|
|
102
|
-
|-----------|---------|
|
|
103
|
-
| `documentSymbol` | List all symbols in a file |
|
|
104
|
-
| `findReferences` | Find all usages of a symbol |
|
|
105
|
-
| `goToDefinition` | Jump to where symbol is defined |
|
|
106
|
-
| `hover` | Get type info and documentation |
|
|
107
|
-
| `goToImplementation` | Find implementations of interface |
|
|
108
|
-
| `incomingCalls` | What calls this function |
|
|
109
|
-
| `outgoingCalls` | What this function calls |
|
|
110
|
-
| `prepareCallHierarchy` | Get call hierarchy at position |
|
|
111
|
-
|
|
112
|
-
## Agents That Use LSP
|
|
113
|
-
|
|
114
|
-
| Agent | How They Use LSP |
|
|
115
|
-
|-------|------------------|
|
|
116
|
-
| **Lars** | Primary user - dead code, unused imports, type errors |
|
|
117
|
-
| **Svetlana** | Type checking during code review (optional) |
|
|
118
|
-
| **Giuseppe** | Verify code compiles before build (optional) |
|
|
119
|
-
|
|
120
|
-
## Troubleshooting
|
|
121
|
-
|
|
122
|
-
### "No LSP server available"
|
|
123
|
-
|
|
124
|
-
1. Check binary is installed: `which typescript-language-server`
|
|
125
|
-
2. Check plugin is installed: `claude plugin list`
|
|
126
|
-
3. Restart Claude: `claude -c`
|
|
127
|
-
|
|
128
|
-
### LSP times out on first query
|
|
129
|
-
|
|
130
|
-
Normal - language server is indexing the project. Wait a few seconds and retry.
|
|
131
|
-
|
|
132
|
-
### LSP works for .ts but not .tsx
|
|
133
|
-
|
|
134
|
-
Check `typescript` is installed alongside `typescript-language-server`:
|
|
135
|
-
```bash
|
|
136
|
-
npm install -g typescript-language-server typescript
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### "Executable not found in $PATH"
|
|
140
|
-
|
|
141
|
-
The binary isn't in your PATH. Either:
|
|
142
|
-
- Install globally: `npm install -g typescript-language-server`
|
|
143
|
-
- Or add npm global bin to PATH: `export PATH="$PATH:$(npm bin -g)"`
|
|
144
|
-
|
|
145
|
-
## Without LSP (Fallback)
|
|
146
|
-
|
|
147
|
-
If LSP isn't available, agents can fall back to:
|
|
148
|
-
|
|
149
|
-
```bash
|
|
150
|
-
# Type errors
|
|
151
|
-
npx tsc --noEmit 2>&1
|
|
152
|
-
|
|
153
|
-
# Unused variables (requires eslint config)
|
|
154
|
-
npx eslint --rule '@typescript-eslint/no-unused-vars: error' src/
|
|
155
|
-
|
|
156
|
-
# Find references (grep-based, less accurate)
|
|
157
|
-
grep -r "functionName" src/
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
This is less accurate but works without setup.
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: mcp-direct-tools
|
|
3
|
-
description: Reference for MCP tools not assigned to agents
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# MCP Direct Tools
|
|
8
|
-
|
|
9
|
-
<purpose>
|
|
10
|
-
Reference for MCP tools not assigned to agents. Load this skill when user requests direct tool usage or needs capabilities not covered by standard agents.
|
|
11
|
-
</purpose>
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## When to Load This Skill
|
|
16
|
-
|
|
17
|
-
- User asks "can you use the bug fixer tools?"
|
|
18
|
-
- User needs capabilities not covered by agents
|
|
19
|
-
- Direct MCP tool access requested
|
|
20
|
-
- Debugging/testing MCP tools
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Bug Fixer Tools (16 tools)
|
|
25
|
-
|
|
26
|
-
Automated bug fixing suite for Hailer apps. Use these for automated debugging workflows.
|
|
27
|
-
|
|
28
|
-
### Discovery & Analysis
|
|
29
|
-
|
|
30
|
-
| Tool | Description | Parameters |
|
|
31
|
-
|------|-------------|------------|
|
|
32
|
-
| `bug_fixer_find_app` | Locate app by name | `{ appName }` |
|
|
33
|
-
| `bug_fixer_analyze_bug` | Classify bug report | `{ bugReport, appId }` |
|
|
34
|
-
|
|
35
|
-
### File Operations
|
|
36
|
-
|
|
37
|
-
| Tool | Description | Parameters |
|
|
38
|
-
|------|-------------|------------|
|
|
39
|
-
| `bug_fixer_list_files` | List project files | `{ appId, path? }` |
|
|
40
|
-
| `bug_fixer_read_file` | Read file content | `{ appId, filePath }` |
|
|
41
|
-
| `bug_fixer_write_file` | Modify file content | `{ appId, filePath, content }` |
|
|
42
|
-
| `bug_fixer_apply_fix` | Apply code patch | `{ appId, filePath, patch }` |
|
|
43
|
-
|
|
44
|
-
### Build & Test
|
|
45
|
-
|
|
46
|
-
| Tool | Description | Parameters |
|
|
47
|
-
|------|-------------|------------|
|
|
48
|
-
| `bug_fixer_run_build` | Execute build command | `{ appId }` |
|
|
49
|
-
|
|
50
|
-
### Git Operations
|
|
51
|
-
|
|
52
|
-
| Tool | Description | Parameters |
|
|
53
|
-
|------|-------------|------------|
|
|
54
|
-
| `bug_fixer_git_status` | Check git status | `{ appId }` |
|
|
55
|
-
| `bug_fixer_git_pull` | Fetch latest code | `{ appId }` |
|
|
56
|
-
| `bug_fixer_git_commit` | Commit changes | `{ appId, message }` |
|
|
57
|
-
| `bug_fixer_git_push` | Push to remote | `{ appId }` |
|
|
58
|
-
| `bug_fixer_git_revert` | Undo changes | `{ appId }` |
|
|
59
|
-
|
|
60
|
-
### Workflow Management
|
|
61
|
-
|
|
62
|
-
| Tool | Description | Parameters |
|
|
63
|
-
|------|-------------|------------|
|
|
64
|
-
| `bug_fixer_start_fix` | Begin fix workflow | `{ bugId, appId }` |
|
|
65
|
-
| `bug_fixer_mark_declined` | Close as not-a-bug | `{ bugId, reason }` |
|
|
66
|
-
| `bug_fixer_publish_fix` | Deploy to production | `{ appId, version }` |
|
|
67
|
-
| `bug_fixer_retry_fix` | Attempt with new context | `{ bugId, newContext }` |
|
|
68
|
-
|
|
69
|
-
### Bug Fixer Workflow
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
1. bug_fixer_find_app → Get app ID
|
|
73
|
-
2. bug_fixer_analyze_bug → Classify issue
|
|
74
|
-
3. bug_fixer_start_fix → Begin workflow
|
|
75
|
-
4. bug_fixer_list_files → Find relevant files
|
|
76
|
-
5. bug_fixer_read_file → Understand current code
|
|
77
|
-
6. bug_fixer_write_file / bug_fixer_apply_fix → Make changes
|
|
78
|
-
7. bug_fixer_run_build → Verify fix
|
|
79
|
-
8. bug_fixer_git_commit → Save changes
|
|
80
|
-
9. bug_fixer_publish_fix → Deploy
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Insight Tools (Not in Viktor)
|
|
86
|
-
|
|
87
|
-
Viktor uses `preview_insight` and `get_insight_data`. These additional tools are available:
|
|
88
|
-
|
|
89
|
-
| Tool | Description | When to Use |
|
|
90
|
-
|------|-------------|-------------|
|
|
91
|
-
| `list_insights` | List all insights in workspace | Discovery, cleanup |
|
|
92
|
-
| `update_insight` | Modify existing insight | Query changes |
|
|
93
|
-
| `remove_insight` | Delete insight (NUCLEAR) | Cleanup |
|
|
94
|
-
|
|
95
|
-
**Note:** SDK has equivalents via insights.ts push. Use SDK for version-controlled changes, MCP for quick fixes.
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## Workflow Tools (PLAYGROUND/NUCLEAR)
|
|
100
|
-
|
|
101
|
-
Direct workflow manipulation. Normally use Helga + SDK, but these exist for quick operations:
|
|
102
|
-
|
|
103
|
-
| Tool | Description | Group |
|
|
104
|
-
|------|-------------|-------|
|
|
105
|
-
| `install_workflow` | Create workflow via MCP | PLAYGROUND |
|
|
106
|
-
| `remove_workflow` | Delete workflow | NUCLEAR |
|
|
107
|
-
| `update_workflow_field` | Modify field config | PLAYGROUND |
|
|
108
|
-
| `update_workflow_phase` | Modify phase config | PLAYGROUND |
|
|
109
|
-
| `test_function_field` | Test JS function | PLAYGROUND |
|
|
110
|
-
|
|
111
|
-
**Warning:** NUCLEAR tools require `ENABLE_NUCLEAR_TOOLS=true` in MCP config.
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## Tool Groups Reference
|
|
116
|
-
|
|
117
|
-
| Group | Risk Level | Examples |
|
|
118
|
-
|-------|------------|----------|
|
|
119
|
-
| READ | Safe | list_activities, get_workflow_schema |
|
|
120
|
-
| WRITE | Updates data | create_activity, add_discussion_message |
|
|
121
|
-
| PLAYGROUND | Admin ops | install_workflow, update_workflow_field |
|
|
122
|
-
| NUCLEAR | Destructive | remove_workflow, remove_app |
|
|
123
|
-
| BOT_INTERNAL | Bots only | Not exposed to MCP clients |
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## Usage Pattern
|
|
128
|
-
|
|
129
|
-
When user requests direct tool usage:
|
|
130
|
-
|
|
131
|
-
```
|
|
132
|
-
User: "Use the bug fixer to fix this app"
|
|
133
|
-
|
|
134
|
-
Orchestrator:
|
|
135
|
-
1. Load this skill
|
|
136
|
-
2. Call tools directly via mcp__hailer__<tool_name>
|
|
137
|
-
3. Follow workflow patterns above
|
|
138
|
-
4. Report results
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
---
|
|
142
|
-
|
|
143
|
-
## Tools NOT Covered Here
|
|
144
|
-
|
|
145
|
-
These are assigned to agents - use the agent instead:
|
|
146
|
-
|
|
147
|
-
| Tool | Agent |
|
|
148
|
-
|------|-------|
|
|
149
|
-
| Activity CRUD | Dmitri |
|
|
150
|
-
| Discussions | Yevgeni |
|
|
151
|
-
| App scaffold/create | Giuseppe |
|
|
152
|
-
| Insights preview/data | Viktor |
|
|
153
|
-
| User search | Permissions Handler |
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: optional-parameters
|
|
3
|
-
description: Omit optional parameters instead of passing empty values
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
triggers: Tool error about empty array/string when parameter should be omitted
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Optional Parameters
|
|
9
|
-
|
|
10
|
-
<purpose>
|
|
11
|
-
Teach correct handling of optional tool parameters - OMIT them entirely when not needed, rather than passing empty arrays, strings, or null values.
|
|
12
|
-
</purpose>
|
|
13
|
-
|
|
14
|
-
<patterns>
|
|
15
|
-
## Pattern 1: Omit vs Empty Value
|
|
16
|
-
|
|
17
|
-
**Key distinction:**
|
|
18
|
-
- **OMIT parameter**: Don't include it in the function call at all
|
|
19
|
-
- **NOT same as empty value**: `[]`, `""`, `null`, `undefined` are NOT valid replacements for omission
|
|
20
|
-
|
|
21
|
-
## Pattern 2: When to Omit
|
|
22
|
-
|
|
23
|
-
- Updating insight public/name but NOT sources → omit sources
|
|
24
|
-
- Updating activity field but NOT name → omit name
|
|
25
|
-
- Any "required" schema parameter that's not relevant to current operation
|
|
26
|
-
|
|
27
|
-
## Pattern 3: Rule of Thumb
|
|
28
|
-
|
|
29
|
-
If you're not changing/using a value, OMIT the parameter entirely rather than passing empty/null.
|
|
30
|
-
</patterns>
|
|
31
|
-
|
|
32
|
-
<examples>
|
|
33
|
-
## Example 1: Correct - Omitting Unused Parameters
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
// Update insight - only changing public flag
|
|
37
|
-
// sources parameter exists in schema but NOT needed for this update
|
|
38
|
-
update_insight({
|
|
39
|
-
insightId: "abc123",
|
|
40
|
-
public: false
|
|
41
|
-
// sources: NOT included - omit entirely
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
// Update insight - changing sources
|
|
45
|
-
update_insight({
|
|
46
|
-
insightId: "abc123",
|
|
47
|
-
sources: [{
|
|
48
|
-
name: 'tasks',
|
|
49
|
-
workflowId: 'wf123',
|
|
50
|
-
fields: [{ name: 'title', meta: 'name' }]
|
|
51
|
-
}]
|
|
52
|
-
// Include sources when actually updating them
|
|
53
|
-
});
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## Example 2: Wrong - Passing Empty Values
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
// WRONG - Passing empty array when parameter should be omitted
|
|
60
|
-
update_insight({
|
|
61
|
-
insightId: "abc123",
|
|
62
|
-
public: false,
|
|
63
|
-
sources: [] // Error: sources must contain at least 1 items
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// WRONG - Passing empty string
|
|
67
|
-
update_activity({
|
|
68
|
-
activityId: "xyz",
|
|
69
|
-
name: "" // Error: name cannot be empty
|
|
70
|
-
});
|
|
71
|
-
```
|
|
72
|
-
</examples>
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: publish-hailer-app
|
|
3
|
-
description: Guide for publishing Hailer apps to production
|
|
4
|
-
version: 1.2.0
|
|
5
|
-
triggers:
|
|
6
|
-
- publish app
|
|
7
|
-
- deploy app
|
|
8
|
-
- production app
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Publish Hailer App Skill
|
|
12
|
-
|
|
13
|
-
Guide for publishing Hailer apps to production using MCP tools.
|
|
14
|
-
|
|
15
|
-
<warning>
|
|
16
|
-
## ⚠️ Publishing Requires Explicit User Request
|
|
17
|
-
|
|
18
|
-
**Default is local development** — scaffold creates a dev app at `http://localhost:3000` automatically.
|
|
19
|
-
|
|
20
|
-
**Only use this skill when the user explicitly asks to publish or deploy to production.**
|
|
21
|
-
|
|
22
|
-
Before publishing: validate manifest.json (see below), then `publish_hailer_app`, then `update_app` to switch URL.
|
|
23
|
-
</warning>
|
|
24
|
-
|
|
25
|
-
<critical>
|
|
26
|
-
## MANDATORY: Validate Before Publishing
|
|
27
|
-
|
|
28
|
-
The `publish_hailer_app` tool will SILENTLY FAIL if manifest.json is misconfigured.
|
|
29
|
-
|
|
30
|
-
**YOU MUST validate these before calling publish_hailer_app:**
|
|
31
|
-
|
|
32
|
-
1. Read `public/manifest.json` in the project
|
|
33
|
-
2. Check `appId` exists and is 24 characters
|
|
34
|
-
3. Check `version` exists and is NOT empty (e.g., "1.0.0")
|
|
35
|
-
4. Check `versionDescription` exists and is NOT empty
|
|
36
|
-
|
|
37
|
-
If ANY are missing/empty, FIX THEM FIRST before publishing.
|
|
38
|
-
</critical>
|
|
39
|
-
|
|
40
|
-
<validation-code>
|
|
41
|
-
## Validation Steps (DO THIS FIRST)
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
1. Read({file_path: "{projectDir}/public/manifest.json"})
|
|
45
|
-
|
|
46
|
-
2. Verify JSON contains:
|
|
47
|
-
- "appId": "24-char-id" ← If missing: use create_app first
|
|
48
|
-
- "version": "1.0.0" ← If empty: set to "1.0.0"
|
|
49
|
-
- "versionDescription": "..." ← If empty: set to "Initial release"
|
|
50
|
-
|
|
51
|
-
3. If any field missing/empty → Edit manifest.json to fix
|
|
52
|
-
|
|
53
|
-
4. ONLY THEN call publish_hailer_app
|
|
54
|
-
```
|
|
55
|
-
</validation-code>
|
|
56
|
-
|
|
57
|
-
<workflow>
|
|
58
|
-
## Full Publishing Workflow
|
|
59
|
-
|
|
60
|
-
### Step 1: Check if Production App Exists
|
|
61
|
-
|
|
62
|
-
```javascript
|
|
63
|
-
list_apps()
|
|
64
|
-
```
|
|
65
|
-
Look for your app with a `https://apps.hailer.com/...` URL (NOT localhost).
|
|
66
|
-
|
|
67
|
-
### Step 2: Create Production App (if needed)
|
|
68
|
-
|
|
69
|
-
If app doesn't exist or only has localhost URL:
|
|
70
|
-
```javascript
|
|
71
|
-
create_app({
|
|
72
|
-
name: "My App Name",
|
|
73
|
-
description: "What the app does"
|
|
74
|
-
})
|
|
75
|
-
```
|
|
76
|
-
Returns new appId with production URL.
|
|
77
|
-
|
|
78
|
-
### Step 3: Validate & Fix manifest.json
|
|
79
|
-
|
|
80
|
-
Read the manifest:
|
|
81
|
-
```javascript
|
|
82
|
-
Read({file_path: "{projectDir}/public/manifest.json"})
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
Required structure:
|
|
86
|
-
```json
|
|
87
|
-
{
|
|
88
|
-
"appId": "695816e2ba1d8bef3af7e018",
|
|
89
|
-
"version": "1.0.0",
|
|
90
|
-
"versionDescription": "Initial production release"
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
**If appId missing:** Add the ID from Step 2
|
|
95
|
-
**If version empty:** Set to "1.0.0"
|
|
96
|
-
**If versionDescription empty:** Set to "Initial release"
|
|
97
|
-
|
|
98
|
-
### Step 4: Publish
|
|
99
|
-
|
|
100
|
-
```javascript
|
|
101
|
-
publish_hailer_app({
|
|
102
|
-
projectDirectory: "/path/to/app"
|
|
103
|
-
})
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### Step 5: Switch URL to Production
|
|
107
|
-
|
|
108
|
-
`publish_hailer_app` uploads files but does NOT change the app URL. Switch it:
|
|
109
|
-
```javascript
|
|
110
|
-
update_app({
|
|
111
|
-
appId: "695816e2ba1d8bef3af7e018",
|
|
112
|
-
url: "https://apps.hailer.com/{workspaceId}/{appId}/"
|
|
113
|
-
})
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### Step 6: Verify
|
|
117
|
-
|
|
118
|
-
```javascript
|
|
119
|
-
list_apps()
|
|
120
|
-
```
|
|
121
|
-
Confirm URL is `https://apps.hailer.com/...` (not localhost).
|
|
122
|
-
</workflow>
|
|
123
|
-
|
|
124
|
-
<silent-failure>
|
|
125
|
-
## Why Silent Failures Happen
|
|
126
|
-
|
|
127
|
-
The SDK publish script requires `version` and `versionDescription` in manifest.json.
|
|
128
|
-
If missing/empty, the tool returns "Success" but files are NOT uploaded.
|
|
129
|
-
|
|
130
|
-
**Symptoms of silent failure:**
|
|
131
|
-
- Tool says "App Published Successfully!"
|
|
132
|
-
- But app URL is still `http://localhost:3000`
|
|
133
|
-
- Or production URL returns 403/404
|
|
134
|
-
|
|
135
|
-
**Always validate manifest BEFORE publishing.**
|
|
136
|
-
</silent-failure>
|
|
137
|
-
|
|
138
|
-
<dev-vs-prod>
|
|
139
|
-
## Dev vs Production Apps
|
|
140
|
-
|
|
141
|
-
| Type | URL | Created By | Can Publish To |
|
|
142
|
-
|------|-----|------------|----------------|
|
|
143
|
-
| Dev | `http://localhost:3000` | `scaffold_hailer_app` or `create_app` | YES (after URL switch) |
|
|
144
|
-
| Prod | `https://apps.hailer.com/{workspaceId}/{appId}/` | `create_app` | YES |
|
|
145
|
-
|
|
146
|
-
**URL switching workflow:**
|
|
147
|
-
1. During development: app URL is `http://localhost:3000/`
|
|
148
|
-
2. When ready to publish: call `update_app` to set production URL: `https://apps.hailer.com/{workspaceId}/{appId}/`
|
|
149
|
-
3. After publishing: URL stays as production
|
|
150
|
-
|
|
151
|
-
**Important:** `publish_hailer_app` uploads built files but does NOT automatically update the URL. You MUST also call `update_app` with the production URL format.
|
|
152
|
-
</dev-vs-prod>
|
|
153
|
-
|
|
154
|
-
<updating>
|
|
155
|
-
## Updating Published Apps
|
|
156
|
-
|
|
157
|
-
1. Bump version in manifest.json:
|
|
158
|
-
```json
|
|
159
|
-
{
|
|
160
|
-
"version": "1.0.1",
|
|
161
|
-
"versionDescription": "Fixed data loading bug"
|
|
162
|
-
}
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
2. Publish:
|
|
166
|
-
```javascript
|
|
167
|
-
publish_hailer_app({
|
|
168
|
-
projectDirectory: "/path/to/app"
|
|
169
|
-
})
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
New version replaces old at same URL.
|
|
173
|
-
</updating>
|
|
174
|
-
|
|
175
|
-
<sharing>
|
|
176
|
-
## Sharing Apps
|
|
177
|
-
|
|
178
|
-
```javascript
|
|
179
|
-
// Entire workspace
|
|
180
|
-
add_app_member({ appId: "...", member: "network_{workspaceId}" })
|
|
181
|
-
|
|
182
|
-
// Team
|
|
183
|
-
add_app_member({ appId: "...", member: "team_{teamId}" })
|
|
184
|
-
|
|
185
|
-
// User
|
|
186
|
-
add_app_member({ appId: "...", member: "user_{userId}" })
|
|
187
|
-
```
|
|
188
|
-
</sharing>
|
|
189
|
-
|
|
190
|
-
<vite-config>
|
|
191
|
-
## CRITICAL: Vite Base Path
|
|
192
|
-
|
|
193
|
-
Vite apps MUST have `base: './'` in vite.config.ts for production deployment.
|
|
194
|
-
|
|
195
|
-
```typescript
|
|
196
|
-
// vite.config.ts
|
|
197
|
-
export default defineConfig({
|
|
198
|
-
base: './', // REQUIRED for production
|
|
199
|
-
// ... other config
|
|
200
|
-
});
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
**Without this:**
|
|
204
|
-
- Asset paths resolve to root domain instead of app folder
|
|
205
|
-
- Production app returns 403/404 errors
|
|
206
|
-
- Works in localhost but fails in production
|
|
207
|
-
|
|
208
|
-
**Also verify:** The .tgz package must have files at `package/dist/` path structure.
|
|
209
|
-
</vite-config>
|
|
210
|
-
|
|
211
|
-
<cache-busting>
|
|
212
|
-
## CRITICAL: Browser Cache for Published Apps
|
|
213
|
-
|
|
214
|
-
Published Hailer apps serve stale versions from browser cache. Vite's hashed JS/CSS filenames handle asset cache-busting, but `index.html` itself needs no-cache headers.
|
|
215
|
-
|
|
216
|
-
**Add these meta tags to `index.html` `<head>` before publishing:**
|
|
217
|
-
|
|
218
|
-
```html
|
|
219
|
-
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
|
|
220
|
-
<meta http-equiv="Pragma" content="no-cache" />
|
|
221
|
-
<meta http-equiv="Expires" content="0" />
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
**Without these:**
|
|
225
|
-
- Users see old app version after publish
|
|
226
|
-
- Hard refresh (Ctrl+Shift+R) works but users won't know to do it
|
|
227
|
-
- Particularly bad for bug fix deploys where users expect changes immediately
|
|
228
|
-
|
|
229
|
-
**Why meta tags not server headers?**
|
|
230
|
-
Hailer apps are served from `apps.hailer.com` static hosting - we can't control server headers. Meta tags are the only client-side cache control available.
|
|
231
|
-
</cache-busting>
|
|
232
|
-
|
|
233
|
-
<checklist>
|
|
234
|
-
## Pre-Publish Checklist
|
|
235
|
-
|
|
236
|
-
- [ ] Production app exists (`create_app`, not scaffold)
|
|
237
|
-
- [ ] manifest.json `appId` is 24 chars (not empty)
|
|
238
|
-
- [ ] manifest.json `version` is set (e.g., "1.0.0")
|
|
239
|
-
- [ ] manifest.json `versionDescription` is set (not empty)
|
|
240
|
-
- [ ] vite.config.ts has `base: './'`
|
|
241
|
-
- [ ] index.html has no-cache meta tags (see cache-busting section)
|
|
242
|
-
- [ ] node_modules exists (dependencies installed)
|
|
243
|
-
- [ ] After publish: `update_app` called to switch URL to production format
|
|
244
|
-
</checklist>
|