@ekanos/cli 0.3.5 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ekanos/cli",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "description": "The Ekanos partner toolchain CLI: scaffold, validate, and test an Ekanos integration against the published @ekanos packages. Agent-native — every verb speaks JSON with a stable exit-code taxonomy.",
5
5
  "keywords": [
6
6
  "cli",
@@ -33,7 +33,7 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@clack/prompts": "1.7.0",
36
- "@ekanos/integration-schema": "0.5.0",
36
+ "@ekanos/integration-schema": "0.6.0",
37
37
  "esbuild": "0.28.1",
38
38
  "picocolors": "1.1.1"
39
39
  },
@@ -358,10 +358,11 @@ your handler with the values the user actually typed.
358
358
 
359
359
  Build widget UI from `@ekanos/ui` — the published slice of the host design
360
360
  system. Available modules (import individually, e.g. `@ekanos/ui/button`):
361
- `alert`, `badge`, `button`, `card`, `dialog`, `dropdown-menu`, `form`, `icon`,
362
- `if`, `input`, `label`, `select`, `separator`, `skeleton`, `spinner`,
363
- `switch`, `textarea`, `tooltip`, `trans`, `utils` (the `cn()` helper),
364
- `ai-prompt-input`, plus the stylesheets `styles.css` / `tokens.css` /
361
+ `alert`, `badge`, `button`, `card`, `confirm-dialog`, `dialog`,
362
+ `dropdown-menu`, `empty-note`, `form`, `icon`, `if`, `input`, `label`,
363
+ `search-field`, `select`, `sheet`, `separator`, `skeleton`, `spinner`,
364
+ `switch`, `table`, `tabs`, `textarea`, `tooltip`, `trans`, `utils` (the
365
+ `cn()` helper), `ai-prompt-input`, plus the stylesheets `styles.css` / `tokens.css` /
365
366
  `theme.css` / `base.css`. Icons are Font Awesome glyph names via
366
367
  `@ekanos/ui/icon`. This generated shell loads Font Awesome **Free**
367
368
  (`@fortawesome/fontawesome-free`) — a much smaller set than the Pro kit Ekanos
@@ -427,6 +428,13 @@ who answers `/api/integrations/<slug>/…`:
427
428
  declared scopes, copy the keys) derived from the declaration plus the
428
429
  entry's `oauth.setup` (console link, provider-specific notes — WRITE these
429
430
  for every OAuth integration), then a form that saves the keys server-side.
431
+ Check the provider's docs for how its token endpoint wants client
432
+ authentication: the default, HTTP Basic, is wrong for some providers
433
+ (LinkedIn accepts only the secret in the form body). Set
434
+ `oauth.provider.tokenAuthMethod: 'client_secret_post'` for those; omit it
435
+ for Basic (`'client_secret_basic'`). A `<slug>_oauth_error=provider_error`
436
+ means the provider itself sent the user back with an error other than
437
+ `access_denied`; read the harness log for its `error_description`.
430
438
  Then Connect, and `onTokens` runs on the server. The connection is
431
439
  memory-only — a dev-server restart means one more Connect. **Never take a
432
440
  user's client id, secret or token through chat or write one into a file;
@@ -11,12 +11,12 @@
11
11
  "prepare": "node scripts/setup-hooks.mjs"
12
12
  },
13
13
  "dependencies": {
14
- "@ekanos/sdk": "^0.5.0",
15
- "@ekanos/ui": "^0.5.0"
14
+ "@ekanos/sdk": "^0.6.0",
15
+ "@ekanos/ui": "^0.6.0"
16
16
  },
17
17
  "devDependencies": {
18
- "@ekanos/cli": "^0.3.5",
19
- "@ekanos/harness": "^0.4.1",
18
+ "@ekanos/cli": "^0.3.6",
19
+ "@ekanos/harness": "^0.4.3",
20
20
  "@hookform/resolvers": "^5.2.2",
21
21
  "@tailwindcss/postcss": "^4.3.3",
22
22
  "@tanstack/react-query": "^5.101.4",
@@ -33,7 +33,11 @@ live: { default: 'live' },
33
33
  Find `consoleUrl` and the notes in the provider's docs during Phase 2
34
34
  (research) — the "create an app" / "register an application" page. Write
35
35
  what the CONSOLE calls things, not what the declaration calls them; the
36
- harness already prints the declared secret names beside each field. The
36
+ harness already prints the declared secret names beside each field. Also
37
+ read the provider's docs for how its token endpoint authenticates the client:
38
+ the default is HTTP Basic (`'client_secret_basic'`), but a provider that wants
39
+ `client_id` and `client_secret` in the form body (LinkedIn) needs
40
+ `provider.tokenAuthMethod: 'client_secret_post'` in the declaration. The
37
41
  harness derives the rest — provider host, redirect URI, scopes, PKCE — from
38
42
  `defineIntegration({ oauth })`, so do not repeat those in `notes`.
39
43
 
@@ -67,9 +71,13 @@ opens with a **Local OAuth** panel:
67
71
  connected" is expected — say so instead of debugging.
68
72
  - `<slug>_oauth_error=<code>` on the return URL is the transport's
69
73
  vocabulary: `not_configured` = a key is still missing (check the panel's
70
- badges), `denied` = the user cancelled at the provider, `exchange_failed` =
71
- the provider rejected the exchange (wrong redirect URI or secret, or the
72
- token host missing from `egress`), `save_failed` = your `onTokens` threw
74
+ badges), `denied` = the user cancelled at the provider, `provider_error` =
75
+ the provider sent the user back with an error other than `access_denied`
76
+ (the dev-server log has its `error` and `error_description`),
77
+ `exchange_failed` = the provider rejected the exchange (wrong redirect URI
78
+ or secret, the wrong `tokenAuthMethod`, or the token host missing from
79
+ `egress`; the log line carries the provider's redacted response body),
80
+ `save_failed` = your `onTokens` threw
73
81
  (read the dev-server log). Fix the cause; do not retry blindly.
74
82
  - Widgets read the connection through `useOAuthWidgetGate` / the storage
75
83
  route. If they show "Connect" after a successful loop, check `onActivate`