@biznetgio/neo-app 0.4.43 → 0.4.44

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 +10 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@biznetgio/neo-app",
3
- "version": "0.4.43",
3
+ "version": "0.4.44",
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
@@ -210,6 +210,13 @@ export const TOOLS = [
210
210
  environments: ['staging', 'production'],
211
211
  pricing,
212
212
  costConsent: { estimateAvailable: true, dryRunIncludesCost: true, planApplyEnforced: true, note: 'neo_plan_stack returns a costed immutable plan; neo_apply_stack is server-enforced (hash/expiry/one-shot) so a billable stack requires a reviewed plan (handoff 3.3-3.5)' },
213
+ // Project/organization lifecycle (issue #107 §3). Honest to THIS build: project
214
+ // deletion is zero-write-preview → exact-name server confirmation → cascade delete;
215
+ // a dedicated costed plan (neo_plan_project_deletion) is not yet exposed, so
216
+ // requiresPlan is false. Organization deletion is unsupported and out of scope —
217
+ // no org-delete tool exists, and deleting a project never deletes its organization.
218
+ project: { delete: true, cascadeDelete: true, requiresPlan: false, requiresConfirmation: true, note: 'neo_delete_project: zero-write preview → exact-name, single-use server confirmation → cascade delete of all child resources.' },
219
+ organization: { delete: false, note: 'Organization deletion is unsupported and out of scope; no organization-delete tool is exposed.' },
213
220
  minClientVersion: pkgVersion(),
214
221
  deprecations: [],
215
222
  };
@@ -264,7 +271,7 @@ export const TOOLS = [
264
271
  },
265
272
  {
266
273
  name: 'neo_confirm_action',
267
- description: 'Record a human DECISION on a confirmation (NEVER creates or deletes anything itself) — the server-enforced approval step for a high-risk action (project/service deletion, billable create). decision is approve | decline | cancel. Approving a DELETION requires confirmationPhrase to exactly equal the target name (the human must type it). After approve, call the action tool again with this confirmationId to actually perform it (single-use). Show the human the summary from the preview and ask once; never infer consent.',
274
+ description: 'Record a human DECISION on a confirmation (NEVER creates or deletes anything itself) — the server-enforced approval step for a high-risk action (project/service deletion, billable create). decision is approve | decline | cancel. Approving a DELETION requires confirmationPhrase to exactly equal the target name (the human must type it — never manufacture it). If the confirmation has ackRequired:true (a project with production resources), approving ALSO requires acknowledgeNoRefund:true. After approve, call the action tool again with this confirmationId to actually perform it (single-use). Show the human the summary from the preview and ask once; never infer consent.',
268
275
  mutating: true,
269
276
  schema: {
270
277
  type: 'object',
@@ -272,11 +279,12 @@ export const TOOLS = [
272
279
  confirmationId: str('Confirmation id (from a destructive preview or a plan)'),
273
280
  decision: { type: 'string', enum: ['approve', 'decline', 'cancel'], description: 'approve | decline | cancel' },
274
281
  confirmationPhrase: str('For a deletion: the EXACT target name, typed by the human, required to approve'),
282
+ acknowledgeNoRefund: { type: 'boolean', description: 'Required to approve when the confirmation has ackRequired:true (production project delete): the human explicitly acknowledges there is no refund, credit, or proration.' },
275
283
  },
276
284
  required: ['confirmationId', 'decision'],
277
285
  },
278
286
  async call(api, args) {
279
- const { status, data } = await api.post(`/api/v1/confirmations/${args.confirmationId}/decide`, { decision: args.decision, confirmationPhrase: args.confirmationPhrase });
287
+ const { status, data } = await api.post(`/api/v1/confirmations/${args.confirmationId}/decide`, { decision: args.decision, confirmationPhrase: args.confirmationPhrase, acknowledgeNoRefund: args.acknowledgeNoRefund === true });
280
288
  return result(status, data);
281
289
  },
282
290
  },