halfcycle 0.4.2 → 0.4.4
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/.claude-plugin/plugin.json +1 -1
- package/bin/bin.bundle.mjs +31 -6
- package/dist/claude-version-probe.d.ts.map +1 -1
- package/dist/cli.js +185 -91
- package/dist/cli.js.map +2 -2
- package/dist/confirm-identity.d.ts +42 -22
- package/dist/confirm-identity.d.ts.map +1 -1
- package/dist/device-signin.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +73 -32
- package/dist/index.js.map +1 -1
- package/dist/install-manifest.d.ts +27 -2
- package/dist/install-manifest.d.ts.map +1 -1
- package/dist/install.d.ts +79 -10
- package/dist/install.d.ts.map +1 -1
- package/dist/merge-settings.d.ts +35 -16
- package/dist/merge-settings.d.ts.map +1 -1
- package/dist/own-engagement.d.ts +8 -7
- package/dist/own-engagement.d.ts.map +1 -1
- package/dist/uninstall.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/install.d.ts
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
* Halfcycle's scaffold contents.
|
|
23
23
|
*/
|
|
24
24
|
import { BUNDLE_PIN_REL, MCP_REGISTRATION_REL, MCP_SERVER_KEY, SETTINGS_REL, WRITE_CAPABLE_TOOLS } from '@halfcycle/core';
|
|
25
|
-
import { type ManifestFile } from './install-manifest.js';
|
|
25
|
+
import { lineKey, type ManifestFile } from './install-manifest.js';
|
|
26
26
|
import { type ClaudeSettings } from './merge-settings.js';
|
|
27
27
|
export type EngagementType = 'self-build' | 'client';
|
|
28
28
|
export interface BundlePin {
|
|
@@ -37,7 +37,15 @@ export interface BundlePin {
|
|
|
37
37
|
*/
|
|
38
38
|
installedAt: string;
|
|
39
39
|
/**
|
|
40
|
-
* The account
|
|
40
|
+
* The account that CREATED this project (W-8, #812; renamed from `accountId` by
|
|
41
|
+
* onboarding fix wave 2, E1 — #1598) — the id, and never the email.
|
|
42
|
+
*
|
|
43
|
+
* WRITTEN ONCE, BY THE CREATE STEP ONLY. Every other install — a re-run, a join from
|
|
44
|
+
* a clone, a refused join — carries the previous pin's value forward unchanged and
|
|
45
|
+
* never supplies one of its own, so the committed file names the owner rather than
|
|
46
|
+
* whoever installed last, and a second clone's tree stays clean. Read it through
|
|
47
|
+
* `pinCreatedByAccountId`, never off this field directly: pins written before the
|
|
48
|
+
* rename hold it as `accountId`.
|
|
41
49
|
*
|
|
42
50
|
* WHY IT IS ON DISK AT ALL. The installer names the acting account on stdout before it
|
|
43
51
|
* creates anything, which is the interruption a person at a terminal gets. A run with
|
|
@@ -61,6 +69,12 @@ export interface BundlePin {
|
|
|
61
69
|
* `HALFCYCLE_TOKEN` that carries no id of its own). Nothing derives access, ownership
|
|
62
70
|
* or entitlement from it — the plane owns those and answers them from the credential.
|
|
63
71
|
*/
|
|
72
|
+
createdByAccountId?: string;
|
|
73
|
+
/**
|
|
74
|
+
* The same fact under its name before E1. Only ever READ — by `pinCreatedByAccountId`,
|
|
75
|
+
* the one reader — and never written: the next install rewrites it as
|
|
76
|
+
* `createdByAccountId`, so an old pin changes once.
|
|
77
|
+
*/
|
|
64
78
|
accountId?: string;
|
|
65
79
|
/**
|
|
66
80
|
* The project's page on the dashboard — where the person sees how the project
|
|
@@ -70,7 +84,7 @@ export interface BundlePin {
|
|
|
70
84
|
* SAFE TO COMMIT, and this field does not churn: it is built from the engagement id and
|
|
71
85
|
* a constant (`projectPageUrl`), so every clone of the same engagement writes the same
|
|
72
86
|
* value, unlike a per-run value. It is rebuilt on every write, never carried forward
|
|
73
|
-
* from the previous pin the way `installedAt` and `
|
|
87
|
+
* from the previous pin the way `installedAt` and `createdByAccountId` are. It carries no
|
|
74
88
|
* credential and never the installer's first-visit code. The dashboard decides what a
|
|
75
89
|
* visitor sees: someone signed in to Halfcycle in that browser reaches the project, and
|
|
76
90
|
* someone who is not is refused.
|
|
@@ -86,7 +100,7 @@ export interface BundlePin {
|
|
|
86
100
|
* follow-ups), so `checkDrift` can report it without asking the plane again.
|
|
87
101
|
*
|
|
88
102
|
* CARRIED FORWARD within the same engagement, on the same terms as
|
|
89
|
-
* `
|
|
103
|
+
* `createdByAccountId` above: a re-install that resolves no fresh create/join answer
|
|
90
104
|
* (the commonest run of all) must not overwrite what an earlier run learned.
|
|
91
105
|
* A different engagement installed into this repository carries nothing
|
|
92
106
|
* forward — see `writeBundlePin`.
|
|
@@ -196,12 +210,13 @@ export interface InstallOptions {
|
|
|
196
210
|
*/
|
|
197
211
|
home?: string;
|
|
198
212
|
/**
|
|
199
|
-
* The account
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
213
|
+
* The account that created the project, for the pin (W-8, #812; E1, #1598). `bin.ts`
|
|
214
|
+
* supplies it on the CREATE arm only, from `confirmActingIdentity`'s answer; every
|
|
215
|
+
* other arm leaves it out and the previous pin's value is carried. A value already
|
|
216
|
+
* recorded for this engagement is never replaced — see `writeBundlePin`. This module
|
|
217
|
+
* never resolves an identity of its own. See `BundlePin.createdByAccountId`.
|
|
203
218
|
*/
|
|
204
|
-
|
|
219
|
+
createdByAccountId?: string;
|
|
205
220
|
}
|
|
206
221
|
export interface InstallResult {
|
|
207
222
|
version: string;
|
|
@@ -216,6 +231,17 @@ export interface InstallResult {
|
|
|
216
231
|
* overwritten. `nothing they already had is changed` holds because of this list.
|
|
217
232
|
*/
|
|
218
233
|
collidedPaths: string[];
|
|
234
|
+
/**
|
|
235
|
+
* A SUBSET of `collidedPaths` (E8, the wording batch): a collided path
|
|
236
|
+
* the PREVIOUS install's own manifest already listed as one of ours. The header
|
|
237
|
+
* line that would normally prove ownership (`bytesAreOurs`) no longer matches —
|
|
238
|
+
* that is what makes this a collision rather than a replace — but the manifest
|
|
239
|
+
* still says this name was Halfcycle's on the run before this one, which a
|
|
240
|
+
* developer's own, never-ours file at that name cannot be. So this is not "a name
|
|
241
|
+
* you already use"; it is the user's own edit of a file an older Halfcycle wrote,
|
|
242
|
+
* and the report names it as that instead.
|
|
243
|
+
*/
|
|
244
|
+
editedCollidedPaths: string[];
|
|
219
245
|
/**
|
|
220
246
|
* Files THIS INSTALLER had written before, which existed, differed, and were
|
|
221
247
|
* overwritten. A SUBSET of `writtenPaths`, never a separate bucket — a consumer
|
|
@@ -335,6 +361,8 @@ export interface ClosedWriteSet {
|
|
|
335
361
|
readonly hookCommands: ReadonlySet<string>;
|
|
336
362
|
/** The SHA-256 of every deny rule the installer adds. */
|
|
337
363
|
readonly denyRuleSha256: ReadonlySet<string>;
|
|
364
|
+
/** The `$schema` value the installer writes into `.claude/settings.json`. */
|
|
365
|
+
readonly settingsSchema: string;
|
|
338
366
|
/** Every line the installer appends to `.gitignore`. */
|
|
339
367
|
readonly gitignoreLines: ReadonlySet<string>;
|
|
340
368
|
/** Every line the installer appends to `.gitattributes`, retired scripts' included. */
|
|
@@ -377,6 +405,8 @@ export declare function closedWriteSet(): ClosedWriteSet;
|
|
|
377
405
|
* THE ONE DEFINITION OF "THESE BYTES ARE OURS" for a whole file outside
|
|
378
406
|
* `.halfcycle/` (FW-3, #1569). True when the bytes hash to what the install record
|
|
379
407
|
* holds for that path, or to what this version writes there (`generatedSha256`).
|
|
408
|
+
* Every one of those hashes is `fileSha256`, which ignores a trailing `\r` on each
|
|
409
|
+
* line, so a CRLF checkout of a file of ours is still ours (F-04, #1587).
|
|
380
410
|
*
|
|
381
411
|
* Uninstall removes a file only when this holds; install replaces a differing
|
|
382
412
|
* command file only when this holds. One predicate, so the two verbs cannot
|
|
@@ -482,6 +512,13 @@ export declare class SettingsParseRefused extends Error {
|
|
|
482
512
|
constructor(message: string);
|
|
483
513
|
}
|
|
484
514
|
export declare function settingsParseRefusal(targetRepo: string, err: unknown): string;
|
|
515
|
+
/**
|
|
516
|
+
* The `$schema` value the installer writes into `.claude/settings.json`. One home:
|
|
517
|
+
* `generateSettingsJson` writes it and uninstall puts the earlier value back only
|
|
518
|
+
* while the file still holds this one (E7, onboarding-fix-wave-2; #1587), so a value
|
|
519
|
+
* the developer set after install is theirs and stays.
|
|
520
|
+
*/
|
|
521
|
+
export declare const SETTINGS_SCHEMA = "https://json.schemastore.org/claude-code-settings.json";
|
|
485
522
|
/**
|
|
486
523
|
* Generate the .claude/settings.json hook entries + permissions for the target
|
|
487
524
|
* repo.
|
|
@@ -661,13 +698,39 @@ export declare const GITIGNORE_HEADER = "# Halfcycle \u2014 machine-local secret
|
|
|
661
698
|
*
|
|
662
699
|
* It claims `header` and, under it (up to the next blank line), only lines in
|
|
663
700
|
* `claimable` — never another line under that header, because a developer may have
|
|
664
|
-
* added their own there.
|
|
701
|
+
* added their own there. Each line is compared without its trailing `\r` (`lineKey`),
|
|
702
|
+
* so a CRLF clone's block is claimed too. The claimed lines are taken verbatim, `\r`
|
|
703
|
+
* included, and in file order. When
|
|
665
704
|
* a developer line sits between them the recorded text does not occur in the file as
|
|
666
705
|
* one block, and uninstall falls back to removing the claimed lines one by one. A
|
|
667
706
|
* blank line directly above a header is the separator the earlier run wrote, and is
|
|
668
707
|
* claimed with the header.
|
|
669
708
|
*/
|
|
670
709
|
export declare function adoptBlockUnderHeader(before: string, header: string, claimable: ReadonlySet<string>): string;
|
|
710
|
+
/** `lineKey` has one home, the manifest module, beside `fileSha256`; re-exported here
|
|
711
|
+
* for the callers that already import the installer's line rules from this module. */
|
|
712
|
+
export { lineKey };
|
|
713
|
+
/**
|
|
714
|
+
* The line ending a line break inserted into `text` takes: the file's own, read from
|
|
715
|
+
* its first line — `\r\n` when that line ends so, else `\n` (E7, #1586). Both the
|
|
716
|
+
* installer's appends and uninstall's re-joined lines use it, so neither leaves a
|
|
717
|
+
* CRLF file with mixed endings.
|
|
718
|
+
*/
|
|
719
|
+
export declare function lineEndingOf(text: string): '\n' | '\r\n';
|
|
720
|
+
/**
|
|
721
|
+
* A WHOLE FILE WRITTEN OVER ANOTHER TAKES THAT FILE'S LINE ENDING (E7; F-04, #1587).
|
|
722
|
+
* `generated` is text this installer composed in full, every break a bare `\n`; it
|
|
723
|
+
* comes back with each break as `lineEndingOf(existing)`. A new file (`existing` is
|
|
724
|
+
* `null`) keeps `\n`. So a re-run in a CRLF clone composes exactly the bytes the
|
|
725
|
+
* checkout holds, and the byte comparison every writer already makes finds nothing to
|
|
726
|
+
* do; and a file that does change keeps the ending the developer's git gave it.
|
|
727
|
+
*
|
|
728
|
+
* NOT for an append to a developer's file (`.gitignore`, `.gitattributes`): there only
|
|
729
|
+
* our lines are new and they take `lineEndingOf` directly, so a developer's line is
|
|
730
|
+
* never rewritten. NOT for the hook scripts (`writeOwnedGenerated`): bash cannot run a
|
|
731
|
+
* CRLF script, which is why `.gitattributes` pins them LF in every clone.
|
|
732
|
+
*/
|
|
733
|
+
export declare function inLineEndingOf(existing: string | null, generated: string): string;
|
|
671
734
|
/**
|
|
672
735
|
* The header line every `.gitattributes` block this installer appends opens with
|
|
673
736
|
* (`windows-install-hygiene.md`, AC1). Git for Windows usually clones with
|
|
@@ -683,6 +746,12 @@ export declare const GITATTRIBUTES_HEADER = "# Halfcycle \u2014 generated script
|
|
|
683
746
|
* the installed version differs from the bundle version the operator intends
|
|
684
747
|
* to run — reusing the mirror-diff/header-strip posture with no new mechanism.
|
|
685
748
|
*/
|
|
749
|
+
/**
|
|
750
|
+
* Who created the project, per the pin — THE ONE READER of that field (E1, #1598).
|
|
751
|
+
* Takes `createdByAccountId`, falling back to `accountId`, the field's name in a pin
|
|
752
|
+
* written before the rename. `undefined` when neither holds a non-empty string.
|
|
753
|
+
*/
|
|
754
|
+
export declare function pinCreatedByAccountId(pin: BundlePin | null | undefined): string | undefined;
|
|
686
755
|
export declare function readBundlePin(targetRepoRoot: string): BundlePin | null;
|
|
687
756
|
/**
|
|
688
757
|
* Read back the engagement this repo is ALREADY installed against, if any — the
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH,OAAO,EACL,cAAc,EAGd,oBAAoB,EACpB,cAAc,EACd,YAAY,EAEZ,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAkBzB,OAAO,
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/merge-settings.d.ts
CHANGED
|
@@ -9,12 +9,15 @@
|
|
|
9
9
|
* here: it has grown twice (`UserPromptSubmit` at W8-T-05b, `Stop` at G-01) and a
|
|
10
10
|
* number in this comment goes stale silently while the code stays right.
|
|
11
11
|
*
|
|
12
|
-
* The merge is UPSERT-BY-IDENTITY, not append: every
|
|
13
|
-
*
|
|
14
|
-
* second install does not fire the guard twice per edit. Identity is
|
|
15
|
-
* hook command string, which is the stable, generated marker of a
|
|
16
|
-
*
|
|
17
|
-
* `.claude/hooks/`).
|
|
12
|
+
* The merge is UPSERT-BY-IDENTITY, not append: every command of ours already present
|
|
13
|
+
* for an event is taken out of the entry holding it and the generated entries
|
|
14
|
+
* re-added, so a second install does not fire the guard twice per edit. Identity is
|
|
15
|
+
* decided by the hook command string, which is the stable, generated marker of a
|
|
16
|
+
* Halfcycle-authored command (each of ours is a distinct invocation of a script under
|
|
17
|
+
* `.claude/hooks/`). **OURS ARE TAKEN OUT COMMAND BY COMMAND, NEVER ENTRY BY ENTRY**
|
|
18
|
+
* (E7, onboarding-fix-wave-2; #1586): an entry is dropped only when ours were all it
|
|
19
|
+
* held, so a developer's command grouped into the same entry as one of ours keeps its
|
|
20
|
+
* entry and matcher (`withoutHalfcycleCommands`, the rule uninstall applies too).
|
|
18
21
|
*
|
|
19
22
|
* **"OURS" IS EVERY COMMAND WE HAVE EVER WRITTEN, not only what this version
|
|
20
23
|
* generates** (#1556). The commands' form changed from `bash ./<script>` to
|
|
@@ -70,17 +73,33 @@ export interface ClaudeSettings {
|
|
|
70
73
|
[key: string]: unknown;
|
|
71
74
|
}
|
|
72
75
|
/**
|
|
73
|
-
* True iff `entry`
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
76
|
+
* True iff `hook` — one element of an entry's `hooks` list, as parsed — is a command
|
|
77
|
+
* of ours. THE PER-COMMAND TEST, and the only one: the merge and uninstall both take
|
|
78
|
+
* out exactly the commands it matches, and nothing else in an entry.
|
|
79
|
+
*/
|
|
80
|
+
export declare function isHalfcycleCommand(hook: unknown, halfcycleCommands: ReadonlySet<string>): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* True iff `entry` holds a command of ours (`isHalfcycleCommand`). This is how a
|
|
83
|
+
* re-install recognises our wiring, and how the installer's manifest decides whether a
|
|
84
|
+
* pre-manifest settings file is adopted. It says the entry HOLDS ours, not that the
|
|
85
|
+
* entry IS ours: a developer may group their own command into the same entry, so what
|
|
86
|
+
* the merge and uninstall take out is decided command by command
|
|
87
|
+
* (`withoutHalfcycleCommands`), never entry by entry.
|
|
88
|
+
*/
|
|
89
|
+
export declare function isHalfcycleEntry(entry: {
|
|
90
|
+
hooks: readonly unknown[];
|
|
91
|
+
}, halfcycleCommands: ReadonlySet<string>): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* `entry` with our commands taken out — THE ONE RULE both the merge and uninstall
|
|
94
|
+
* apply to a hook entry (E7, onboarding-fix-wave-2; #1586): an entry holding none of
|
|
95
|
+
* ours comes back as it is (the same object); one holding ours comes back with only
|
|
96
|
+
* the developer's commands, its `matcher` and every other key kept; and `null` only
|
|
97
|
+
* when taking ours out left it with no command at all. A developer's command in an
|
|
98
|
+
* entry beside ours therefore survives both install and uninstall.
|
|
82
99
|
*/
|
|
83
|
-
export declare function
|
|
100
|
+
export declare function withoutHalfcycleCommands<E extends {
|
|
101
|
+
hooks: readonly unknown[];
|
|
102
|
+
}>(entry: E, halfcycleCommands: ReadonlySet<string>): E | null;
|
|
84
103
|
/**
|
|
85
104
|
* Merge Halfcycle's generated hook entries into an existing settings object.
|
|
86
105
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-settings.d.ts","sourceRoot":"","sources":["../src/merge-settings.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"merge-settings.d.ts","sourceRoot":"","sources":["../src/merge-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAIH,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAIjG;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,EAAE,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAEtH;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,EAC9E,KAAK,EAAE,CAAC,EACR,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,GACrC,CAAC,GAAG,IAAI,CAIV;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,GAAG,cAAc,CA0CjG"}
|
package/dist/own-engagement.d.ts
CHANGED
|
@@ -32,10 +32,11 @@ export type OwnEngagementDeps = ConfirmIdentityDeps;
|
|
|
32
32
|
*
|
|
33
33
|
* `actingAccountId` is not part of the plane's response and is not read from one: it is
|
|
34
34
|
* the account `confirmActingIdentity` settled on for this run, carried out to `bin.ts`
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* the
|
|
35
|
+
* for the report's "Signed in as" line and, on a CREATE only, for the committed
|
|
36
|
+
* `.halfcycle/bundle.json` as `createdByAccountId` (E1, #1598). Naming the account on
|
|
37
|
+
* stdout leaves the fact in scrollback and in nothing else — an agent-run install puts
|
|
38
|
+
* it in a transcript, not in front of a person — so the creator's id travels to disk
|
|
39
|
+
* with the engagement id it belongs beside. A join writes nothing there.
|
|
39
40
|
*
|
|
40
41
|
* THE ID AND NEVER THE EMAIL. That file is committed into the client's repository, so
|
|
41
42
|
* the identity read's `email` stops at the terminal; what is recorded is the value the
|
|
@@ -78,9 +79,9 @@ export interface OutcomeBRefusal {
|
|
|
78
79
|
readonly message: string;
|
|
79
80
|
/**
|
|
80
81
|
* The account this run confirmed before the plane refused it, when known — the
|
|
81
|
-
* same value `OwnedEngagement.actingAccountId` carries on success,
|
|
82
|
-
*
|
|
83
|
-
*
|
|
82
|
+
* same value `OwnedEngagement.actingAccountId` carries on success, for the
|
|
83
|
+
* report's "Signed in as" line. Never written to `.halfcycle/bundle.json`: only
|
|
84
|
+
* a create records an account there (E1, #1598).
|
|
84
85
|
*/
|
|
85
86
|
readonly actingAccountId?: string;
|
|
86
87
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"own-engagement.d.ts","sourceRoot":"","sources":["../src/own-engagement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGxF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAEpD
|
|
1
|
+
{"version":3,"file":"own-engagement.d.ts","sourceRoot":"","sources":["../src/own-engagement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGxF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,eAAe,CAAC;CAC3C;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,eAAe,CAAC;CAC3C;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,GAAG,eAAe,GACxC,MAAM,IAAI,eAAe,CAE3B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,GAAG,qBAAqB,GAC9C,MAAM,IAAI,qBAAqB,CAEjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,eAAe,GAAG,qBAAqB,CAAC,CAwDlD;AAmDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,eAAe,GAAG,eAAe,CAAC,CAoF5C"}
|
package/dist/uninstall.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AA+CH,2BAA2B;AAC3B,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,kEAAkE;AAClE,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GACnC;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,GAAG,aAAa,CAAC;IAC9D,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;CACxC;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG;IAAE,gBAAgB,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAc7G;AAwkBD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAiJpE;AA8OD,yFAAyF;AACzF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAmEhH"}
|
package/package.json
CHANGED