blacksmith-organization-system 1.6.0 → 1.8.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/bos.d.ts +15 -0
- package/dist/bos.js +54 -0
- package/dist/bos.js.map +1 -1
- package/dist/core/omnis.d.ts +29 -4
- package/dist/core/omnis.js +93 -18
- package/dist/core/omnis.js.map +1 -1
- package/dist/core/patterning.d.ts +19 -0
- package/dist/core/patterning.js +61 -0
- package/dist/core/patterning.js.map +1 -0
- package/dist/core/ruling.d.ts +34 -0
- package/dist/core/ruling.js +97 -0
- package/dist/core/ruling.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/models/almanac/load.d.ts +12 -0
- package/dist/models/almanac/load.js +38 -0
- package/dist/models/almanac/load.js.map +1 -0
- package/dist/models/devlog/class.d.ts +1 -0
- package/dist/models/devlog/class.js +19 -11
- package/dist/models/devlog/class.js.map +1 -1
- package/dist/models/index.d.ts +1 -0
- package/dist/models/index.js +1 -0
- package/dist/models/index.js.map +1 -1
- package/dist/models/workshop/class.d.ts +1 -0
- package/dist/models/workshop/class.js +4 -0
- package/dist/models/workshop/class.js.map +1 -1
- package/dist/models/workshop/locate.js +12 -5
- package/dist/models/workshop/locate.js.map +1 -1
- package/dist/procedures/index.d.ts +3 -0
- package/dist/procedures/index.js +3 -0
- package/dist/procedures/index.js.map +1 -1
- package/dist/procedures/inspecting/_index.js +2 -0
- package/dist/procedures/inspecting/_index.js.map +1 -1
- package/dist/procedures/inspecting/read-omnis.d.ts +2 -0
- package/dist/procedures/inspecting/read-omnis.js +14 -0
- package/dist/procedures/inspecting/read-omnis.js.map +1 -0
- package/dist/procedures/inspecting/report.d.ts +6 -0
- package/dist/procedures/inspecting/report.js +1 -0
- package/dist/procedures/inspecting/report.js.map +1 -1
- package/dist/procedures/inspecting/rules.d.ts +1 -0
- package/dist/procedures/inspecting/rules.js +10 -0
- package/dist/procedures/inspecting/rules.js.map +1 -1
- package/dist/procedures/judging/_index.d.ts +4 -0
- package/dist/procedures/judging/_index.js +8 -0
- package/dist/procedures/judging/_index.js.map +1 -0
- package/dist/procedures/judging/context.d.ts +10 -0
- package/dist/procedures/judging/context.js +2 -0
- package/dist/procedures/judging/context.js.map +1 -0
- package/dist/procedures/judging/steps.d.ts +4 -0
- package/dist/procedures/judging/steps.js +21 -0
- package/dist/procedures/judging/steps.js.map +1 -0
- package/dist/procedures/recalling/_index.d.ts +4 -0
- package/dist/procedures/recalling/_index.js +8 -0
- package/dist/procedures/recalling/_index.js.map +1 -0
- package/dist/procedures/recalling/context.d.ts +10 -0
- package/dist/procedures/recalling/context.js +2 -0
- package/dist/procedures/recalling/context.js.map +1 -0
- package/dist/procedures/recalling/steps.d.ts +4 -0
- package/dist/procedures/recalling/steps.js +12 -0
- package/dist/procedures/recalling/steps.js.map +1 -0
- package/dist/procedures/sealing/_index.d.ts +5 -0
- package/dist/procedures/sealing/_index.js +11 -0
- package/dist/procedures/sealing/_index.js.map +1 -0
- package/dist/procedures/sealing/context.d.ts +20 -0
- package/dist/procedures/sealing/context.js +4 -0
- package/dist/procedures/sealing/context.js.map +1 -0
- package/dist/procedures/sealing/steps.d.ts +9 -0
- package/dist/procedures/sealing/steps.js +44 -0
- package/dist/procedures/sealing/steps.js.map +1 -0
- package/dist/tools/_index.js +2 -0
- package/dist/tools/_index.js.map +1 -1
- package/dist/tools/almanac.d.ts +1 -0
- package/dist/tools/almanac.js +56 -0
- package/dist/tools/almanac.js.map +1 -0
- package/dist/tools/project.js +28 -0
- package/dist/tools/project.js.map +1 -1
- package/dist/views/almanac.d.ts +5 -0
- package/dist/views/almanac.js +59 -0
- package/dist/views/almanac.js.map +1 -0
- package/dist/views/devlog.js +1 -1
- package/dist/views/devlog.js.map +1 -1
- package/dist/views/sealing.d.ts +2 -0
- package/dist/views/sealing.js +26 -0
- package/dist/views/sealing.js.map +1 -0
- package/package.json +4 -1
- package/resources/almanac/patterning/bos-core.json +90 -0
- package/resources/almanac/rulesets/bos-environment.json +141 -0
package/dist/bos.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Element } from "./core/element.ts";
|
|
2
2
|
import type { Host } from "./core/host.ts";
|
|
3
|
+
import { type Allocators } from "./core/omnis.ts";
|
|
4
|
+
import type { Case } from "./core/ruling.ts";
|
|
3
5
|
import type { LoopEvent } from "./core/version.ts";
|
|
4
6
|
import * as Models from "./models/index.ts";
|
|
5
7
|
import * as Procedures from "./procedures/index.ts";
|
|
@@ -70,6 +72,19 @@ export declare class BOS {
|
|
|
70
72
|
dir?: string;
|
|
71
73
|
dryRun?: boolean;
|
|
72
74
|
}): Promise<Procedures.CreditOutcome>;
|
|
75
|
+
omnis({ dir, seal, dryRun, allocators, }?: {
|
|
76
|
+
dir?: string;
|
|
77
|
+
seal?: boolean;
|
|
78
|
+
dryRun?: boolean;
|
|
79
|
+
allocators?: Allocators;
|
|
80
|
+
}): Promise<Procedures.SealOutcome>;
|
|
81
|
+
almanac(dir?: string): Models.Almanac;
|
|
82
|
+
judge(description: string | Case, { dir }?: {
|
|
83
|
+
dir?: string;
|
|
84
|
+
}): Promise<Procedures.JudgeContext>;
|
|
85
|
+
recall(events: string[], { dir }?: {
|
|
86
|
+
dir?: string;
|
|
87
|
+
}): Promise<Procedures.RecallContext>;
|
|
73
88
|
propose(branch: string, { dir, dryRun }?: {
|
|
74
89
|
dir?: string;
|
|
75
90
|
dryRun?: boolean;
|
package/dist/bos.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { GitHub, LocalGit } from "./bridges/index.js";
|
|
6
6
|
import { createContext } from "./core/context.js";
|
|
7
7
|
import { Element } from "./core/element.js";
|
|
8
|
+
import { DEFAULT_ALLOCATORS, OMNIS_FILE } from "./core/omnis.js";
|
|
8
9
|
import * as Models from "./models/index.js";
|
|
9
10
|
import * as Procedures from "./procedures/index.js";
|
|
10
11
|
export class BOS {
|
|
@@ -34,6 +35,9 @@ export class BOS {
|
|
|
34
35
|
options;
|
|
35
36
|
#workshop = null;
|
|
36
37
|
constructor(host, options = {}) {
|
|
38
|
+
if (!host) {
|
|
39
|
+
throw new TypeError("new BOS(host): give it the machine, e.g. new BOS(new NodeHost())");
|
|
40
|
+
}
|
|
37
41
|
this.host = host;
|
|
38
42
|
this.options = options;
|
|
39
43
|
}
|
|
@@ -161,6 +165,56 @@ export class BOS {
|
|
|
161
165
|
};
|
|
162
166
|
return (await Procedures.crediting.run(context)).outcome;
|
|
163
167
|
}
|
|
168
|
+
// the project's halo (.bos/.omnis.toml) now, against the sealed one; seal: true writes it
|
|
169
|
+
async omnis({ dir, seal = false, dryRun = false, allocators = DEFAULT_ALLOCATORS, } = {}) {
|
|
170
|
+
const { project } = this.loop(dir);
|
|
171
|
+
const context = {
|
|
172
|
+
...createContext(this.host, { dryRun }),
|
|
173
|
+
projectPath: project.path,
|
|
174
|
+
git: new LocalGit(this.host, project.path),
|
|
175
|
+
allocators,
|
|
176
|
+
seal,
|
|
177
|
+
sealed: null,
|
|
178
|
+
halo: [],
|
|
179
|
+
outcome: Procedures.unsealed(`${project.path}/${OMNIS_FILE}`),
|
|
180
|
+
};
|
|
181
|
+
return (await Procedures.sealing.run(context)).outcome;
|
|
182
|
+
}
|
|
183
|
+
// the almanac of the project around dir (docs/almanac/), then the universal one of the core
|
|
184
|
+
almanac(dir) {
|
|
185
|
+
return Models.almanacOf(this.host, this.#around(dir));
|
|
186
|
+
}
|
|
187
|
+
// the project around dir, or dir itself outside a repository (the universal almanac still holds)
|
|
188
|
+
#around(dir) {
|
|
189
|
+
try {
|
|
190
|
+
return Models.projectAround(this.host, dir).path;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return dir ?? this.host.cwd();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// does a case break a rule of the almanac: in words ("Cleo pushes to master"), JSON, or fields
|
|
197
|
+
async judge(description, { dir } = {}) {
|
|
198
|
+
return Procedures.judging.run({
|
|
199
|
+
...createContext(this.host),
|
|
200
|
+
projectPath: this.#around(dir),
|
|
201
|
+
description,
|
|
202
|
+
almanac: { places: [], rulesets: [], chains: [] },
|
|
203
|
+
case: {},
|
|
204
|
+
judgement: null,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
// the chains of events met before that hold these events, and what usually comes next
|
|
208
|
+
async recall(events, { dir } = {}) {
|
|
209
|
+
return Procedures.recalling.run({
|
|
210
|
+
...createContext(this.host),
|
|
211
|
+
projectPath: this.#around(dir),
|
|
212
|
+
events,
|
|
213
|
+
almanac: { places: [], rulesets: [], chains: [] },
|
|
214
|
+
prediction: null,
|
|
215
|
+
chains: [],
|
|
216
|
+
});
|
|
217
|
+
}
|
|
164
218
|
// open the pull request of a branch's forward step on GitHub
|
|
165
219
|
async propose(branch, { dir, dryRun = false } = {}) {
|
|
166
220
|
const { project, loop } = this.loop(dir);
|
package/dist/bos.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bos.js","sourceRoot":"","sources":["../src/bos.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kFAAkF;AAClF,yBAAyB;AACzB,8EAA8E;AAC9E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"bos.js","sourceRoot":"","sources":["../src/bos.ts"],"names":[],"mappings":"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"}
|
package/dist/core/omnis.d.ts
CHANGED
|
@@ -1,15 +1,40 @@
|
|
|
1
1
|
import type { DigestAlgorithm, Host } from "./host.ts";
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const OMNIS_FILE = ".bos/.omnis.toml";
|
|
3
3
|
export declare function a12y(word: string): string;
|
|
4
4
|
export declare function crc32(text: string): string;
|
|
5
5
|
export declare function adler32(text: string): string;
|
|
6
6
|
export declare function base32(text: string): string;
|
|
7
|
+
export declare const KEYNAME_ALLOCATORS: {
|
|
8
|
+
readonly crc32: (path: string) => string;
|
|
9
|
+
readonly adler32: (path: string) => string;
|
|
10
|
+
readonly a12y: (path: string) => string;
|
|
11
|
+
};
|
|
12
|
+
export type KeynameAllocator = keyof typeof KEYNAME_ALLOCATORS;
|
|
13
|
+
export type Allocators = {
|
|
14
|
+
keyname: KeynameAllocator[];
|
|
15
|
+
valuedata: DigestAlgorithm[];
|
|
16
|
+
};
|
|
17
|
+
export declare const DEFAULT_ALLOCATORS: Allocators;
|
|
7
18
|
export declare function counted(path: string): boolean;
|
|
19
|
+
export declare function ownFiles(host: Host, root: string, files: string[]): string[];
|
|
8
20
|
export type Hallow = {
|
|
9
21
|
key: string;
|
|
10
22
|
value: string;
|
|
11
23
|
path: string;
|
|
12
24
|
};
|
|
13
|
-
export declare function hallow(host: Host, root: string, path: string): Hallow | null;
|
|
14
|
-
export declare function omnis(host: Host, root: string, files: string[]): Hallow[];
|
|
15
|
-
export declare function omnisToml(hallows: Hallow[], unixusat: number): string;
|
|
25
|
+
export declare function hallow(host: Host, root: string, path: string, allocators?: Allocators): Hallow | null;
|
|
26
|
+
export declare function omnis(host: Host, root: string, files: string[], allocators?: Allocators): Hallow[];
|
|
27
|
+
export declare function omnisToml(hallows: Hallow[], unixusat: number, allocators?: Allocators): string;
|
|
28
|
+
export type Sealed = {
|
|
29
|
+
unixusat: number;
|
|
30
|
+
allocators: Allocators;
|
|
31
|
+
hallows: Map<string, string>;
|
|
32
|
+
};
|
|
33
|
+
export declare function readOmnis(text: string): Sealed;
|
|
34
|
+
export type Drift = {
|
|
35
|
+
added: string[];
|
|
36
|
+
changed: string[];
|
|
37
|
+
removed: number;
|
|
38
|
+
};
|
|
39
|
+
export declare function drift(sealed: Sealed, now: Hallow[]): Drift;
|
|
40
|
+
export declare const unchanged: (d: Drift) => boolean;
|
package/dist/core/omnis.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
// (
|
|
3
|
-
|
|
4
|
-
// "authenticity" → "a12y": the first letter, the length, the last letter (the owner's
|
|
5
|
-
// example; the usual numeronym counts only the letters between, a10y - Q16)
|
|
1
|
+
export const OMNIS_FILE = ".bos/.omnis.toml";
|
|
2
|
+
// a12y, the owner's algorithm (not a numeronym like a11y): the first letter, the length and
|
|
3
|
+
// the last letter of any string: "authenticity" → "a12y", "ab" → "a2b", "x" → "x1x"
|
|
6
4
|
export function a12y(word) {
|
|
7
5
|
const letters = [...word];
|
|
8
|
-
if (letters.length
|
|
9
|
-
return
|
|
6
|
+
if (!letters.length) {
|
|
7
|
+
return "0";
|
|
10
8
|
}
|
|
11
9
|
return `${letters[0]}${letters.length}${letters[letters.length - 1]}`;
|
|
12
10
|
}
|
|
@@ -56,33 +54,110 @@ export function base32(text) {
|
|
|
56
54
|
}
|
|
57
55
|
return out;
|
|
58
56
|
}
|
|
57
|
+
// the allocators of a key: each reads the file's path (relative to the model, with /)
|
|
58
|
+
export const KEYNAME_ALLOCATORS = {
|
|
59
|
+
crc32: (path) => crc32(path),
|
|
60
|
+
adler32: (path) => adler32(path),
|
|
61
|
+
a12y: (path) => a12y(path.split("/").pop() ?? path),
|
|
62
|
+
};
|
|
63
|
+
export const DEFAULT_ALLOCATORS = {
|
|
64
|
+
keyname: ["crc32", "a12y", "adler32"],
|
|
65
|
+
valuedata: ["sha1", "md5", "crc32"],
|
|
66
|
+
};
|
|
59
67
|
// does a file of this name count: it begins and ends with a letter
|
|
60
68
|
export function counted(path) {
|
|
61
69
|
const name = path.split("/").pop() ?? "";
|
|
62
70
|
return /^\p{L}(.*\p{L})?$/u.test(name);
|
|
63
71
|
}
|
|
72
|
+
// the files of this model only: none inside a directory that is a model of its own (it has
|
|
73
|
+
// its own .bos/, and its own .omnis.toml)
|
|
74
|
+
export function ownFiles(host, root, files) {
|
|
75
|
+
const boundary = new Map();
|
|
76
|
+
const isModel = (dir) => {
|
|
77
|
+
if (!boundary.has(dir)) {
|
|
78
|
+
boundary.set(dir, host.isDirectory(`${root}/${dir}/.bos`));
|
|
79
|
+
}
|
|
80
|
+
return boundary.get(dir) === true;
|
|
81
|
+
};
|
|
82
|
+
return files.filter((path) => {
|
|
83
|
+
const parts = path.split("/").slice(0, -1);
|
|
84
|
+
return !parts.some((_, at) => isModel(parts.slice(0, at + 1).join("/")));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
64
87
|
// one line of [hallows] for a file (path relative to the model's root, with /); null when
|
|
65
88
|
// it is not a regular file
|
|
66
|
-
export function hallow(host, root, path) {
|
|
67
|
-
const digests =
|
|
89
|
+
export function hallow(host, root, path, allocators = DEFAULT_ALLOCATORS) {
|
|
90
|
+
const digests = allocators.valuedata.map((algorithm) => host.digest(`${root}/${path}`, algorithm));
|
|
68
91
|
if (digests.some((digest) => digest === null)) {
|
|
69
92
|
return null;
|
|
70
93
|
}
|
|
71
|
-
const
|
|
72
|
-
const key = [crc32(path), a12y(name), adler32(path)].join("");
|
|
94
|
+
const key = allocators.keyname.map((name) => KEYNAME_ALLOCATORS[name](path)).join("");
|
|
73
95
|
return { key: base32(key), value: base32(digests.join("")), path };
|
|
74
96
|
}
|
|
75
97
|
// the halo of the given files (e.g. LocalGit.files(): what no .gitignore leaves out)
|
|
76
|
-
export function omnis(host, root, files) {
|
|
77
|
-
return files
|
|
78
|
-
.filter(counted)
|
|
98
|
+
export function omnis(host, root, files, allocators = DEFAULT_ALLOCATORS) {
|
|
99
|
+
return ownFiles(host, root, files.filter(counted))
|
|
79
100
|
.sort()
|
|
80
|
-
.map((path) => hallow(host, root, path))
|
|
101
|
+
.map((path) => hallow(host, root, path, allocators))
|
|
81
102
|
.filter((entry) => entry !== null);
|
|
82
103
|
}
|
|
104
|
+
const list = (names) => `[${names.map((name) => `"${name}"`).join(", ")}]`;
|
|
83
105
|
// .omnis.toml's text
|
|
84
|
-
export function omnisToml(hallows, unixusat) {
|
|
85
|
-
|
|
86
|
-
|
|
106
|
+
export function omnisToml(hallows, unixusat, allocators = DEFAULT_ALLOCATORS) {
|
|
107
|
+
return [
|
|
108
|
+
"[moriatur]",
|
|
109
|
+
`UNIXUSAT = ${unixusat}`,
|
|
110
|
+
"[allocators]",
|
|
111
|
+
`KEYNAME = ${list(allocators.keyname)}`,
|
|
112
|
+
`VALUEDATA = ${list(allocators.valuedata)}`,
|
|
113
|
+
"[hallows]",
|
|
114
|
+
...hallows.map(({ key, value }) => `${key} = "${value}"`),
|
|
115
|
+
"",
|
|
116
|
+
].join("\n");
|
|
117
|
+
}
|
|
118
|
+
// read back what omnisToml wrote (only that shape: sections, bare keys, strings, string lists)
|
|
119
|
+
export function readOmnis(text) {
|
|
120
|
+
const sealed = { unixusat: 0, allocators: DEFAULT_ALLOCATORS, hallows: new Map() };
|
|
121
|
+
const allocators = { ...DEFAULT_ALLOCATORS };
|
|
122
|
+
let section = "";
|
|
123
|
+
for (const raw of text.split("\n")) {
|
|
124
|
+
const line = raw.trim();
|
|
125
|
+
const header = /^\[(\w+)\]$/.exec(line);
|
|
126
|
+
if (header) {
|
|
127
|
+
section = header[1] ?? "";
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const pair = /^([\w-]+)\s*=\s*(.+)$/.exec(line);
|
|
131
|
+
if (!pair) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const [, key = "", value = ""] = pair;
|
|
135
|
+
const strings = [...value.matchAll(/"([^"]*)"/g)].map((match) => match[1] ?? "");
|
|
136
|
+
if (section === "moriatur" && key === "UNIXUSAT") {
|
|
137
|
+
sealed.unixusat = Number(value);
|
|
138
|
+
}
|
|
139
|
+
else if (section === "allocators" && key === "KEYNAME") {
|
|
140
|
+
allocators.keyname = strings;
|
|
141
|
+
}
|
|
142
|
+
else if (section === "allocators" && key === "VALUEDATA") {
|
|
143
|
+
allocators.valuedata = strings;
|
|
144
|
+
}
|
|
145
|
+
else if (section === "hallows") {
|
|
146
|
+
sealed.hallows.set(key, strings[0] ?? "");
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
sealed.allocators = allocators;
|
|
150
|
+
return sealed;
|
|
151
|
+
}
|
|
152
|
+
export function drift(sealed, now) {
|
|
153
|
+
const here = new Set(now.map((entry) => entry.key));
|
|
154
|
+
return {
|
|
155
|
+
added: now.filter((entry) => !sealed.hallows.has(entry.key)).map((entry) => entry.path),
|
|
156
|
+
changed: now
|
|
157
|
+
.filter((entry) => sealed.hallows.has(entry.key) && sealed.hallows.get(entry.key) !== entry.value)
|
|
158
|
+
.map((entry) => entry.path),
|
|
159
|
+
removed: [...sealed.hallows.keys()].filter((key) => !here.has(key)).length,
|
|
160
|
+
};
|
|
87
161
|
}
|
|
162
|
+
export const unchanged = (d) => !d.added.length && !d.changed.length && !d.removed;
|
|
88
163
|
//# sourceMappingURL=omnis.js.map
|
package/dist/core/omnis.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"omnis.js","sourceRoot":"","sources":["../../src/core/omnis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"omnis.js","sourceRoot":"","sources":["../../src/core/omnis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type Chain = {
|
|
2
|
+
id: string;
|
|
3
|
+
events: string[];
|
|
4
|
+
cataclysm?: string;
|
|
5
|
+
solution?: string;
|
|
6
|
+
seen?: string[];
|
|
7
|
+
};
|
|
8
|
+
export type Patterns = Map<string, Map<string, number>>;
|
|
9
|
+
export declare const ORDER = 2;
|
|
10
|
+
export declare function learn(chains: Chain[]): Patterns;
|
|
11
|
+
export type Prediction = {
|
|
12
|
+
after: string;
|
|
13
|
+
next: {
|
|
14
|
+
event: string;
|
|
15
|
+
p: number;
|
|
16
|
+
}[];
|
|
17
|
+
};
|
|
18
|
+
export declare function predict(patterns: Patterns, events: string[]): Prediction;
|
|
19
|
+
export declare function recall(chains: Chain[], events: string[]): Chain[];
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Patterning of the almanac (glossary: almanac): chains of events met before, each with the
|
|
2
|
+
// result it came to (a cataclysm) and what solved it. Counting which event followed which
|
|
3
|
+
// gives the probable next events of a situation met again.
|
|
4
|
+
// predict(learn(chains), ["commit", "bump-version"]) → [{ event: "push:revision", p: 0.5 }…]
|
|
5
|
+
export const ORDER = 2;
|
|
6
|
+
const contextKey = (events) => events.join(" → ");
|
|
7
|
+
export function learn(chains) {
|
|
8
|
+
const patterns = new Map();
|
|
9
|
+
for (const { events, seen } of chains) {
|
|
10
|
+
// a chain seen several times weighs as much as it was seen
|
|
11
|
+
const weight = Math.max(1, seen?.length ?? 1);
|
|
12
|
+
events.forEach((next, at) => {
|
|
13
|
+
for (let order = 1; order <= ORDER && at - order >= 0; order++) {
|
|
14
|
+
const key = contextKey(events.slice(at - order, at));
|
|
15
|
+
const counts = patterns.get(key) ?? new Map();
|
|
16
|
+
counts.set(next, (counts.get(next) ?? 0) + weight);
|
|
17
|
+
patterns.set(key, counts);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return patterns;
|
|
22
|
+
}
|
|
23
|
+
// the next events after the given ones, from the longest context met before (two events,
|
|
24
|
+
// else the last one); nothing known: no next events
|
|
25
|
+
export function predict(patterns, events) {
|
|
26
|
+
for (let order = Math.min(ORDER, events.length); order >= 1; order--) {
|
|
27
|
+
const after = contextKey(events.slice(-order));
|
|
28
|
+
const counts = patterns.get(after);
|
|
29
|
+
if (!counts) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const total = [...counts.values()].reduce((sum, count) => sum + count, 0);
|
|
33
|
+
const next = [...counts]
|
|
34
|
+
.map(([event, count]) => ({ event, p: count / total }))
|
|
35
|
+
.sort((a, b) => b.p - a.p || a.event.localeCompare(b.event));
|
|
36
|
+
return { after, next };
|
|
37
|
+
}
|
|
38
|
+
return { after: contextKey(events.slice(-1)), next: [] };
|
|
39
|
+
}
|
|
40
|
+
// the chains that hold the given events in this order (not necessarily next to each other),
|
|
41
|
+
// the ones that hold more of them first
|
|
42
|
+
export function recall(chains, events) {
|
|
43
|
+
const held = (chain) => {
|
|
44
|
+
let at = 0;
|
|
45
|
+
let count = 0;
|
|
46
|
+
for (const event of events) {
|
|
47
|
+
const found = chain.events.indexOf(event, at);
|
|
48
|
+
if (found !== -1) {
|
|
49
|
+
count++;
|
|
50
|
+
at = found + 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return count;
|
|
54
|
+
};
|
|
55
|
+
return chains
|
|
56
|
+
.map((chain) => ({ chain, count: held(chain) }))
|
|
57
|
+
.filter(({ count }) => count > 0)
|
|
58
|
+
.sort((a, b) => b.count - a.count)
|
|
59
|
+
.map(({ chain }) => chain);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=patterning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterning.js","sourceRoot":"","sources":["../../src/core/patterning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type Verdict = "allowed" | "ask" | "violation";
|
|
2
|
+
export type Case = Record<string, string | string[]>;
|
|
3
|
+
export type Conditions = Record<string, string | string[]>;
|
|
4
|
+
export type Rule = {
|
|
5
|
+
id: string;
|
|
6
|
+
statement: string;
|
|
7
|
+
when: Conditions;
|
|
8
|
+
unless?: Conditions;
|
|
9
|
+
verdict: Verdict;
|
|
10
|
+
source?: string;
|
|
11
|
+
};
|
|
12
|
+
export type Ruleset = {
|
|
13
|
+
ruleset: string;
|
|
14
|
+
roles?: Record<string, string[]>;
|
|
15
|
+
rules: Rule[];
|
|
16
|
+
};
|
|
17
|
+
export declare function roleOf(rulesets: Ruleset[], actor: string): string | null;
|
|
18
|
+
export type Judgement = {
|
|
19
|
+
verdict: Verdict | "unknown";
|
|
20
|
+
case: Case;
|
|
21
|
+
rule: (Rule & {
|
|
22
|
+
ruleset: string;
|
|
23
|
+
}) | null;
|
|
24
|
+
also: (Rule & {
|
|
25
|
+
ruleset: string;
|
|
26
|
+
})[];
|
|
27
|
+
};
|
|
28
|
+
export declare function globMatches(pattern: string, value: string): boolean;
|
|
29
|
+
export declare function matches(conditions: Conditions, subject: Case): boolean;
|
|
30
|
+
export declare function applies(rule: Rule, subject: Case): boolean;
|
|
31
|
+
export declare function judgeCase(rulesets: Ruleset[], subject: Case): Judgement;
|
|
32
|
+
export type Vocabulary = Map<string, Map<string, string>>;
|
|
33
|
+
export declare function vocabulary(rulesets: Ruleset[]): Vocabulary;
|
|
34
|
+
export declare function categorize(text: string, rulesets: Ruleset[], extra?: Case): Case;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// Rulesets of the almanac (glossary: almanac): rules written for people (statement) and
|
|
2
|
+
// matched by code (when / unless), so a described case can be judged against them.
|
|
3
|
+
// judgeCase(rulesets, { role: "agent", action: "push", target: "master" }).verdict → "ask"
|
|
4
|
+
export function roleOf(rulesets, actor) {
|
|
5
|
+
for (const { roles = {} } of rulesets) {
|
|
6
|
+
for (const [role, names] of Object.entries(roles)) {
|
|
7
|
+
if (names.some((name) => globMatches(name, actor))) {
|
|
8
|
+
return role;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const words = (value) => value === undefined ? [] : Array.isArray(value) ? value : [value];
|
|
15
|
+
const literal = (text) => text.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
|
|
16
|
+
export function globMatches(pattern, value) {
|
|
17
|
+
const regex = new RegExp(`^${pattern.split("*").map(literal).join(".*")}$`, "i");
|
|
18
|
+
return regex.test(value);
|
|
19
|
+
}
|
|
20
|
+
// every field of the conditions matches one value of the case's same field
|
|
21
|
+
export function matches(conditions, subject) {
|
|
22
|
+
return Object.entries(conditions).every(([field, patterns]) => {
|
|
23
|
+
const values = words(subject[field]);
|
|
24
|
+
return words(patterns).some((pattern) => values.some((value) => globMatches(pattern, value)));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export function applies(rule, subject) {
|
|
28
|
+
return matches(rule.when, subject) && !(rule.unless && matches(rule.unless, subject));
|
|
29
|
+
}
|
|
30
|
+
// the first rule that applies decides; no rule: unknown (ask)
|
|
31
|
+
export function judgeCase(rulesets, subject) {
|
|
32
|
+
const applying = rulesets.flatMap(({ ruleset, rules }) => rules.filter((rule) => applies(rule, subject)).map((rule) => ({ ...rule, ruleset })));
|
|
33
|
+
const [rule = null, ...also] = applying;
|
|
34
|
+
return { verdict: rule?.verdict ?? "unknown", case: subject, rule, also };
|
|
35
|
+
}
|
|
36
|
+
export function vocabulary(rulesets) {
|
|
37
|
+
const known = new Map();
|
|
38
|
+
for (const { rules } of rulesets) {
|
|
39
|
+
for (const rule of rules) {
|
|
40
|
+
for (const conditions of [rule.when, rule.unless ?? {}]) {
|
|
41
|
+
for (const [field, patterns] of Object.entries(conditions)) {
|
|
42
|
+
const entries = known.get(field) ?? new Map();
|
|
43
|
+
for (const pattern of words(patterns)) {
|
|
44
|
+
entries.set(pattern.toLowerCase(), pattern);
|
|
45
|
+
}
|
|
46
|
+
known.set(field, entries);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return known;
|
|
52
|
+
}
|
|
53
|
+
// a word of the text stands for a known one: the same, an inflection of it (push → pushes,
|
|
54
|
+
// pushed, pushing; publish → publishing), or a value its glob pattern covers (dev/* → dev/Cleo)
|
|
55
|
+
function standsFor(token, known) {
|
|
56
|
+
const word = token.toLowerCase();
|
|
57
|
+
if (known.includes("*")) {
|
|
58
|
+
return known.replace(/\*/g, "").length > 0 && globMatches(known, token);
|
|
59
|
+
}
|
|
60
|
+
if (word === known) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
const stem = known.replace(/e$/, "");
|
|
64
|
+
return (stem.length >= 3 && /^(s|es|ed|d|ing)$/.test(word.slice(stem.length)) && word.startsWith(stem));
|
|
65
|
+
}
|
|
66
|
+
export function categorize(text, rulesets, extra = {}) {
|
|
67
|
+
const tokens = text.match(/[\p{L}\p{N}_.\-/~=]+/gu) ?? [];
|
|
68
|
+
const subject = {};
|
|
69
|
+
for (const [field, known] of vocabulary(rulesets)) {
|
|
70
|
+
const found = new Set();
|
|
71
|
+
for (const token of tokens) {
|
|
72
|
+
for (const [lower, pattern] of known) {
|
|
73
|
+
if (standsFor(token, lower)) {
|
|
74
|
+
found.add(pattern.includes("*") ? token : pattern);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (found.size) {
|
|
79
|
+
subject[field] = found.size === 1 ? ([...found][0] ?? "") : [...found];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// a first word with a capital, not known as anything else, is the actor ("Cleo pushes…")
|
|
83
|
+
const [first] = tokens;
|
|
84
|
+
if (!subject.actor &&
|
|
85
|
+
first &&
|
|
86
|
+
/^\p{Lu}/u.test(first) &&
|
|
87
|
+
!Object.values(subject).flat().includes(first)) {
|
|
88
|
+
subject.actor = first;
|
|
89
|
+
}
|
|
90
|
+
const actor = words(extra.actor ?? subject.actor)[0];
|
|
91
|
+
const role = actor ? roleOf(rulesets, actor) : null;
|
|
92
|
+
if (role && !subject.role) {
|
|
93
|
+
subject.role = role;
|
|
94
|
+
}
|
|
95
|
+
return { ...subject, ...extra };
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=ruling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruling.js","sourceRoot":"","sources":["../../src/core/ruling.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,8 +7,10 @@ export * from "./core/element.ts";
|
|
|
7
7
|
export * from "./core/emitter.ts";
|
|
8
8
|
export * from "./core/json-file.ts";
|
|
9
9
|
export * from "./core/omnis.ts";
|
|
10
|
+
export * from "./core/patterning.ts";
|
|
10
11
|
export * as paths from "./core/paths.ts";
|
|
11
12
|
export * from "./core/procedure.ts";
|
|
13
|
+
export * from "./core/ruling.ts";
|
|
12
14
|
export * from "./core/serialize.ts";
|
|
13
15
|
export * from "./core/tool.ts";
|
|
14
16
|
export * from "./core/version.ts";
|
package/dist/index.js
CHANGED
|
@@ -14,8 +14,10 @@ export * from "./core/element.js";
|
|
|
14
14
|
export * from "./core/emitter.js";
|
|
15
15
|
export * from "./core/json-file.js";
|
|
16
16
|
export * from "./core/omnis.js";
|
|
17
|
+
export * from "./core/patterning.js";
|
|
17
18
|
export * as paths from "./core/paths.js";
|
|
18
19
|
export * from "./core/procedure.js";
|
|
20
|
+
export * from "./core/ruling.js";
|
|
19
21
|
export * from "./core/serialize.js";
|
|
20
22
|
export * from "./core/tool.js";
|
|
21
23
|
export * from "./core/version.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oEAAoE;AACpE,yCAAyC;AACzC,gEAAgE;AAChE,oFAAoF;AACpF,oFAAoF;AAEpF,iFAAiF;AACjF,OAAO,EAAE,GAAG,EAAsC,MAAM,UAAU,CAAC;AAInE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,cAAc,oBAAoB,CAAC;AAEnC,8CAA8C;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAElC,uEAAuE;AACvE,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oEAAoE;AACpE,yCAAyC;AACzC,gEAAgE;AAChE,oFAAoF;AACpF,oFAAoF;AAEpF,iFAAiF;AACjF,OAAO,EAAE,GAAG,EAAsC,MAAM,UAAU,CAAC;AAInE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,cAAc,oBAAoB,CAAC;AAEnC,8CAA8C;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAElC,uEAAuE;AACvE,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Host } from "../../core/host.ts";
|
|
2
|
+
import type { Chain } from "../../core/patterning.ts";
|
|
3
|
+
import type { Ruleset } from "../../core/ruling.ts";
|
|
4
|
+
export type Almanac = {
|
|
5
|
+
places: string[];
|
|
6
|
+
rulesets: Ruleset[];
|
|
7
|
+
chains: Chain[];
|
|
8
|
+
};
|
|
9
|
+
export declare const PROJECT_ALMANAC = "docs/almanac";
|
|
10
|
+
export declare const PACKAGE_ALMANAC: string;
|
|
11
|
+
export declare function readAlmanac(host: Host, places: string[]): Almanac;
|
|
12
|
+
export declare function almanacOf(host: Host, projectPath: string): Almanac;
|