@hasna/skills 0.3.0 → 0.5.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.
Files changed (55) hide show
  1. package/README.md +269 -14
  2. package/bin/index.js +7835 -5440
  3. package/bin/mcp.js +2040 -589
  4. package/bin/migrate.js +148 -40
  5. package/bin/server.js +66 -87
  6. package/bin/worker.js +42 -75
  7. package/dist/admin-contract.d.ts +37 -19
  8. package/dist/admin-contract.js +1 -1
  9. package/dist/cli/cli.test-utils.d.ts +10 -8
  10. package/dist/cli/commands/customer-profile.d.ts +2 -0
  11. package/dist/cli/commands/customer-verification.d.ts +5 -0
  12. package/dist/cli/commands/remote-account.d.ts +7 -0
  13. package/dist/cli/commands/tool-primitives.d.ts +1 -1
  14. package/dist/cli/commands/workspace-member-mutations.d.ts +2 -0
  15. package/dist/cli/commands/workspace-members.d.ts +2 -0
  16. package/dist/cli/env-assignment.d.ts +9 -0
  17. package/dist/index.d.ts +7 -2
  18. package/dist/index.js +1369 -349
  19. package/dist/lib/agent-sync.d.ts +13 -8
  20. package/dist/lib/api-url.d.ts +4 -3
  21. package/dist/lib/app-home.d.ts +0 -1
  22. package/dist/lib/auth-store.d.ts +1 -1
  23. package/dist/lib/client-types.d.ts +75 -0
  24. package/dist/lib/credential-state.d.ts +12 -0
  25. package/dist/lib/fleet-credentials.d.ts +49 -17
  26. package/dist/lib/home-adoption.d.ts +2 -0
  27. package/dist/lib/home-census.d.ts +3 -1
  28. package/dist/lib/instance-credentials.d.ts +13 -0
  29. package/dist/lib/local-opt-in.d.ts +24 -0
  30. package/dist/lib/mcp-contracts.d.ts +4 -0
  31. package/dist/lib/portable-skills-files.d.ts +10 -2
  32. package/dist/lib/portable-skills-types.d.ts +2 -0
  33. package/dist/lib/read-access.d.ts +83 -0
  34. package/dist/lib/remote-account.d.ts +42 -0
  35. package/dist/lib/remote-auth.d.ts +46 -0
  36. package/dist/lib/remote-client.d.ts +90 -6
  37. package/dist/lib/remote-customer-operations.d.ts +106 -0
  38. package/dist/lib/remote-files.d.ts +21 -0
  39. package/dist/lib/remote-profile.d.ts +26 -0
  40. package/dist/lib/remote-registry.d.ts +7 -3
  41. package/dist/lib/remote-workspace.d.ts +76 -0
  42. package/dist/lib/run-routing.d.ts +1 -0
  43. package/dist/lib/run-state.d.ts +3 -0
  44. package/dist/lib/skillinfo.d.ts +1 -1
  45. package/dist/mcp/helpers.d.ts +22 -0
  46. package/dist/mcp/index.d.ts +16 -0
  47. package/dist/mcp/remote-customer-tools.d.ts +2 -0
  48. package/dist/sdk/governance-store.d.ts +1 -0
  49. package/dist/sdk/index.d.ts +8 -1
  50. package/dist/sdk/index.js +1994 -416
  51. package/dist/sdk/outputs.d.ts +0 -11
  52. package/dist/sdk/runs.d.ts +5 -5
  53. package/dist/storage.js +6 -40
  54. package/docs/skill-standard.md +30 -2
  55. package/package.json +7 -6
package/bin/worker.js CHANGED
@@ -23103,7 +23103,7 @@ import { randomUUID as randomUUID4 } from "crypto";
23103
23103
  // package.json
23104
23104
  var package_default = {
23105
23105
  name: "@hasna/skills",
23106
- version: "0.3.0",
23106
+ version: "0.5.0",
23107
23107
  description: "Skills library for AI coding agents",
23108
23108
  type: "module",
23109
23109
  bin: {
@@ -23135,6 +23135,7 @@ var package_default = {
23135
23135
  files: [
23136
23136
  "dist/",
23137
23137
  "!dist/**/*.test.d.ts",
23138
+ "!dist/**/*.fixture.d.ts",
23138
23139
  "!dist/test-preload.d.ts",
23139
23140
  "!dist/platform",
23140
23141
  "bin/",
@@ -23160,10 +23161,10 @@ var package_default = {
23160
23161
  migrate: "bun run ./src/server/migrate.ts",
23161
23162
  typecheck: "tsc --noEmit",
23162
23163
  "verify:release": "bun run scripts/release-guard.ts",
23164
+ "verify:consumer-types": "bun run scripts/consumer-types.ts",
23163
23165
  prepare: "bun run build:js",
23164
- prepack: "bun run build && bun run verify:release",
23165
- prepublishOnly: "bun run typecheck && bun run test",
23166
- postinstall: "mkdir -p $HOME/.hasna/skills/custom 2>/dev/null || true"
23166
+ prepack: "bun run build && bun run verify:release && bun run verify:consumer-types",
23167
+ prepublishOnly: "bun run typecheck && bun run test"
23167
23168
  },
23168
23169
  keywords: [
23169
23170
  "skills",
@@ -23184,6 +23185,7 @@ var package_default = {
23184
23185
  author: "Hasna",
23185
23186
  license: "Apache-2.0",
23186
23187
  devDependencies: {
23188
+ "@hasna/contracts": "1.0.2",
23187
23189
  "@types/bun": "1.3.14",
23188
23190
  "@types/node": "25.2.3",
23189
23191
  "@types/react": "^18.2.0",
@@ -23195,8 +23197,7 @@ var package_default = {
23195
23197
  dependencies: {
23196
23198
  "@aws-sdk/client-ecs": "^3.1079.0",
23197
23199
  "@aws-sdk/client-s3": "^3.1079.0",
23198
- "@hasna/contracts": "1.0.1",
23199
- "@hasna/events": "0.1.16",
23200
+ "@hasna/events": "0.1.18",
23200
23201
  "@modelcontextprotocol/sdk": "^1.26.0",
23201
23202
  chalk: "^5.3.0",
23202
23203
  commander: "^12.1.0",
@@ -23746,7 +23747,7 @@ var $NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS = NODE_RESPONSE_CHECKSUM_V
23746
23747
  var $getFlexibleChecksumsPlugin = getFlexibleChecksumsPlugin;
23747
23748
  var $resolveFlexibleChecksumsConfig = resolveFlexibleChecksumsConfig;
23748
23749
 
23749
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/S3Client.js
23750
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/S3Client.js
23750
23751
  var import_client23 = __toESM(require_client2(), 1);
23751
23752
 
23752
23753
  // ../../node_modules/.bun/@aws-sdk+middleware-sdk-s3@3.972.75/node_modules/@aws-sdk/middleware-sdk-s3/dist-cjs/submodules/s3/index.js
@@ -24354,7 +24355,7 @@ var $getThrow200ExceptionsPlugin = getThrow200ExceptionsPlugin;
24354
24355
  var $getValidateBucketNamePlugin = getValidateBucketNamePlugin;
24355
24356
  var $resolveS3Config = resolveS3Config;
24356
24357
 
24357
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/S3Client.js
24358
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/S3Client.js
24358
24359
  var import_core = __toESM(require_dist_cjs2(), 1);
24359
24360
  var import_client24 = __toESM(require_client(), 1);
24360
24361
  var import_config29 = __toESM(require_config(), 1);
@@ -24364,17 +24365,17 @@ var import_protocols6 = __toESM(require_protocols(), 1);
24364
24365
  var import_retry4 = __toESM(require_retry(), 1);
24365
24366
  var import_schema2 = __toESM(require_schema(), 1);
24366
24367
 
24367
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/auth/httpAuthSchemeProvider.js
24368
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/auth/httpAuthSchemeProvider.js
24368
24369
  var import_httpAuthSchemes = __toESM(require_httpAuthSchemes(), 1);
24369
24370
  var import_signature_v4_multi_region = __toESM(require_dist_cjs4(), 1);
24370
24371
  var import_client2 = __toESM(require_client(), 1);
24371
24372
  var import_endpoints3 = __toESM(require_endpoints(), 1);
24372
24373
 
24373
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/endpoint/endpointResolver.js
24374
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/endpoint/endpointResolver.js
24374
24375
  var import_client = __toESM(require_client2(), 1);
24375
24376
  var import_endpoints2 = __toESM(require_endpoints(), 1);
24376
24377
 
24377
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/endpoint/bdd.js
24378
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/endpoint/bdd.js
24378
24379
  var import_endpoints = __toESM(require_endpoints(), 1);
24379
24380
  var aw = "ref";
24380
24381
  var ax = "argv";
@@ -26318,7 +26319,7 @@ var nodes = new Int32Array([
26318
26319
  ]);
26319
26320
  var bdd = import_endpoints.BinaryDecisionDiagram.from(nodes, root, _data.conditions, _data.results);
26320
26321
 
26321
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/endpoint/endpointResolver.js
26322
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/endpoint/endpointResolver.js
26322
26323
  var cache = new import_endpoints2.EndpointCache({
26323
26324
  size: 50,
26324
26325
  params: [
@@ -26346,7 +26347,7 @@ var defaultEndpointResolver = (endpointParams, context = {}) => {
26346
26347
  };
26347
26348
  import_endpoints2.customEndpointFunctions.aws = import_client.awsEndpointFunctions;
26348
26349
 
26349
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/auth/httpAuthSchemeProvider.js
26350
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/auth/httpAuthSchemeProvider.js
26350
26351
  var createEndpointRuleSetHttpAuthSchemeParametersProvider = (defaultHttpAuthSchemeParametersProvider) => async (config, context, input) => {
26351
26352
  if (!input) {
26352
26353
  throw new Error("Could not find `input` for `defaultEndpointRuleSetHttpAuthSchemeParametersProvider`");
@@ -26462,11 +26463,11 @@ var resolveHttpAuthSchemeConfig = (config) => {
26462
26463
  });
26463
26464
  };
26464
26465
 
26465
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/commandBuilder.js
26466
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/commandBuilder.js
26466
26467
  var import_client3 = __toESM(require_client(), 1);
26467
26468
  var import_endpoints4 = __toESM(require_endpoints(), 1);
26468
26469
 
26469
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/endpoint/EndpointParameters.js
26470
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/endpoint/EndpointParameters.js
26470
26471
  var resolveClientEndpointParameters = (options) => {
26471
26472
  return Object.assign(options, {
26472
26473
  useFipsEndpoint: options.useFipsEndpoint ?? false,
@@ -26492,7 +26493,7 @@ var commonParams = {
26492
26493
  UseDualStack: { type: "builtInParams", name: "useDualstackEndpoint" }
26493
26494
  };
26494
26495
 
26495
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/commandBuilder.js
26496
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/commandBuilder.js
26496
26497
  var command = import_client3.makeBuilder(commonParams, "AmazonS3", "S3Client", import_endpoints4.getEndpointPlugin);
26497
26498
  var _ep0 = {
26498
26499
  Bucket: { type: "contextParams", name: "Bucket" },
@@ -26524,10 +26525,10 @@ var _mw11 = (Command, cs, config, o2) => [
26524
26525
  $getSsecPlugin(config)
26525
26526
  ];
26526
26527
 
26527
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/schemas/schemas_0.js
26528
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/schemas/schemas_0.js
26528
26529
  var import_schema = __toESM(require_schema(), 1);
26529
26530
 
26530
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/models/S3ServiceException.js
26531
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/models/S3ServiceException.js
26531
26532
  var import_client4 = __toESM(require_client(), 1);
26532
26533
  class S3ServiceException extends import_client4.ServiceException {
26533
26534
  constructor(options) {
@@ -26536,7 +26537,7 @@ class S3ServiceException extends import_client4.ServiceException {
26536
26537
  }
26537
26538
  }
26538
26539
 
26539
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/models/errors.js
26540
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/models/errors.js
26540
26541
  class NoSuchUpload extends S3ServiceException {
26541
26542
  name = "NoSuchUpload";
26542
26543
  $fault = "client";
@@ -26814,7 +26815,7 @@ class ObjectAlreadyInActiveTierError extends S3ServiceException {
26814
26815
  }
26815
26816
  }
26816
26817
 
26817
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/schemas/schemas_0.js
26818
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/schemas/schemas_0.js
26818
26819
  var _A = "Account";
26819
26820
  var _AAO = "AnalyticsAndOperator";
26820
26821
  var _AC = "AccelerateConfiguration";
@@ -32266,13 +32267,13 @@ var WriteGetObjectResponse$ = [
32266
32267
  () => __Unit
32267
32268
  ];
32268
32269
 
32269
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/commands/CreateSessionCommand.js
32270
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/commands/CreateSessionCommand.js
32270
32271
  class CreateSessionCommand extends command(_ep4, _mw0, "CreateSession", CreateSession$) {
32271
32272
  }
32272
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/package.json
32273
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/package.json
32273
32274
  var package_default2 = {
32274
32275
  name: "@aws-sdk/client-s3",
32275
- version: "3.1126.0",
32276
+ version: "3.1127.0",
32276
32277
  description: "AWS SDK for JavaScript S3 Client for Node.js, Browser and React Native",
32277
32278
  homepage: "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-s3",
32278
32279
  license: "Apache-2.0",
@@ -32339,7 +32340,7 @@ var package_default2 = {
32339
32340
  tslib: "^2.6.2"
32340
32341
  },
32341
32342
  devDependencies: {
32342
- "@aws-sdk/signature-v4-crt": "3.1126.0",
32343
+ "@aws-sdk/signature-v4-crt": "3.1127.0",
32343
32344
  "@smithy/snapshot-testing": "^2.3.2",
32344
32345
  "@tsconfig/node20": "20.1.8",
32345
32346
  "@types/node": "^20.14.8",
@@ -32354,7 +32355,7 @@ var package_default2 = {
32354
32355
  }
32355
32356
  };
32356
32357
 
32357
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeConfig.js
32358
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeConfig.js
32358
32359
  var import_client19 = __toESM(require_client2(), 1);
32359
32360
  var import_httpAuthSchemes3 = __toESM(require_httpAuthSchemes(), 1);
32360
32361
 
@@ -32511,7 +32512,7 @@ var defaultProvider = (init = {}) => memoizeChain([
32511
32512
  }
32512
32513
  ], credentialsTreatedAsExpired);
32513
32514
  var credentialsTreatedAsExpired = (credentials) => credentials?.expiration !== undefined && credentials.expiration.getTime() - Date.now() < 300000;
32514
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeConfig.js
32515
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeConfig.js
32515
32516
  var import_checksum2 = __toESM(require_checksum(), 1);
32516
32517
  var import_client20 = __toESM(require_client(), 1);
32517
32518
  var import_config28 = __toESM(require_config(), 1);
@@ -32749,7 +32750,7 @@ var subtle = typeof digest === "function" && typeof sign2 === "function" && type
32749
32750
  var MAX_PENDING_BYTES = 8 * 1024 * 1024;
32750
32751
  var $Sha1 = Sha1Node;
32751
32752
 
32752
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeConfig.shared.js
32753
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeConfig.shared.js
32753
32754
  var import_httpAuthSchemes2 = __toESM(require_httpAuthSchemes(), 1);
32754
32755
  var import_signature_v4_multi_region2 = __toESM(require_dist_cjs4(), 1);
32755
32756
  var import_checksum = __toESM(require_checksum(), 1);
@@ -32801,7 +32802,7 @@ var getRuntimeConfig2 = (config) => {
32801
32802
  };
32802
32803
  };
32803
32804
 
32804
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeConfig.js
32805
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeConfig.js
32805
32806
  var getRuntimeConfig3 = (config) => {
32806
32807
  import_client20.emitWarningIfUnsupportedVersion(process.version);
32807
32808
  const defaultsMode = import_config28.resolveDefaultsModeConfig(config);
@@ -32842,12 +32843,12 @@ var getRuntimeConfig3 = (config) => {
32842
32843
  };
32843
32844
  };
32844
32845
 
32845
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeExtensions.js
32846
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeExtensions.js
32846
32847
  var import_client21 = __toESM(require_client2(), 1);
32847
32848
  var import_client22 = __toESM(require_client(), 1);
32848
32849
  var import_protocols5 = __toESM(require_protocols(), 1);
32849
32850
 
32850
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/auth/httpAuthExtensionConfiguration.js
32851
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/auth/httpAuthExtensionConfiguration.js
32851
32852
  var getHttpAuthExtensionConfiguration2 = (runtimeConfig) => {
32852
32853
  const _httpAuthSchemes = runtimeConfig.httpAuthSchemes;
32853
32854
  let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider;
@@ -32886,14 +32887,14 @@ var resolveHttpAuthRuntimeConfig2 = (config) => {
32886
32887
  };
32887
32888
  };
32888
32889
 
32889
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeExtensions.js
32890
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/runtimeExtensions.js
32890
32891
  var resolveRuntimeExtensions2 = (runtimeConfig, extensions) => {
32891
32892
  const extensionConfiguration = Object.assign(import_client21.getAwsRegionExtensionConfiguration(runtimeConfig), import_client22.getDefaultExtensionConfiguration(runtimeConfig), import_protocols5.getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration2(runtimeConfig));
32892
32893
  extensions.forEach((extension) => extension.configure(extensionConfiguration));
32893
32894
  return Object.assign(runtimeConfig, import_client21.resolveAwsRegionExtensionConfiguration(extensionConfiguration), import_client22.resolveDefaultRuntimeConfig(extensionConfiguration), import_protocols5.resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig2(extensionConfiguration));
32894
32895
  };
32895
32896
 
32896
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/S3Client.js
32897
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/S3Client.js
32897
32898
  class S3Client extends import_client24.Client {
32898
32899
  config;
32899
32900
  constructor(...[configuration]) {
@@ -32938,15 +32939,15 @@ class S3Client extends import_client24.Client {
32938
32939
  }
32939
32940
  }
32940
32941
 
32941
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/commands/DeleteObjectCommand.js
32942
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/commands/DeleteObjectCommand.js
32942
32943
  class DeleteObjectCommand extends command(_ep0, _mw0, "DeleteObject", DeleteObject$) {
32943
32944
  }
32944
32945
 
32945
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/commands/GetObjectCommand.js
32946
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/commands/GetObjectCommand.js
32946
32947
  class GetObjectCommand extends command(_ep0, _mw7, "GetObject", GetObject$) {
32947
32948
  }
32948
32949
 
32949
- // ../../node_modules/.bun/@aws-sdk+client-s3@3.1126.0/node_modules/@aws-sdk/client-s3/dist-es/commands/PutObjectCommand.js
32950
+ // ../../node_modules/.bun/@aws-sdk+client-s3@3.1127.0/node_modules/@aws-sdk/client-s3/dist-es/commands/PutObjectCommand.js
32950
32951
  class PutObjectCommand extends command(_ep0, _mw11, "PutObject", PutObject$) {
32951
32952
  }
32952
32953
 
@@ -33233,12 +33234,7 @@ import { homedir as homedir2 } from "os";
33233
33234
  import { join as join2, resolve } from "path";
33234
33235
  import { homedir as pathsResolverHomedir } from "os";
33235
33236
  import { join as pathsResolverJoin } from "path";
33236
- var PATHS_RESOLVER_KIND_ENV = {
33237
- config: "HASNA_CONFIG_HOME",
33238
- data: "HASNA_DATA_HOME",
33239
- state: "HASNA_STATE_HOME",
33240
- cache: "HASNA_CACHE_HOME"
33241
- };
33237
+ var PATHS_RESOLVER_DATA_ENV = "HASNA_DATA_HOME";
33242
33238
  var PATHS_RESOLVER_APP_SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
33243
33239
  function pathsResolverAssertApp(app) {
33244
33240
  if (typeof app !== "string" || app.length === 0) {
@@ -33248,48 +33244,19 @@ function pathsResolverAssertApp(app) {
33248
33244
  throw new TypeError(`paths: invalid app slug "${app}" \u2014 expected lowercase kebab-case ([a-z0-9]+(-[a-z0-9]+)*)`);
33249
33245
  }
33250
33246
  }
33251
- function pathsResolverAssertKind(kind) {
33252
- if (!Object.keys(PATHS_RESOLVER_KIND_ENV).includes(kind)) {
33253
- throw new TypeError(`paths: invalid path kind "${kind}" \u2014 expected one of ${Object.keys(PATHS_RESOLVER_KIND_ENV).join(", ")}`);
33254
- }
33255
- }
33256
- function pathsResolverBaseDir(kind, options) {
33257
- pathsResolverAssertKind(kind);
33247
+ function pathsResolverDataBaseDir(options) {
33258
33248
  const env = options.env ?? process.env;
33259
- const override = env[PATHS_RESOLVER_KIND_ENV[kind]];
33249
+ const override = env[PATHS_RESOLVER_DATA_ENV];
33260
33250
  if (typeof override === "string" && override.length > 0)
33261
33251
  return override;
33262
33252
  const home = options.home ?? pathsResolverHomedir();
33263
33253
  const platform = options.platform ?? process.platform;
33264
- if (platform === "darwin") {
33265
- switch (kind) {
33266
- case "config":
33267
- case "data":
33268
- return pathsResolverJoin(home, "Library", "Application Support", "Hasna");
33269
- case "cache":
33270
- return pathsResolverJoin(home, "Library", "Caches", "Hasna");
33271
- case "state":
33272
- return pathsResolverJoin(home, "Library", "Logs", "Hasna");
33273
- }
33274
- }
33275
- switch (kind) {
33276
- case "config":
33277
- return pathsResolverJoin(home, ".config", "hasna");
33278
- case "data":
33279
- return pathsResolverJoin(home, ".local", "share", "hasna");
33280
- case "state":
33281
- return pathsResolverJoin(home, ".local", "state", "hasna");
33282
- case "cache":
33283
- return pathsResolverJoin(home, ".cache", "hasna");
33284
- }
33254
+ return platform === "darwin" ? pathsResolverJoin(home, "Library", "Application Support", "Hasna") : pathsResolverJoin(home, ".local", "share", "hasna");
33285
33255
  }
33286
- function pathsResolverResolve(kind, options) {
33256
+ function dataDir(options) {
33287
33257
  pathsResolverAssertApp(options.app);
33288
33258
  const appSegment = options.internal === true ? pathsResolverJoin("internal", options.app) : options.app;
33289
- return pathsResolverJoin(pathsResolverBaseDir(kind, options), appSegment);
33290
- }
33291
- function dataDir(options) {
33292
- return pathsResolverResolve("data", options);
33259
+ return pathsResolverJoin(pathsResolverDataBaseDir(options), appSegment);
33293
33260
  }
33294
33261
  var DATA_DIR_ENV = "HASNA_SKILLS_DIR";
33295
33262
  var HASNA_SKILLS_HOME_ENV = "HASNA_SKILLS_HOME";
@@ -1,4 +1,4 @@
1
- import { z } from "zod";
1
+ import { z } from "zod/v3";
2
2
  /** Version of the public, contract-only Skills administration API surface. */
3
3
  export declare const SKILLS_ADMIN_API_CONTRACT_VERSION: "1.0.0";
4
4
  export declare const SKILLS_ADMIN_ENV_URL: "HASNA_SKILLS_API_URL";
@@ -1561,27 +1561,30 @@ export declare const SkillsAdminListUsersResponseSchema: z.ZodObject<{
1561
1561
  users: z.ZodArray<z.ZodObject<{
1562
1562
  id: z.ZodString;
1563
1563
  email: z.ZodString;
1564
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
1565
1564
  organizationId: z.ZodOptional<z.ZodString>;
1566
1565
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1567
1566
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1568
1567
  createdAt: z.ZodString;
1568
+ } & {
1569
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
1569
1570
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
1570
1571
  id: z.ZodString;
1571
1572
  email: z.ZodString;
1572
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
1573
1573
  organizationId: z.ZodOptional<z.ZodString>;
1574
1574
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1575
1575
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1576
1576
  createdAt: z.ZodString;
1577
+ } & {
1578
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
1577
1579
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
1578
1580
  id: z.ZodString;
1579
1581
  email: z.ZodString;
1580
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
1581
1582
  organizationId: z.ZodOptional<z.ZodString>;
1582
1583
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1583
1584
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1584
1585
  createdAt: z.ZodString;
1586
+ } & {
1587
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
1585
1588
  }, z.ZodTypeAny, "passthrough">>, "many">;
1586
1589
  limit: z.ZodNumber;
1587
1590
  offset: z.ZodNumber;
@@ -1589,27 +1592,30 @@ export declare const SkillsAdminListUsersResponseSchema: z.ZodObject<{
1589
1592
  users: z.ZodArray<z.ZodObject<{
1590
1593
  id: z.ZodString;
1591
1594
  email: z.ZodString;
1592
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
1593
1595
  organizationId: z.ZodOptional<z.ZodString>;
1594
1596
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1595
1597
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1596
1598
  createdAt: z.ZodString;
1599
+ } & {
1600
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
1597
1601
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
1598
1602
  id: z.ZodString;
1599
1603
  email: z.ZodString;
1600
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
1601
1604
  organizationId: z.ZodOptional<z.ZodString>;
1602
1605
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1603
1606
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1604
1607
  createdAt: z.ZodString;
1608
+ } & {
1609
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
1605
1610
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
1606
1611
  id: z.ZodString;
1607
1612
  email: z.ZodString;
1608
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
1609
1613
  organizationId: z.ZodOptional<z.ZodString>;
1610
1614
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1611
1615
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1612
1616
  createdAt: z.ZodString;
1617
+ } & {
1618
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
1613
1619
  }, z.ZodTypeAny, "passthrough">>, "many">;
1614
1620
  limit: z.ZodNumber;
1615
1621
  offset: z.ZodNumber;
@@ -1617,27 +1623,30 @@ export declare const SkillsAdminListUsersResponseSchema: z.ZodObject<{
1617
1623
  users: z.ZodArray<z.ZodObject<{
1618
1624
  id: z.ZodString;
1619
1625
  email: z.ZodString;
1620
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
1621
1626
  organizationId: z.ZodOptional<z.ZodString>;
1622
1627
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1623
1628
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1624
1629
  createdAt: z.ZodString;
1630
+ } & {
1631
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
1625
1632
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
1626
1633
  id: z.ZodString;
1627
1634
  email: z.ZodString;
1628
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
1629
1635
  organizationId: z.ZodOptional<z.ZodString>;
1630
1636
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1631
1637
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1632
1638
  createdAt: z.ZodString;
1639
+ } & {
1640
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
1633
1641
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
1634
1642
  id: z.ZodString;
1635
1643
  email: z.ZodString;
1636
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
1637
1644
  organizationId: z.ZodOptional<z.ZodString>;
1638
1645
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1639
1646
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1640
1647
  createdAt: z.ZodString;
1648
+ } & {
1649
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
1641
1650
  }, z.ZodTypeAny, "passthrough">>, "many">;
1642
1651
  limit: z.ZodNumber;
1643
1652
  offset: z.ZodNumber;
@@ -4405,27 +4414,30 @@ export declare const SKILLS_ADMIN_OPERATIONS: {
4405
4414
  users: z.ZodArray<z.ZodObject<{
4406
4415
  id: z.ZodString;
4407
4416
  email: z.ZodString;
4408
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
4409
4417
  organizationId: z.ZodOptional<z.ZodString>;
4410
4418
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
4411
4419
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
4412
4420
  createdAt: z.ZodString;
4421
+ } & {
4422
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
4413
4423
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
4414
4424
  id: z.ZodString;
4415
4425
  email: z.ZodString;
4416
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
4417
4426
  organizationId: z.ZodOptional<z.ZodString>;
4418
4427
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
4419
4428
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
4420
4429
  createdAt: z.ZodString;
4430
+ } & {
4431
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
4421
4432
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
4422
4433
  id: z.ZodString;
4423
4434
  email: z.ZodString;
4424
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
4425
4435
  organizationId: z.ZodOptional<z.ZodString>;
4426
4436
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
4427
4437
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
4428
4438
  createdAt: z.ZodString;
4439
+ } & {
4440
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
4429
4441
  }, z.ZodTypeAny, "passthrough">>, "many">;
4430
4442
  limit: z.ZodNumber;
4431
4443
  offset: z.ZodNumber;
@@ -4433,27 +4445,30 @@ export declare const SKILLS_ADMIN_OPERATIONS: {
4433
4445
  users: z.ZodArray<z.ZodObject<{
4434
4446
  id: z.ZodString;
4435
4447
  email: z.ZodString;
4436
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
4437
4448
  organizationId: z.ZodOptional<z.ZodString>;
4438
4449
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
4439
4450
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
4440
4451
  createdAt: z.ZodString;
4452
+ } & {
4453
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
4441
4454
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
4442
4455
  id: z.ZodString;
4443
4456
  email: z.ZodString;
4444
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
4445
4457
  organizationId: z.ZodOptional<z.ZodString>;
4446
4458
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
4447
4459
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
4448
4460
  createdAt: z.ZodString;
4461
+ } & {
4462
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
4449
4463
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
4450
4464
  id: z.ZodString;
4451
4465
  email: z.ZodString;
4452
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
4453
4466
  organizationId: z.ZodOptional<z.ZodString>;
4454
4467
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
4455
4468
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
4456
4469
  createdAt: z.ZodString;
4470
+ } & {
4471
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
4457
4472
  }, z.ZodTypeAny, "passthrough">>, "many">;
4458
4473
  limit: z.ZodNumber;
4459
4474
  offset: z.ZodNumber;
@@ -4461,27 +4476,30 @@ export declare const SKILLS_ADMIN_OPERATIONS: {
4461
4476
  users: z.ZodArray<z.ZodObject<{
4462
4477
  id: z.ZodString;
4463
4478
  email: z.ZodString;
4464
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
4465
4479
  organizationId: z.ZodOptional<z.ZodString>;
4466
4480
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
4467
4481
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
4468
4482
  createdAt: z.ZodString;
4483
+ } & {
4484
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
4469
4485
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
4470
4486
  id: z.ZodString;
4471
4487
  email: z.ZodString;
4472
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
4473
4488
  organizationId: z.ZodOptional<z.ZodString>;
4474
4489
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
4475
4490
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
4476
4491
  createdAt: z.ZodString;
4492
+ } & {
4493
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
4477
4494
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
4478
4495
  id: z.ZodString;
4479
4496
  email: z.ZodString;
4480
- role: z.ZodEnum<["owner", "admin", "member", "viewer"]>;
4481
4497
  organizationId: z.ZodOptional<z.ZodString>;
4482
4498
  metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
4483
4499
  lastLoginAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
4484
4500
  createdAt: z.ZodString;
4501
+ } & {
4502
+ role: z.ZodNullable<z.ZodEnum<["owner", "admin", "member", "viewer"]>>;
4485
4503
  }, z.ZodTypeAny, "passthrough">>, "many">;
4486
4504
  limit: z.ZodNumber;
4487
4505
  offset: z.ZodNumber;
@@ -4249,7 +4249,7 @@ var SkillsAdminSuspendOrganizationResponseSchema = exports_external.object({
4249
4249
  organization: exports_external.object({ id: identifier, slug: exports_external.string().min(1), metadata }).passthrough()
4250
4250
  }).passthrough();
4251
4251
  var SkillsAdminListUsersResponseSchema = exports_external.object({
4252
- users: exports_external.array(SkillsAdminUserSchema),
4252
+ users: exports_external.array(SkillsAdminUserSchema.extend({ role: SkillsAdminUserSchema.shape.role.nullable() })),
4253
4253
  limit: positiveInt,
4254
4254
  offset: nonNegativeInt
4255
4255
  }).passthrough();
@@ -16,15 +16,17 @@ export declare const PACKAGE_VERSION: string;
16
16
  export declare const SLOW_TEST_TIMEOUT = 30000;
17
17
  export declare const CLEAN_CLI_HOME: string;
18
18
  /**
19
- * The one line an unconfigured install is allowed to print on stderr.
19
+ * The one line an opted-in local install is allowed to print on stderr.
20
20
  *
21
- * Local mode announces itself (owner ruling 2026-09-04, hasna/apps#1720): with no
22
- * credential and no API URL, the CLI says once, per process, that it is running
23
- * on this machine. That is not the deleted onboarding nudge — it demands no
24
- * choice and asks no question — but it does mean "stderr is empty" is the wrong
25
- * assertion for a local command. Use {@link stderrWithoutLocalNotice}, which
26
- * strips exactly this line and nothing else, so an unexpected warning still
27
- * fails the test it would have failed before.
21
+ * Local mode is opt-in only and announces itself (owner ruling 2026-09-04,
22
+ * hasna/apps#1720; class-patch order 2026-09-06): with the explicit
23
+ * `HASNA_SKILLS_LOCAL=1` opt-in and no API credential or URL, the CLI says
24
+ * once, per process, that it is running on this machine. The harness below
25
+ * passes the opt-in itself, so the suite's local runs are deliberate ones
26
+ * and "stderr is empty" remains the wrong assertion for a local command. Use
27
+ * {@link stderrWithoutLocalNotice}, which strips exactly this line and nothing
28
+ * else, so an unexpected warning still fails the test it would have failed
29
+ * before.
28
30
  */
29
31
  export declare const LOCAL_MODE_NOTICE_MARKER = "skills: local mode";
30
32
  /** `stderr` with the single local-mode notice line removed. */
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerCustomerProfileCommands(program: Command): void;
@@ -0,0 +1,5 @@
1
+ export declare class NameInputError extends Error {
2
+ }
3
+ /** OTP enters through stdin, never a new command-line credential argument. */
4
+ export declare function readCode(): Promise<string>;
5
+ export declare function promptCode(): Promise<string | null>;
@@ -0,0 +1,7 @@
1
+ import type { Command } from "commander";
2
+ import { createRemoteSkillsClient } from "../../lib/remote-client.js";
3
+ /** These commands expose the configured server's account contract, without local prices. */
4
+ export declare function registerRemoteAccount(parent: Command): void;
5
+ export declare function execute(options: {
6
+ json: boolean;
7
+ }, action: (client: NonNullable<Awaited<ReturnType<typeof createRemoteSkillsClient>>>) => Promise<unknown>): Promise<void>;
@@ -1,2 +1,2 @@
1
- import type { Command } from "commander";
1
+ import { type Command } from "commander";
2
2
  export declare function registerToolPrimitives(parent: Command): void;
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerWorkspaceMemberMutationCommands(workspace: Command): void;
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerWorkspaceMembersCommand(workspace: Command): void;
@@ -0,0 +1,9 @@
1
+ export declare class EnvAssignmentError extends Error {
2
+ }
3
+ /** Change only exact assignments to one valid key; reject ambiguous layouts before any write. */
4
+ export declare function prepareEnvAssignment(assignment: string, existing: string): {
5
+ key: string;
6
+ content: string;
7
+ };
8
+ /** Use one regular-file descriptor; never follow a link or create a file for invalid input. */
9
+ export declare function setEnvAssignment(path: string, assignment: string): string;