@open-tomato/rafa 0.34.0 → 0.35.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.
package/dist/index.js CHANGED
@@ -1,163 +1,156 @@
1
1
  // @bun
2
2
  import {
3
- FEATURE_TYPES,
4
- MANIFEST_VERSION,
5
- OUTPUT_CHANNELS,
6
- RUNNING_MANIFEST_SEAMS,
3
+ CONFIG_VERSIONS2,
4
+ STORE_BACKENDS2,
5
+ SYNC_STRATEGIES2,
6
+ BOARD_RELATIONSHIP_MODES2,
7
+ INJECT_MODES2,
8
+ OUTPUT_MODES2,
9
+ CLAUDE_SETTING_SOURCES2,
10
+ PR_PROVIDERS2,
11
+ RELEASE_AUTO2,
12
+ PREREQUISITE_KINDS2,
13
+ MODULE_SOURCE_KINDS2,
14
+ CONFIG_FILE2,
15
+ CONFIG_DEFAULTS2,
16
+ ConfigError2,
17
+ configFilePath2,
18
+ parseConfigText2,
19
+ resolveConfig2,
20
+ RAFA_BLOCK_KINDS2,
21
+ isRafaBlockKind2,
22
+ readRafaBlocks2,
23
+ REPORT_STATUSES2,
24
+ FINDING_KINDS2,
25
+ FINDING_SIGNALS2,
26
+ parseReport2
27
+ } from "./index-2tjmxwvp.js";
28
+ import {
29
+ EFFORT_KEY_PROJECTIONS2,
30
+ openNdjsonStore2,
31
+ SCOPE_DIR2,
32
+ INIT_COMMAND2,
33
+ DISK_FILE_SYSTEM2,
34
+ ScopeError2,
35
+ scopeAt2,
36
+ initHint2,
37
+ selfAndAncestors2,
38
+ resolveScope2,
39
+ openSqliteStore2,
40
+ readConfigFile2,
41
+ loadConfig2,
42
+ mergeStore2,
43
+ PORT_VERSIONS2,
44
+ createAdapterRegistry2,
45
+ CORE_ADAPTER_REGISTRY2,
46
+ TRUSTED_PERMISSIONS2,
47
+ WIRE_FORMAT2,
48
+ WIRE_VERSION2,
49
+ WireFormatError2,
50
+ WireExportRefusal2,
51
+ encodeWirePayload2,
52
+ decodeWirePayload2,
53
+ exportWirePayload2,
54
+ materialiseWirePayload2,
55
+ selectEffortStore2
56
+ } from "./index-ckqfhynj.js";
57
+ import"./index-hgcvjke7.js";
58
+ import {
59
+ MANIFEST_VERSION2,
60
+ FEATURE_TYPES2,
61
+ OUTPUT_CHANNELS2,
62
+ RUNNING_MANIFEST_SEAMS2,
63
+ validateManifest2,
7
64
  collect,
8
- plan,
9
65
  report,
10
66
  start,
11
- usage,
12
- validateManifest
13
- } from "./index-4b3m7s0z.js";
14
- import {
15
- PLAN_BLOCK_KINDS,
16
- PLAN_HEADER_FIELDS,
17
- PROBE_TIMEOUT_MS,
18
- loadPlanPrerequisites,
19
- mergePlanPrerequisites,
20
- parsePlan,
21
- parsePrerequisites,
22
- planPrerequisites,
23
- prerequisitesPathForPlan,
24
- renderInjection,
25
- runPreflight,
26
- runShellProbe
27
- } from "./index-v8d7c6sw.js";
67
+ plan
68
+ } from "./index-dvrq9nfb.js";
28
69
  import {
29
- CORE_ADAPTER_REGISTRY,
30
- DISK_FILE_SYSTEM,
31
- EFFORT_KEY_PROJECTIONS,
32
- INIT_COMMAND,
33
- PORT_VERSIONS,
34
- SCOPE_DIR,
35
- ScopeError,
36
- TRUSTED_PERMISSIONS,
37
- WIRE_FORMAT,
38
- WIRE_VERSION,
39
- WireExportRefusal,
40
- WireFormatError,
41
- createAdapterRegistry,
42
- decodeWirePayload,
43
- encodeWirePayload,
44
- exportWirePayload,
45
- initHint,
46
- loadConfig,
47
- materialiseWirePayload,
48
- mergeStore,
49
- openNdjsonStore,
50
- openSqliteStore,
51
- readConfigFile,
52
- resolveScope,
53
- scopeAt,
54
- selectEffortStore,
55
- selfAndAncestors
56
- } from "./index-bvfbfa63.js";
57
- import {
58
- CONFIG_DEFAULTS,
59
- CONFIG_FILE,
60
- ConfigError,
61
- FINDING_KINDS,
62
- FINDING_SIGNALS,
63
- MODULE_SOURCE_KINDS,
64
- PREREQUISITE_KINDS,
65
- RAFA_BLOCK_KINDS,
66
- REPORT_STATUSES,
67
- configFilePath,
68
- isRafaBlockKind,
69
- parseConfigText,
70
- parseReport,
71
- readRafaBlocks,
72
- resolveConfig
73
- } from "./index-vp0xghk2.js";
74
- import"./index-d6d0942q.js";
75
- import"./index-k6sd4ym5.js";
76
- import"./index-3mzw3kzh.js";
77
- import {
78
- BOARD_RELATIONSHIP_MODES,
79
- CLAUDE_SETTING_SOURCES,
80
- CONFIG_VERSIONS,
81
- INJECT_MODES,
82
- OUTPUT_MODES,
83
- PR_PROVIDERS,
84
- RELEASE_AUTO,
85
- STORE_BACKENDS,
86
- SYNC_STRATEGIES
87
- } from "./index-fzhd3d4y.js";
88
- import"./index-wp8c28fd.js";
70
+ PLAN_BLOCK_KINDS2,
71
+ PLAN_HEADER_FIELDS2,
72
+ parsePlan2,
73
+ parsePrerequisites2,
74
+ planPrerequisites2,
75
+ mergePlanPrerequisites2,
76
+ prerequisitesPathForPlan2,
77
+ loadPlanPrerequisites2,
78
+ PROBE_TIMEOUT_MS2,
79
+ runShellProbe2,
80
+ runPreflight2,
81
+ renderInjection2
82
+ } from "./index-41vzahew.js";
89
83
  export {
90
- validateManifest,
91
- usage as usageCommand,
92
- start as startCommand,
93
- selfAndAncestors,
94
- selectEffortStore,
95
- scopeAt,
96
- runShellProbe,
97
- runPreflight,
98
- resolveScope,
99
- resolveConfig,
100
- renderInjection,
101
- readRafaBlocks,
102
- readConfigFile,
103
- prerequisitesPathForPlan,
104
- planPrerequisites,
105
- plan as planCommand,
106
- parseReport,
107
- parsePrerequisites,
108
- parsePlan,
109
- parseConfigText,
110
- openSqliteStore,
111
- openNdjsonStore,
112
- mergeStore,
113
- mergePlanPrerequisites,
114
- materialiseWirePayload,
115
- loadPlanPrerequisites,
116
- loadConfig,
117
- isRafaBlockKind,
118
- initHint,
119
- exportWirePayload,
120
- encodeWirePayload,
121
- report as effortReportCommand,
84
+ BOARD_RELATIONSHIP_MODES2 as BOARD_RELATIONSHIP_MODES,
85
+ CLAUDE_SETTING_SOURCES2 as CLAUDE_SETTING_SOURCES,
86
+ CONFIG_DEFAULTS2 as CONFIG_DEFAULTS,
87
+ CONFIG_FILE2 as CONFIG_FILE,
88
+ CONFIG_VERSIONS2 as CONFIG_VERSIONS,
89
+ CORE_ADAPTER_REGISTRY2 as CORE_ADAPTER_REGISTRY,
90
+ ConfigError2 as ConfigError,
91
+ DISK_FILE_SYSTEM2 as DISK_FILE_SYSTEM,
92
+ EFFORT_KEY_PROJECTIONS2 as EFFORT_KEY_PROJECTIONS,
93
+ FEATURE_TYPES2 as FEATURE_TYPES,
94
+ FINDING_KINDS2 as FINDING_KINDS,
95
+ FINDING_SIGNALS2 as FINDING_SIGNALS,
96
+ INIT_COMMAND2 as INIT_COMMAND,
97
+ INJECT_MODES2 as INJECT_MODES,
98
+ MANIFEST_VERSION2 as MANIFEST_VERSION,
99
+ MODULE_SOURCE_KINDS2 as MODULE_SOURCE_KINDS,
100
+ OUTPUT_CHANNELS2 as OUTPUT_CHANNELS,
101
+ OUTPUT_MODES2 as OUTPUT_MODES,
102
+ PLAN_BLOCK_KINDS2 as PLAN_BLOCK_KINDS,
103
+ PLAN_HEADER_FIELDS2 as PLAN_HEADER_FIELDS,
104
+ PORT_VERSIONS2 as PORT_VERSIONS,
105
+ PREREQUISITE_KINDS2 as PREREQUISITE_KINDS,
106
+ PROBE_TIMEOUT_MS2 as PROBE_TIMEOUT_MS,
107
+ PR_PROVIDERS2 as PR_PROVIDERS,
108
+ RAFA_BLOCK_KINDS2 as RAFA_BLOCK_KINDS,
109
+ RELEASE_AUTO2 as RELEASE_AUTO,
110
+ REPORT_STATUSES2 as REPORT_STATUSES,
111
+ RUNNING_MANIFEST_SEAMS2 as RUNNING_MANIFEST_SEAMS,
112
+ SCOPE_DIR2 as SCOPE_DIR,
113
+ STORE_BACKENDS2 as STORE_BACKENDS,
114
+ SYNC_STRATEGIES2 as SYNC_STRATEGIES,
115
+ ScopeError2 as ScopeError,
116
+ TRUSTED_PERMISSIONS2 as TRUSTED_PERMISSIONS,
117
+ WIRE_FORMAT2 as WIRE_FORMAT,
118
+ WIRE_VERSION2 as WIRE_VERSION,
119
+ WireExportRefusal2 as WireExportRefusal,
120
+ WireFormatError2 as WireFormatError,
121
+ configFilePath2 as configFilePath,
122
+ createAdapterRegistry2 as createAdapterRegistry,
123
+ decodeWirePayload2 as decodeWirePayload,
122
124
  collect as effortCollectCommand,
123
- decodeWirePayload,
124
- createAdapterRegistry,
125
- configFilePath,
126
- WireFormatError,
127
- WireExportRefusal,
128
- WIRE_VERSION,
129
- WIRE_FORMAT,
130
- TRUSTED_PERMISSIONS,
131
- ScopeError,
132
- SYNC_STRATEGIES,
133
- STORE_BACKENDS,
134
- SCOPE_DIR,
135
- RUNNING_MANIFEST_SEAMS,
136
- REPORT_STATUSES,
137
- RELEASE_AUTO,
138
- RAFA_BLOCK_KINDS,
139
- PR_PROVIDERS,
140
- PROBE_TIMEOUT_MS,
141
- PREREQUISITE_KINDS,
142
- PORT_VERSIONS,
143
- PLAN_HEADER_FIELDS,
144
- PLAN_BLOCK_KINDS,
145
- OUTPUT_MODES,
146
- OUTPUT_CHANNELS,
147
- MODULE_SOURCE_KINDS,
148
- MANIFEST_VERSION,
149
- INJECT_MODES,
150
- INIT_COMMAND,
151
- FINDING_SIGNALS,
152
- FINDING_KINDS,
153
- FEATURE_TYPES,
154
- EFFORT_KEY_PROJECTIONS,
155
- DISK_FILE_SYSTEM,
156
- ConfigError,
157
- CORE_ADAPTER_REGISTRY,
158
- CONFIG_VERSIONS,
159
- CONFIG_FILE,
160
- CONFIG_DEFAULTS,
161
- CLAUDE_SETTING_SOURCES,
162
- BOARD_RELATIONSHIP_MODES
125
+ report as effortReportCommand,
126
+ encodeWirePayload2 as encodeWirePayload,
127
+ exportWirePayload2 as exportWirePayload,
128
+ initHint2 as initHint,
129
+ isRafaBlockKind2 as isRafaBlockKind,
130
+ loadConfig2 as loadConfig,
131
+ loadPlanPrerequisites2 as loadPlanPrerequisites,
132
+ materialiseWirePayload2 as materialiseWirePayload,
133
+ mergePlanPrerequisites2 as mergePlanPrerequisites,
134
+ mergeStore2 as mergeStore,
135
+ openNdjsonStore2 as openNdjsonStore,
136
+ openSqliteStore2 as openSqliteStore,
137
+ parseConfigText2 as parseConfigText,
138
+ parsePlan2 as parsePlan,
139
+ parsePrerequisites2 as parsePrerequisites,
140
+ parseReport2 as parseReport,
141
+ plan as planCommand,
142
+ planPrerequisites2 as planPrerequisites,
143
+ prerequisitesPathForPlan2 as prerequisitesPathForPlan,
144
+ readConfigFile2 as readConfigFile,
145
+ readRafaBlocks2 as readRafaBlocks,
146
+ renderInjection2 as renderInjection,
147
+ resolveConfig2 as resolveConfig,
148
+ resolveScope2 as resolveScope,
149
+ runPreflight2 as runPreflight,
150
+ runShellProbe2 as runShellProbe,
151
+ scopeAt2 as scopeAt,
152
+ selectEffortStore2 as selectEffortStore,
153
+ selfAndAncestors2 as selfAndAncestors,
154
+ start as startCommand,
155
+ validateManifest2 as validateManifest
163
156
  };
@@ -1,25 +1,25 @@
1
1
  // @bun
2
2
  import {
3
- bless,
4
- merge,
5
- promotable
6
- } from "../index-d6d0942q.js";
3
+ bless2,
4
+ promotable2,
5
+ merge2
6
+ } from "../index-hgcvjke7.js";
7
7
  import {
8
- CONFIDENCE_MAX,
9
- CONFIDENCE_MIN,
10
- GAP,
11
- SOURCE_STEP,
12
- actionHash,
13
- triggerKey
14
- } from "../index-wp8c28fd.js";
8
+ GAP2,
9
+ SOURCE_STEP2,
10
+ CONFIDENCE_MIN2,
11
+ CONFIDENCE_MAX2,
12
+ actionHash2,
13
+ triggerKey2
14
+ } from "../index-21jcfatr.js";
15
15
  export {
16
- triggerKey,
17
- promotable,
18
- merge,
19
- bless,
20
- actionHash,
21
- SOURCE_STEP,
22
- GAP,
23
- CONFIDENCE_MIN,
24
- CONFIDENCE_MAX
16
+ CONFIDENCE_MAX2 as CONFIDENCE_MAX,
17
+ CONFIDENCE_MIN2 as CONFIDENCE_MIN,
18
+ GAP2 as GAP,
19
+ SOURCE_STEP2 as SOURCE_STEP,
20
+ actionHash2 as actionHash,
21
+ bless2 as bless,
22
+ merge2 as merge,
23
+ promotable2 as promotable,
24
+ triggerKey2 as triggerKey
25
25
  };
@@ -1,50 +1,47 @@
1
1
  // @bun
2
2
  import {
3
- PLAN_BLOCK_KINDS,
4
- PLAN_HEADER_FIELDS,
5
- PROBE_TIMEOUT_MS,
6
- loadPlanPrerequisites,
7
- mergePlanPrerequisites,
8
- parsePlan,
9
- parsePrerequisites,
10
- planPrerequisites,
11
- prerequisitesPathForPlan,
12
- renderInjection,
13
- runPreflight,
14
- runShellProbe
15
- } from "../index-v8d7c6sw.js";
3
+ PLAN_BLOCK_KINDS2,
4
+ PLAN_HEADER_FIELDS2,
5
+ parsePlan2,
6
+ parsePrerequisites2,
7
+ planPrerequisites2,
8
+ mergePlanPrerequisites2,
9
+ prerequisitesPathForPlan2,
10
+ loadPlanPrerequisites2,
11
+ PROBE_TIMEOUT_MS2,
12
+ runShellProbe2,
13
+ runPreflight2,
14
+ renderInjection2
15
+ } from "../index-41vzahew.js";
16
16
  import {
17
- FINDING_KINDS,
18
- FINDING_SIGNALS,
19
- RAFA_BLOCK_KINDS,
20
- REPORT_STATUSES,
21
- isRafaBlockKind,
22
- parseReport,
23
- readRafaBlocks
24
- } from "../index-vp0xghk2.js";
25
- import {
26
- INJECT_MODES
27
- } from "../index-fzhd3d4y.js";
28
- import"../index-wp8c28fd.js";
17
+ INJECT_MODES2,
18
+ RAFA_BLOCK_KINDS2,
19
+ isRafaBlockKind2,
20
+ readRafaBlocks2,
21
+ REPORT_STATUSES2,
22
+ FINDING_KINDS2,
23
+ FINDING_SIGNALS2,
24
+ parseReport2
25
+ } from "../index-2tjmxwvp.js";
29
26
  export {
30
- runShellProbe,
31
- runPreflight,
32
- renderInjection,
33
- readRafaBlocks,
34
- prerequisitesPathForPlan,
35
- planPrerequisites,
36
- parseReport,
37
- parsePrerequisites,
38
- parsePlan,
39
- mergePlanPrerequisites,
40
- loadPlanPrerequisites,
41
- isRafaBlockKind,
42
- REPORT_STATUSES,
43
- RAFA_BLOCK_KINDS,
44
- PROBE_TIMEOUT_MS,
45
- PLAN_HEADER_FIELDS,
46
- PLAN_BLOCK_KINDS,
47
- INJECT_MODES,
48
- FINDING_SIGNALS,
49
- FINDING_KINDS
27
+ FINDING_KINDS2 as FINDING_KINDS,
28
+ FINDING_SIGNALS2 as FINDING_SIGNALS,
29
+ INJECT_MODES2 as INJECT_MODES,
30
+ PLAN_BLOCK_KINDS2 as PLAN_BLOCK_KINDS,
31
+ PLAN_HEADER_FIELDS2 as PLAN_HEADER_FIELDS,
32
+ PROBE_TIMEOUT_MS2 as PROBE_TIMEOUT_MS,
33
+ RAFA_BLOCK_KINDS2 as RAFA_BLOCK_KINDS,
34
+ REPORT_STATUSES2 as REPORT_STATUSES,
35
+ isRafaBlockKind2 as isRafaBlockKind,
36
+ loadPlanPrerequisites2 as loadPlanPrerequisites,
37
+ mergePlanPrerequisites2 as mergePlanPrerequisites,
38
+ parsePlan2 as parsePlan,
39
+ parsePrerequisites2 as parsePrerequisites,
40
+ parseReport2 as parseReport,
41
+ planPrerequisites2 as planPrerequisites,
42
+ prerequisitesPathForPlan2 as prerequisitesPathForPlan,
43
+ readRafaBlocks2 as readRafaBlocks,
44
+ renderInjection2 as renderInjection,
45
+ runPreflight2 as runPreflight,
46
+ runShellProbe2 as runShellProbe
50
47
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-tomato/rafa",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "description": "Alpha. Runs a plan through the ralph loop: one Claude Code session per task, one commit per task, then a pull request and a CI wait.",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -57,7 +57,9 @@
57
57
  "lint": "eslint .",
58
58
  "check-types": "tsc --noEmit && bun run --filter './packages/*' check-types",
59
59
  "gate:control-bytes": "bun scripts/control-byte-gate/control-byte-gate.ts",
60
- "snapshot": "bun scripts/snapshot-runtime.ts"
60
+ "snapshot": "bun scripts/snapshot-runtime.ts",
61
+ "stretch": "bash scripts/stretch/stretch.sh",
62
+ "device:check": "bash scripts/device/check.sh"
61
63
  },
62
64
  "devDependencies": {
63
65
  "@eslint/js": "^9.39.4",
@@ -1,14 +0,0 @@
1
- // @bun
2
- import {
3
- DESCRIBE_BINARY,
4
- DESCRIBE_SCHEMA_VERSION,
5
- describeRegistry
6
- } from "./index-k6sd4ym5.js";
7
- import"./index-3mzw3kzh.js";
8
- import"./index-fzhd3d4y.js";
9
- import"./index-wp8c28fd.js";
10
- export {
11
- describeRegistry,
12
- DESCRIBE_SCHEMA_VERSION,
13
- DESCRIBE_BINARY
14
- };
@@ -1,129 +0,0 @@
1
- // @bun
2
- import {
3
- describeValue
4
- } from "./index-fzhd3d4y.js";
5
-
6
- // src/cli/spends.ts
7
- var SPENDS_GLYPH = "\uD83E\uDE99";
8
- var SPENDS_WHEN = ["always", "with", "unless", "through"];
9
- var FLAGGED = ["with", "unless"];
10
- var FLAG_SPELLING = /^--[^\s-]\S*$/;
11
- function flagProblem(when, flag) {
12
- if (FLAGGED.includes(when)) {
13
- return typeof flag === "string" && FLAG_SPELLING.test(flag) ? null : `spends.flag is ${describeValue(flag)}, expected a flag as typed, starting with --`;
14
- }
15
- return flag === undefined ? null : `spends.flag is ${describeValue(flag)}, expected absent when spends.when is "${when}"`;
16
- }
17
- function spendsProblem(value) {
18
- if (value === undefined)
19
- return null;
20
- if (typeof value !== "object" || value === null || Array.isArray(value)) {
21
- return `spends is ${describeValue(value)}, expected absent or a mapping`;
22
- }
23
- const { when, what, flag } = value;
24
- if (!SPENDS_WHEN.includes(when)) {
25
- return `spends.when is ${describeValue(when)}, expected one of ${SPENDS_WHEN.join(", ")}`;
26
- }
27
- if (typeof what !== "string") {
28
- return `spends.what is ${describeValue(what)}, expected a string`;
29
- }
30
- return flagProblem(when, flag);
31
- }
32
-
33
- // src/cli/command.ts
34
- var COMMAND_OUTPUTS = ["text", "json", "events", "tui"];
35
- var MAX_EXIT_CODE = 255;
36
-
37
- class CommandExit extends Error {
38
- exitCode;
39
- constructor(exitCode, message = "") {
40
- super(message);
41
- if (!Number.isInteger(exitCode) || exitCode < 0 || exitCode > MAX_EXIT_CODE) {
42
- throw new TypeError(`CommandExit: exit code is ${describeValue(exitCode)}, expected a whole number from 0 to ${MAX_EXIT_CODE}`);
43
- }
44
- this.name = "CommandExit";
45
- this.exitCode = exitCode;
46
- }
47
- }
48
- function isListOf(value, check) {
49
- return Array.isArray(value) && value.every(check);
50
- }
51
- function hasStrings(value, keys) {
52
- if (typeof value !== "object" || value === null)
53
- return false;
54
- const record = value;
55
- return keys.every((key) => typeof record[key] === "string");
56
- }
57
- function isRoutingWord(value) {
58
- return typeof value === "string" && /^[^\s/-][^\s/]*$/.test(value);
59
- }
60
- function isFlag(item) {
61
- if (!hasStrings(item, ["name"]))
62
- return false;
63
- const { deprecated } = item;
64
- return deprecated === undefined || hasStrings(deprecated, ["use"]);
65
- }
66
- function fieldProblem(fields) {
67
- const checks = [
68
- ["subject", isRoutingWord(fields.subject), "a word with no space, no slash and no leading dash"],
69
- ["action", isRoutingWord(fields.action), "a word with no space, no slash and no leading dash"],
70
- ["name", typeof fields.name === "string", "a string"],
71
- ["summary", typeof fields.summary === "string", "a string"],
72
- ["description", typeof fields.description === "string", "a string"],
73
- ["args", isListOf(fields.args, (item) => hasStrings(item, ["name"])), "a list of named arguments"],
74
- ["flags", isListOf(fields.flags, isFlag), "a list of named flags, each deprecation naming its use"],
75
- ["examples", isListOf(fields.examples, (item) => hasStrings(item, ["cmd", "note"])), "a list of examples"],
76
- [
77
- "outputs",
78
- isListOf(fields.outputs, (item) => COMMAND_OUTPUTS.includes(item)),
79
- `a list of ${COMMAND_OUTPUTS.join(", ")}`
80
- ],
81
- [
82
- "aliases",
83
- fields.aliases === undefined || isListOf(fields.aliases, (item) => typeof item === "string"),
84
- "absent or a list of strings"
85
- ],
86
- [
87
- "lastingAliases",
88
- fields.lastingAliases === undefined || isListOf(fields.lastingAliases, (item) => typeof item === "string"),
89
- "absent or a list of strings"
90
- ],
91
- [
92
- "deprecated",
93
- fields.deprecated === undefined || hasStrings(fields.deprecated, ["since", "use"]),
94
- "absent or a mapping of since and use"
95
- ],
96
- ["hidden", fields.hidden === undefined || typeof fields.hidden === "boolean", "absent or a boolean"],
97
- [
98
- "needsProject",
99
- fields.needsProject === undefined || typeof fields.needsProject === "boolean",
100
- "absent or a boolean"
101
- ],
102
- ["exec", fields.exec === undefined || fields.exec === true, "absent or true"],
103
- ["run", typeof fields.run === "function", "a function"]
104
- ];
105
- const failed = checks.find(([, passes]) => !passes);
106
- if (failed === undefined)
107
- return null;
108
- const [key, , expected] = failed;
109
- return `${key} is ${describeValue(fields[key])}, expected ${expected}`;
110
- }
111
- function commandProblem(value) {
112
- if (typeof value !== "object" || value === null || Array.isArray(value)) {
113
- return `a command is ${describeValue(value)}, expected a mapping`;
114
- }
115
- const fields = value;
116
- const problem = fieldProblem(fields) ?? spendsProblem(fields.spends);
117
- if (problem === null)
118
- return null;
119
- const named = isRoutingWord(fields.subject) && isRoutingWord(fields.action) ? `command "${commandSpelling(fields)}"` : "a command";
120
- return `${named}: ${problem}`;
121
- }
122
- function isTopLevel(command) {
123
- return command.subject === command.action;
124
- }
125
- function commandSpelling(command) {
126
- return isTopLevel(command) ? command.subject : `${command.subject} ${command.action}`;
127
- }
128
-
129
- export { SPENDS_GLYPH, CommandExit, isRoutingWord, commandProblem, isTopLevel, commandSpelling };