@outerlayer/cli 0.11.0 → 0.13.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/CHANGELOG.md +23 -0
- package/README.md +16 -7
- package/dist/{agent-setup-YEFN74Y4.js → agent-setup-QE6PSCEZ.js} +8 -8
- package/dist/build-info.json +1 -1
- package/dist/{builder-PP436VGZ.js → builder-UUS4ORDH.js} +3 -3
- package/dist/{check-YDXOLVJ5.js → check-63IDCEEV.js} +31 -30
- package/dist/{chunk-XR3BJN33.js → chunk-22RMZBGW.js} +20 -1
- package/dist/{chunk-TB7EP24C.js → chunk-2M63GG56.js} +1 -1
- package/dist/{chunk-Y6P5XX2B.js → chunk-3D4OYFCD.js} +4 -4
- package/dist/{chunk-2GBCTEN4.js → chunk-3KTA5UU2.js} +1 -1
- package/dist/{chunk-USO2DKBD.js → chunk-4KSQKQXE.js} +8 -2
- package/dist/{chunk-UES67HLJ.js → chunk-4QVZCVWT.js} +5 -5
- package/dist/{chunk-I263FZ3A.js → chunk-6S3H3J6H.js} +3 -3
- package/dist/{chunk-BHOBM3IZ.js → chunk-C6IV5BV7.js} +10 -10
- package/dist/{chunk-VDI5POCC.js → chunk-CNFVHDHG.js} +1 -1
- package/dist/{chunk-EOWWTFUU.js → chunk-DPKX26LT.js} +92 -16
- package/dist/{chunk-SUMWRA7K.js → chunk-DXQ5MHCO.js} +1 -1
- package/dist/{chunk-ZQ5JGHUO.js → chunk-EFZLAYPE.js} +2 -2
- package/dist/{chunk-RWQWPZB4.js → chunk-GI4XXD4I.js} +3 -3
- package/dist/{chunk-YU5GL7QS.js → chunk-HDTVTA6I.js} +2 -2
- package/dist/{chunk-BFESLKPP.js → chunk-IP7BIBXJ.js} +19 -1
- package/dist/{chunk-YT35WGIP.js → chunk-J5M7BSJQ.js} +99 -7
- package/dist/{chunk-IU4NZROR.js → chunk-JXYVA45C.js} +1 -1
- package/dist/{chunk-BMX3L7CR.js → chunk-LCEXHCHD.js} +1 -1
- package/dist/{chunk-7C4T5BGN.js → chunk-MJXXRX4M.js} +54 -12
- package/dist/{chunk-E5DC4VZL.js → chunk-MZN7AQOB.js} +8 -8
- package/dist/{chunk-CJGQQZWB.js → chunk-NX57IBNK.js} +1 -1
- package/dist/{chunk-DTDZXDQ3.js → chunk-P4MM66C6.js} +31 -18
- package/dist/{chunk-BEZSECPA.js → chunk-P6FX4D43.js} +1 -1
- package/dist/{chunk-A56PYPDF.js → chunk-R7OQTKWT.js} +2 -1
- package/dist/{chunk-TFIOXPZT.js → chunk-RLYZLUQ7.js} +67 -5
- package/dist/chunk-RMWLBUCJ.js +50 -0
- package/dist/{chunk-4HMXH2OA.js → chunk-SFFHGX3G.js} +1 -1
- package/dist/{chunk-3YFCWYBU.js → chunk-SVEP7PVH.js} +14 -14
- package/dist/chunk-T5VPP6H7.js +65 -0
- package/dist/{chunk-BGWTYRSS.js → chunk-TCIW27FM.js} +1 -1
- package/dist/{chunk-R7BJYFD2.js → chunk-TOPDNXHZ.js} +5 -5
- package/dist/{chunk-HKUH5AR2.js → chunk-XJKL4BNU.js} +3 -3
- package/dist/{cli-RQZXTOEI.js → cli-WSBIAVZU.js} +176 -88
- package/dist/{command-U6UGIBVT.js → command-N7BAB4XJ.js} +21 -22
- package/dist/{config-MKBX2ZQD.js → config-N3C6DFQA.js} +1 -1
- package/dist/{connect-cmd-5MIUNYAY.js → connect-cmd-FGYRLLXL.js} +5 -5
- package/dist/{context-adopt-A77G67CP.js → context-adopt-B3PWGFHL.js} +5 -5
- package/dist/{context-materialize-KQZYATQZ.js → context-materialize-7S6NLLRO.js} +5 -5
- package/dist/{dist-3M3ZMEZF.js → dist-LKDWQWZ7.js} +2 -2
- package/dist/{docker-WVRRMK6R.js → docker-BZ55BMBJ.js} +4 -4
- package/dist/{doctor-ZF4PYWVN.js → doctor-3H25Q7WT.js} +23 -20
- package/dist/{emit-artifact-cmd-VKPW577P.js → emit-artifact-cmd-IQCRXOH7.js} +9 -9
- package/dist/{emit-cmd-SU62J2PB.js → emit-cmd-KDSM5VAO.js} +4 -4
- package/dist/{emit-criteria-cmd-U2TL6FYY.js → emit-criteria-cmd-EYUXME26.js} +7 -7
- package/dist/emit-finding-cmd-P4RKBPBB.js +465 -0
- package/dist/{emit-result-cmd-GKBVPMU4.js → emit-result-cmd-6XYENU6H.js} +9 -9
- package/dist/{hook-fast-AQCAQIA6.js → hook-fast-PXWKQPN6.js} +1 -1
- package/dist/{import-capture-cmd-5NJVL2HN.js → import-capture-cmd-2BKM5I2N.js} +3 -3
- package/dist/{import-ruler-cmd-TUK3MRPC.js → import-ruler-cmd-IXR7YK47.js} +2 -2
- package/dist/index.js +3 -3
- package/dist/{init-PUY2BUHH.js → init-2LWVS4AH.js} +21 -17
- package/dist/{init-M5IBAGVE.js → init-ZL7ORPTF.js} +53 -32
- package/dist/{init-cmd-NPNR23UL.js → init-cmd-JXOBCOIB.js} +16 -14
- package/dist/{install-HKOVISUP.js → install-HDBIPHTX.js} +2 -4
- package/dist/{login-browser-7XGSV7MA.js → login-browser-QZCS3WW6.js} +2 -1
- package/dist/{loop-3FNROLW7.js → loop-XOAE6ZIY.js} +32 -30
- package/dist/{machine-RWDDJRWB.js → machine-G6PY2J2J.js} +16 -16
- package/dist/{mcp-install-cmd-XZARXNYT.js → mcp-install-cmd-VXVIH7PH.js} +1 -1
- package/dist/runner-env-XTC53CHN.js +15 -0
- package/dist/runner-key-TDTLNAKJ.js +154 -0
- package/dist/{session-sender-E3UHGSNV.js → session-sender-XVGZFWRK.js} +7 -7
- package/dist/{starter-pack-I35VNYAR.js → starter-pack-B7JPGEDO.js} +4 -4
- package/dist/{status-2OW5AKWL.js → status-MRTPG34B.js} +22 -22
- package/dist/{sync-cmd-ULKXCHO2.js → sync-cmd-UBUZMMDN.js} +6 -6
- package/dist/{watch-IU6NHB4K.js → watch-STNPEWD6.js} +6 -6
- package/dist/{work-claim-cmd-LXXSNEGF.js → work-claim-cmd-CWGYEIJE.js} +11 -11
- package/dist/{work-cmd-ZJY3NA2G.js → work-cmd-X7NMJDFL.js} +8 -8
- package/dist/{work-comment-cmd-34FTLPUO.js → work-comment-cmd-FI2TMAYQ.js} +8 -8
- package/dist/{work-open-pr-cmd-YZAENDP6.js → work-open-pr-cmd-OVHJ5I5H.js} +9 -9
- package/dist/{work-pr-cmd-EXTOGBJC.js → work-pr-cmd-Y5TDMQ4O.js} +8 -8
- package/package.json +1 -1
- package/skill-pack/maintained/reporting-findings/SKILL.md +84 -5
- package/skill-pack/template/build/SKILL.md +60 -33
- package/skill-pack/template/build/references/agent-briefs.md +4 -2
- package/skill-pack/template/build/references/release.md +1 -1
- package/skill-pack/template/build/references/review-loop.md +6 -2
- package/skill-pack/template/build/scripts/record-criteria.mjs +109 -143
- package/skill-pack/validators/code-review.yaml +4 -2
- package/dist/chunk-FBTE2A2X.js +0 -38
- package/dist/chunk-JKIWMRFH.js +0 -27
- package/dist/chunk-T6OIJQRT.js +0 -31
- package/dist/emit-finding-cmd-TMOOKHPD.js +0 -251
|
@@ -1,55 +1,55 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { LEASE_SECONDS, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-Y6P5XX2B.js';
|
|
3
|
+
import { LEASE_SECONDS, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-C6IV5BV7.js';
|
|
4
|
+
import './chunk-RMWLBUCJ.js';
|
|
5
|
+
import './chunk-XJKL4BNU.js';
|
|
6
|
+
import './chunk-3D4OYFCD.js';
|
|
8
7
|
import './chunk-HHJDN6AU.js';
|
|
8
|
+
import './chunk-HYZRY4KZ.js';
|
|
9
9
|
import { formatBytes } from './chunk-YYYRBYWG.js';
|
|
10
10
|
import './chunk-TBT347UY.js';
|
|
11
|
-
import { formatDuration, formatClock, relativeToRunner } from './chunk-
|
|
11
|
+
import { formatDuration, formatClock, relativeToRunner } from './chunk-MZN7AQOB.js';
|
|
12
12
|
import './chunk-3FMPZPJQ.js';
|
|
13
13
|
import './chunk-N5FOE5PS.js';
|
|
14
14
|
import './chunk-OGFGZQA3.js';
|
|
15
|
-
import './chunk-
|
|
15
|
+
import './chunk-3KTA5UU2.js';
|
|
16
16
|
import './chunk-QOZKPLVJ.js';
|
|
17
|
-
import './chunk-
|
|
17
|
+
import './chunk-NX57IBNK.js';
|
|
18
18
|
import './chunk-CX22S5BA.js';
|
|
19
19
|
import './chunk-QKFB4K7X.js';
|
|
20
20
|
import './chunk-RSNSZ2LJ.js';
|
|
21
21
|
import './chunk-F7CU5ABH.js';
|
|
22
22
|
import './chunk-BKO6JEZI.js';
|
|
23
|
-
import './chunk-
|
|
24
|
-
import './chunk-
|
|
25
|
-
import './chunk-
|
|
26
|
-
import './chunk-
|
|
27
|
-
import './chunk-
|
|
28
|
-
import './chunk-
|
|
29
|
-
import './chunk-
|
|
23
|
+
import './chunk-P4MM66C6.js';
|
|
24
|
+
import './chunk-EFZLAYPE.js';
|
|
25
|
+
import './chunk-IP7BIBXJ.js';
|
|
26
|
+
import './chunk-4QVZCVWT.js';
|
|
27
|
+
import './chunk-CNFVHDHG.js';
|
|
28
|
+
import './chunk-JXYVA45C.js';
|
|
29
|
+
import './chunk-4KSQKQXE.js';
|
|
30
30
|
import './chunk-N6LURUEF.js';
|
|
31
31
|
import './chunk-YRYMNBGQ.js';
|
|
32
|
-
import './chunk-
|
|
32
|
+
import './chunk-22RMZBGW.js';
|
|
33
33
|
import './chunk-UXYLWVTQ.js';
|
|
34
34
|
import './chunk-7RQ73DLO.js';
|
|
35
35
|
import './chunk-4Q7OMKAT.js';
|
|
36
36
|
import './chunk-GQD22KKN.js';
|
|
37
37
|
import './chunk-WZBHBH3J.js';
|
|
38
38
|
import './chunk-5QRP3MVS.js';
|
|
39
|
-
import './chunk-
|
|
39
|
+
import './chunk-GI4XXD4I.js';
|
|
40
40
|
import './chunk-ZJSNLVCE.js';
|
|
41
|
-
import './chunk-
|
|
42
|
-
import './chunk-
|
|
43
|
-
import './chunk-
|
|
41
|
+
import './chunk-TCIW27FM.js';
|
|
42
|
+
import './chunk-LCEXHCHD.js';
|
|
43
|
+
import './chunk-2M63GG56.js';
|
|
44
44
|
import './chunk-YO4PSLVB.js';
|
|
45
45
|
import './chunk-PLMTLGYH.js';
|
|
46
|
-
import './chunk-
|
|
46
|
+
import './chunk-J5M7BSJQ.js';
|
|
47
47
|
import './chunk-EABW6AJQ.js';
|
|
48
48
|
import './chunk-BYT5O5RV.js';
|
|
49
49
|
import './chunk-RA3O54FC.js';
|
|
50
50
|
import './chunk-V7NIVOFD.js';
|
|
51
51
|
import { runnerDir, jobsDir } from './chunk-ZM2IMMYN.js';
|
|
52
|
-
import './chunk-
|
|
52
|
+
import './chunk-SFFHGX3G.js';
|
|
53
53
|
import './chunk-XCCLFVXM.js';
|
|
54
54
|
import './chunk-BJ3KTMDH.js';
|
|
55
55
|
import './chunk-VNVZDWO3.js';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
export { CHUNK_PART_TARGET_BYTES, RETRYABLE_STATUSES, SyncConfigError, SyncTransportError, detectCi, isLoopbackUrl, resolveTier, runSync } from './chunk-
|
|
3
|
+
export { CHUNK_PART_TARGET_BYTES, RETRYABLE_STATUSES, SyncConfigError, SyncTransportError, detectCi, isLoopbackUrl, resolveTier, runSync } from './chunk-3D4OYFCD.js';
|
|
4
4
|
import './chunk-HHJDN6AU.js';
|
|
5
5
|
import './chunk-TBT347UY.js';
|
|
6
6
|
import './chunk-F7CU5ABH.js';
|
|
7
7
|
import './chunk-BKO6JEZI.js';
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
8
|
+
import './chunk-IP7BIBXJ.js';
|
|
9
|
+
import './chunk-CNFVHDHG.js';
|
|
10
|
+
import './chunk-JXYVA45C.js';
|
|
11
11
|
import './chunk-YRYMNBGQ.js';
|
|
12
12
|
import './chunk-GQD22KKN.js';
|
|
13
13
|
import './chunk-WZBHBH3J.js';
|
|
@@ -15,11 +15,11 @@ import './chunk-5QRP3MVS.js';
|
|
|
15
15
|
import './chunk-ZJSNLVCE.js';
|
|
16
16
|
import './chunk-YO4PSLVB.js';
|
|
17
17
|
import './chunk-PLMTLGYH.js';
|
|
18
|
-
import './chunk-
|
|
18
|
+
import './chunk-J5M7BSJQ.js';
|
|
19
19
|
export { cloudConfigPath, readCloudConfig, writeCloudConfig } from './chunk-EABW6AJQ.js';
|
|
20
20
|
import './chunk-V7NIVOFD.js';
|
|
21
21
|
import './chunk-ZM2IMMYN.js';
|
|
22
|
-
import './chunk-
|
|
22
|
+
import './chunk-SFFHGX3G.js';
|
|
23
23
|
import './chunk-XCCLFVXM.js';
|
|
24
24
|
import './chunk-BJ3KTMDH.js';
|
|
25
25
|
import './chunk-VNVZDWO3.js';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { LiveUploader } from './chunk-
|
|
3
|
+
import { LiveUploader } from './chunk-3D4OYFCD.js';
|
|
4
4
|
import './chunk-HHJDN6AU.js';
|
|
5
5
|
import './chunk-TBT347UY.js';
|
|
6
6
|
import './chunk-F7CU5ABH.js';
|
|
7
7
|
import './chunk-BKO6JEZI.js';
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import { StatuslineAggregator, CaptureDaemon } from './chunk-
|
|
8
|
+
import './chunk-IP7BIBXJ.js';
|
|
9
|
+
import './chunk-CNFVHDHG.js';
|
|
10
|
+
import { StatuslineAggregator, CaptureDaemon } from './chunk-JXYVA45C.js';
|
|
11
11
|
import './chunk-YRYMNBGQ.js';
|
|
12
12
|
import './chunk-GQD22KKN.js';
|
|
13
13
|
import './chunk-WZBHBH3J.js';
|
|
@@ -15,11 +15,11 @@ import './chunk-5QRP3MVS.js';
|
|
|
15
15
|
import './chunk-ZJSNLVCE.js';
|
|
16
16
|
import './chunk-YO4PSLVB.js';
|
|
17
17
|
import './chunk-PLMTLGYH.js';
|
|
18
|
-
import './chunk-
|
|
18
|
+
import './chunk-J5M7BSJQ.js';
|
|
19
19
|
import './chunk-EABW6AJQ.js';
|
|
20
20
|
import './chunk-V7NIVOFD.js';
|
|
21
21
|
import './chunk-ZM2IMMYN.js';
|
|
22
|
-
import './chunk-
|
|
22
|
+
import './chunk-SFFHGX3G.js';
|
|
23
23
|
import './chunk-XCCLFVXM.js';
|
|
24
24
|
import './chunk-BJ3KTMDH.js';
|
|
25
25
|
import { homeFromEnv } from './chunk-VNVZDWO3.js';
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
3
|
import { RUNNER_PROTOCOL } from './chunk-FI5UYJMQ.js';
|
|
4
|
-
import { resolveCredentials, WorkCommandError, parsePositiveInt, postJson, environmentFacts, resolveRepository, findLiveItem } from './chunk-
|
|
5
|
-
export { WorkCommandError } from './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
11
|
-
import './chunk-
|
|
4
|
+
import { resolveCredentials, WorkCommandError, parsePositiveInt, postJson, environmentFacts, resolveRepository, findLiveItem } from './chunk-P4MM66C6.js';
|
|
5
|
+
export { WorkCommandError } from './chunk-P4MM66C6.js';
|
|
6
|
+
import './chunk-EFZLAYPE.js';
|
|
7
|
+
import './chunk-IP7BIBXJ.js';
|
|
8
|
+
import './chunk-4QVZCVWT.js';
|
|
9
|
+
import './chunk-CNFVHDHG.js';
|
|
10
|
+
import './chunk-JXYVA45C.js';
|
|
11
|
+
import './chunk-4KSQKQXE.js';
|
|
12
12
|
import './chunk-N6LURUEF.js';
|
|
13
13
|
import './chunk-YRYMNBGQ.js';
|
|
14
|
-
import { defaultRunnerConfigPath } from './chunk-
|
|
14
|
+
import { defaultRunnerConfigPath } from './chunk-22RMZBGW.js';
|
|
15
15
|
import './chunk-UXYLWVTQ.js';
|
|
16
16
|
import './chunk-7RQ73DLO.js';
|
|
17
17
|
import './chunk-4Q7OMKAT.js';
|
|
18
18
|
import './chunk-WZBHBH3J.js';
|
|
19
19
|
import { defaultFetch } from './chunk-YO4PSLVB.js';
|
|
20
20
|
import './chunk-PLMTLGYH.js';
|
|
21
|
-
import './chunk-
|
|
21
|
+
import './chunk-J5M7BSJQ.js';
|
|
22
22
|
import './chunk-EABW6AJQ.js';
|
|
23
23
|
import './chunk-BYT5O5RV.js';
|
|
24
24
|
import { ensureHostKey } from './chunk-V7NIVOFD.js';
|
|
@@ -118,7 +118,7 @@ async function runWorkRelease(opts) {
|
|
|
118
118
|
{ sessionId, ended: true },
|
|
119
119
|
fetchImpl
|
|
120
120
|
);
|
|
121
|
-
const { markWorkLeaseRenewed } = await import('./hook-fast-
|
|
121
|
+
const { markWorkLeaseRenewed } = await import('./hook-fast-PXWKQPN6.js');
|
|
122
122
|
markWorkLeaseRenewed(sessionId, opts.home ?? homeFromEnv(env));
|
|
123
123
|
const output2 = opts.json ? JSON.stringify(data2) : `released session ${sessionId}'s lease on #${itemId}, if it held one`;
|
|
124
124
|
if (!opts.quiet) process.stdout.write(output2 + "\n");
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
export { WorkCommandError, environmentFacts, findLiveItem, getJson, parsePositiveInt, postJson, resolveCredentials, resolveRepository, runWorkBuild, runWorkLinkSession, runWorkList, runWorkRemove, runWorkStatus } from './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
3
|
+
export { WorkCommandError, environmentFacts, findLiveItem, getJson, parsePositiveInt, postJson, resolveCredentials, resolveRepository, runWorkBuild, runWorkLinkSession, runWorkList, runWorkRemove, runWorkStatus } from './chunk-P4MM66C6.js';
|
|
4
|
+
import './chunk-EFZLAYPE.js';
|
|
5
|
+
import './chunk-IP7BIBXJ.js';
|
|
6
|
+
import './chunk-4QVZCVWT.js';
|
|
7
|
+
import './chunk-CNFVHDHG.js';
|
|
8
|
+
import './chunk-JXYVA45C.js';
|
|
9
|
+
import './chunk-4KSQKQXE.js';
|
|
10
10
|
import './chunk-N6LURUEF.js';
|
|
11
11
|
import './chunk-YRYMNBGQ.js';
|
|
12
12
|
import './chunk-WZBHBH3J.js';
|
|
13
13
|
import './chunk-YO4PSLVB.js';
|
|
14
14
|
import './chunk-PLMTLGYH.js';
|
|
15
|
-
import './chunk-
|
|
15
|
+
import './chunk-J5M7BSJQ.js';
|
|
16
16
|
import './chunk-EABW6AJQ.js';
|
|
17
17
|
import './chunk-V7NIVOFD.js';
|
|
18
18
|
import './chunk-ZM2IMMYN.js';
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { resolveCredentials, postJson, getJson } from './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import { detectActiveSession } from './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import { sanitizeTerminal } from './chunk-
|
|
8
|
-
import { resolveRepoIdentity } from './chunk-
|
|
9
|
-
import './chunk-
|
|
3
|
+
import { resolveCredentials, postJson, getJson } from './chunk-P4MM66C6.js';
|
|
4
|
+
import './chunk-EFZLAYPE.js';
|
|
5
|
+
import { detectActiveSession } from './chunk-IP7BIBXJ.js';
|
|
6
|
+
import './chunk-4QVZCVWT.js';
|
|
7
|
+
import { sanitizeTerminal } from './chunk-CNFVHDHG.js';
|
|
8
|
+
import { resolveRepoIdentity } from './chunk-JXYVA45C.js';
|
|
9
|
+
import './chunk-4KSQKQXE.js';
|
|
10
10
|
import './chunk-N6LURUEF.js';
|
|
11
11
|
import './chunk-YRYMNBGQ.js';
|
|
12
12
|
import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
|
|
13
13
|
import { defaultFetch } from './chunk-YO4PSLVB.js';
|
|
14
14
|
import './chunk-PLMTLGYH.js';
|
|
15
|
-
import './chunk-
|
|
15
|
+
import './chunk-J5M7BSJQ.js';
|
|
16
16
|
import './chunk-EABW6AJQ.js';
|
|
17
17
|
import './chunk-V7NIVOFD.js';
|
|
18
18
|
import './chunk-ZM2IMMYN.js';
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
import { itemLabel, runWorkPr, WorkPrCommandError } from './chunk-
|
|
4
|
-
import { resolveCredentials } from './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
3
|
+
import { itemLabel, runWorkPr, WorkPrCommandError } from './chunk-6S3H3J6H.js';
|
|
4
|
+
import { resolveCredentials } from './chunk-P4MM66C6.js';
|
|
5
|
+
import './chunk-EFZLAYPE.js';
|
|
6
|
+
import './chunk-IP7BIBXJ.js';
|
|
7
|
+
import './chunk-4QVZCVWT.js';
|
|
8
|
+
import './chunk-CNFVHDHG.js';
|
|
9
|
+
import './chunk-JXYVA45C.js';
|
|
10
|
+
import './chunk-4KSQKQXE.js';
|
|
11
11
|
import './chunk-N6LURUEF.js';
|
|
12
12
|
import './chunk-YRYMNBGQ.js';
|
|
13
13
|
import { parseWorkItemEnv } from './chunk-GQD22KKN.js';
|
|
14
14
|
import './chunk-WZBHBH3J.js';
|
|
15
15
|
import { defaultFetch } from './chunk-YO4PSLVB.js';
|
|
16
16
|
import './chunk-PLMTLGYH.js';
|
|
17
|
-
import './chunk-
|
|
17
|
+
import './chunk-J5M7BSJQ.js';
|
|
18
18
|
import './chunk-EABW6AJQ.js';
|
|
19
19
|
import './chunk-V7NIVOFD.js';
|
|
20
20
|
import './chunk-ZM2IMMYN.js';
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'node:module';
|
|
3
|
-
export { WorkPrCommandError, itemLabel, runWorkPr } from './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
3
|
+
export { WorkPrCommandError, itemLabel, runWorkPr } from './chunk-6S3H3J6H.js';
|
|
4
|
+
import './chunk-EFZLAYPE.js';
|
|
5
|
+
import './chunk-IP7BIBXJ.js';
|
|
6
|
+
import './chunk-4QVZCVWT.js';
|
|
7
|
+
import './chunk-CNFVHDHG.js';
|
|
8
|
+
import './chunk-JXYVA45C.js';
|
|
9
|
+
import './chunk-4KSQKQXE.js';
|
|
10
10
|
import './chunk-N6LURUEF.js';
|
|
11
11
|
import './chunk-YRYMNBGQ.js';
|
|
12
12
|
import './chunk-GQD22KKN.js';
|
|
13
13
|
import './chunk-WZBHBH3J.js';
|
|
14
14
|
import './chunk-YO4PSLVB.js';
|
|
15
15
|
import './chunk-PLMTLGYH.js';
|
|
16
|
-
import './chunk-
|
|
16
|
+
import './chunk-J5M7BSJQ.js';
|
|
17
17
|
import './chunk-EABW6AJQ.js';
|
|
18
18
|
import './chunk-V7NIVOFD.js';
|
|
19
19
|
import './chunk-ZM2IMMYN.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@outerlayer/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "OuterLayer CLI — commands: init, connect, doctor, login, logout, sync, daemon (alias: watch), emit, work, runner, hooks, mcp, import, context. Capture and sync coding-agent sessions, and record proof of factory work.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Magu Studios, Inc.",
|
|
@@ -8,7 +8,8 @@ description: >
|
|
|
8
8
|
use it the moment a CLAUDE.md, AGENTS.md or skill sentence turns out wrong or stale,
|
|
9
9
|
a test passes on rerun with no change, a gate or command misbehaves, or a setup step
|
|
10
10
|
fails for a reason outside the diff. Defines the six categories, what evidence each
|
|
11
|
-
carries, the JSON batch shape, and the
|
|
11
|
+
carries, how a finding joins a factory-level problem, the JSON batch shape, and the
|
|
12
|
+
`outerlayer emit finding` command.
|
|
12
13
|
---
|
|
13
14
|
|
|
14
15
|
## What this is for
|
|
@@ -21,6 +22,12 @@ agent does not pay for it again. Findings are informational. They show on the
|
|
|
21
22
|
work item page, grouped by category, and nothing reads them to pass or fail
|
|
22
23
|
the work.
|
|
23
24
|
|
|
25
|
+
Every finding joins a factory-level problem: one thing in the factory that
|
|
26
|
+
keeps costing time, reported by findings on many work items. The server joins
|
|
27
|
+
a finding to a problem when a key matches. Otherwise `outerlayer emit
|
|
28
|
+
finding` lists the closest problems and you choose. See "Linking a finding to
|
|
29
|
+
a problem" below.
|
|
30
|
+
|
|
24
31
|
## Categories
|
|
25
32
|
|
|
26
33
|
Each finding has exactly one category. Put the evidence in the title, file,
|
|
@@ -63,11 +70,67 @@ reproduce it.
|
|
|
63
70
|
Anything else that cost you time and fits none of the above. Describe it in the
|
|
64
71
|
title.
|
|
65
72
|
|
|
73
|
+
## What to record in a finding
|
|
74
|
+
|
|
75
|
+
Fill these in whenever you know them. They are what lets the next agent
|
|
76
|
+
recognise the problem and fix its cause.
|
|
77
|
+
|
|
78
|
+
- `--cause`: what is actually wrong. Write `unknown` when you do not know.
|
|
79
|
+
- `--detail`: what happened, a few paragraphs.
|
|
80
|
+
- `--suggestion`: what would help.
|
|
81
|
+
- `--command`: the command that misbehaved, for `tooling` and `environment`.
|
|
82
|
+
- `--error`: the first error line, for `tooling` and `environment`.
|
|
83
|
+
- `--test`: the test name, for `flaky-test`.
|
|
84
|
+
- `--symbol`: the function the problem is in, for `defect`.
|
|
85
|
+
|
|
86
|
+
`--command` and `--error` together, `--test`, and `--symbol` are what let the
|
|
87
|
+
server join a finding to a known problem without asking you.
|
|
88
|
+
|
|
89
|
+
## Time lost
|
|
90
|
+
|
|
91
|
+
When you run `outerlayer emit finding` without `--started-at`, it prints your
|
|
92
|
+
recent session events, each with an id and a time:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
e118 14:02:11 agent: Bash: yarn test
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Run it again with `--started-at <id>` for the event where you first hit the
|
|
99
|
+
problem and `--ended-at <id>` for the event where you got past it. The time is
|
|
100
|
+
read from those two events. Never estimate minutes yourself. A finding with no
|
|
101
|
+
events still counts toward how often the problem occurs.
|
|
102
|
+
|
|
103
|
+
## Linking a finding to a problem
|
|
104
|
+
|
|
105
|
+
1. Same problem means one fix resolves both. The same error or symptom is not enough.
|
|
106
|
+
2. A gap in the instructions is its own problem, separate from the thing it fails to mention. They are fixed in different places.
|
|
107
|
+
3. A finding can report more than one problem. Link each one, or record one finding per problem.
|
|
108
|
+
|
|
109
|
+
When no key matches, `outerlayer emit finding` stores nothing, prints the
|
|
110
|
+
closest problems with their reports, and exits with code 3. This is not a
|
|
111
|
+
failure: read the candidates, then run the same command again:
|
|
112
|
+
|
|
113
|
+
- `--problem <id> --link-reason "<why>"` for a problem this finding reports.
|
|
114
|
+
Repeat `--problem` for each problem it reports, as rule 3 says.
|
|
115
|
+
- `--new` when none of them is the same problem. Use it rather than linking
|
|
116
|
+
the nearest one.
|
|
117
|
+
|
|
118
|
+
`--problem` always needs `--link-reason`. Apply rule 1 to every candidate: the
|
|
119
|
+
same error is not enough, one fix has to resolve both. If a candidate's
|
|
120
|
+
reports carry a different cause, it is a different problem.
|
|
121
|
+
|
|
122
|
+
If a key of your finding is owned by a problem, the finding joins that problem
|
|
123
|
+
whatever `--problem` you named, and the output says so.
|
|
124
|
+
|
|
66
125
|
## The command
|
|
67
126
|
|
|
68
127
|
```bash
|
|
69
128
|
outerlayer emit finding --id <short-id> --category <category> \
|
|
70
|
-
--title "<one sentence>" --file <path> [--line <n>] --where "<what you were doing>"
|
|
129
|
+
--title "<one sentence>" --file <path> [--line <n>] --where "<what you were doing>" \
|
|
130
|
+
[--cause "<cause>"] [--detail "<text>"] [--suggestion "<text>"] \
|
|
131
|
+
[--command "<cmd>"] [--error "<first error line>"] [--test "<name>"] [--symbol "<function>"] \
|
|
132
|
+
[--started-at <event id> --ended-at <event id>] \
|
|
133
|
+
[--problem <id> --link-reason "<why>" | --new]
|
|
71
134
|
```
|
|
72
135
|
|
|
73
136
|
Inside a recorded session the work item is found automatically. Outside one,
|
|
@@ -91,11 +154,14 @@ outerlayer emit finding --id stale-path --category context \
|
|
|
91
154
|
outerlayer emit finding --id flaky-refresh --category flaky-test \
|
|
92
155
|
--title "refresh.test.ts fails once, then passes on rerun" \
|
|
93
156
|
--file apps/tenant-dashboard/src/lib/system/pr-session-comment/__tests__/refresh.test.ts \
|
|
157
|
+
--test "refreshes the comment after a push" \
|
|
94
158
|
--where "vitest run <file> failed, then passed with no change"
|
|
95
159
|
|
|
96
160
|
outerlayer emit finding --id gate-skip --category tooling \
|
|
97
161
|
--title "The pre-push gate prints green when a step was skipped" \
|
|
98
162
|
--file scripts/git/pre-push-checks.mjs \
|
|
163
|
+
--command "node scripts/git/pre-push-checks.mjs" --error "step lint skipped: no changed files" \
|
|
164
|
+
--cause "the skip path returns before the summary is computed" \
|
|
99
165
|
--where "expected a failure, got exit 0"
|
|
100
166
|
|
|
101
167
|
outerlayer emit finding --id shared-db --category environment \
|
|
@@ -105,7 +171,7 @@ outerlayer emit finding --id shared-db --category environment \
|
|
|
105
171
|
|
|
106
172
|
outerlayer emit finding --id null-read --category defect \
|
|
107
173
|
--title "readItem throws on an item with no claim" \
|
|
108
|
-
--file src/lib/work/read.ts --line 88 \
|
|
174
|
+
--file src/lib/work/read.ts --line 88 --symbol readItem \
|
|
109
175
|
--where "reproduce: call readItem on a fresh item"
|
|
110
176
|
|
|
111
177
|
outerlayer emit finding --id slow-hook --category other \
|
|
@@ -118,7 +184,7 @@ To record several at once, write a JSON batch and run
|
|
|
118
184
|
|
|
119
185
|
```json
|
|
120
186
|
{
|
|
121
|
-
"schemaVersion":
|
|
187
|
+
"schemaVersion": 3,
|
|
122
188
|
"headSha": "<branch head, optional>",
|
|
123
189
|
"findings": [
|
|
124
190
|
{
|
|
@@ -128,12 +194,25 @@ To record several at once, write a JSON batch and run
|
|
|
128
194
|
"file": "<path>",
|
|
129
195
|
"line": null,
|
|
130
196
|
"rule": null,
|
|
131
|
-
"where": { "label": "<what the agent was doing, in plain words>" }
|
|
197
|
+
"where": { "label": "<what the agent was doing, in plain words>" },
|
|
198
|
+
"cause": "<what is actually wrong, or unknown>",
|
|
199
|
+
"command": "<optional>",
|
|
200
|
+
"error": "<optional, first error line>",
|
|
201
|
+
"startedAt": "e118",
|
|
202
|
+
"endedAt": "e131",
|
|
203
|
+
"problems": ["<problem id>"],
|
|
204
|
+
"linkReason": "<why, required with problems>"
|
|
132
205
|
}
|
|
133
206
|
]
|
|
134
207
|
}
|
|
135
208
|
```
|
|
136
209
|
|
|
210
|
+
`startedAt` and `endedAt` are event ids from `emit finding`'s list, given
|
|
211
|
+
together or not at all. `problems` with `linkReason`, and `new: true`, are
|
|
212
|
+
for a finding that needs a choice; give neither and the server decides by key
|
|
213
|
+
or lists candidates. `emit findings` stores the findings that match a key,
|
|
214
|
+
lists the ones that need a choice, and exits with code 3.
|
|
215
|
+
|
|
137
216
|
`file` and `title` are always set; `line` and `rule` are `null` when there
|
|
138
217
|
is nothing to put in them. A `context` finding fills `rule` with
|
|
139
218
|
`{ "path", "line", "quote", "relation" }`. Leave `quote` out, rather than
|
|
@@ -125,48 +125,75 @@ Run them in order.
|
|
|
125
125
|
has not expired, stop and name it.
|
|
126
126
|
Phase 2 finds the issue's criteria. If it finds some, they are the
|
|
127
127
|
definition of done, and each declares a proof form or a test. If it finds
|
|
128
|
-
none, build from the issue's description
|
|
129
|
-
|
|
128
|
+
none, the build drafts them from the issue's description, and the drafted
|
|
129
|
+
criteria are the definition of done in the same way. An issue is never
|
|
130
|
+
sent back for lacking criteria.
|
|
130
131
|
Ask nothing from here until the final report. An agent that needs a ruling
|
|
131
132
|
states its assumption in its report and continues. The final report lists
|
|
132
133
|
every assumption.
|
|
133
134
|
2. **Read the criteria.** Record the issue's criteria on the item, so the
|
|
134
135
|
Criteria tab, the item's status and the judge hold the pull request to one
|
|
135
|
-
list.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
136
|
+
list. Read the whole issue and find its acceptance criteria in whatever
|
|
137
|
+
form they are written: under a heading of any wording, as a checklist or
|
|
138
|
+
numbered items, as "done when" prose, with ids or without. There is no
|
|
139
|
+
fixed shape. Keep each criterion's text exactly as the author wrote it.
|
|
140
|
+
Never reword one. A criterion you think is wrong becomes a note in the
|
|
141
|
+
final report, never an edit.
|
|
142
|
+
|
|
143
|
+
Write them, in the order the issue lists them, to a file:
|
|
144
|
+
|
|
145
|
+
{ "criteria": [ { "id": "<the id, if the issue gives one>", "text": "<verbatim>", "proof": null } ] }
|
|
146
|
+
|
|
147
|
+
Give `proof` an artifact kind (`video`, `screenshot`, `report`, `log`,
|
|
148
|
+
`test` or `file`) only when the issue states that proof explicitly, as in
|
|
149
|
+
`(proof: screenshot)`. Never infer a proof kind from the words. Then run:
|
|
150
|
+
|
|
151
|
+
node .outerlayer/skills/build/scripts/record-criteria.mjs --item "$OUTERLAYER_WORK" --criteria-file <file>
|
|
152
|
+
|
|
153
|
+
The script keeps the issue's ids only when every criterion carries one
|
|
154
|
+
that fits the id grammar. Otherwise, a partly numbered list included, it
|
|
155
|
+
numbers every criterion `AC-<item number>-NN` in order, and the state file
|
|
156
|
+
says why. The final report says the criteria were numbered and from what.
|
|
157
|
+
A file the script cannot use exits 2 with the reason. Fix the file and
|
|
158
|
+
run it again.
|
|
159
|
+
|
|
160
|
+
When the issue has no criteria anywhere, draft them from the issue's
|
|
161
|
+
description. Each is one observable behavior the description asks for, in
|
|
162
|
+
its words, adding no scope it does not state. Write them to the same kind
|
|
163
|
+
of file without ids, set `proof` only when the description asks for that
|
|
164
|
+
proof, and run the script with `--drafted` added. It numbers the draft
|
|
165
|
+
`AC-<item number>-NN` and records it with `drafted: true`, so the Criteria
|
|
166
|
+
tab says the build drafted the list.
|
|
167
|
+
|
|
168
|
+
The script writes the list to
|
|
151
169
|
`"$(git rev-parse --absolute-git-dir)/build-reports/criteria.json"` and runs
|
|
152
170
|
`outerlayer emit criteria` on it. The gateway decides whether a list may be
|
|
153
171
|
recorded. A 409 means the item already has a recorded list. That list
|
|
154
172
|
stands, and nothing is recorded. No command returns the item's list, so the
|
|
155
|
-
build cannot read it: it holds the work to
|
|
156
|
-
so in the final report. Any other
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
`count` and `
|
|
161
|
-
criteria goes under `issueReading`.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
173
|
+
build cannot read it: it holds the work to its own reading of the criteria
|
|
174
|
+
and says so in the final report. Any other refusal is written to the state
|
|
175
|
+
file with its message, and the build continues. The script writes the
|
|
176
|
+
outcome under `criteria` in the state file: `source` (`issue`, `drafted`,
|
|
177
|
+
`item`, or `none` when even a draft holds no criterion), `recorded`,
|
|
178
|
+
`count`, `list` and `numbered`. On a 409, `list` is empty, and the build's
|
|
179
|
+
reading of the criteria goes under `issueReading`.
|
|
180
|
+
|
|
181
|
+
Drafted criteria are tiered, proven and judged like any others. A drafted
|
|
182
|
+
list stands like any recorded list. A later build's record
|
|
183
|
+
answers 409 until a person replaces the list with
|
|
184
|
+
`outerlayer emit criteria`, even after criteria are added to the issue. The
|
|
185
|
+
final report says the criteria were drafted and how to replace them.
|
|
186
|
+
|
|
187
|
+
Change nothing in the issue. The intake summary names how many criteria
|
|
188
|
+
were recorded, whether they kept the issue's ids or were numbered, and
|
|
189
|
+
whether they were drafted.
|
|
190
|
+
3. **Implement.** When `OUTERLAYER_BRANCH` is set, as it is in a host's
|
|
191
|
+
build, work on that branch, checking it out if it is not current, and
|
|
192
|
+
push only to it: the host refuses a push to any other branch. Otherwise
|
|
193
|
+
branch `feat/<slug>` from the default branch. Spawn the implementer with the Implementer brief from
|
|
168
194
|
[references/agent-briefs.md](references/agent-briefs.md), the issue, the
|
|
169
|
-
|
|
195
|
+
drafted criteria with their ids when the build drafted them, the branch
|
|
196
|
+
and the instructions-file pointer. The phase ends when the
|
|
170
197
|
repository's own pre-push checks and tests pass on the branch. Review
|
|
171
198
|
never opens on a red branch. A branch that cannot go green escalates.
|
|
172
199
|
4. **Review.** Read [references/review-loop.md](references/review-loop.md) on
|
|
@@ -185,7 +212,7 @@ Run them in order.
|
|
|
185
212
|
on entry and run it. A release agent rebases, gates and pushes. Open the
|
|
186
213
|
pull request as release.md says: a runner build with `outerlayer work open-pr`,
|
|
187
214
|
which links it, and a local session with `gh pr create` and then
|
|
188
|
-
`outerlayer work pr <number>`. When the
|
|
215
|
+
`outerlayer work pr <number>`. When the build recorded criteria, from the issue or drafted, a fresh agent judges them with
|
|
189
216
|
[references/criteria-judge.md](references/criteria-judge.md), and the
|
|
190
217
|
judge's HTML report is emitted:
|
|
191
218
|
|
|
@@ -78,8 +78,10 @@ drives the real chain, from input through storage to read-back, with nothing
|
|
|
78
78
|
mocked at the store boundary, plus one test per criterion written from the
|
|
79
79
|
criterion's own words. Read every failure. Each test must fail because the
|
|
80
80
|
behavior is absent, not because of a typo or a missing import. Then implement
|
|
81
|
-
until green. When the
|
|
82
|
-
in the same
|
|
81
|
+
until green. When the build drafted the criteria from the issue's
|
|
82
|
+
description, they are requirements in the same way, and tests cite their
|
|
83
|
+
ids. When no criteria were recorded, write tests from the description in the
|
|
84
|
+
same order.
|
|
83
85
|
|
|
84
86
|
Version any new database migration with the current UTC time, never a round or
|
|
85
87
|
guessed one. Two open branches that guess the same time both pass their own
|
|
@@ -76,7 +76,7 @@ Then run `outerlayer sync`. List every unsatisfied criterion in the final
|
|
|
76
76
|
report. A criterion that declares a proof form such as a screenshot or video is
|
|
77
77
|
proven only by an artifact bound to it on the pull request. The judge cannot
|
|
78
78
|
see that, so confirm each has an artifact of the declared kind, and emit any
|
|
79
|
-
that is missing in the evidence phase. When
|
|
79
|
+
that is missing in the evidence phase. When no criteria were recorded, no judge
|
|
80
80
|
runs and no judge report is emitted.
|
|
81
81
|
|
|
82
82
|
## Watch CI
|
|
@@ -20,12 +20,16 @@ whatever its size.
|
|
|
20
20
|
|
|
21
21
|
| Item and diff | Tier | Reviewers | Judge |
|
|
22
22
|
|---|---|---|---|
|
|
23
|
-
| No criteria | small | one generalist | no judge runs |
|
|
23
|
+
| No criteria recorded | small | one generalist | no judge runs |
|
|
24
24
|
| Under ~40 lines, off the floor | small | one generalist | when criteria exist |
|
|
25
25
|
| Up to ~800 lines, off the floor | medium | generalist + one focused reviewer | when criteria exist |
|
|
26
26
|
| Floor, or larger | full | generalist + up to three | when criteria exist |
|
|
27
27
|
|
|
28
|
-
An item with no criteria is `small` whatever its diff, and no judge
|
|
28
|
+
An item with no criteria recorded is `small` whatever its diff, and no judge
|
|
29
|
+
runs. That happens only when the build could not draft a single criterion, since
|
|
30
|
+
an issue with no criteria gets a drafted list. A drafted list
|
|
31
|
+
(`criteria.source` is `drafted`) is tiered and judged like criteria the issue
|
|
32
|
+
wrote.
|
|
29
33
|
|
|
30
34
|
- **Small.** One generalist reads the full diff. No focused reviewer and no
|
|
31
35
|
mutation agent. The orchestrator runs the repository's mutation tool itself
|