@minnovate/shadow-publisher 0.16.0 → 0.17.1
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.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "git-publisher",
|
|
3
3
|
"displayName": "Git Publisher",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.17.1",
|
|
5
5
|
"description": "Publish an app folder's Git history to the serverless Git publishing backend and keep it updated (\"publish my app\", \"update my app\", \"fetch the engineered version\").",
|
|
6
6
|
"author": { "name": "git-publisher project" },
|
|
7
7
|
"keywords": ["git", "publish", "deploy", "serverless"]
|
|
@@ -28,7 +28,7 @@ Every command accepts `--json` and prints exactly one JSON object on stdout. Exi
|
|
|
28
28
|
publisher --version
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
If the command is not found, or the version is older than 0.
|
|
31
|
+
If the command is not found, or the version is older than 0.16.0, install it:
|
|
32
32
|
`npm install -g @minnovate/shadow-publisher@latest` (it needs Node.js 22.12 or a later 22). In a Claude Cowork task
|
|
33
33
|
this is normal: the sandbox starts empty every time, so install it without asking. On the person's
|
|
34
34
|
own computer, say in one line that you are installing the publisher. If `npm` itself is missing,
|
|
@@ -179,7 +179,7 @@ following, for when the person asks not to wait.
|
|
|
179
179
|
`recorded.excluded` is not empty, what was left out and why. Then read `progress` (null with
|
|
180
180
|
`--no-wait`) and pass on its `hint`:
|
|
181
181
|
- `kind: "settled"` with `ending` `"live"`: the app is live. `"not-deployed"`: published and
|
|
182
|
-
checked, and this
|
|
182
|
+
checked, and this organization does not deploy automatically. `"failed"` with `findings`: it
|
|
183
183
|
did not pass its checks, and `findings` says why — fix them as "When the checks find something"
|
|
184
184
|
below says. `"failed"` without `findings`: it stopped at `failedAt`; the portal says why — do
|
|
185
185
|
not guess the reason. A fault on our side can be tried again: to find out, run `publisher
|
|
@@ -215,13 +215,13 @@ following, for when the person asks not to wait.
|
|
|
215
215
|
|
|
216
216
|
### When the app moved
|
|
217
217
|
|
|
218
|
-
`REPOSITORY_MOVED` means the app moved to another
|
|
218
|
+
`REPOSITORY_MOVED` means the app moved to another organization (the person's team adopted it).
|
|
219
219
|
This folder can no longer publish; nothing was lost, and it can still be read. It comes as a
|
|
220
220
|
`"rejected"` publication, or as `error.code` when the publish was refused before it started; both
|
|
221
221
|
carry a `hint` and `details.movedTo` (in `publication.rejection.details` or `error.details`).
|
|
222
222
|
Pass the `hint` on, then:
|
|
223
223
|
|
|
224
|
-
1. Tell the person to sign in again and choose the
|
|
224
|
+
1. Tell the person to sign in again and choose the organization the app moved to:
|
|
225
225
|
`publisher login`. Never ask them for a token.
|
|
226
226
|
2. Find the app there: `publisher checkout <new folder> --repo <details.movedTo> --json` when
|
|
227
227
|
`details.movedTo` is set; otherwise `publisher list --json` and pick the app by its name.
|
|
@@ -280,7 +280,7 @@ folder. Never `init` or `sync` an empty new folder in its place: that makes a se
|
|
|
280
280
|
In a sandbox (Claude Cowork, Claude Code on the web) a `NETWORK` error, or `CONNECT tunnel failed,
|
|
281
281
|
response 403`, usually means the sandbox's network does not allow the platform. Tell the person that
|
|
282
282
|
their Claude settings must allow the platform's domain and its storage (`*.s3.<region>.amazonaws.com`)
|
|
283
|
-
under Settings → Capabilities, or that their
|
|
283
|
+
under Settings → Capabilities, or that their organization's owner must, on a Team or Enterprise plan.
|
|
284
284
|
Do not retry until they say it is done.
|
|
285
285
|
|
|
286
286
|
## 6. Interrupted earlier?
|
|
@@ -23,9 +23,9 @@ published elsewhere was brought in (`"fast-forward"` or `"merge"`); mention it w
|
|
|
23
23
|
## When the app moved
|
|
24
24
|
|
|
25
25
|
A sync that ends with `REPOSITORY_MOVED` — `publication.rejection.code`, or `error.code` when it
|
|
26
|
-
was refused before anything was sent — means the app moved to another
|
|
26
|
+
was refused before anything was sent — means the app moved to another organization (the person's
|
|
27
27
|
team adopted it). Pass on its `hint`, and do what the `publish-app` skill's "When the app moved"
|
|
28
|
-
says: sign in again with `publisher login` and choose that
|
|
28
|
+
says: sign in again with `publisher login` and choose that organization, then
|
|
29
29
|
`publisher checkout <new folder> --repo <details.movedTo>` (or find the app with
|
|
30
30
|
`publisher list --json` when `details.movedTo` is `null`), and publish from the new folder. Do not
|
|
31
31
|
sync this folder again.
|
|
@@ -33,7 +33,7 @@ sync this folder again.
|
|
|
33
33
|
## When it waits for an answer
|
|
34
34
|
|
|
35
35
|
Sometimes the app's preparation asks one business question before it can go on (for example
|
|
36
|
-
whether to use the
|
|
36
|
+
whether to use the organization's data). `follow` then stops with `kind: "waiting"` and
|
|
37
37
|
`next.command`. Read the question:
|
|
38
38
|
|
|
39
39
|
```bash
|
package/dist/publisher.cjs
CHANGED
|
@@ -98,10 +98,10 @@ var ERROR_CODES = [
|
|
|
98
98
|
"UNAUTHORIZED",
|
|
99
99
|
"FORBIDDEN",
|
|
100
100
|
"REF_FORBIDDEN",
|
|
101
|
-
// The credential names no
|
|
102
|
-
// code rather than FORBIDDEN: a caller can act on it (sign in again, choosing an
|
|
101
|
+
// The credential names no organization, so there is nothing to publish a repository FOR. Its own
|
|
102
|
+
// code rather than FORBIDDEN: a caller can act on it (sign in again, choosing an organization),
|
|
103
103
|
// and a test that could not tell it from "you may not" would prove nothing about the check.
|
|
104
|
-
"
|
|
104
|
+
"ORGANIZATION_REQUIRED",
|
|
105
105
|
// A repository is created only by the platform's application maker (the portal), for a person,
|
|
106
106
|
// after it has made the application the repository will belong to. Its own code: a terminal that
|
|
107
107
|
// meets it is an older client calling this route directly, and can say "upgrade" rather than
|
|
@@ -116,13 +116,13 @@ var ERROR_CODES = [
|
|
|
116
116
|
"REPOSITORY_NOT_FOUND",
|
|
117
117
|
"REPOSITORY_CONFLICT",
|
|
118
118
|
"REPOSITORY_ARCHIVED",
|
|
119
|
-
// The repository moved to another
|
|
119
|
+
// The repository moved to another organization (an adoption): it refuses every write and still
|
|
120
120
|
// admits reads. `details.movedTo` names the new repository only to a caller with a grant on it,
|
|
121
121
|
// and is null for everybody else. A client that does not know the code reads it as its 409.
|
|
122
122
|
"REPOSITORY_MOVED",
|
|
123
|
-
// A copy for an adoption names the
|
|
123
|
+
// A copy for an adoption names the organization it moves the application from, and the source
|
|
124
124
|
// repository is in another one. Its own code: the portal tells it from a moved repository.
|
|
125
|
-
"
|
|
125
|
+
"REPOSITORY_NOT_IN_ORGANIZATION",
|
|
126
126
|
"ACCESS_CONFLICT",
|
|
127
127
|
// publications (begin / finalize / status)
|
|
128
128
|
"PUBLICATION_NOT_FOUND",
|
|
@@ -152,7 +152,7 @@ var ERROR_CODES = [
|
|
|
152
152
|
"INTERNAL",
|
|
153
153
|
// client-side only
|
|
154
154
|
"NETWORK",
|
|
155
|
-
"
|
|
155
|
+
"CANCELED",
|
|
156
156
|
"OUTCOME_UNKNOWN",
|
|
157
157
|
"LOCAL_STATE",
|
|
158
158
|
"GIT"
|
|
@@ -166,14 +166,14 @@ var HTTP_STATUS_FOR_CODE = {
|
|
|
166
166
|
UNAUTHORIZED: 401,
|
|
167
167
|
FORBIDDEN: 403,
|
|
168
168
|
REF_FORBIDDEN: 403,
|
|
169
|
-
|
|
169
|
+
ORGANIZATION_REQUIRED: 403,
|
|
170
170
|
APPLICATION_REQUIRED: 403,
|
|
171
171
|
ADMIN_REQUIRED: 403,
|
|
172
172
|
REPOSITORY_NOT_FOUND: 404,
|
|
173
173
|
REPOSITORY_CONFLICT: 409,
|
|
174
174
|
REPOSITORY_ARCHIVED: 409,
|
|
175
175
|
REPOSITORY_MOVED: 409,
|
|
176
|
-
|
|
176
|
+
REPOSITORY_NOT_IN_ORGANIZATION: 409,
|
|
177
177
|
ACCESS_CONFLICT: 412,
|
|
178
178
|
PUBLICATION_NOT_FOUND: 404,
|
|
179
179
|
NOTHING_CHANGED: 409,
|
|
@@ -196,7 +196,7 @@ var HTTP_STATUS_FOR_CODE = {
|
|
|
196
196
|
UNAVAILABLE: 503,
|
|
197
197
|
INTERNAL: 500,
|
|
198
198
|
NETWORK: 0,
|
|
199
|
-
|
|
199
|
+
CANCELED: 0,
|
|
200
200
|
OUTCOME_UNKNOWN: 0,
|
|
201
201
|
LOCAL_STATE: 0,
|
|
202
202
|
GIT: 0
|
|
@@ -2689,14 +2689,14 @@ var LimitsSchema = object({
|
|
|
2689
2689
|
maxTemporaryBytes: _default(positiveInt(), 3 * 512 * 1024 * 1024),
|
|
2690
2690
|
/** wall-clock bound for a single validation git command */
|
|
2691
2691
|
gitTimeoutMs: _default(positiveInt(), 3e5),
|
|
2692
|
-
// ---- per-
|
|
2692
|
+
// ---- per-organization bounds ----
|
|
2693
2693
|
/**
|
|
2694
|
-
* ACTIVE repositories an
|
|
2695
|
-
* (ADR-0014 A1); anyone may sign up and publish, so this bounds one account's
|
|
2694
|
+
* ACTIVE repositories an organization may hold when it sets no quota of its own in users
|
|
2695
|
+
* (ADR-0014 A1); anyone may sign up and publish, so this bounds one account's organization.
|
|
2696
2696
|
* Named `maxRepositoriesPerPrincipal` before 0.9.0, when it counted a creator's repositories.
|
|
2697
2697
|
* Defaulted so an older server reads as the default, not a failure.
|
|
2698
2698
|
*/
|
|
2699
|
-
|
|
2699
|
+
maxRepositoriesPerOrganization: _default(positiveInt(), 25),
|
|
2700
2700
|
// ---- a publication of files (ADR-0030) ----
|
|
2701
2701
|
/** the UTF-8 bytes of the files one file publication writes; the commit builder is invoked with them, and Lambda takes 6 MB */
|
|
2702
2702
|
maxFilePublicationBytes: _default(positiveInt(), 4 * 1024 * 1024),
|
|
@@ -2721,7 +2721,7 @@ var DEFAULT_LIMITS = {
|
|
|
2721
2721
|
maxProcessMemoryBytes: 2 * 1024 * 1024 * 1024,
|
|
2722
2722
|
maxTemporaryBytes: 3 * 512 * 1024 * 1024,
|
|
2723
2723
|
gitTimeoutMs: 3e5,
|
|
2724
|
-
|
|
2724
|
+
maxRepositoriesPerOrganization: 25,
|
|
2725
2725
|
maxFilePublicationBytes: 4 * 1024 * 1024,
|
|
2726
2726
|
maxFilePublicationPaths: 1e3,
|
|
2727
2727
|
maxShownFileBytes: 512 * 1024
|
|
@@ -2802,7 +2802,7 @@ var IndexRecord = object({
|
|
|
2802
2802
|
*/
|
|
2803
2803
|
archived: _default(nullable(IsoDate), null),
|
|
2804
2804
|
/**
|
|
2805
|
-
* The repository this one was copied into when its application moved to another
|
|
2805
|
+
* The repository this one was copied into when its application moved to another organization (an
|
|
2806
2806
|
* adoption, ADR-0034), or null. Set once, by the same compare-and-swap as `archived`, after the copy
|
|
2807
2807
|
* holds every object. A moved repository refuses every publication and compaction with
|
|
2808
2808
|
* `REPOSITORY_MOVED`, and still admits every read. Records written before this field read as null.
|
|
@@ -2815,7 +2815,7 @@ var OwnerMarker = object({
|
|
|
2815
2815
|
repoId: RepoId,
|
|
2816
2816
|
createdAt: IsoDate
|
|
2817
2817
|
});
|
|
2818
|
-
var
|
|
2818
|
+
var RepositoryOrganization = object({
|
|
2819
2819
|
schemaVersion: SchemaVersion,
|
|
2820
2820
|
repoId: RepoId,
|
|
2821
2821
|
org: OrgId
|
|
@@ -2829,15 +2829,15 @@ var MetaRecord = object({
|
|
|
2829
2829
|
createdBy: PrincipalId,
|
|
2830
2830
|
creationId: CreationId,
|
|
2831
2831
|
/**
|
|
2832
|
-
* The
|
|
2833
|
-
*
|
|
2832
|
+
* The organization that published this repository, and what `repoId` is derived from: "that
|
|
2833
|
+
* organization publishes a repository" is the product's sentence.
|
|
2834
2834
|
*
|
|
2835
2835
|
* `null` is what a record written BEFORE repositories were org-scoped reads as, and every such
|
|
2836
2836
|
* record is still readable, cloneable and publishable — `tests/compat/fixtures/schema-v1` is one,
|
|
2837
2837
|
* and the promise that it stays readable is why this field is not required. What `null` must
|
|
2838
2838
|
* never do is default: the worker refuses to ANNOUNCE a publication it cannot attribute
|
|
2839
2839
|
* (`packages/worker/src/publish.ts`), because a consumer that guessed would create an
|
|
2840
|
-
* application in an
|
|
2840
|
+
* application in an organization nobody chose. Every repository created since carries one.
|
|
2841
2841
|
*/
|
|
2842
2842
|
org: _default(nullable(OrgId), null),
|
|
2843
2843
|
/**
|
|
@@ -3019,7 +3019,7 @@ var RepositoryIdRequest = object({ creationId: CreationId });
|
|
|
3019
3019
|
var RepositoryIdResponse = object({ repoId: RepoId });
|
|
3020
3020
|
var CopyRepositoryRequest = object({
|
|
3021
3021
|
creationId: CreationId,
|
|
3022
|
-
|
|
3022
|
+
fromOrganization: OrgId,
|
|
3023
3023
|
grants: _default(array(Grant).check(_maxLength(200)), [])
|
|
3024
3024
|
});
|
|
3025
3025
|
var CopyRepositoryResponse = object({ repoId: RepoId, movedFrom: RepoId });
|
|
@@ -3168,7 +3168,7 @@ var BundleBootstrapResponse = object({
|
|
|
3168
3168
|
// ../protocol/src/keys.ts
|
|
3169
3169
|
var PENDING_KEY_RE = new RegExp(`^pending/(${REPO_ID_RE.source.slice(1, -1)})/(${PUBLICATION_ID_RE.source.slice(1, -1)})$`);
|
|
3170
3170
|
var OWNER_KEY_RE = new RegExp(`^owners/(${PRINCIPAL_ID_RE.source.slice(1, -1)})/(${REPO_ID_RE.source.slice(1, -1)})$`);
|
|
3171
|
-
var
|
|
3171
|
+
var REPOSITORY_ORGANIZATION_KEY_RE = new RegExp(`^repository-organizations/(${REPO_ID_RE.source.slice(1, -1)})\\.json$`);
|
|
3172
3172
|
|
|
3173
3173
|
// ../protocol/src/index.ts
|
|
3174
3174
|
var MAX_WAIT_SECONDS = 5;
|
|
@@ -3484,8 +3484,8 @@ function feedStdin(child, input, onSourceError) {
|
|
|
3484
3484
|
function killedError(reason, detail, args, timeoutMs, maxOut) {
|
|
3485
3485
|
const what = `git ${args[0]}`;
|
|
3486
3486
|
switch (reason) {
|
|
3487
|
-
case "
|
|
3488
|
-
return new PublisherError("
|
|
3487
|
+
case "canceled":
|
|
3488
|
+
return new PublisherError("CANCELED", `${what} canceled`);
|
|
3489
3489
|
case "timeout":
|
|
3490
3490
|
return new PublisherError("GIT", `${what} timed out after ${timeoutMs}ms`, { retryable: true });
|
|
3491
3491
|
case "output-limit":
|
|
@@ -3522,7 +3522,7 @@ async function runGit(args, opts = {}) {
|
|
|
3522
3522
|
terminate(child);
|
|
3523
3523
|
};
|
|
3524
3524
|
const timer = setTimeout(() => kill("timeout"), timeoutMs);
|
|
3525
|
-
const onAbort = () => kill("
|
|
3525
|
+
const onAbort = () => kill("canceled");
|
|
3526
3526
|
if (opts.signal) {
|
|
3527
3527
|
if (opts.signal.aborted) {
|
|
3528
3528
|
onAbort();
|
|
@@ -4057,7 +4057,7 @@ async function packObjectsToFile(repoDir, extraArgs, stdinLines, opts) {
|
|
|
4057
4057
|
throw startFailure("git pack-objects", ended.error, repoDir);
|
|
4058
4058
|
}
|
|
4059
4059
|
if (opts.signal?.aborted) {
|
|
4060
|
-
throw new PublisherError("
|
|
4060
|
+
throw new PublisherError("CANCELED", "pack creation canceled");
|
|
4061
4061
|
}
|
|
4062
4062
|
if (timedOut) {
|
|
4063
4063
|
throw new PublisherError("GIT", `pack-objects timed out after ${timeoutMs}ms`, { retryable: true });
|
|
@@ -5212,7 +5212,7 @@ function isRecord(value) {
|
|
|
5212
5212
|
}
|
|
5213
5213
|
function mergedSay(body) {
|
|
5214
5214
|
const error2 = isRecord(body) ? body["error"] : void 0;
|
|
5215
|
-
if (!isRecord(error2) || error2["code"] !== "
|
|
5215
|
+
if (!isRecord(error2) || error2["code"] !== "organization-merged") {
|
|
5216
5216
|
return null;
|
|
5217
5217
|
}
|
|
5218
5218
|
const details = error2["details"];
|
|
@@ -5333,7 +5333,7 @@ var Transport = class {
|
|
|
5333
5333
|
const token = await this.opts.token();
|
|
5334
5334
|
const controller = new AbortController();
|
|
5335
5335
|
const timer = setTimeout(() => controller.abort(new PublisherError("NETWORK", "request timed out", { retryable: true })), this.opts.timeoutMs ?? 6e4);
|
|
5336
|
-
const onAbort = () => controller.abort(new PublisherError("
|
|
5336
|
+
const onAbort = () => controller.abort(new PublisherError("CANCELED", "canceled"));
|
|
5337
5337
|
ro.signal?.addEventListener("abort", onAbort, { once: true });
|
|
5338
5338
|
if (ro.signal?.aborted) {
|
|
5339
5339
|
onAbort();
|
|
@@ -5403,7 +5403,7 @@ function sleep(ms, signal) {
|
|
|
5403
5403
|
"abort",
|
|
5404
5404
|
() => {
|
|
5405
5405
|
clearTimeout(t);
|
|
5406
|
-
reject(new PublisherError("
|
|
5406
|
+
reject(new PublisherError("CANCELED", "canceled"));
|
|
5407
5407
|
},
|
|
5408
5408
|
{ once: true }
|
|
5409
5409
|
);
|
|
@@ -5582,7 +5582,7 @@ async function confirmPortal(portal, endpoint, fetchImpl = fetch) {
|
|
|
5582
5582
|
|
|
5583
5583
|
// ../client/src/preparation.ts
|
|
5584
5584
|
var PREPARATION = "preparation";
|
|
5585
|
-
var STATUSES = ["queued", "running", "needs-choice", "ready", "blocked", "
|
|
5585
|
+
var STATUSES = ["queued", "running", "needs-choice", "ready", "blocked", "canceled"];
|
|
5586
5586
|
var MAX_FINDINGS = 10;
|
|
5587
5587
|
var MAX_TEXT = 500;
|
|
5588
5588
|
function readPreparation(input, opts) {
|
|
@@ -5780,7 +5780,7 @@ async function onboardFolder(opts) {
|
|
|
5780
5780
|
const walk = async (d) => {
|
|
5781
5781
|
for (const e of await (0, import_promises6.readdir)(d, { withFileTypes: true })) {
|
|
5782
5782
|
if (opts.signal?.aborted) {
|
|
5783
|
-
throw new PublisherError("
|
|
5783
|
+
throw new PublisherError("CANCELED", "canceled");
|
|
5784
5784
|
}
|
|
5785
5785
|
const full = (0, import_node_path5.join)(d, e.name);
|
|
5786
5786
|
const rel = (0, import_node_path5.relative)(dir, full).split(import_node_path5.sep).join("/");
|
|
@@ -5971,7 +5971,7 @@ async function uploadPack(fetchImpl, upload, packPath, size, opts) {
|
|
|
5971
5971
|
});
|
|
5972
5972
|
} catch (e) {
|
|
5973
5973
|
if (opts.signal?.aborted) {
|
|
5974
|
-
throw new PublisherError("
|
|
5974
|
+
throw new PublisherError("CANCELED", "upload canceled");
|
|
5975
5975
|
}
|
|
5976
5976
|
throw new PublisherError("NETWORK", `upload failed: ${e.message}`, { retryable: true, cause: e });
|
|
5977
5977
|
}
|
|
@@ -7218,7 +7218,7 @@ function progressHint(r, portal, answerable = false) {
|
|
|
7218
7218
|
case "live":
|
|
7219
7219
|
return "Your app is live.";
|
|
7220
7220
|
case "not-deployed":
|
|
7221
|
-
return "Published and checked; this
|
|
7221
|
+
return "Published and checked; this organization does not deploy automatically.";
|
|
7222
7222
|
case "failed":
|
|
7223
7223
|
return inPortal(portal, `It stopped at "${r.failedAt ?? "a step"}".${r.reason === null ? "" : ` ${r.reason}`}`, r.reason === null ? "See why" : "See it");
|
|
7224
7224
|
case "stopped":
|
|
@@ -7798,7 +7798,7 @@ var Moved = class {
|
|
|
7798
7798
|
}
|
|
7799
7799
|
const movedTo = details?.["movedTo"];
|
|
7800
7800
|
const next = typeof movedTo === "string" ? `then run publisher checkout <new folder> --repo ${movedTo}` : "then run publisher list to find it there";
|
|
7801
|
-
return `This app moved to another
|
|
7801
|
+
return `This app moved to another organization. Sign in again with publisher login, choose that organization, ${next}.`;
|
|
7802
7802
|
}
|
|
7803
7803
|
};
|
|
7804
7804
|
|
|
@@ -8002,7 +8002,7 @@ function shown(portal, r) {
|
|
|
8002
8002
|
return { kind: "view", portal, preparation, questions, hint: hintFor(r.view) };
|
|
8003
8003
|
}
|
|
8004
8004
|
case "no-application":
|
|
8005
|
-
throw new PublisherError("NOT_FOUND", "this repository has no application in your
|
|
8005
|
+
throw new PublisherError("NOT_FOUND", "this repository has no application in your organization yet; publish it first");
|
|
8006
8006
|
case "moved-on":
|
|
8007
8007
|
throw new PublisherError("UNAVAILABLE", "the preparation moved on before the answer arrived; run publisher question again", { retryable: true });
|
|
8008
8008
|
case "unauthorized":
|
|
@@ -8010,7 +8010,7 @@ function shown(portal, r) {
|
|
|
8010
8010
|
case "forbidden":
|
|
8011
8011
|
throw new PublisherError(
|
|
8012
8012
|
"FORBIDDEN",
|
|
8013
|
-
r.say ?? "the portal will not let this sign-in answer for this
|
|
8013
|
+
r.say ?? "the portal will not let this sign-in answer for this organization (an owner or admin can, or the app's creator for the first preparation after an adoption)"
|
|
8014
8014
|
);
|
|
8015
8015
|
case "unavailable":
|
|
8016
8016
|
throw new PublisherError("UNAVAILABLE", `the portal could not be asked: ${r.detail}`, { retryable: true });
|
|
@@ -8094,7 +8094,7 @@ async function creatorTool(p, endpoint, tool, args, opts = {}) {
|
|
|
8094
8094
|
case "unauthorized":
|
|
8095
8095
|
throw new PublisherError("UNAUTHORIZED", "the portal did not accept this sign-in; run publisher login");
|
|
8096
8096
|
case "forbidden":
|
|
8097
|
-
throw new PublisherError("FORBIDDEN", result.say ?? "the portal will not let this sign-in do that in this
|
|
8097
|
+
throw new PublisherError("FORBIDDEN", result.say ?? "the portal will not let this sign-in do that in this organization");
|
|
8098
8098
|
case "unavailable":
|
|
8099
8099
|
throw new PublisherError("UNAVAILABLE", `the portal could not be asked: ${result.detail}`, { retryable: true });
|
|
8100
8100
|
case "malformed":
|
|
@@ -8182,7 +8182,7 @@ var share = {
|
|
|
8182
8182
|
async run(inv) {
|
|
8183
8183
|
const access2 = inv.cmd[1];
|
|
8184
8184
|
if (access2 === void 0) {
|
|
8185
|
-
throw new PublisherError("INVALID_REQUEST", "share takes
|
|
8185
|
+
throw new PublisherError("INVALID_REQUEST", "share takes organization, invited or anyone-with-link");
|
|
8186
8186
|
}
|
|
8187
8187
|
const { dir, app } = await folderApp(inv);
|
|
8188
8188
|
return run(inv, dir, "share_app", { app, access: access2, add: listFlag(inv, "add"), remove: listFlag(inv, "remove") });
|
|
@@ -8358,13 +8358,13 @@ var EXIT_CODE = {
|
|
|
8358
8358
|
NOT_FOUND: 1,
|
|
8359
8359
|
METHOD_NOT_ALLOWED: 1,
|
|
8360
8360
|
REF_FORBIDDEN: 1,
|
|
8361
|
-
|
|
8361
|
+
ORGANIZATION_REQUIRED: 1,
|
|
8362
8362
|
APPLICATION_REQUIRED: 1,
|
|
8363
8363
|
REPOSITORY_NOT_FOUND: 1,
|
|
8364
8364
|
REPOSITORY_CONFLICT: 1,
|
|
8365
8365
|
REPOSITORY_ARCHIVED: 1,
|
|
8366
8366
|
REPOSITORY_MOVED: 1,
|
|
8367
|
-
|
|
8367
|
+
REPOSITORY_NOT_IN_ORGANIZATION: 1,
|
|
8368
8368
|
ACCESS_CONFLICT: 1,
|
|
8369
8369
|
PUBLICATION_NOT_FOUND: 1,
|
|
8370
8370
|
NOTHING_CHANGED: 1,
|
|
@@ -8385,7 +8385,7 @@ var EXIT_CODE = {
|
|
|
8385
8385
|
INVALID_TARGET: 1,
|
|
8386
8386
|
EXPIRED: 1,
|
|
8387
8387
|
INTERNAL: 1,
|
|
8388
|
-
|
|
8388
|
+
CANCELED: 1,
|
|
8389
8389
|
LOCAL_STATE: 1,
|
|
8390
8390
|
GIT: 1
|
|
8391
8391
|
};
|
|
@@ -8566,14 +8566,14 @@ Usage:
|
|
|
8566
8566
|
(the data and who can open the app stay as they are)
|
|
8567
8567
|
publisher suggestions what colleagues suggested for this folder's app, still open
|
|
8568
8568
|
publisher suggestion done|decline <id> [--run <id>] close one; sync --answers <id> closes it with that publication
|
|
8569
|
-
publisher share
|
|
8569
|
+
publisher share organization|invited|anyone-with-link [--add <emails>] [--remove <emails>]
|
|
8570
8570
|
who can open this folder's app; new invitees get the link by mail
|
|
8571
8571
|
publisher columns [<id>] the column names of connected data, for the code that reads it;
|
|
8572
8572
|
its first rows only to an owner or admin who allowed that
|
|
8573
8573
|
publisher data add <sheet link> [--app <app>] [--name <name>]
|
|
8574
8574
|
connect a Google sheet anyone with the link can view, and
|
|
8575
8575
|
turn it on for that app (an app you made, or any as owner or admin)
|
|
8576
|
-
publisher data remove <id> --app <app> that app stops using that data; the
|
|
8576
|
+
publisher data remove <id> --app <app> that app stops using that data; the organization keeps it
|
|
8577
8577
|
publisher merge-check [dir] --ours <ref> --theirs <ref> [--apply]
|
|
8578
8578
|
publisher info [dir] repository state as seen by the server
|
|
8579
8579
|
publisher doctor environment check (node, git, credentials, association)
|