@wrenautomation/knowledge 0.59.1 → 0.60.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,7 +11,7 @@ cd my-notes && git init && knowledge init --owner ana
11
11
 
12
12
  ## Records
13
13
 
14
- One file each. The folder says the type: `sources/`, `findings/`, `verdicts/`, `rules/<topic>/`, `guides/`.
14
+ One file each. The folder says the type: `sources/`, `findings/`, `patterns/`, `verdicts/`, `rules/<topic>/`, `guides/`.
15
15
 
16
16
  ```md
17
17
  ---
@@ -36,12 +36,15 @@ Put the name in line one.
36
36
  |---|---|
37
37
  | source | `kind` (site, page, video, reel, post, person, tool, doc, paper, feed, repo, list, other), `url`, `handle`, `priority` 1-9, `media` {sha256, type} |
38
38
  | finding | `source` (a source's id), `quote` (the source's words; none for a paraphrase), `page`, `at` (0:16, p. 4), `run` |
39
+ | pattern | `sites` (distinct sites across its findings), `run`. What several findings say together; `cites` the findings |
39
40
  | verdict | `from` (vireo, orrery, owner, other), `ref` (hero:3), `score` |
40
41
  | rule | `topic`, `order` |
41
42
  | guide | `topic`, `description`. A procedure (an SOP) as one doc; its body cites `[2]` or `[2 0:16]`, the 2nd id in `cites` |
42
43
 
43
44
  Every record: `id`, `title`, `status` (live, retired), `version`, `by`, `why`, `cites`, `tags`, `created`,
44
- `updated`. Other keys are kept. A file whose name starts with `_` is not a record (a site's folder page).
45
+ `updated`. Other keys are kept. A source's id comes from `sourceId(url)`: the platform's own id where there is one
46
+ (`youtube-<v>`, `instagram-<code>`, `reddit-<post>`, `hn-<item>`, `x-<status>`, `arxiv-<id>`), else
47
+ `web-<host and path>`; `urlKey` says when two URLs are one page. A file whose name starts with `_` is not a record (a site's folder page).
45
48
 
46
49
  ## Writes
47
50
 
@@ -57,7 +60,7 @@ knowledge apply --by agent-7 --why "…" < changes.json # [{"op":"add|edit|re
57
60
  - One command = one commit. The whole tree is linted first; a fault in a record it touches refuses the
58
61
  change and writes nothing. A failed commit puts every file back.
59
62
  - The lint: unique ids, a file at the path its type and id call for, every cite in the repo, a finding's
60
- source is a source, a guide's `[n]` is in its cites, a rule cites its evidence (only the owner in `knowledge.json` may write one with
63
+ source is a source, a pattern cites findings (or patterns) only, a guide's `[n]` is in its cites, a rule cites its evidence (only the owner in `knowledge.json` may write one with
61
64
  none). A live record that cites a retired one is a warning.
62
65
  - `--push`, or `"push": true` in `knowledge.json`, pushes after the commit. A rejected push fetches, merges,
63
66
  lints the merge (two clean branches can still break a cite) and tries again; a bad merge is undone.
package/dist/index.d.ts CHANGED
@@ -5,4 +5,5 @@ export * from "./record-index.js";
5
5
  export * from "./records.js";
6
6
  export * from "./render.js";
7
7
  export * from "./repo.js";
8
+ export * from "./source-id.js";
8
9
  export * from "./write.js";
package/dist/index.js CHANGED
@@ -5,5 +5,6 @@ export * from "./record-index.js";
5
5
  export * from "./records.js";
6
6
  export * from "./render.js";
7
7
  export * from "./repo.js";
8
+ export * from "./source-id.js";
8
9
  export * from "./write.js";
9
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
package/dist/lint.js CHANGED
@@ -39,6 +39,15 @@ export function lint(tree, owner) {
39
39
  if (s && s.type !== "source")
40
40
  e("error", `source ${fm.source} is a ${s.type}, not a source`);
41
41
  }
42
+ if (fm.type === "pattern") {
43
+ if (!fm.cites.length)
44
+ e("error", "a pattern cites the findings it rests on");
45
+ for (const to of fm.cites) {
46
+ const t = byId.get(to)?.doc.fm;
47
+ if (t && t.type !== "finding" && t.type !== "pattern")
48
+ e("error", `cites ${to}, a ${t.type}: a pattern rests on findings`);
49
+ }
50
+ }
42
51
  if (fm.type === "guide")
43
52
  for (const m of l.doc.body.matchAll(CITE_NUMBER)) {
44
53
  const n = Number(m[1]);
package/dist/lint.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lint.js","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"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"}
package/dist/records.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- export declare const TYPES: readonly ["source", "finding", "verdict", "rule", "guide"];
2
+ export declare const TYPES: readonly ["source", "finding", "pattern", "verdict", "rule", "guide"];
3
3
  export type RecordType = (typeof TYPES)[number];
4
4
  export declare const DIRS: Record<RecordType, string>;
5
5
  export declare const Id: z.ZodString;
@@ -63,6 +63,24 @@ export declare const Finding: z.ZodObject<{
63
63
  created: z.ZodPreprocess<z.ZodString, unknown>;
64
64
  updated: z.ZodPreprocess<z.ZodString, unknown>;
65
65
  }, z.core.$loose>;
66
+ export declare const Pattern: z.ZodObject<{
67
+ type: z.ZodLiteral<"pattern">;
68
+ sites: z.ZodOptional<z.ZodNumber>;
69
+ run: z.ZodOptional<z.ZodString>;
70
+ id: z.ZodString;
71
+ title: z.ZodString;
72
+ status: z.ZodEnum<{
73
+ live: "live";
74
+ retired: "retired";
75
+ }>;
76
+ version: z.ZodNumber;
77
+ by: z.ZodString;
78
+ why: z.ZodString;
79
+ cites: z.ZodDefault<z.ZodArray<z.ZodString>>;
80
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
81
+ created: z.ZodPreprocess<z.ZodString, unknown>;
82
+ updated: z.ZodPreprocess<z.ZodString, unknown>;
83
+ }, z.core.$loose>;
66
84
  export declare const Verdict: z.ZodObject<{
67
85
  type: z.ZodLiteral<"verdict">;
68
86
  from: z.ZodEnum<{
@@ -180,6 +198,23 @@ export declare const Frontmatter: z.ZodDiscriminatedUnion<[z.ZodObject<{
180
198
  tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
181
199
  created: z.ZodPreprocess<z.ZodString, unknown>;
182
200
  updated: z.ZodPreprocess<z.ZodString, unknown>;
201
+ }, z.core.$loose>, z.ZodObject<{
202
+ type: z.ZodLiteral<"pattern">;
203
+ sites: z.ZodOptional<z.ZodNumber>;
204
+ run: z.ZodOptional<z.ZodString>;
205
+ id: z.ZodString;
206
+ title: z.ZodString;
207
+ status: z.ZodEnum<{
208
+ live: "live";
209
+ retired: "retired";
210
+ }>;
211
+ version: z.ZodNumber;
212
+ by: z.ZodString;
213
+ why: z.ZodString;
214
+ cites: z.ZodDefault<z.ZodArray<z.ZodString>>;
215
+ tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
216
+ created: z.ZodPreprocess<z.ZodString, unknown>;
217
+ updated: z.ZodPreprocess<z.ZodString, unknown>;
183
218
  }, z.core.$loose>, z.ZodObject<{
184
219
  type: z.ZodLiteral<"verdict">;
185
220
  from: z.ZodEnum<{
@@ -251,6 +286,10 @@ export declare function pathOf(fm: Pick<Frontmatter, "type" | "id"> & {
251
286
  export declare const CITE_NUMBER: RegExp;
252
287
  /** The ids a record leans on: its cites, and a finding's source. */
253
288
  export declare function edgesOf(fm: Frontmatter): string[];
289
+ /** A title as an id's head: lower case, dashes, at most `max` characters. */
290
+ export declare function slugOf(title: string, max?: number): string;
291
+ /** Slug + a tail: random for a new record, or the writer's own stable id (a ledger id) so a rerun lands on the same file. */
292
+ export declare function idOf(title: string, tail: string): string;
254
293
  export declare function newId(title: string): string;
255
294
  export type Parsed = {
256
295
  ok: true;
package/dist/records.js CHANGED
@@ -5,10 +5,11 @@
5
5
  import { randomBytes } from "node:crypto";
6
6
  import matter from "gray-matter";
7
7
  import { z } from "zod";
8
- export const TYPES = ["source", "finding", "verdict", "rule", "guide"];
8
+ export const TYPES = ["source", "finding", "pattern", "verdict", "rule", "guide"];
9
9
  export const DIRS = {
10
10
  source: "sources",
11
11
  finding: "findings",
12
+ pattern: "patterns",
12
13
  verdict: "verdicts",
13
14
  rule: "rules",
14
15
  guide: "guides",
@@ -69,6 +70,14 @@ export const Finding = z.looseObject({
69
70
  at: Text.optional(),
70
71
  run: z.string().optional(),
71
72
  });
73
+ // what several findings say together; cites = the findings (or patterns) it rests on
74
+ export const Pattern = z.looseObject({
75
+ ...base,
76
+ type: z.literal("pattern"),
77
+ // distinct sites across the cited findings, counted by the writer
78
+ sites: z.number().int().positive().optional(),
79
+ run: z.string().optional(),
80
+ });
72
81
  export const Verdict = z.looseObject({
73
82
  ...base,
74
83
  type: z.literal("verdict"),
@@ -92,7 +101,14 @@ export const Guide = z.looseObject({
92
101
  // one line: what the guide is for (a skill's description)
93
102
  description: z.string().optional(),
94
103
  });
95
- export const Frontmatter = z.discriminatedUnion("type", [Source, Finding, Verdict, Rule, Guide]);
104
+ export const Frontmatter = z.discriminatedUnion("type", [
105
+ Source,
106
+ Finding,
107
+ Pattern,
108
+ Verdict,
109
+ Rule,
110
+ Guide,
111
+ ]);
96
112
  /** Where a record lives in the repo. A rule sits under its topic. */
97
113
  export function pathOf(fm) {
98
114
  const dir = DIRS[fm.type];
@@ -104,18 +120,25 @@ export const CITE_NUMBER = /\[(\d+)((?: (?:\d{1,2}:\d{2}(?::\d{2})?(?:, \d{1,2}:
104
120
  export function edgesOf(fm) {
105
121
  return [...new Set(fm.type === "finding" ? [...fm.cites, fm.source] : fm.cites)];
106
122
  }
107
- const B32 = "0123456789abcdefghjkmnpqrstvwxyz";
108
- export function newId(title) {
109
- const slug = title
123
+ /** A title as an id's head: lower case, dashes, at most `max` characters. */
124
+ export function slugOf(title, max = 40) {
125
+ return title
110
126
  .toLowerCase()
111
127
  .normalize("NFKD")
112
128
  .replace(/[^a-z0-9]+/g, "-")
113
129
  .replace(/^-+|-+$/g, "")
114
- .slice(0, 40)
130
+ .slice(0, max)
115
131
  .replace(/-+$/, "");
116
- const tail = [...randomBytes(6)].map((b) => B32[b % 32]).join("");
132
+ }
133
+ /** Slug + a tail: random for a new record, or the writer's own stable id (a ledger id) so a rerun lands on the same file. */
134
+ export function idOf(title, tail) {
135
+ const slug = slugOf(title);
117
136
  return slug ? `${slug}-${tail}` : tail;
118
137
  }
138
+ const B32 = "0123456789abcdefghjkmnpqrstvwxyz";
139
+ export function newId(title) {
140
+ return idOf(title, [...randomBytes(6)].map((b) => B32[b % 32]).join(""));
141
+ }
119
142
  export function parse(text) {
120
143
  let m;
121
144
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"records.js","sourceRoot":"","sources":["../src/records.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAEhF,MAAM,CAAC,MAAM,IAAI,GAA+B;IAC9C,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,sGAAsG;AACtG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAChB,MAAM,EAAE;KACR,KAAK,CAAC,oCAAoC,EAAE,4BAA4B,CAAC,CAAC;AAC7E,wFAAwF;AACxF,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAChD,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CACrE,CAAC;AACF,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAEtF,MAAM,IAAI,GAAG;IACX,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;IACN,KAAK;IACL,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;CACC,CAAC;AAEX,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC;IAClC,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;IAC1B,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,6CAA6C;IAC7C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnD,8CAA8C;IAC9C,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7F,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC;IACnC,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,EAAE;IACV,mEAAmE;IACnE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACxB,sDAAsD;IACtD,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE;IACnB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC;IACnC,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,mEAAmE;IACnE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC;IAChC,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;IACxE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,CAAC;AAChF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC;IACjC,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACxB,KAAK,EAAE,KAAK;IACZ,0DAA0D;IAC1D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAQjG,qEAAqE;AACrE,MAAM,UAAU,MAAM,CAAC,EAA0D;IAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;AAC9F,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,MAAM,WAAW,GACtB,uFAAuF,CAAC;AAE1F,oEAAoE;AACpE,MAAM,UAAU,OAAO,CAAC,EAAe;IACrC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,GAAG,GAAG,kCAAkC,CAAC;AAC/C,MAAM,UAAU,KAAK,CAAC,KAAa;IACjC,MAAM,IAAI,GAAG,KAAK;SACf,WAAW,EAAE;SACb,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC;AAID,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,IAAI,CAAqC,CAAC;IAC1C,IAAI,CAAC;QACH,gGAAgG;QAChG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAiB,CAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACrF,CAAC;IACD,MAAM,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,CAAC,OAAO;QACZ,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM;iBAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,aAAa,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;iBAChE,IAAI,CAAC,IAAI,CAAC;SACd,CAAC;IACJ,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;IAClB,EAAE,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,EAAE,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;AAC5F,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACxF,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAEpC,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,MAAM,EAAE,GAAG,GAAG,CAAC,EAA6B,CAAC;IAC7C,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE;QACxB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;YAAE,OAAO;QACpE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SACrD,IAAI,EAAE;QACP,GAAG,CAAC,CAAC,CAAC,CAAC;IACT,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../src/records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Lower-case host without www., m. and the like. */
2
+ export declare const hostKey: (u: URL) => string;
3
+ /** The id a source at this URL gets. Not a URL: `web-` and its slug. */
4
+ export declare function sourceId(url: string): string;
5
+ /** A URL as two writers would agree on it: no hash, no trailing slash, host as `hostKey`. */
6
+ export declare function urlKey(url: string): string;
@@ -0,0 +1,68 @@
1
+ /**
2
+ * A source's natural id from its URL: the platform's own id where it has one (`youtube-<v>`,
3
+ * `instagram-<code>`), else `web-<host and path>`. One function for every writer, so one URL is one
4
+ * source record whoever reads it first.
5
+ */
6
+ import { slugOf } from "./records.js";
7
+ const HOST_PREFIX = /^(www|m|mobile|old|new|music)\./;
8
+ /** Lower-case host without www., m. and the like. */
9
+ export const hostKey = (u) => u.hostname.toLowerCase().replace(HOST_PREFIX, "");
10
+ function platformId(u) {
11
+ const host = hostKey(u);
12
+ const path = u.pathname;
13
+ const at = (re) => path.match(re)?.[1] ?? null;
14
+ const tag = (prefix, id) => (id ? `${prefix}-${id}` : null);
15
+ switch (host) {
16
+ case "youtube.com":
17
+ return tag("youtube", u.searchParams.get("v")?.match(/^[A-Za-z0-9_-]{11}$/)?.[0] ??
18
+ at(/^\/(?:shorts|live|embed)\/([A-Za-z0-9_-]{11})/));
19
+ case "youtu.be":
20
+ return tag("youtube", at(/^\/([A-Za-z0-9_-]{11})/));
21
+ case "instagram.com":
22
+ return tag("instagram", at(/\/(?:reels?|p|tv)\/([A-Za-z0-9_-]+)/));
23
+ case "tiktok.com":
24
+ return tag("tiktok", at(/\/(?:video|photo)\/(\d+)/));
25
+ case "x.com":
26
+ case "twitter.com":
27
+ return tag("x", at(/\/status(?:es)?\/(\d+)/));
28
+ case "reddit.com":
29
+ return tag("reddit", at(/\/comments\/([a-z0-9]+)/i)?.toLowerCase() ?? null);
30
+ case "news.ycombinator.com":
31
+ return tag("hn", u.searchParams.get("id")?.match(/^\d+$/)?.[0] ?? null);
32
+ case "linkedin.com":
33
+ return tag("linkedin", `${path}${u.search}`.match(/(?:activity|ugcPost|share)[:-](\d{15,})/)?.[1] ?? null);
34
+ case "arxiv.org":
35
+ return tag("arxiv", at(/^\/(?:abs|pdf|html)\/(\d{4}\.\d{4,5})/));
36
+ case "github.com": {
37
+ const m = path.match(/^\/([A-Za-z0-9-]+)\/([A-Za-z0-9._-]+)/);
38
+ return m ? `github-${slugOf(`${m[1]}-${m[2]?.replace(/\.git$/, "")}`, 100)}` : null;
39
+ }
40
+ default:
41
+ return null;
42
+ }
43
+ }
44
+ /** The id a source at this URL gets. Not a URL: `web-` and its slug. */
45
+ export function sourceId(url) {
46
+ let u;
47
+ try {
48
+ u = new URL(url);
49
+ }
50
+ catch {
51
+ return `web-${slugOf(url, 80) || "page"}`;
52
+ }
53
+ return platformId(u) ?? `web-${slugOf(`${hostKey(u)}${u.pathname}`, 80) || "page"}`;
54
+ }
55
+ /** A URL as two writers would agree on it: no hash, no trailing slash, host as `hostKey`. */
56
+ export function urlKey(url) {
57
+ try {
58
+ const u = new URL(url);
59
+ const id = platformId(u);
60
+ if (id)
61
+ return id;
62
+ return `${hostKey(u)}${u.pathname.replace(/\/+$/, "")}${u.search}`;
63
+ }
64
+ catch {
65
+ return url;
66
+ }
67
+ }
68
+ //# sourceMappingURL=source-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-id.js","sourceRoot":"","sources":["../src/source-id.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wrenautomation/knowledge",
3
- "version": "0.59.1",
3
+ "version": "0.60.1",
4
4
  "description": "Knowledge as files: sources, findings, verdicts and rules as markdown records in a git repo, each linked to its evidence. One commit is one transaction; a lint guards every write; a Postgres (or PGlite) index built from the commits answers queries, backlinks and stale marks.",
5
5
  "repository": {
6
6
  "type": "git",