@biznetgio/neo-app 0.4.67 → 0.4.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/mcp/tools.js +29 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@biznetgio/neo-app",
3
- "version": "0.4.67",
3
+ "version": "0.4.69",
4
4
  "description": "NEO App CLI — one-command agent onboarding, MCP server, and project ops for coding agents (Codex, Claude Code).",
5
5
  "type": "module",
6
6
  "bin": {
package/src/mcp/tools.js CHANGED
@@ -270,6 +270,25 @@ export const TOOLS = [
270
270
  return { environment: sessionEnv, ...acct };
271
271
  },
272
272
  },
273
+ {
274
+ name: 'neo_list_tokens',
275
+ description: 'List your API tokens — the agent/MCP & CLI SESSIONS that can act as you (JNG #109). Returns id, name, scope, createdAt, and lastUsed (so you can spot stale or unexpected sessions). Token secrets are never returned (write-only). Use with neo_revoke_token to terminate a session.',
276
+ mutating: false,
277
+ schema: { type: 'object', properties: {} },
278
+ async call(api) {
279
+ return (await api.get('/api/v1/tokens')).data;
280
+ },
281
+ },
282
+ {
283
+ name: 'neo_revoke_token',
284
+ description: 'Revoke (terminate) an API token / agent session by id — the token stops working immediately and cannot be restored (JNG #109). DESTRUCTIVE: confirm with the user which session to revoke first, and do NOT revoke the token this session is currently using unless the user explicitly wants to end it. Use neo_list_tokens to find the id.',
285
+ mutating: true,
286
+ destructive: true,
287
+ schema: { type: 'object', properties: { tokenId: str('Token/session id (from neo_list_tokens)') }, required: ['tokenId'] },
288
+ async call(api, args) {
289
+ return (await api.del(`/api/v1/tokens/${args.tokenId}`)).data;
290
+ },
291
+ },
273
292
  {
274
293
  name: 'neo_get_capabilities',
275
294
  description:
@@ -313,7 +332,7 @@ export const TOOLS = [
313
332
  controlPlane,
314
333
  resourceTypes,
315
334
  // Verbs this MCP build exposes today (no create-DB/queue/cron/bucket, no costed plan/apply yet).
316
- lifecycleVerbs: ['plan', 'apply', 'plan_promotion', 'get_operation', 'wait_operation', 'delete_stack', 'reconcile_usage', 'service_usage', 'create', 'list', 'get', 'update', 'verify', 'enable_public_access', 'disable_public_access', 'deploy', 'scale', 'add_domain', 'remove_domain', 'domain_status', 'logs', 'get_variables', 'set_variable', 'estimate', 'scan_repo', 'bind', 'unbind', 'run_cron', 'cron_questionnaire', 'presign_object', 'backup', 'restore', 'delete', 'delete_project', 'list_approvals', 'get_approval', 'get_credit', 'list_templates'],
335
+ lifecycleVerbs: ['plan', 'apply', 'plan_promotion', 'get_operation', 'wait_operation', 'delete_stack', 'reconcile_usage', 'service_usage', 'create', 'list', 'get', 'update', 'verify', 'enable_public_access', 'disable_public_access', 'deploy', 'scale', 'add_domain', 'remove_domain', 'domain_status', 'logs', 'get_variables', 'set_variable', 'estimate', 'scan_repo', 'bind', 'unbind', 'run_cron', 'cron_questionnaire', 'presign_object', 'backup', 'restore', 'delete', 'delete_project', 'list_approvals', 'get_approval', 'get_credit', 'list_templates', 'list_tokens', 'revoke_token'],
317
336
  promotion: { supported: true, byCopy: true, tool: 'neo_plan_promotion', note: 'staging→production promotion by copy (JNG #112 §8.7): an immutable costed prod stack plan; applied with neo_apply_stack; copies build/compute/env/bound foundations, never custom domains or secret values, never mutates the source.' },
318
337
  bindings: { supported: true, targets: ['neo_db', 'neo_queue', 'neo_object_storage'], writeOnly: true, note: 'neo_bind_resource + neo_plan_stack bindings inject DATABASE_URL / NATS_URL (+ NATS_HOST/PORT/USER/PASSWORD) / S3_* server-side at deploy; secrets never returned (handoff 5)' },
319
338
  sourceTypes: ['git', 'image', 'dockerfile', 'local', 'template'],
@@ -510,6 +529,15 @@ export const TOOLS = [
510
529
  return result(status, data);
511
530
  },
512
531
  },
532
+ {
533
+ name: 'neo_get_webhook',
534
+ description: 'Push-to-deploy (auto-deploy) integration status for a service (JNG #142). "Auto-deploy enabled" is NOT the same as "webhook active": this returns `status` = active (a delivery has been received) or **pending_setup** (NEO has never heard from the git provider — the webhook was likely never installed), plus `lastDeliveryAt` and the `setupUrl` to add to the repo. If pending_setup, add `setupUrl` as a push webhook (content-type application/json) in the repo\'s Settings → Webhooks; manual neo_deploy always works meanwhile.',
535
+ mutating: false,
536
+ schema: { type: 'object', properties: { appId: str('Service/app id') }, required: ['appId'] },
537
+ async call(api, args) {
538
+ return (await api.get(`/api/v1/apps/${args.appId}/webhook`)).data;
539
+ },
540
+ },
513
541
  {
514
542
  name: 'neo_get_domain_status',
515
543
  description: 'Check a custom domain\'s readiness to a TERMINAL state (JNG #112 §8.6): whether it is attached, whether DNS resolves to the expected CNAME target (with an expected-vs-observed diagnostic), whether managed TLS has been issued, and whether HTTPS actually serves a valid certificate for the host. Poll this after neo_add_service_domain + redeploy until ready:true — do NOT assume "attach accepted" means live. Returns {attached, expectedTarget, dns:{pointed,observed,diagnostic}, tls:{issued}, https:{ok,statusCode,certHostnameValid}, ready}.',