@goodbones/cli 0.1.0-beta.2 → 0.1.0-beta.20

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.
Files changed (41) hide show
  1. package/build/dts/campaigns/host.d.ts +51 -0
  2. package/build/dts/campaigns/host.d.ts.map +1 -0
  3. package/build/dts/campaigns/live.d.ts +3 -0
  4. package/build/dts/campaigns/live.d.ts.map +1 -0
  5. package/build/dts/campaigns/none.d.ts +7 -0
  6. package/build/dts/campaigns/none.d.ts.map +1 -0
  7. package/build/dts/campaigns/verbs.d.ts +6 -0
  8. package/build/dts/campaigns/verbs.d.ts.map +1 -0
  9. package/build/dts/config-loader.d.ts +10 -3
  10. package/build/dts/config-loader.d.ts.map +1 -1
  11. package/build/dts/infer.d.ts +34 -0
  12. package/build/dts/infer.d.ts.map +1 -0
  13. package/build/dts/output.d.ts +9 -0
  14. package/build/dts/output.d.ts.map +1 -0
  15. package/build/dts/run.d.ts +67 -8
  16. package/build/dts/run.d.ts.map +1 -1
  17. package/build/esm/campaigns/host.js +2 -0
  18. package/build/esm/campaigns/host.js.map +1 -0
  19. package/build/esm/campaigns/live.js +106 -0
  20. package/build/esm/campaigns/live.js.map +1 -0
  21. package/build/esm/campaigns/none.js +34 -0
  22. package/build/esm/campaigns/none.js.map +1 -0
  23. package/build/esm/campaigns/verbs.js +489 -0
  24. package/build/esm/campaigns/verbs.js.map +1 -0
  25. package/build/esm/config-loader.js +66 -10
  26. package/build/esm/config-loader.js.map +1 -1
  27. package/build/esm/infer.js +378 -0
  28. package/build/esm/infer.js.map +1 -0
  29. package/build/esm/output.js +8 -0
  30. package/build/esm/output.js.map +1 -0
  31. package/build/esm/run.js +555 -78
  32. package/build/esm/run.js.map +1 -1
  33. package/package.json +19 -5
  34. package/src/campaigns/host.ts +120 -0
  35. package/src/campaigns/live.ts +136 -0
  36. package/src/campaigns/none.ts +47 -0
  37. package/src/campaigns/verbs.ts +620 -0
  38. package/src/config-loader.ts +81 -11
  39. package/src/infer.ts +511 -0
  40. package/src/output.ts +18 -0
  41. package/src/run.ts +870 -103
@@ -0,0 +1,51 @@
1
+ import type { CampaignEvaluation, CampaignReport } from "@goodbones/campaigns";
2
+ import type { LoadedPolicy as CorePolicy, PolicyExtension, Snapshot, SourceFacts, UninstalledExtension, Violation } from "@goodbones/core";
3
+ import type * as Effect from "effect/Effect";
4
+ import type { CliFailure } from "../output.js";
5
+ export type { CampaignEvaluation, CampaignReport } from "@goodbones/campaigns";
6
+ export type LoadedPolicy = CorePolicy & {
7
+ readonly campaigns: CampaignsHost;
8
+ };
9
+ export type CampaignHit = {
10
+ readonly violation: Violation;
11
+ readonly objective: string;
12
+ readonly sector: string;
13
+ readonly entry: string;
14
+ readonly ledgered: boolean;
15
+ };
16
+ export type Readers = {
17
+ readonly textOf: (file: string) => string;
18
+ readonly factsOf: (file: string) => SourceFacts;
19
+ };
20
+ export type VerbContext = {
21
+ readonly policy: LoadedPolicy;
22
+ readonly defaultRoots: ReadonlyArray<string>;
23
+ readonly argv: ReadonlyArray<string>;
24
+ readonly evaluate: (roots: ReadonlyArray<string>) => ReadonlyArray<CampaignEvaluation>;
25
+ readonly reload: (repoRoot: string) => Promise<CorePolicy>;
26
+ readonly manifestPath: string;
27
+ };
28
+ export type CampaignsHost = {
29
+ readonly widenedExtensions: (policy: CorePolicy) => ReadonlyArray<string>;
30
+ readonly readReports: (policy: CorePolicy) => Promise<void>;
31
+ readonly evaluate: (policy: CorePolicy, roots: ReadonlyArray<string>, walked: ReadonlyArray<string>, readers: Readers) => ReadonlyArray<CampaignEvaluation>;
32
+ readonly hitsOf: (policy: CorePolicy, evaluations: ReadonlyArray<CampaignEvaluation>) => ReadonlyArray<CampaignHit>;
33
+ readonly reportsOf: (policy: CorePolicy, evaluations: ReadonlyArray<CampaignEvaluation>) => ReadonlyArray<CampaignReport>;
34
+ readonly failuresOf: (reports: ReadonlyArray<CampaignReport>) => ReadonlyArray<string>;
35
+ readonly renderReports: (reports: ReadonlyArray<CampaignReport>, hits: ReadonlyArray<CampaignHit>) => ReadonlyArray<string>;
36
+ readonly snapshotOf: (policy: CorePolicy, evaluations: ReadonlyArray<CampaignEvaluation>) => Snapshot["campaigns"];
37
+ readonly renderRows: (campaigns: Snapshot["campaigns"]) => ReadonlyArray<string>;
38
+ readonly explainLines: (policy: CorePolicy, file: string, evaluate: () => ReadonlyArray<CampaignEvaluation>) => ReadonlyArray<string>;
39
+ readonly campaigns: (context: VerbContext) => Effect.Effect<void, CliFailure>;
40
+ readonly objectives: (context: VerbContext) => Effect.Effect<void, CliFailure>;
41
+ };
42
+ export type Composition = {
43
+ readonly manifest: unknown;
44
+ readonly extensions: ReadonlyArray<PolicyExtension>;
45
+ readonly uninstalled: ReadonlyArray<UninstalledExtension>;
46
+ };
47
+ export type CampaignsFamily = {
48
+ readonly host: CampaignsHost;
49
+ readonly compose: (repoRoot: string, configPath: string | null, manifest: unknown) => Promise<Composition>;
50
+ };
51
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../src/campaigns/host.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EACV,YAAY,IAAI,UAAU,EAC1B,eAAe,EACf,QAAQ,EACR,WAAW,EACX,oBAAoB,EACpB,SAAS,EACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI/E,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;CAAE,CAAC;AAI9E,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,CAAC;AAIF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,WAAW,CAAC;CACjD,CAAC;AAKF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACvF,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAE1B,QAAQ,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;IAE1E,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,QAAQ,CAAC,QAAQ,EAAE,CACjB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAC5B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,OAAO,EAAE,OAAO,KACb,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAEvC,QAAQ,CAAC,MAAM,EAAE,CACf,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,aAAa,CAAC,kBAAkB,CAAC,KAC3C,aAAa,CAAC,WAAW,CAAC,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,CAClB,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,aAAa,CAAC,kBAAkB,CAAC,KAC3C,aAAa,CAAC,cAAc,CAAC,CAAC;IAEnC,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;IACvF,QAAQ,CAAC,aAAa,EAAE,CACtB,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,EACtC,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,KAC7B,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,CACnB,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,aAAa,CAAC,kBAAkB,CAAC,KAC3C,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;IAGjF,QAAQ,CAAC,YAAY,EAAE,CACrB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,aAAa,CAAC,kBAAkB,CAAC,KAC9C,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9E,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;CAChF,CAAC;AAMF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IACpD,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAG7B,QAAQ,CAAC,OAAO,EAAE,CAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,QAAQ,EAAE,OAAO,KACd,OAAO,CAAC,WAAW,CAAC,CAAC;CAC3B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CampaignsFamily } from "./host.js";
2
+ export declare const liveCampaigns: CampaignsFamily;
3
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../../src/campaigns/live.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,WAAW,CAAC;AA6FhE,eAAO,MAAM,aAAa,EAAE,eAiB3B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { UninstalledExtension } from "@goodbones/core";
2
+ import type { CampaignsFamily, CampaignsHost } from "./host.js";
3
+ export declare const CAMPAIGNS_PACKAGE = "@goodbones/campaigns";
4
+ export declare const CAMPAIGNS_UNINSTALLED: UninstalledExtension;
5
+ export declare const noCampaigns: CampaignsHost;
6
+ export declare const campaignsNotInstalled: CampaignsFamily;
7
+ //# sourceMappingURL=none.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"none.d.ts","sourceRoot":"","sources":["../../../src/campaigns/none.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAI5D,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAKhE,eAAO,MAAM,iBAAiB,yBAAyB,CAAC;AAExD,eAAO,MAAM,qBAAqB,EAAE,oBAGnC,CAAC;AAaF,eAAO,MAAM,WAAW,EAAE,aAazB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAInC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { type CliFailure } from "../output.js";
3
+ import type { VerbContext } from "./host.js";
4
+ export declare const objectives: (context: VerbContext) => Effect.Effect<void, CliFailure>;
5
+ export declare const campaigns: (context: VerbContext) => Effect.Effect<void, CliFailure>;
6
+ //# sourceMappingURL=verbs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verbs.d.ts","sourceRoot":"","sources":["../../../src/campaigns/verbs.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,KAAK,UAAU,EAAuB,MAAM,cAAc,CAAC;AACpE,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,WAAW,CAAC;AA2J3D,eAAO,MAAM,UAAU,YAAa,WAAW,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CA0N5E,CAAC;AAEL,eAAO,MAAM,SAAS,YAAa,WAAW,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAyN3E,CAAC"}
@@ -1,4 +1,11 @@
1
- import { type LoadedPolicy } from "@goodbones/core";
2
- export type { LoadedPolicy } from "@goodbones/core";
3
- export declare const loadPolicyFromFile: (repoRoot: string, configFilename?: string) => Promise<LoadedPolicy>;
1
+ import { type ConfigInvalid, type Language, type PatternInvalid } from "@goodbones/core";
2
+ import * as Result from "effect/Result";
3
+ import type { CampaignsFamily, LoadedPolicy } from "./campaigns/host.js";
4
+ export type { LoadedPolicy } from "./campaigns/host.js";
5
+ export declare const hostLanguages: () => Promise<ReadonlyArray<Language>>;
6
+ export declare const hostCampaigns: () => Promise<CampaignsFamily>;
7
+ export declare const hostNow: () => number;
8
+ export declare const manifestPathOf: (repoRoot: string, configFilename?: string) => string;
9
+ export declare const loadPolicyFromFile: (repoRoot: string, configFilename?: string, given?: CampaignsFamily) => Promise<LoadedPolicy>;
10
+ export declare const loadPolicyFromManifest: (repoRoot: string, manifest: unknown) => Promise<Result.Result<LoadedPolicy, ConfigInvalid | PatternInvalid>>;
4
11
  //# sourceMappingURL=config-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,YAAY,EAIlB,MAAM,iBAAiB,CAAC;AAIzB,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMpD,eAAO,MAAM,kBAAkB,aACnB,MAAM,mBACC,MAAM,KACtB,OAAO,CAAC,YAAY,CAkBtB,CAAC"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,aAAa,EAGlB,KAAK,QAAQ,EAGb,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGzE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAGrE,CAAC;AAKF,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,eAAe,CAElB,CAAC;AAK7C,eAAO,MAAM,OAAO,QAAO,MAQ1B,CAAC;AAQF,eAAO,MAAM,cAAc,aAAc,MAAM,mBAAmB,MAAM,KAAG,MAG/B,CAAC;AAI7C,eAAO,MAAM,kBAAkB,aACnB,MAAM,mBACC,MAAM,UACf,eAAe,KACtB,OAAO,CAAC,YAAY,CAkBtB,CAAC;AAMF,eAAO,MAAM,sBAAsB,aACvB,MAAM,YACN,OAAO,KAChB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,GAAG,cAAc,CAAC,CAcrE,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type Generalization, type Manifest } from "@goodbones/core";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Result from "effect/Result";
4
+ export type CliFailure = {
5
+ readonly _tag: "CliFailure";
6
+ readonly message: string;
7
+ };
8
+ export type InferFlags = {
9
+ readonly depth: number;
10
+ readonly roots: ReadonlyArray<string>;
11
+ readonly tsconfig: string | null;
12
+ readonly write: boolean;
13
+ readonly answers: "ask" | "yes" | "exhaustive";
14
+ readonly collapse: boolean;
15
+ };
16
+ export declare const INFER_USAGE = "infer [--depth N] [--root DIR]... [--tsconfig PATH] [--write] [--yes | --exhaustive] [--collapse]";
17
+ export declare const parseInferFlags: (argv: ReadonlyArray<string>) => Result.Result<InferFlags, string>;
18
+ export type InferIo = {
19
+ readonly out: (text: string) => void;
20
+ readonly err: (line: string) => void;
21
+ readonly ask: (question: string) => Promise<boolean>;
22
+ readonly interactive: boolean;
23
+ };
24
+ export declare const terminalIo: () => InferIo;
25
+ export type InferOutcome = {
26
+ readonly manifest: Manifest;
27
+ readonly yaml: string;
28
+ readonly files: number;
29
+ readonly nodes: number;
30
+ readonly unresolved: ReadonlyArray<string>;
31
+ readonly generalized: ReadonlyArray<Generalization>;
32
+ };
33
+ export declare const infer: (repoRoot: string, argv: ReadonlyArray<string>, configFilename: string | undefined, io?: InferIo) => Effect.Effect<InferOutcome, CliFailure>;
34
+ //# sourceMappingURL=infer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../../src/infer.ts"],"names":[],"mappings":"AAIA,OAAO,EAOL,KAAK,cAAc,EAMnB,KAAK,QAAQ,EAId,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAaxC,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAGnF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAExB,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,KAAK,GAAG,YAAY,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,WAAW,sGAC6E,CAAC;AAEtG,eAAO,MAAM,eAAe,SAAU,aAAa,CAAC,MAAM,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CA2D7F,CAAC;AAIF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,UAAU,QAAO,OAc5B,CAAC;AAqMH,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;CACrD,CAAC;AAEF,eAAO,MAAM,KAAK,aACN,MAAM,QACV,aAAa,CAAC,MAAM,CAAC,kBACX,MAAM,GAAG,SAAS,OAC9B,OAAO,KACV,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAmKrC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import * as Effect from "effect/Effect";
2
+ export type CliFailure = {
3
+ readonly _tag: "CliFailure";
4
+ readonly message: string;
5
+ };
6
+ export declare const fail: (message: string) => CliFailure;
7
+ export declare const report: (lines: ReadonlyArray<string>) => Effect.Effect<void>;
8
+ export declare const count: (n: number, noun: string, plural?: string) => string;
9
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAOxC,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnF,eAAO,MAAM,IAAI,YAAa,MAAM,KAAG,UAA+C,CAAC;AAEvF,eAAO,MAAM,MAAM,UAAW,aAAa,CAAC,MAAM,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAGpE,CAAC;AAEL,eAAO,MAAM,KAAK,MAAO,MAAM,QAAQ,MAAM,sBAAwB,MAC1B,CAAC"}
@@ -1,23 +1,82 @@
1
- import { type Violation } from "@goodbones/core";
1
+ import { type ConformanceMeasure, type CoverageFamily, type Graph, type ObservedEdge, type Snapshot, type Violation } from "@goodbones/core";
2
2
  import * as Effect from "effect/Effect";
3
+ import type { CampaignEvaluation, CampaignReport } from "./campaigns/host.js";
3
4
  import { type LoadedPolicy } from "./config-loader.js";
4
- export type CliFailure = {
5
- readonly _tag: "CliFailure";
6
- readonly message: string;
5
+ import { type CliFailure } from "./output.js";
6
+ export type { CliFailure } from "./output.js";
7
+ export type UnresolvedEdge = {
8
+ readonly file: string;
9
+ readonly specifier: string;
10
+ readonly detail: string;
7
11
  };
8
12
  export type Findings = {
9
13
  readonly violations: ReadonlyArray<Violation>;
10
- readonly unresolved: ReadonlyArray<string>;
14
+ readonly campaigns: ReadonlyArray<CampaignEvaluation>;
15
+ readonly unresolved: ReadonlyArray<UnresolvedEdge>;
11
16
  readonly files: number;
17
+ readonly edges: ReadonlyArray<ObservedEdge>;
18
+ readonly graph: Graph | null;
12
19
  };
13
- export declare const collectFindings: (policy: LoadedPolicy, roots: ReadonlyArray<string>) => Findings;
14
- export declare const check: (policy: LoadedPolicy, roots: ReadonlyArray<string>) => Effect.Effect<void, CliFailure>;
20
+ export type CollectOptions = {
21
+ readonly graph?: boolean;
22
+ };
23
+ export declare const collectFindings: (policy: LoadedPolicy, roots: ReadonlyArray<string>, options?: CollectOptions) => Findings;
24
+ export type ReportedViolation = Violation & {
25
+ readonly fingerprint: string;
26
+ readonly baselined: boolean;
27
+ readonly ledgered: boolean;
28
+ readonly objective?: string;
29
+ readonly sector?: string;
30
+ readonly entry?: string;
31
+ };
32
+ export type CoverageReport = Readonly<Record<CoverageFamily, {
33
+ readonly covered: number;
34
+ readonly total: number;
35
+ readonly floor?: number;
36
+ readonly ceiling?: number;
37
+ }>>;
38
+ export type ConformanceReport = Readonly<Record<ConformanceMeasure, {
39
+ readonly count: number;
40
+ readonly ceiling?: number;
41
+ }>>;
42
+ export type CheckReport = {
43
+ readonly version: 1;
44
+ readonly files: number;
45
+ readonly outside: number;
46
+ readonly roots: ReadonlyArray<string>;
47
+ readonly ok: boolean;
48
+ readonly manifest: {
49
+ readonly path: string;
50
+ readonly sha256: string;
51
+ };
52
+ readonly violations: ReadonlyArray<ReportedViolation>;
53
+ readonly unresolved: ReadonlyArray<UnresolvedEdge>;
54
+ readonly stale: ReadonlyArray<string>;
55
+ readonly coverage: CoverageReport;
56
+ readonly conformance: ConformanceReport;
57
+ readonly adoption: {
58
+ readonly unrestricted: ReadonlyArray<string>;
59
+ readonly partial: ReadonlyArray<string>;
60
+ };
61
+ readonly campaigns: ReadonlyArray<CampaignReport>;
62
+ };
63
+ export declare const checkReport: (policy: LoadedPolicy, roots: ReadonlyArray<string>, manifestPath: string) => CheckReport;
64
+ export type CheckOptions = {
65
+ readonly format: "text" | "json";
66
+ readonly manifestPath: string;
67
+ };
68
+ export declare const check: (policy: LoadedPolicy, roots: ReadonlyArray<string>, options: CheckOptions) => Effect.Effect<void, CliFailure>;
69
+ export declare const snapshotOf: (policy: LoadedPolicy, roots: ReadonlyArray<string>, manifestPath: string) => Snapshot;
70
+ export type ConformanceOptions = CheckOptions;
71
+ export declare const conformance: (policy: LoadedPolicy, roots: ReadonlyArray<string>, options: ConformanceOptions) => Effect.Effect<void, CliFailure>;
15
72
  export declare const coverage: (policy: LoadedPolicy, roots: ReadonlyArray<string>) => Effect.Effect<void, CliFailure>;
16
73
  export declare const writeBaseline: (policy: LoadedPolicy, roots: ReadonlyArray<string>) => Effect.Effect<void, CliFailure>;
17
- export declare const explain: (policy: LoadedPolicy, file: string) => Effect.Effect<void, CliFailure>;
74
+ export declare const explain: (policy: LoadedPolicy, file: string, roots?: ReadonlyArray<string>) => Effect.Effect<void, CliFailure>;
18
75
  export declare const facts: (policy: LoadedPolicy, file: string, format?: "text" | "json") => Effect.Effect<void, CliFailure>;
19
76
  export declare const init: (repoRoot: string) => Effect.Effect<void, CliFailure>;
20
77
  export declare const migrate: (repoRoot: string, configFilename?: string) => Effect.Effect<void, CliFailure>;
78
+ export declare const objectives: (policy: LoadedPolicy, defaultRoots: ReadonlyArray<string>, argv: ReadonlyArray<string>) => Effect.Effect<void, CliFailure>;
79
+ export declare const campaigns: (policy: LoadedPolicy, defaultRoots: ReadonlyArray<string>, argv: ReadonlyArray<string>, configFilename?: string) => Effect.Effect<void, CliFailure>;
21
80
  export declare const run: (repoRoot: string, argv: ReadonlyArray<string>, configFilename?: string) => Effect.Effect<void, CliFailure>;
22
81
  export declare const fingerprint: (violation: Violation) => string;
23
82
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"AAGA,OAAO,EAiCL,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AAgB3E,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAInF,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,eAAe,WAAY,YAAY,SAAS,aAAa,CAAC,MAAM,CAAC,KAAG,QAgFpF,CAAC;AAyBF,eAAO,MAAM,KAAK,WACR,YAAY,SACb,aAAa,CAAC,MAAM,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAwD7B,CAAC;AAOL,eAAO,MAAM,QAAQ,WACX,YAAY,SACb,aAAa,CAAC,MAAM,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAiC7B,CAAC;AAEL,eAAO,MAAM,aAAa,WAChB,YAAY,SACb,aAAa,CAAC,MAAM,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAkB7B,CAAC;AAIL,eAAO,MAAM,OAAO,WAAY,YAAY,QAAQ,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAuFvF,CAAC;AAQL,eAAO,MAAM,KAAK,WACR,YAAY,QACd,MAAM,WACJ,MAAM,GAAG,MAAM,KACtB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAmD7B,CAAC;AAuDL,eAAO,MAAM,IAAI,aAAc,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAoBlE,CAAC;AAKL,eAAO,MAAM,OAAO,aACR,MAAM,mBACC,MAAM,KACtB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CA0C7B,CAAC;AAEL,eAAO,MAAM,GAAG,aACJ,MAAM,QACV,aAAa,CAAC,MAAM,CAAC,mBAEV,MAAM,KACtB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CA0C7B,CAAC;AAEL,eAAO,MAAM,WAAW,kCAAgB,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../../src/campaigns/host.ts"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import * as path from "node:path";
3
+ import { campaignFailuresOf, campaignReportsOf, campaignsExtension, campaignsOf, campaignsSelecting, evaluateCampaigns, explainCampaignLines, explainObjective, hitsInWindow, ledgeredFilter, loadCampaignFunctions, makeReportSourceLive, measureFile, renderCampaignReports, renderCampaignRows, reportSpecsOf, snapshotCampaignsOf, valueOfParts, widenedExtensions, } from "@goodbones/campaigns";
4
+ import { campaigns, objectives } from "./verbs.js";
5
+ // The campaigns family as this host runs it, over `@goodbones/campaigns`.
6
+ // The one module that loads the package: the composition root imports it
7
+ // through `importOptional`, so its absence is `none`, not a crash.
8
+ const firstSentence = (message) => `${(message.split(". ")[0] ?? message).replace(/\.$/, "")}.`;
9
+ const host = {
10
+ widenedExtensions,
11
+ readReports: async (policy) => {
12
+ const { campaignRules, reports } = campaignsOf(policy);
13
+ await Promise.all(reportSpecsOf(campaignRules).map((spec) => reports.read?.(spec)));
14
+ },
15
+ evaluate: evaluateCampaigns,
16
+ hitsOf: (policy, evaluations) => {
17
+ const isLedgered = ledgeredFilter(policy, evaluations);
18
+ return evaluations.flatMap((evaluation) => hitsInWindow(evaluation).map((hit) => ({
19
+ violation: hit.violation,
20
+ objective: hit.objective,
21
+ sector: hit.sector,
22
+ entry: hit.entry,
23
+ ledgered: isLedgered(hit),
24
+ })));
25
+ },
26
+ reportsOf: campaignReportsOf,
27
+ failuresOf: campaignFailuresOf,
28
+ renderReports: renderCampaignReports,
29
+ snapshotOf: snapshotCampaignsOf,
30
+ renderRows: renderCampaignRows,
31
+ // Each campaign selecting the file: the sector the file is in, its phase
32
+ // and definedness, the objectives in window that fire on it and the
33
+ // nearest remaining holdouts — which needs the campaign evaluated over its
34
+ // files, since a sector's phase is derived from all of them — then each
35
+ // objective's truth table: one line per leaf term and what it answered
36
+ // here, so a detector that "should fire" and does not shows which term is
37
+ // not saying what its author thinks.
38
+ explainLines: (policy, relative, evaluate) => {
39
+ const selected = campaignsSelecting(campaignsOf(policy).campaignRules, relative);
40
+ if (selected.length === 0)
41
+ return [];
42
+ const evaluations = evaluate();
43
+ return selected.flatMap((rule) => {
44
+ const at = path.join(policy.repoRoot, relative);
45
+ const text = existsSync(at) ? readFileSync(at, "utf8") : "";
46
+ const input = {
47
+ file: relative,
48
+ text,
49
+ facts: policy.extractor.factsOf(relative, text),
50
+ resolver: policy.resolver,
51
+ fileSystem: policy.fileSystem,
52
+ syntax: policy.syntax.parse(relative, text),
53
+ functions: campaignsOf(policy).functions,
54
+ reports: campaignsOf(policy).reports,
55
+ };
56
+ const evaluation = evaluations.find((one) => one.rule.id === rule.id);
57
+ return [
58
+ ...(evaluation === undefined ? [] : explainCampaignLines(policy, evaluation, relative)),
59
+ ...rule.objectives.flatMap((objective) => {
60
+ const measure = objective.measure;
61
+ if (measure !== null) {
62
+ // A scalar: what this file adds to its sector's number.
63
+ if (measure.kind === "command")
64
+ return [];
65
+ const parts = measureFile(measure, input);
66
+ const here = measure.kind === "ratio"
67
+ ? `${String(parts.of)} of ${String(parts.per)} here`
68
+ : `${String(valueOfParts(measure, parts))} here`;
69
+ return [
70
+ ` ${objective.name} — ${firstSentence(objective.intent ?? objective.message)} (measure, ${objective.direction}; ${here})`,
71
+ ];
72
+ }
73
+ const table = explainObjective(objective, input);
74
+ if (table.length === 0)
75
+ return [];
76
+ const fired = table.length > 0 && table.every((line) => line.answer);
77
+ return [
78
+ ` ${objective.name} — ${firstSentence(objective.intent ?? objective.message)} (${objective.holdout}; ${fired ? "fires here" : "no hit"})`,
79
+ ...table.map((line) => ` ${line.answer ? "✓" : "✗"} ${line.term}${line.count === undefined ? "" : ` (${String(line.count)})`}`),
80
+ ];
81
+ }),
82
+ ];
83
+ });
84
+ },
85
+ campaigns,
86
+ objectives,
87
+ };
88
+ export const liveCampaigns = {
89
+ host,
90
+ // The `fn` terms are imported here, before the policy loads: the core
91
+ // receives the functions as a map and touches no module loader. A
92
+ // manifest held as a value has no file for them to resolve against.
93
+ compose: async (repoRoot, configPath, manifest) => {
94
+ const reports = makeReportSourceLive(repoRoot);
95
+ if (configPath === null) {
96
+ return { manifest, extensions: [campaignsExtension({ reports })], uninstalled: [] };
97
+ }
98
+ const loaded = await loadCampaignFunctions(configPath, manifest);
99
+ return {
100
+ manifest: loaded.manifest,
101
+ extensions: [campaignsExtension({ functions: loaded.functions, reports })],
102
+ uninstalled: [],
103
+ };
104
+ },
105
+ };
106
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../../../src/campaigns/live.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { fail } from "../output.js";
3
+ // The package the family comes in, and the manifest keys it would claim: a
4
+ // manifest that uses one without it is refused naming the package, rather
5
+ // than as a misspelling.
6
+ export const CAMPAIGNS_PACKAGE = "@goodbones/campaigns";
7
+ export const CAMPAIGNS_UNINSTALLED = {
8
+ manifestKeys: ["campaigns", "ledger"],
9
+ install: CAMPAIGNS_PACKAGE,
10
+ };
11
+ const notInstalled = (verb) => Effect.fail(fail(`\`architecture ${verb}\` needs \`${CAMPAIGNS_PACKAGE}\`, which is not installed. ` +
12
+ `Install it beside @goodbones/cli to run campaigns.`));
13
+ // The family, when it is not installed: there is nothing to evaluate, so every
14
+ // report has no campaigns in it, and the two campaigns commands say what to
15
+ // install.
16
+ export const noCampaigns = {
17
+ widenedExtensions: () => [],
18
+ readReports: () => Promise.resolve(),
19
+ evaluate: () => [],
20
+ hitsOf: () => [],
21
+ reportsOf: () => [],
22
+ failuresOf: () => [],
23
+ renderReports: () => [],
24
+ snapshotOf: () => [],
25
+ renderRows: () => [],
26
+ explainLines: () => [],
27
+ campaigns: () => notInstalled("campaigns"),
28
+ objectives: () => notInstalled("objectives"),
29
+ };
30
+ export const campaignsNotInstalled = {
31
+ host: noCampaigns,
32
+ compose: (_repoRoot, _configPath, manifest) => Promise.resolve({ manifest, extensions: [], uninstalled: [CAMPAIGNS_UNINSTALLED] }),
33
+ };
34
+ //# sourceMappingURL=none.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"none.js","sourceRoot":"","sources":["../../../src/campaigns/none.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,2EAA2E;AAC3E,0EAA0E;AAC1E,yBAAyB;AACzB,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAExD,MAAM,CAAC,MAAM,qBAAqB,GAAyB;IACzD,YAAY,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;IACrC,OAAO,EAAE,iBAAiB;CAC3B,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE,CACpC,MAAM,CAAC,IAAI,CACT,IAAI,CACF,kBAAkB,IAAI,cAAc,iBAAiB,8BAA8B;IACjF,oDAAoD,CACvD,CACF,CAAC;AAEJ,+EAA+E;AAC/E,4EAA4E;AAC5E,WAAW;AACX,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,iBAAiB,EAAE,GAAG,EAAE,CAAC,EAAE;IAC3B,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;IACpC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE;IAClB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE;IAChB,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE;IACnB,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE;IACpB,aAAa,EAAE,GAAG,EAAE,CAAC,EAAE;IACvB,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE;IACpB,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE;IACpB,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE;IACtB,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC;IAC1C,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC;CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAoB;IACpD,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,CAC5C,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC;CACtF,CAAC"}