@indigoai-us/hq-cloud 6.15.69 → 6.15.71
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/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/share.d.ts +20 -0
- package/dist/cli/share.d.ts.map +1 -1
- package/dist/cli/share.js +105 -1
- package/dist/cli/share.js.map +1 -1
- package/dist/cli/share.test.js +95 -3
- package/dist/cli/share.test.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/vault-client.d.ts +26 -0
- package/dist/vault-client.d.ts.map +1 -1
- package/dist/vault-client.js +26 -0
- package/dist/vault-client.js.map +1 -1
- package/dist/vault-client.test.js +48 -0
- package/dist/vault-client.test.js.map +1 -1
- package/dist/watcher.d.ts +5 -6
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +13 -10
- package/dist/watcher.js.map +1 -1
- package/dist/watcher.test.js +6 -5
- package/dist/watcher.test.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.d.ts
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Registers `hq share`, `hq sync`, and membership commands.
|
|
5
5
|
* These are consumed by @indigoai-us/hq-cli or invoked directly.
|
|
6
6
|
*/
|
|
7
|
-
export { share } from "./share.js";
|
|
8
|
-
export type { ShareOptions, ShareResult } from "./share.js";
|
|
7
|
+
export { share, UnregisteredCompanySkillError, parseRegisteredCompanySkillUid, } from "./share.js";
|
|
8
|
+
export type { ShareOptions, ShareResult, CompanySkillRegistrar, CompanySkillRegistrationRequest, } from "./share.js";
|
|
9
9
|
export { sync } from "./sync.js";
|
|
10
10
|
export type { SyncOptions, SyncResult, SyncProgressEvent } from "./sync.js";
|
|
11
11
|
export { resolveConflict, showDiff } from "./conflict.js";
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,+BAA+B,GAChC,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK/D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,WAAW,GACZ,MAAM,aAAa,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Registers `hq share`, `hq sync`, and membership commands.
|
|
5
5
|
* These are consumed by @indigoai-us/hq-cli or invoked directly.
|
|
6
6
|
*/
|
|
7
|
-
export { share } from "./share.js";
|
|
7
|
+
export { share, UnregisteredCompanySkillError, parseRegisteredCompanySkillUid, } from "./share.js";
|
|
8
8
|
export { sync } from "./sync.js";
|
|
9
9
|
export { resolveConflict, showDiff } from "./conflict.js";
|
|
10
10
|
// Membership commands (VLT-7)
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AAQpB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG1D,8BAA8B;AAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,0EAA0E;AAC1E,8CAA8C;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,6EAA6E;AAC7E,4DAA4D;AAC5D,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGtD,qEAAqE;AACrE,oDAAoD;AACpD,+EAA+E;AAC/E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/cli/share.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ import type { SyncProgressEvent } from "./sync.js";
|
|
|
11
11
|
import { type CompanyTombstone } from "./tombstones.js";
|
|
12
12
|
import { type ScopePrefixInput } from "../prefix-coalesce.js";
|
|
13
13
|
import { type TransferSemaphore } from "../sync-core.js";
|
|
14
|
+
import { type RegisterCompanySkillResult } from "../vault-client.js";
|
|
14
15
|
/**
|
|
15
16
|
* Local-only ephemeral artifacts: conflict-side files written whenever a
|
|
16
17
|
* 3-way merge preserves the displaced side for inspection. Depending on the
|
|
@@ -263,6 +264,13 @@ export interface ShareOptions {
|
|
|
263
264
|
* Mutually exclusive with `vaultConfig`.
|
|
264
265
|
*/
|
|
265
266
|
entityContext?: EntityContext;
|
|
267
|
+
/**
|
|
268
|
+
* Identity-registration seam for pre-vended entity-context callers. Normal
|
|
269
|
+
* CLI/runner calls omit it: share() binds a VaultClient from `vaultConfig`.
|
|
270
|
+
* A company push that encounters an unstamped canonical SKILL.md fails closed
|
|
271
|
+
* when neither path can register it.
|
|
272
|
+
*/
|
|
273
|
+
registerCompanySkill?: CompanySkillRegistrar;
|
|
266
274
|
/** HQ root directory */
|
|
267
275
|
hqRoot: string;
|
|
268
276
|
/**
|
|
@@ -469,6 +477,16 @@ export interface ShareOptions {
|
|
|
469
477
|
*/
|
|
470
478
|
serverOwnedPathPolicy?: "error" | "skip";
|
|
471
479
|
}
|
|
480
|
+
export interface CompanySkillRegistrationRequest {
|
|
481
|
+
companySlug: string;
|
|
482
|
+
path: string;
|
|
483
|
+
content: string;
|
|
484
|
+
}
|
|
485
|
+
export type CompanySkillRegistrar = (input: CompanySkillRegistrationRequest) => Promise<RegisterCompanySkillResult>;
|
|
486
|
+
export declare class UnregisteredCompanySkillError extends Error {
|
|
487
|
+
readonly paths: string[];
|
|
488
|
+
constructor(paths: string[]);
|
|
489
|
+
}
|
|
472
490
|
/** Why an explicitly-named push path could not be shipped. */
|
|
473
491
|
export type UnreachablePathReason = "missing" | "outside-company" | "unreadable-link";
|
|
474
492
|
/**
|
|
@@ -634,6 +652,8 @@ type UploadPlanItem = Extract<PushPlanItem, {
|
|
|
634
652
|
* fails; the upload itself surfaces any real I/O error.
|
|
635
653
|
*/
|
|
636
654
|
export declare function currentUploadBytes(item: UploadPlanItem): number;
|
|
655
|
+
/** Read only the immutable identity field from the first YAML frontmatter. */
|
|
656
|
+
export declare function parseRegisteredCompanySkillUid(content: string): string | undefined;
|
|
637
657
|
/**
|
|
638
658
|
* Default human-readable share output. Preserves the exact format the CLI
|
|
639
659
|
* emitted before `onEvent` was added — tty users see no change.
|
package/dist/cli/share.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/cli/share.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AAkBhG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA+B7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAOL,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/cli/share.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AAkBhG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA+B7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAOL,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,oBAAoB,CAAC;AA0D5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,sBAAsB,QACmD,CAAC;AAEvF;;;;;;;;;GASG;AACH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,QAAqB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;CASpB,CAAC;AAEF;;;;;;;;;GASG;AACH,KAAK,YAAY,GACb;IACE,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IAOb,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B,GACD;IACE,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IAIrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,CAAC,CAAC;CACT,GACD;IACE,MAAM,EAAE,qBAAqB,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IAMrB,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D,CAAC;AASN;;;;;;;;;GASG;AACH,oDAAoD;AACpD,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAgED;;;;;;;;;;;;;;GAcG;AACH,iBAAS,kBAAkB,CACzB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAuBT;AA+MD,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC;;;;;;;;;;;;;;;;;;OAkBG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IAC7C,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACtD;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;IACH,qBAAqB,CAAC,EAAE,gBAAgB,GAAG,YAAY,GAAG,KAAK,CAAC;IAChE;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvD;;;;;;;;;;;;;;;;;;;OAmBG;IACH,qBAAqB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzC;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1C;AAED,MAAM,WAAW,+BAA+B;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,0BAA0B,CAAC,CAAC;AAEzC,qBAAa,6BAA8B,SAAQ,KAAK;aAC1B,KAAK,EAAE,MAAM,EAAE;gBAAf,KAAK,EAAE,MAAM,EAAE;CAO5C;AAED,8DAA8D;AAC9D,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAEtF;;;;;GAKG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;gBAE5C,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAAE,QAAQ,EAAE,MAAM;CAuBtF;AAED,0EAA0E;AAC1E,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;gBAEb,KAAK,EAAE,MAAM,EAAE;CAa5B;AA6BD,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB;;;;;;;;;OASG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC;;;;;;;OAOG;IACH,0BAA0B,EAAE,MAAM,CAAC;IACnC;;;;;;;OAOG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;;;;;;;OAQG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;;;;;;;;;OAiBG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;;;OAOG;IACH,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC;;;;OAIG;IACH,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,wBAAwB,GAChC,YAAY,GACZ,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,uBAAuB,GACvB,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,CAAC;AAErB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,SAAS,EAAE,QAAQ,GAAG,WAAW,CAAC;IAClC,MAAM,CAAC,EAAE,wBAAwB,CAAC;CACnC;AAmDD;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,EACzD,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC3C,aAAa,CAAC,EAAE,MAAM,IAAI,GACzB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAW/C;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA6EvE;AAID,KAAK,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC;AAGlE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAO/D;AAoRD,8EAA8E;AAC9E,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQlF;AAogDD;;;GAGG;AACH,iBAAS,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAiK5D;AAED;;;;;;;;;GASG;AACH,KAAK,cAAc,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,UAAU,YAAY;IACpB,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC/E,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,iBAAS,gBAAgB,CACvB,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAsB,GAC1B,MAAM,CAuBR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,iBAAS,qBAAqB,CAC5B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACvC,OAAO,CAwBT;AA8HD;;;;;;;;;;;GAWG;AACH,iBAAS,YAAY,CACnB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,EAC/C,KAAK,GAAE,YAAiB,GACvB,cAAc,EAAE,CAkGlB"}
|
package/dist/cli/share.js
CHANGED
|
@@ -23,7 +23,7 @@ import { hasRemoteChanged, isAccessDenied, resolveActiveCompany, resolveTransfer
|
|
|
23
23
|
import { buildConflictId, buildConflictPath, readShortMachineId, } from "../lib/conflict-file.js";
|
|
24
24
|
import { appendConflictEntry } from "../lib/conflict-index.js";
|
|
25
25
|
import { isCloudAuthoritative } from "../lib/cloud-authoritative.js";
|
|
26
|
-
import { VaultAuthError } from "../vault-client.js";
|
|
26
|
+
import { VaultAuthError, VaultClient, } from "../vault-client.js";
|
|
27
27
|
import { describeError } from "../lib/describe-error.js";
|
|
28
28
|
import { readlinkOrNull } from "../lib/readlink-safe.js";
|
|
29
29
|
/**
|
|
@@ -498,6 +498,15 @@ function uploadBodyMatchesPlan(planned, current) {
|
|
|
498
498
|
return planned.kind === "file" ||
|
|
499
499
|
(current.kind === "symlink" && planned.target === current.target);
|
|
500
500
|
}
|
|
501
|
+
export class UnregisteredCompanySkillError extends Error {
|
|
502
|
+
paths;
|
|
503
|
+
constructor(paths) {
|
|
504
|
+
super(`Company skill${paths.length === 1 ? "" : "s"} must be registered before sync: ${paths.join(", ")}. ` +
|
|
505
|
+
"Run `hq skill --company <company> create <slug> --no-sync`, then retry.");
|
|
506
|
+
this.paths = paths;
|
|
507
|
+
this.name = "UnregisteredCompanySkillError";
|
|
508
|
+
}
|
|
509
|
+
}
|
|
501
510
|
/**
|
|
502
511
|
* Thrown by `share()` when a caller-named path cannot be pushed and
|
|
503
512
|
* `unreachablePathPolicy` is `"error"` (the default). Raised while the plans
|
|
@@ -853,6 +862,100 @@ function createShareCounters() {
|
|
|
853
862
|
filesSuppressedByTombstone: 0,
|
|
854
863
|
};
|
|
855
864
|
}
|
|
865
|
+
const CANONICAL_COMPANY_SKILL_RE = /^skills\/([a-z0-9][a-z0-9-]*)\/SKILL\.md$/;
|
|
866
|
+
const REGISTERED_SKILL_UID_RE = /^skl_[A-Za-z0-9]+$/;
|
|
867
|
+
/** Read only the immutable identity field from the first YAML frontmatter. */
|
|
868
|
+
export function parseRegisteredCompanySkillUid(content) {
|
|
869
|
+
const frontmatter = content.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);
|
|
870
|
+
if (!frontmatter)
|
|
871
|
+
return undefined;
|
|
872
|
+
const line = frontmatter[1]?.match(/^[\t ]*skill_uid:[\t ]*(?:"([^"]+)"|'([^']+)'|([^\s#]+))[\t ]*(?:#.*)?\r?$/m);
|
|
873
|
+
const value = line?.[1] ?? line?.[2] ?? line?.[3];
|
|
874
|
+
return value && REGISTERED_SKILL_UID_RE.test(value) ? value : undefined;
|
|
875
|
+
}
|
|
876
|
+
function writeRegisteredSkillAtomically(filePath, content) {
|
|
877
|
+
const mode = fs.statSync(filePath).mode;
|
|
878
|
+
const tempPath = path.join(path.dirname(filePath), `.SKILL.md.${process.pid}.${crypto.randomBytes(6).toString("hex")}.registering`);
|
|
879
|
+
try {
|
|
880
|
+
fs.writeFileSync(tempPath, content, {
|
|
881
|
+
encoding: "utf8",
|
|
882
|
+
flag: "wx",
|
|
883
|
+
mode,
|
|
884
|
+
});
|
|
885
|
+
fs.renameSync(tempPath, filePath);
|
|
886
|
+
}
|
|
887
|
+
finally {
|
|
888
|
+
try {
|
|
889
|
+
fs.rmSync(tempPath, { force: true });
|
|
890
|
+
}
|
|
891
|
+
catch {
|
|
892
|
+
// The rename already committed, or cleanup is best-effort after failure.
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
function skillRegistrarForRun(run) {
|
|
897
|
+
if (run.options.registerCompanySkill)
|
|
898
|
+
return run.options.registerCompanySkill;
|
|
899
|
+
if (!run.vaultConfig)
|
|
900
|
+
return undefined;
|
|
901
|
+
const client = new VaultClient(run.vaultConfig);
|
|
902
|
+
return ({ companySlug, path: skillPath, content }) => client.registerCompanySkill(companySlug, { path: skillPath, content });
|
|
903
|
+
}
|
|
904
|
+
function assertValidSkillRegistration(result, expectedPath) {
|
|
905
|
+
const stampedUid = parseRegisteredCompanySkillUid(result.content);
|
|
906
|
+
if (result.path !== expectedPath ||
|
|
907
|
+
result.vaultPath !== expectedPath ||
|
|
908
|
+
!REGISTERED_SKILL_UID_RE.test(result.skillUid) ||
|
|
909
|
+
stampedUid !== result.skillUid) {
|
|
910
|
+
throw new Error(`Skill registration returned an invalid identity for '${expectedPath}'; local bytes were not changed.`);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
async function registerOneCompanySkill(run, entry, registrar) {
|
|
914
|
+
let content = fs.readFileSync(entry.absolutePath, "utf8");
|
|
915
|
+
// A live editor can save while the network request is in flight. Re-register
|
|
916
|
+
// the newest bytes instead of overwriting them with the response to an older
|
|
917
|
+
// body. Three attempts bound pathological save loops and fail visibly.
|
|
918
|
+
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
919
|
+
const currentUid = parseRegisteredCompanySkillUid(content);
|
|
920
|
+
if (currentUid)
|
|
921
|
+
return;
|
|
922
|
+
run.options.onHeartbeat?.();
|
|
923
|
+
const result = await registrar({
|
|
924
|
+
companySlug: run.ctx.slug,
|
|
925
|
+
path: entry.relativePath,
|
|
926
|
+
content,
|
|
927
|
+
});
|
|
928
|
+
assertValidSkillRegistration(result, entry.relativePath);
|
|
929
|
+
const current = fs.readFileSync(entry.absolutePath, "utf8");
|
|
930
|
+
if (current !== content) {
|
|
931
|
+
content = current;
|
|
932
|
+
continue;
|
|
933
|
+
}
|
|
934
|
+
writeRegisteredSkillAtomically(entry.absolutePath, result.content);
|
|
935
|
+
return;
|
|
936
|
+
}
|
|
937
|
+
throw new Error(`Company skill '${entry.relativePath}' kept changing while HQ registered it; retry after the current edit finishes.`);
|
|
938
|
+
}
|
|
939
|
+
/**
|
|
940
|
+
* Durable creation backstop. Hooks improve the authoring experience, but sync
|
|
941
|
+
* is the invariant boundary: no unstamped canonical company skill reaches S3.
|
|
942
|
+
*/
|
|
943
|
+
async function preflightCompanySkillIdentities(run, entries) {
|
|
944
|
+
if (run.options.personalMode === true || run.ctx.uid.startsWith("prs_"))
|
|
945
|
+
return;
|
|
946
|
+
const unstamped = entries.filter((entry) => entry.kind === "file" &&
|
|
947
|
+
CANONICAL_COMPANY_SKILL_RE.test(entry.relativePath) &&
|
|
948
|
+
!parseRegisteredCompanySkillUid(fs.readFileSync(entry.absolutePath, "utf8")));
|
|
949
|
+
if (unstamped.length === 0)
|
|
950
|
+
return;
|
|
951
|
+
const registrar = skillRegistrarForRun(run);
|
|
952
|
+
if (!registrar) {
|
|
953
|
+
throw new UnregisteredCompanySkillError(unstamped.map((entry) => entry.relativePath));
|
|
954
|
+
}
|
|
955
|
+
for (const entry of unstamped) {
|
|
956
|
+
await registerOneCompanySkill(run, entry, registrar);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
856
959
|
async function buildSharePlans(run) {
|
|
857
960
|
const collected = collectFiles(run.paths, run.hqRoot, run.syncRoot, run.shouldSync, {
|
|
858
961
|
onUnreachablePath: (namedPath, reason) => {
|
|
@@ -934,6 +1037,7 @@ async function buildSharePlans(run) {
|
|
|
934
1037
|
return false;
|
|
935
1038
|
})
|
|
936
1039
|
: controlCharFiltered;
|
|
1040
|
+
await preflightCompanySkillIdentities(run, filesToShare);
|
|
937
1041
|
const pushPlan = computePushPlan(filesToShare, run.journal, run.skipUnchanged === true, run.options.onHeartbeat);
|
|
938
1042
|
const deleteScopeRoots = run.propagateDeletes === true
|
|
939
1043
|
? resolveDeleteScopeRoots(run.paths, run.hqRoot, run.syncRoot, run.options.deleteScopeRoots)
|