@hailer/mcp 1.1.16 → 1.1.17-beta.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/.claude/CLAUDE.md +117 -320
- package/.claude/commands/app-squad.md +86 -90
- package/.claude/commands/audit-squad.md +19 -19
- package/.claude/commands/autoplan.md +3 -3
- package/.claude/commands/cleanup-squad.md +16 -16
- package/.claude/commands/config-squad.md +30 -30
- package/.claude/commands/crud-squad.md +23 -23
- package/.claude/commands/data-squad.md +21 -21
- package/.claude/commands/debug-squad.md +44 -44
- package/.claude/commands/doc-squad.md +16 -16
- package/.claude/commands/help:agents.md +130 -99
- package/.claude/commands/help:commands.md +15 -15
- package/.claude/commands/help:faq.md +17 -17
- package/.claude/commands/help:plugins.md +1 -1
- package/.claude/commands/help:skills.md +18 -24
- package/.claude/commands/hotfix-squad.md +22 -22
- package/.claude/commands/integration-squad.md +22 -22
- package/.claude/commands/janitor-squad.md +31 -31
- package/.claude/commands/learn-auto.md +5 -5
- package/.claude/commands/learn.md +12 -20
- package/.claude/commands/onboard-squad.md +39 -49
- package/.claude/commands/plan-workspace.md +2 -2
- package/.claude/commands/publish.md +32 -37
- package/.claude/commands/review-squad.md +27 -27
- package/.claude/commands/stats.md +26 -12
- package/.claude/commands/swarm.md +25 -25
- package/.claude/skills/chrome-mcp-reference/SKILL.md +5 -0
- package/.claude/skills/hailer-api-client/SKILL.md +55 -16
- package/.claude/skills/hailer-app-builder/SKILL.md +4 -270
- package/.claude/skills/hailer-apps-pictures/SKILL.md +3 -3
- package/.claude/skills/hailer-design-system/SKILL.md +96 -4
- package/.claude/skills/hailer-monolith-automations/SKILL.md +138 -116
- package/.claude/skills/hailer-permissions-system/SKILL.md +6 -9
- package/.claude/skills/hailer-project-protocol/SKILL.md +20 -110
- package/.claude/skills/integration-patterns/SKILL.md +6 -6
- package/.claude/skills/lsp-setup/SKILL.md +8 -9
- package/.claude/skills/sdk-activity-patterns/SKILL.md +238 -0
- package/.claude/skills/{SDK-document-templates → sdk-document-templates}/SKILL.md +13 -340
- package/.claude/skills/{SDK-function-fields → sdk-function-fields}/SKILL.md +8 -40
- package/.claude/skills/{SDK-insight-queries → sdk-insight-queries}/SKILL.md +114 -392
- package/.claude/skills/{SDK-ws-config-skill → sdk-ws-config-skill}/SKILL.md +79 -310
- package/.claude/skills/zapier-hailer-patterns/SKILL.md +84 -361
- package/.opencode/package-lock.json +117 -0
- package/CLAUDE.md +5 -358
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +10 -127
- package/dist/app.js.map +1 -1
- package/dist/bot/bot-manager.d.ts +3 -14
- package/dist/bot/bot-manager.d.ts.map +1 -1
- package/dist/bot/bot-manager.js +13 -4
- package/dist/bot/bot-manager.js.map +1 -1
- package/dist/bot/bot.d.ts +23 -102
- package/dist/bot/bot.d.ts.map +1 -1
- package/dist/bot/bot.js +356 -1212
- package/dist/bot/bot.js.map +1 -1
- package/dist/bot/services/bot-permissions.d.ts +50 -0
- package/dist/bot/services/bot-permissions.d.ts.map +1 -0
- package/dist/bot/services/bot-permissions.js +198 -0
- package/dist/bot/services/bot-permissions.js.map +1 -0
- package/dist/bot/services/index.d.ts +4 -2
- package/dist/bot/services/index.d.ts.map +1 -1
- package/dist/bot/services/index.js +10 -5
- package/dist/bot/services/index.js.map +1 -1
- package/dist/bot/services/message-classifier.d.ts +1 -1
- package/dist/bot/services/message-classifier.d.ts.map +1 -1
- package/dist/bot/services/message-classifier.js.map +1 -1
- package/dist/bot/services/signal-router.d.ts +32 -0
- package/dist/bot/services/signal-router.d.ts.map +1 -0
- package/dist/bot/services/signal-router.js +132 -0
- package/dist/bot/services/signal-router.js.map +1 -0
- package/dist/bot/services/system-prompt.d.ts +12 -0
- package/dist/bot/services/system-prompt.d.ts.map +1 -0
- package/dist/bot/services/system-prompt.js +93 -0
- package/dist/bot/services/system-prompt.js.map +1 -0
- package/dist/bot/services/types.d.ts +7 -34
- package/dist/bot/services/types.d.ts.map +1 -1
- package/dist/bot/services/types.js +0 -3
- package/dist/bot/services/types.js.map +1 -1
- package/dist/bot/services/workspace-refresh.d.ts +47 -0
- package/dist/bot/services/workspace-refresh.d.ts.map +1 -0
- package/dist/bot/services/workspace-refresh.js +154 -0
- package/dist/bot/services/workspace-refresh.js.map +1 -0
- package/dist/bot-config/constants.d.ts +0 -36
- package/dist/bot-config/constants.d.ts.map +1 -1
- package/dist/bot-config/constants.js +1 -76
- package/dist/bot-config/constants.js.map +1 -1
- package/dist/bot-config/context.d.ts +2 -42
- package/dist/bot-config/context.d.ts.map +1 -1
- package/dist/bot-config/context.js +13 -134
- package/dist/bot-config/context.js.map +1 -1
- package/dist/bot-config/index.d.ts +6 -15
- package/dist/bot-config/index.d.ts.map +1 -1
- package/dist/bot-config/index.js +5 -80
- package/dist/bot-config/index.js.map +1 -1
- package/dist/bot-config/loader.d.ts +16 -4
- package/dist/bot-config/loader.d.ts.map +1 -1
- package/dist/bot-config/loader.js +187 -96
- package/dist/bot-config/loader.js.map +1 -1
- package/dist/bot-config/persistence.d.ts +1 -52
- package/dist/bot-config/persistence.d.ts.map +1 -1
- package/dist/bot-config/persistence.js +3 -213
- package/dist/bot-config/persistence.js.map +1 -1
- package/dist/bot-config/state.d.ts +0 -41
- package/dist/bot-config/state.d.ts.map +1 -1
- package/dist/bot-config/state.js +0 -151
- package/dist/bot-config/state.js.map +1 -1
- package/dist/bot-config/tools.d.ts +1 -1
- package/dist/bot-config/tools.js +27 -27
- package/dist/bot-config/tools.js.map +1 -1
- package/dist/bot-config/types.d.ts +39 -32
- package/dist/bot-config/types.d.ts.map +1 -1
- package/dist/bot-config/types.js +0 -3
- package/dist/bot-config/types.js.map +1 -1
- package/dist/bot-config/webhooks.d.ts +0 -4
- package/dist/bot-config/webhooks.d.ts.map +1 -1
- package/dist/bot-config/webhooks.js +0 -13
- package/dist/bot-config/webhooks.js.map +1 -1
- package/dist/commands/seed-config.js +16 -31
- package/dist/commands/seed-config.js.map +1 -1
- package/dist/config.d.ts +0 -9
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -15
- package/dist/config.js.map +1 -1
- package/dist/mcp/hailer-clients.js +2 -2
- package/dist/mcp/hailer-clients.js.map +1 -1
- package/dist/mcp/tool-registry.d.ts +10 -115
- package/dist/mcp/tool-registry.d.ts.map +1 -1
- package/dist/mcp/tool-registry.js +39 -363
- package/dist/mcp/tool-registry.js.map +1 -1
- package/dist/mcp/tools/activity.d.ts +3 -0
- package/dist/mcp/tools/activity.d.ts.map +1 -1
- package/dist/mcp/tools/activity.js +8 -1
- package/dist/mcp/tools/activity.js.map +1 -1
- package/dist/mcp/tools/app-core.d.ts +3 -0
- package/dist/mcp/tools/app-core.d.ts.map +1 -1
- package/dist/mcp/tools/app-core.js +9 -2
- package/dist/mcp/tools/app-core.js.map +1 -1
- package/dist/mcp/tools/app-marketplace.d.ts +3 -0
- package/dist/mcp/tools/app-marketplace.d.ts.map +1 -1
- package/dist/mcp/tools/app-marketplace.js +13 -1
- package/dist/mcp/tools/app-marketplace.js.map +1 -1
- package/dist/mcp/tools/app-member.d.ts +3 -0
- package/dist/mcp/tools/app-member.d.ts.map +1 -1
- package/dist/mcp/tools/app-member.js +6 -1
- package/dist/mcp/tools/app-member.js.map +1 -1
- package/dist/mcp/tools/app-scaffold.d.ts +3 -0
- package/dist/mcp/tools/app-scaffold.d.ts.map +1 -1
- package/dist/mcp/tools/app-scaffold.js +15 -11
- package/dist/mcp/tools/app-scaffold.js.map +1 -1
- package/dist/mcp/tools/company.d.ts +3 -0
- package/dist/mcp/tools/company.d.ts.map +1 -1
- package/dist/mcp/tools/company.js +5 -1
- package/dist/mcp/tools/company.js.map +1 -1
- package/dist/mcp/tools/discussion.d.ts +3 -0
- package/dist/mcp/tools/discussion.d.ts.map +1 -1
- package/dist/mcp/tools/discussion.js +13 -2
- package/dist/mcp/tools/discussion.js.map +1 -1
- package/dist/mcp/tools/file.d.ts +3 -0
- package/dist/mcp/tools/file.d.ts.map +1 -1
- package/dist/mcp/tools/file.js +6 -1
- package/dist/mcp/tools/file.js.map +1 -1
- package/dist/mcp/tools/index.d.ts +7 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +34 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/insight.d.ts +3 -0
- package/dist/mcp/tools/insight.d.ts.map +1 -1
- package/dist/mcp/tools/insight.js +18 -8
- package/dist/mcp/tools/insight.js.map +1 -1
- package/dist/mcp/tools/user.d.ts +3 -0
- package/dist/mcp/tools/user.d.ts.map +1 -1
- package/dist/mcp/tools/user.js +6 -1
- package/dist/mcp/tools/user.js.map +1 -1
- package/dist/mcp/tools/workflow-permissions.d.ts +3 -0
- package/dist/mcp/tools/workflow-permissions.d.ts.map +1 -1
- package/dist/mcp/tools/workflow-permissions.js +8 -1
- package/dist/mcp/tools/workflow-permissions.js.map +1 -1
- package/dist/mcp/tools/workflow.d.ts +3 -0
- package/dist/mcp/tools/workflow.d.ts.map +1 -1
- package/dist/mcp/tools/workflow.js +29 -28
- package/dist/mcp/tools/workflow.js.map +1 -1
- package/dist/mcp/utils/index.d.ts +4 -11
- package/dist/mcp/utils/index.d.ts.map +1 -1
- package/dist/mcp/utils/index.js +5 -36
- package/dist/mcp/utils/index.js.map +1 -1
- package/dist/mcp/utils/role-utils.d.ts +0 -32
- package/dist/mcp/utils/role-utils.d.ts.map +1 -1
- package/dist/mcp/utils/role-utils.js +0 -73
- package/dist/mcp/utils/role-utils.js.map +1 -1
- package/dist/mcp/utils/tool-helpers.d.ts +0 -25
- package/dist/mcp/utils/tool-helpers.d.ts.map +1 -1
- package/dist/mcp/utils/tool-helpers.js +0 -34
- package/dist/mcp/utils/tool-helpers.js.map +1 -1
- package/dist/mcp/webhook-handler.d.ts +4 -34
- package/dist/mcp/webhook-handler.d.ts.map +1 -1
- package/dist/mcp/webhook-handler.js +57 -74
- package/dist/mcp/webhook-handler.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +3 -78
- package/dist/mcp-server.js.map +1 -1
- package/package.json +1 -2
- 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 -208
- 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/skills/SDK-activity-patterns/SKILL.md +0 -428
- package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
- package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
- package/.claude/skills/agent-structure/SKILL.md +0 -98
- 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-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/json-only-output/SKILL.md +0 -72
- package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
- package/.claude/skills/optional-parameters/SKILL.md +0 -72
- package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
- package/.claude/skills/tool-response-verification/SKILL.md +0 -92
- 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 -204
- 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
|
@@ -15,41 +15,7 @@ Patterns and templates for building Hailer apps with @hailer/app-sdk.
|
|
|
15
15
|
<critical-rules>
|
|
16
16
|
## CRITICAL: Scaffolding and Data Sources
|
|
17
17
|
|
|
18
|
-
**ALWAYS use scaffold_hailer_app MCP tool** to create new apps. Never manually create the project structure.
|
|
19
|
-
|
|
20
|
-
### scaffold_hailer_app - One-Shot Full Setup
|
|
21
|
-
|
|
22
|
-
This tool does EVERYTHING in one call:
|
|
23
|
-
- Scaffolds project from `@hailer/create-app@beta` template (Vite + React + TypeScript)
|
|
24
|
-
- Runs `npm install`
|
|
25
|
-
- Configures CORS in `vite.config.ts`
|
|
26
|
-
- **Reuses existing localhost dev app** if one exists, otherwise creates a new one (with auto-generated icon)
|
|
27
|
-
- Shares app with entire workspace
|
|
28
|
-
- Adds appId to `manifest.json`
|
|
29
|
-
- Starts dev server on port 3000
|
|
30
|
-
|
|
31
|
-
**NEVER call `create_app` separately during scaffolding — it creates duplicates.** The scaffold tool handles dev app creation/reuse internally.
|
|
32
|
-
|
|
33
|
-
**Publishing (when ready):** Call `publish_hailer_app` — it builds, packages with correct tar structure (`package/dist/manifest.json`), uploads to S3, and auto-updates app URL to production.
|
|
34
|
-
|
|
35
|
-
**You're customizing a working starter app**, not building from scratch.
|
|
36
|
-
|
|
37
|
-
### create_app - Entry Only (No Local Files)
|
|
38
|
-
|
|
39
|
-
Use `mcp__hailer__create_app` when you:
|
|
40
|
-
- Need a production app entry pointing to a deployed URL
|
|
41
|
-
- Want to register an external/existing app in Hailer
|
|
42
|
-
- Already have app code and just need the Hailer entry
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
mcp__hailer__create_app({
|
|
46
|
-
name: "Production App",
|
|
47
|
-
url: "https://app.example.com"
|
|
48
|
-
})
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
**scaffold = full development setup**
|
|
52
|
-
**create_app = just the Hailer entry/frame**
|
|
18
|
+
**ALWAYS use scaffold_hailer_app MCP tool** to create new apps. Never manually create the project structure. Never call `create_app` separately during scaffolding — it creates duplicates.
|
|
53
19
|
|
|
54
20
|
**For project data structure (workflows, fields, phases):**
|
|
55
21
|
- READ workspace/ TypeScript files directly (fields.ts, phases.ts, enums.ts)
|
|
@@ -64,38 +30,6 @@ mcp__hailer__create_app({
|
|
|
64
30
|
```
|
|
65
31
|
</critical-rules>
|
|
66
32
|
|
|
67
|
-
<local-dev-flow>
|
|
68
|
-
## Development Flow
|
|
69
|
-
|
|
70
|
-
**Default: Local development.** `scaffold_hailer_app` handles everything automatically:
|
|
71
|
-
1. Creates local project files
|
|
72
|
-
2. Reuses existing localhost dev app (or creates one if none exists) at `http://localhost:3000`
|
|
73
|
-
3. Shares the app with the workspace
|
|
74
|
-
4. Starts the dev server
|
|
75
|
-
|
|
76
|
-
**Do NOT call `create_app` during scaffolding.** The scaffold tool handles it.
|
|
77
|
-
|
|
78
|
-
After scaffolding, run `npm run dev` and test inside Hailer iframe.
|
|
79
|
-
|
|
80
|
-
**Publishing: Only when user explicitly asks.** Load the `publish-hailer-app` skill, which covers manifest validation, file upload via `publish_hailer_app`, and URL switch from localhost to production via `update_app`.
|
|
81
|
-
|
|
82
|
-
### Manual Local Dev App (Rare Cases)
|
|
83
|
-
|
|
84
|
-
Only needed if:
|
|
85
|
-
- You have existing code without a dev app entry
|
|
86
|
-
- The scaffold's dev app was deleted
|
|
87
|
-
|
|
88
|
-
```
|
|
89
|
-
mcp__hailer__create_app({
|
|
90
|
-
name: "Local Dev",
|
|
91
|
-
url: "http://localhost:3000",
|
|
92
|
-
description: "Local development testing"
|
|
93
|
-
})
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
Or manually in Hailer UI: Apps → Create App → URL: http://localhost:3000
|
|
97
|
-
</local-dev-flow>
|
|
98
|
-
|
|
99
33
|
<sdk-setup>
|
|
100
34
|
## Hook Import (CRITICAL)
|
|
101
35
|
|
|
@@ -364,42 +298,9 @@ const phaseResults = await Promise.all(
|
|
|
364
298
|
const allActivities = phaseResults.flat();
|
|
365
299
|
```
|
|
366
300
|
|
|
367
|
-
### Phase Selection
|
|
368
|
-
|
|
369
|
-
**Don't blindly fetch all phases.** Consider what the user needs to see:
|
|
370
|
-
|
|
371
|
-
| App Type | Phases to Fetch | Rationale |
|
|
372
|
-
|----------|-----------------|-----------|
|
|
373
|
-
| Sales dashboard | Active only | Don't show internal drafts |
|
|
374
|
-
| Product manager view | Draft + Active | Need to see work-in-progress |
|
|
375
|
-
| Archive browser | Archived only | Historical data |
|
|
376
|
-
| Kanban board | All except Archived | Full workflow visibility |
|
|
377
|
-
|
|
378
|
-
**Example: Role-based phase selection**
|
|
379
|
-
```typescript
|
|
380
|
-
// Define phases per user role
|
|
381
|
-
const PHASE_CONFIG = {
|
|
382
|
-
sales: ['activePhaseId'],
|
|
383
|
-
manager: ['draftPhaseId', 'activePhaseId'],
|
|
384
|
-
admin: ['draftPhaseId', 'activePhaseId', 'archivedPhaseId'],
|
|
385
|
-
};
|
|
301
|
+
### Phase Selection
|
|
386
302
|
|
|
387
|
-
|
|
388
|
-
const userRole = 'sales'; // from app config or user check
|
|
389
|
-
const phases = PHASE_CONFIG[userRole] || PHASE_CONFIG.sales;
|
|
390
|
-
|
|
391
|
-
const results = await Promise.all(
|
|
392
|
-
phases.map(phaseId => hailer.activity.list(workflowId, phaseId))
|
|
393
|
-
);
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
**Document phase selection in PRD:**
|
|
397
|
-
```markdown
|
|
398
|
-
## Data Access
|
|
399
|
-
- **Product Browser**: Shows Draft + Active phases (managers need WIP visibility)
|
|
400
|
-
- **Public Dashboard**: Active only (no internal data exposed)
|
|
401
|
-
- **Insights**: Active only (accurate counts, no duplicates from drafts)
|
|
402
|
-
```
|
|
303
|
+
Don't blindly fetch all phases — fetch only what the user needs to see (e.g., active only for dashboards, all except archived for kanban). For field value formats and phase selection patterns, see the **sdk-activity-patterns** skill.
|
|
403
304
|
|
|
404
305
|
## Kanban API
|
|
405
306
|
|
|
@@ -802,125 +703,6 @@ function StatsCard({ label, value, helpText }: Props) {
|
|
|
802
703
|
```
|
|
803
704
|
</component-templates>
|
|
804
705
|
|
|
805
|
-
<app-template>
|
|
806
|
-
## Full App Template
|
|
807
|
-
|
|
808
|
-
```typescript
|
|
809
|
-
import { useEffect, useState } from 'react';
|
|
810
|
-
import {
|
|
811
|
-
Box,
|
|
812
|
-
Heading,
|
|
813
|
-
Text,
|
|
814
|
-
Spinner,
|
|
815
|
-
Table,
|
|
816
|
-
Thead,
|
|
817
|
-
Tbody,
|
|
818
|
-
Tr,
|
|
819
|
-
Th,
|
|
820
|
-
Td,
|
|
821
|
-
VStack,
|
|
822
|
-
useColorModeValue,
|
|
823
|
-
} from '@chakra-ui/react';
|
|
824
|
-
import useHailer from './hailer/use-hailer';
|
|
825
|
-
|
|
826
|
-
// Field IDs from workflow schema (provided by orchestrator)
|
|
827
|
-
const FIELDS = {
|
|
828
|
-
NAME_FIELD: 'fieldId123',
|
|
829
|
-
STATUS_FIELD: 'fieldId456',
|
|
830
|
-
} as const;
|
|
831
|
-
|
|
832
|
-
interface Activity {
|
|
833
|
-
_id: string;
|
|
834
|
-
name: string;
|
|
835
|
-
fields?: Record<string, { value: unknown }>;
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
function App() {
|
|
839
|
-
const { inside, hailer } = useHailer();
|
|
840
|
-
const [activities, setActivities] = useState<Activity[]>([]);
|
|
841
|
-
const [loading, setLoading] = useState(true);
|
|
842
|
-
const [error, setError] = useState<string | null>(null);
|
|
843
|
-
|
|
844
|
-
const bg = useColorModeValue('gray.50', 'gray.800');
|
|
845
|
-
|
|
846
|
-
// Fetch data when inside Hailer
|
|
847
|
-
useEffect(() => {
|
|
848
|
-
if (!inside) return;
|
|
849
|
-
|
|
850
|
-
async function fetchData() {
|
|
851
|
-
try {
|
|
852
|
-
setLoading(true);
|
|
853
|
-
const data = await hailer.activity.list(
|
|
854
|
-
'workflowId', // Replace with actual workflow ID
|
|
855
|
-
'phaseId', // Replace with actual phase ID
|
|
856
|
-
{ limit: 100 }
|
|
857
|
-
);
|
|
858
|
-
setActivities(data);
|
|
859
|
-
} catch (err) {
|
|
860
|
-
setError(err instanceof Error ? err.message : 'Failed to load data');
|
|
861
|
-
} finally {
|
|
862
|
-
setLoading(false);
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
fetchData();
|
|
867
|
-
}, [inside]); // IMPORTANT: [inside] not [hailer]
|
|
868
|
-
|
|
869
|
-
// Early return AFTER hooks
|
|
870
|
-
if (!inside) {
|
|
871
|
-
return (
|
|
872
|
-
<Box p={8} textAlign="center">
|
|
873
|
-
<Text>Please open this app inside Hailer</Text>
|
|
874
|
-
</Box>
|
|
875
|
-
);
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
if (loading) {
|
|
879
|
-
return (
|
|
880
|
-
<Box p={8} textAlign="center">
|
|
881
|
-
<Spinner size="xl" />
|
|
882
|
-
</Box>
|
|
883
|
-
);
|
|
884
|
-
}
|
|
885
|
-
|
|
886
|
-
if (error) {
|
|
887
|
-
return (
|
|
888
|
-
<Box p={8} textAlign="center">
|
|
889
|
-
<Text color="red.500">{error}</Text>
|
|
890
|
-
</Box>
|
|
891
|
-
);
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
return (
|
|
895
|
-
<Box p={4} bg={bg} minH="100vh">
|
|
896
|
-
<VStack spacing={4} align="stretch">
|
|
897
|
-
<Heading size="lg">Dashboard</Heading>
|
|
898
|
-
|
|
899
|
-
<Table variant="simple" size="sm">
|
|
900
|
-
<Thead>
|
|
901
|
-
<Tr>
|
|
902
|
-
<Th>Name</Th>
|
|
903
|
-
<Th>Status</Th>
|
|
904
|
-
</Tr>
|
|
905
|
-
</Thead>
|
|
906
|
-
<Tbody>
|
|
907
|
-
{activities.map(activity => (
|
|
908
|
-
<Tr key={activity._id}>
|
|
909
|
-
<Td>{activity.name}</Td>
|
|
910
|
-
<Td>{String(activity.fields?.[FIELDS.STATUS_FIELD]?.value ?? '-')}</Td>
|
|
911
|
-
</Tr>
|
|
912
|
-
))}
|
|
913
|
-
</Tbody>
|
|
914
|
-
</Table>
|
|
915
|
-
</VStack>
|
|
916
|
-
</Box>
|
|
917
|
-
);
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
export default App;
|
|
921
|
-
```
|
|
922
|
-
</app-template>
|
|
923
|
-
|
|
924
706
|
<theme-patterns>
|
|
925
707
|
## Hailer Theme Colors
|
|
926
708
|
|
|
@@ -1052,18 +834,6 @@ const PHASE_COLOR_MAP: Record<string, string> = {
|
|
|
1052
834
|
};
|
|
1053
835
|
```
|
|
1054
836
|
|
|
1055
|
-
## Common UI Patterns
|
|
1056
|
-
|
|
1057
|
-
```typescript
|
|
1058
|
-
// Page container
|
|
1059
|
-
<Box p={4} bg={useColorModeValue('gray.50', 'gray.800')} minH="100vh">
|
|
1060
|
-
|
|
1061
|
-
// Card
|
|
1062
|
-
<Box p={4} bg={useColorModeValue('white', 'gray.700')} borderRadius="md" shadow="sm">
|
|
1063
|
-
|
|
1064
|
-
// Section with border
|
|
1065
|
-
<Box p={4} border="1px" borderColor={useColorModeValue('gray.200', 'gray.600')} borderRadius="md">
|
|
1066
|
-
```
|
|
1067
837
|
</theme-patterns>
|
|
1068
838
|
|
|
1069
839
|
<troubleshooting>
|
|
@@ -1072,7 +842,6 @@ const PHASE_COLOR_MAP: Record<string, string> = {
|
|
|
1072
842
|
When SDK calls fail with permission/not-allowed errors, check **workflow configuration in Hailer** first.
|
|
1073
843
|
|
|
1074
844
|
**Common symptoms:**
|
|
1075
|
-
- `hailer.activity.move()` fails with permission error
|
|
1076
845
|
- Phase transitions not working
|
|
1077
846
|
- "Not allowed" errors on operations that should work
|
|
1078
847
|
|
|
@@ -1152,20 +921,8 @@ const hoverBg = useColorModeValue('gray.50', 'gray.600');
|
|
|
1152
921
|
```
|
|
1153
922
|
|
|
1154
923
|
### hailer.activity.move is not a function
|
|
1155
|
-
```typescript
|
|
1156
|
-
// ❌ WRONG - activity.move() DOES NOT EXIST (common mistake)
|
|
1157
|
-
// await hailer.activity.move(activityId, newPhaseId); // This will fail!
|
|
1158
924
|
|
|
1159
|
-
|
|
1160
|
-
await hailer.activity.update([
|
|
1161
|
-
{
|
|
1162
|
-
_id: activityId,
|
|
1163
|
-
phaseId: newPhaseId,
|
|
1164
|
-
},
|
|
1165
|
-
], {});
|
|
1166
|
-
```
|
|
1167
|
-
|
|
1168
|
-
**Explanation:** Phase transitions in Hailer are done via the `update()` method by setting the `phaseId` field. There is no separate `move()` method in the SDK.
|
|
925
|
+
`activity.move()` does not exist. Use `activity.update([{ _id, phaseId }], {})` — see Phase Transitions in sdk-api.
|
|
1169
926
|
|
|
1170
927
|
### Routing: HashRouter vs BrowserRouter
|
|
1171
928
|
|
|
@@ -1276,29 +1033,6 @@ export const FIELDS = {
|
|
|
1276
1033
|
} as const;
|
|
1277
1034
|
```
|
|
1278
1035
|
|
|
1279
|
-
## Types File Pattern
|
|
1280
|
-
|
|
1281
|
-
```typescript
|
|
1282
|
-
// src/types/index.ts
|
|
1283
|
-
export interface Activity {
|
|
1284
|
-
_id: string;
|
|
1285
|
-
name: string;
|
|
1286
|
-
fields?: Record<string, { value: unknown }>;
|
|
1287
|
-
created?: number;
|
|
1288
|
-
updated?: number;
|
|
1289
|
-
}
|
|
1290
|
-
|
|
1291
|
-
export interface ActivityLinkValue {
|
|
1292
|
-
_id: string;
|
|
1293
|
-
name: string;
|
|
1294
|
-
}
|
|
1295
|
-
|
|
1296
|
-
export interface UserValue {
|
|
1297
|
-
_id: string;
|
|
1298
|
-
firstname: string;
|
|
1299
|
-
lastname: string;
|
|
1300
|
-
}
|
|
1301
|
-
```
|
|
1302
1036
|
</file-structure>
|
|
1303
1037
|
|
|
1304
1038
|
<app-manifest>
|
|
@@ -76,7 +76,7 @@ Create a wrapper component for CORS handling and error states:
|
|
|
76
76
|
import { Image, ImageProps, Icon } from '@chakra-ui/react';
|
|
77
77
|
import { FaImage } from 'react-icons/fa6';
|
|
78
78
|
import { useState, useEffect } from 'react';
|
|
79
|
-
import
|
|
79
|
+
import useHailer from '../hailer/use-hailer';
|
|
80
80
|
|
|
81
81
|
interface HailerImageProps extends Omit<ImageProps, 'src'> {
|
|
82
82
|
hailerImageUrl?: string;
|
|
@@ -102,7 +102,7 @@ export const HailerImage = ({
|
|
|
102
102
|
return;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
if (!hailer?.ready) {
|
|
105
|
+
if (!hailer?.ready) { // NOTE: verify .ready exists on SDK type — may need .activity or similar
|
|
106
106
|
setIsLoading(true);
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
@@ -237,7 +237,7 @@ const ProductImageCarousel = ({ allPictures, mainImageUrl }: Props) => {
|
|
|
237
237
|
```typescript
|
|
238
238
|
// In App.tsx or data fetching hook
|
|
239
239
|
const fetchProducts = async () => {
|
|
240
|
-
const data = await hailer.
|
|
240
|
+
const data = await hailer.public.insight.dataAsObject(PRODUCT_INSIGHT_KEY);
|
|
241
241
|
|
|
242
242
|
return data.map(item => ({
|
|
243
243
|
// ... other fields
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hailer-design-system
|
|
3
|
-
description: Chakra UI v2 theme, colors, icons, and component patterns for Hailer apps
|
|
4
|
-
version:
|
|
5
|
-
triggers: Build app, UI components, styling, theme, colors, icons, buttons, forms
|
|
3
|
+
description: Chakra UI v2 theme, colors, icons, and component patterns for Hailer apps. Includes layout, spacing, visual hierarchy, responsive design, empty/loading states.
|
|
4
|
+
version: 2.0.0
|
|
5
|
+
triggers: Build app, UI components, styling, theme, colors, icons, buttons, forms, layout, spacing, hierarchy, responsive, empty state, loading state, design, UI, UX, mockup, dashboard, grid
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Hailer Design System
|
|
@@ -11,6 +11,83 @@ Chakra UI v2 with custom Hailer theme.
|
|
|
11
11
|
|
|
12
12
|
**Full reference:** Read `docs/design-system/HAILER_DESIGN_SYSTEM.md` for comprehensive documentation (all icons, all components, full examples).
|
|
13
13
|
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Design Principles
|
|
17
|
+
|
|
18
|
+
### Layout
|
|
19
|
+
|
|
20
|
+
Common layout patterns (use Chakra Flex/Grid to implement):
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Dashboard: [Sidebar 240px] [Main Content flex-1]
|
|
24
|
+
List View: [Filters 280px] [Table/Cards flex-1]
|
|
25
|
+
Detail View: [Main 2/3] [Sidebar 1/3]
|
|
26
|
+
Form: [Labels 1/3] [Inputs 2/3] or stacked on mobile
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Grid: 12-column, 1200–1400px max-width, centered. Gutters 16–24px.
|
|
30
|
+
|
|
31
|
+
### Spacing Scale
|
|
32
|
+
|
|
33
|
+
| Token | px | Use |
|
|
34
|
+
|-------|----|-----|
|
|
35
|
+
| 1 | 4px | Icon padding |
|
|
36
|
+
| 2 | 8px | Compact (button padding) |
|
|
37
|
+
| 4 | 16px | Default (card padding, list gaps) |
|
|
38
|
+
| 6 | 24px | Section gaps |
|
|
39
|
+
| 8 | 32px | Page sections |
|
|
40
|
+
| 12 | 48px | Major sections |
|
|
41
|
+
|
|
42
|
+
### Visual Hierarchy
|
|
43
|
+
|
|
44
|
+
**Size scale:**
|
|
45
|
+
|
|
46
|
+
| Level | Size | Weight |
|
|
47
|
+
|-------|------|--------|
|
|
48
|
+
| Page title | 32–48px (`2xl`) | Bold |
|
|
49
|
+
| Section header | 24–28px (`xl`) | Semibold |
|
|
50
|
+
| Card title | 18–20px (`lg`/`md`) | Medium |
|
|
51
|
+
| Body | 14–16px | Regular |
|
|
52
|
+
| Caption/label | 12–13px (`sm`) | Regular/Medium |
|
|
53
|
+
|
|
54
|
+
**Emphasis:** size > weight > color > whitespace > position (F-pattern: top-left reads first).
|
|
55
|
+
|
|
56
|
+
**Density:** Bold labels + regular values for scannability. Group related info in cards. Show summary first, details on demand.
|
|
57
|
+
|
|
58
|
+
### Responsive Breakpoints
|
|
59
|
+
|
|
60
|
+
| Breakpoint | Width | Layout |
|
|
61
|
+
|------------|-------|--------|
|
|
62
|
+
| Mobile | < 640px | 1 column, stacked |
|
|
63
|
+
| Tablet | 640–1024px | 2 columns, sidebar hidden |
|
|
64
|
+
| Desktop | > 1024px | Full layout |
|
|
65
|
+
| Wide | > 1440px | max-width container |
|
|
66
|
+
|
|
67
|
+
Mobile adaptations: stack layouts vertically, hamburger menu, 44px min touch targets, bottom sheets over modals.
|
|
68
|
+
|
|
69
|
+
### Empty States
|
|
70
|
+
|
|
71
|
+
Always design for empty — never leave a blank panel:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
[Illustration / Icon]
|
|
75
|
+
No items yet
|
|
76
|
+
Add your first item
|
|
77
|
+
[+ Add Item]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Use `VStack` centered in the container with muted icon, `Text` heading, helper text, and a primary action button.
|
|
81
|
+
|
|
82
|
+
### Loading States
|
|
83
|
+
|
|
84
|
+
- **Skeleton** — gray boxes mimicking content shape (initial page loads)
|
|
85
|
+
- **Spinner** — for triggered actions, not initial loads
|
|
86
|
+
- **Progress** — multi-step or long operations
|
|
87
|
+
- **Optimistic** — show expected result immediately, revert on error
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
14
91
|
## Setup
|
|
15
92
|
|
|
16
93
|
The `react-ts` scaffold template already includes the design system at `src/hailer/theme/`. **Do NOT copy from other projects.**
|
|
@@ -43,6 +120,15 @@ import { theme } from './hailer/theme/theme';
|
|
|
43
120
|
- `bodyText` - Main text
|
|
44
121
|
- `chakra-body-bg` - Page background
|
|
45
122
|
|
|
123
|
+
**Background hierarchy:**
|
|
124
|
+
- Page: `gray.50` or white
|
|
125
|
+
- Card: white (with subtle shadow)
|
|
126
|
+
- Hover: `gray.100`
|
|
127
|
+
- Selected: `brand.50` or `blue.50`
|
|
128
|
+
- Disabled: `gray.100` with `gray.400` text
|
|
129
|
+
|
|
130
|
+
**Contrast:** 4.5:1 minimum for text (WCAG AA), 3:1 for large text and UI components.
|
|
131
|
+
|
|
46
132
|
---
|
|
47
133
|
|
|
48
134
|
## Buttons
|
|
@@ -110,6 +196,8 @@ import { HailerPlus, HailerSettings } from './hailer/theme/icons';
|
|
|
110
196
|
<Text fontSize="sm" color="subtleText">Caption</Text>
|
|
111
197
|
```
|
|
112
198
|
|
|
199
|
+
Text alignment: left-align body, center short headings/CTAs, right-align numbers in tables. Never justify body text.
|
|
200
|
+
|
|
113
201
|
---
|
|
114
202
|
|
|
115
203
|
## Spacing
|
|
@@ -137,6 +225,8 @@ import { HailerPlus, HailerSettings } from './hailer/theme/icons';
|
|
|
137
225
|
|
|
138
226
|
**Selection controls:** Only green colorScheme for Checkbox, Radio, Switch.
|
|
139
227
|
|
|
228
|
+
Labels above inputs (mobile-friendly). Group related fields in sections.
|
|
229
|
+
|
|
140
230
|
---
|
|
141
231
|
|
|
142
232
|
## Tables
|
|
@@ -153,7 +243,7 @@ import { HailerPlus, HailerSettings } from './hailer/theme/icons';
|
|
|
153
243
|
</Tr>
|
|
154
244
|
</Thead>
|
|
155
245
|
<Tbody>
|
|
156
|
-
<Tr>
|
|
246
|
+
<Tr _hover={{ bg: 'gray.50' }}>
|
|
157
247
|
<Td>Item</Td>
|
|
158
248
|
<Td isNumeric>42</Td>
|
|
159
249
|
</Tr>
|
|
@@ -162,6 +252,8 @@ import { HailerPlus, HailerSettings } from './hailer/theme/icons';
|
|
|
162
252
|
</TableContainer>
|
|
163
253
|
```
|
|
164
254
|
|
|
255
|
+
Responsive: hide secondary columns on mobile with `display={{ base: 'none', md: 'table-cell' }}`.
|
|
256
|
+
|
|
165
257
|
---
|
|
166
258
|
|
|
167
259
|
## Modals
|