@theglitchking/hit-em-with-the-docs 2.7.0 → 2.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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +40 -1
- package/dist/action/core/enforce/guard.d.ts +54 -0
- package/dist/action/core/enforce/guard.d.ts.map +1 -0
- package/dist/action/generators/regenerate.d.ts +14 -3
- package/dist/action/generators/regenerate.d.ts.map +1 -1
- package/dist/action/index.d.ts +1 -0
- package/dist/action/index.d.ts.map +1 -1
- package/dist/action/index.js +1 -1
- package/dist/action/utils/config.d.ts +58 -11
- package/dist/action/utils/config.d.ts.map +1 -1
- package/dist/action/utils/glob.d.ts +15 -4
- package/dist/action/utils/glob.d.ts.map +1 -1
- package/dist/cli/index.js +45 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/core/enforce/guard.d.ts +54 -0
- package/dist/core/enforce/guard.d.ts.map +1 -0
- package/dist/core/enforce/guard.js +201 -0
- package/dist/core/enforce/guard.js.map +1 -0
- package/dist/generators/regenerate.d.ts +14 -3
- package/dist/generators/regenerate.d.ts.map +1 -1
- package/dist/generators/regenerate.js +99 -16
- package/dist/generators/regenerate.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/config.d.ts +47 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +13 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/glob.d.ts +15 -4
- package/dist/utils/glob.d.ts.map +1 -1
- package/dist/utils/glob.js +16 -4
- package/dist/utils/glob.js.map +1 -1
- package/hooks/hooks.json +16 -1
- package/hooks/pre-tool-use.js +98 -0
- package/hooks/session-brief.js +51 -0
- package/package.json +2 -1
- package/scripts/link-skills.js +5 -4
- package/skills/documentation-lifecycle/SKILL.md +130 -0
- package/templates/claude/CLAUDE.md +0 -208
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle enforcement — the decision function behind the PreToolUse hook.
|
|
3
|
+
*
|
|
4
|
+
* hewtd's lifecycle policy has always been enforced at the CLI boundary (the
|
|
5
|
+
* archive link guard, `auto: false`, the frontmatter schema). None of that
|
|
6
|
+
* binds an *agent*, which will happily `rm` a doc, hand-edit a generated
|
|
7
|
+
* INDEX.md, or invent its own `docs/` folder. This is the part the model
|
|
8
|
+
* cannot reason its way past: the harness runs it, and a `deny` is final.
|
|
9
|
+
*
|
|
10
|
+
* Two rules deny, because they destroy work or corrupt a generated artifact.
|
|
11
|
+
* Everything else at most warns. Anything unrecognized is allowed — this runs
|
|
12
|
+
* in every session the plugin is installed in, including repos that have
|
|
13
|
+
* nothing to do with hewtd, so the cost of a false positive is far higher
|
|
14
|
+
* than the cost of a miss.
|
|
15
|
+
*/
|
|
16
|
+
import { basename } from 'path';
|
|
17
|
+
/** Files hewtd generates and owns. Hand-editing them is always wrong. */
|
|
18
|
+
const GENERATED_FILES = new Set(['INDEX.md', 'REGISTRY.md']);
|
|
19
|
+
export const DEFAULT_ENFORCEMENT = {
|
|
20
|
+
blockIndexEdits: true,
|
|
21
|
+
blockDocDeletion: true,
|
|
22
|
+
};
|
|
23
|
+
/** Posix-normalized, leading-`./`-stripped path for matching. */
|
|
24
|
+
function normalize(p) {
|
|
25
|
+
return p.replace(/\\/g, '/').replace(/^\.\//, '');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Is this path inside an `archive/` folder, at any depth?
|
|
29
|
+
*
|
|
30
|
+
* Archived docs are **referenceable but never concrete** — history you may cite,
|
|
31
|
+
* never evidence of what is true now. Nothing under an `archive/` folder is
|
|
32
|
+
* indexed, audited, link-checked, or validated.
|
|
33
|
+
*/
|
|
34
|
+
export function isArchived(path) {
|
|
35
|
+
return normalize(path)
|
|
36
|
+
.split('/')
|
|
37
|
+
.some((segment) => segment === 'archive');
|
|
38
|
+
}
|
|
39
|
+
/** Is this path inside the documentation tree? */
|
|
40
|
+
function inDocsTree(path, docsDir) {
|
|
41
|
+
const p = normalize(path);
|
|
42
|
+
const d = normalize(docsDir);
|
|
43
|
+
return p === d || p.includes(`/${d}/`) || p.startsWith(`${d}/`);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Shell commands that destroy a file. `mv` is deliberately absent: moving a
|
|
47
|
+
* doc is how `archive` itself works (via `git mv`), and a hand-rolled move is
|
|
48
|
+
* a warn, not a denial — it loses the frontmatter stamping, but loses nothing.
|
|
49
|
+
*/
|
|
50
|
+
const DESTRUCTIVE_RE = /(^|[\s;&|(])(rm|unlink|shred)\s|(^|[\s;&|(])git\s+rm\s/;
|
|
51
|
+
/** Markdown paths a shell command names. */
|
|
52
|
+
function markdownTargets(command, docsDir) {
|
|
53
|
+
const d = normalize(docsDir);
|
|
54
|
+
const re = new RegExp(`[^\\s'"\`;&|]*${d}/[^\\s'"\`;&|]*\\.md`, 'g');
|
|
55
|
+
return command.match(re) ?? [];
|
|
56
|
+
}
|
|
57
|
+
/** Does this text set `status: deprecated` in frontmatter? */
|
|
58
|
+
function setsDeprecated(text) {
|
|
59
|
+
return /^\s*status:\s*['"]?deprecated['"]?\s*$/m.test(text);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Decide what to do about one tool call. Pure — all I/O lives in the hook.
|
|
63
|
+
*/
|
|
64
|
+
export function evaluate(input, policy = DEFAULT_ENFORCEMENT) {
|
|
65
|
+
const { toolName, filePath, command, text, docsDir } = input;
|
|
66
|
+
// ---- Write / Edit -------------------------------------------------------
|
|
67
|
+
if ((toolName === 'Write' || toolName === 'Edit') && filePath) {
|
|
68
|
+
const inTree = inDocsTree(filePath, docsDir);
|
|
69
|
+
// DENY: a generated index is not a document. Editing it by hand is either
|
|
70
|
+
// pointless (the next `hewtd index` overwrites it) or actively harmful
|
|
71
|
+
// (it is how people ended up hand-curating rows the indexer then deleted
|
|
72
|
+
// — see issue #12).
|
|
73
|
+
if (policy.blockIndexEdits && inTree && GENERATED_FILES.has(basename(filePath))) {
|
|
74
|
+
return {
|
|
75
|
+
action: 'deny',
|
|
76
|
+
reason: `${basename(filePath)} is a generated artifact, rebuilt from the documents ` +
|
|
77
|
+
`on disk. Hand-edits are overwritten by the next \`hewtd index\` or ` +
|
|
78
|
+
`\`hewtd maintain\`. To change what it lists, change the documents — then ` +
|
|
79
|
+
`run \`hewtd index\`.`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// WARN: a doc outside the tree is invisible to every hewtd scan. Scoped to
|
|
83
|
+
// markdown that is plausibly *documentation* — a rival `docs/` folder, or a
|
|
84
|
+
// loose doc at the repo root. Warning on every .md anywhere (a fixture, a
|
|
85
|
+
// subpackage README, a website's own docs) would be noise, and a noisy
|
|
86
|
+
// guard is one people switch off.
|
|
87
|
+
if (!inTree && looksLikeStrayDoc(filePath)) {
|
|
88
|
+
return {
|
|
89
|
+
action: 'warn',
|
|
90
|
+
context: `This project manages its documentation with hit-em-with-the-docs, under ` +
|
|
91
|
+
`\`${docsDir}/\`. A markdown file outside that tree is not indexed, ` +
|
|
92
|
+
`link-checked, or metadata-validated. \`hewtd integrate <file>\` classifies ` +
|
|
93
|
+
`a doc into a domain and registers it.`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// WARN: archived content is historical. Editing it is not destructive —
|
|
97
|
+
// hence a warn, not a denial — but it is almost always a mistake: the edit
|
|
98
|
+
// lands in a subtree that no scan reads and no index lists, so it changes
|
|
99
|
+
// nothing anyone will see.
|
|
100
|
+
if (inTree && isArchived(filePath)) {
|
|
101
|
+
return {
|
|
102
|
+
action: 'warn',
|
|
103
|
+
context: `This file is under an \`archive/\` folder. Archived documentation is ` +
|
|
104
|
+
`historical: it is excluded from every hewtd scan — not indexed, not ` +
|
|
105
|
+
`audited, not link-checked, not validated — and describes what the docs ` +
|
|
106
|
+
`used to say, not what is true now. It can be referenced, but it is never ` +
|
|
107
|
+
`evidence of current behavior. \`hewtd unarchive <file>\` restores it to ` +
|
|
108
|
+
`its domain as an active document.`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// WARN: `status: deprecated` flags intent but leaves the doc live and
|
|
112
|
+
// indexed. Archiving is the separate step that actually retires it.
|
|
113
|
+
if (inTree && text && setsDeprecated(text)) {
|
|
114
|
+
return {
|
|
115
|
+
action: 'warn',
|
|
116
|
+
context: `\`status: deprecated\` marks intent but leaves the document in its domain ` +
|
|
117
|
+
`folder, still indexed and still scanned. \`hewtd archive <file>\` retires ` +
|
|
118
|
+
`it: the move is reversible (\`archived_from\` records the origin) and ` +
|
|
119
|
+
`link-safe (it refuses if active docs still link to it).`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return { action: 'allow' };
|
|
123
|
+
}
|
|
124
|
+
// ---- Bash ---------------------------------------------------------------
|
|
125
|
+
if (toolName === 'Bash' && command) {
|
|
126
|
+
const targets = markdownTargets(command, docsDir);
|
|
127
|
+
if (targets.length === 0)
|
|
128
|
+
return { action: 'allow' };
|
|
129
|
+
// DENY: deleting a doc is the one truly irreversible act, and hewtd has a
|
|
130
|
+
// purpose-built, reversible, link-safe alternative. This is the whole
|
|
131
|
+
// reason the plugin never calls rm/unlink anywhere in its own source.
|
|
132
|
+
if (policy.blockDocDeletion && DESTRUCTIVE_RE.test(command)) {
|
|
133
|
+
return {
|
|
134
|
+
action: 'deny',
|
|
135
|
+
reason: `Deleting documentation is destructive and hewtd never does it. ` +
|
|
136
|
+
`\`hewtd archive ${targets[0]}\` retires a doc instead: it moves the file ` +
|
|
137
|
+
`under \`archive/\` (preserving git history), stamps \`archived_from\` so ` +
|
|
138
|
+
`\`hewtd unarchive\` can restore it exactly, and refuses if active docs ` +
|
|
139
|
+
`still link to it. Use \`--force\` there to override the link guard.`,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// WARN: a hand-rolled move into archive/ skips the frontmatter stamping,
|
|
143
|
+
// so `unarchive` has no `archived_from` to restore from.
|
|
144
|
+
if (/(^|[\s;&|(])(mv|git\s+mv)\s/.test(command) && /archive\//.test(command)) {
|
|
145
|
+
return {
|
|
146
|
+
action: 'warn',
|
|
147
|
+
context: `Moving a doc into \`archive/\` by hand skips the lifecycle stamping. ` +
|
|
148
|
+
`\`hewtd archive <file>\` records \`archived_on\`, \`archived_from\`, and ` +
|
|
149
|
+
`\`archived_reason\`, which is what makes \`hewtd unarchive\` lossless; a ` +
|
|
150
|
+
`plain move leaves nothing to restore from.`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return { action: 'allow' };
|
|
154
|
+
}
|
|
155
|
+
return { action: 'allow' };
|
|
156
|
+
}
|
|
157
|
+
/** A repo's own top-level markdown — never documentation-tree content. */
|
|
158
|
+
const PROJECT_FILES = new Set([
|
|
159
|
+
'README.MD',
|
|
160
|
+
'CHANGELOG.MD',
|
|
161
|
+
'CONTRIBUTING.MD',
|
|
162
|
+
'LICENSE.MD',
|
|
163
|
+
'CLAUDE.MD',
|
|
164
|
+
'AGENTS.MD',
|
|
165
|
+
'SECURITY.MD',
|
|
166
|
+
'CODE_OF_CONDUCT.MD',
|
|
167
|
+
]);
|
|
168
|
+
/** Folder names that mean "somebody is starting a rival documentation tree". */
|
|
169
|
+
const RIVAL_DOC_DIRS = new Set(['docs', 'doc', 'documentation', 'wiki', 'guides']);
|
|
170
|
+
/**
|
|
171
|
+
* Is this markdown a *stray document* — something that ought to have gone
|
|
172
|
+
* through `integrate`?
|
|
173
|
+
*
|
|
174
|
+
* Deliberately narrow. It catches the real failure mode (an agent creating
|
|
175
|
+
* `docs/how-it-works.md` in a repo that already has a managed tree, or dropping
|
|
176
|
+
* a loose doc at the root) and stays silent on markdown that is obviously not
|
|
177
|
+
* documentation: source fixtures, subpackage READMEs, a website's own content,
|
|
178
|
+
* agent scaffolding. Anything it misses is merely un-nagged; anything it
|
|
179
|
+
* over-claims is a papercut on every unrelated file the user writes.
|
|
180
|
+
*/
|
|
181
|
+
function looksLikeStrayDoc(filePath) {
|
|
182
|
+
const p = normalize(filePath);
|
|
183
|
+
if (!p.endsWith('.md'))
|
|
184
|
+
return false;
|
|
185
|
+
const segments = p.split('/');
|
|
186
|
+
const name = basename(p).toUpperCase();
|
|
187
|
+
// Agent/tooling scaffolding and dependencies are never docs.
|
|
188
|
+
if (segments.some((s) => s === 'node_modules' || s === '.planning' || s === '.claude')) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
// A rival docs folder anywhere in the path.
|
|
192
|
+
if (segments.slice(0, -1).some((s) => RIVAL_DOC_DIRS.has(s.toLowerCase()))) {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
// A loose doc sitting at the repo root that isn't one of the standard
|
|
196
|
+
// project files.
|
|
197
|
+
if (segments.length === 1 && !PROJECT_FILES.has(name))
|
|
198
|
+
return true;
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../src/core/enforce/guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,12 @@ export interface RegenerateOptions {
|
|
|
9
9
|
*/
|
|
10
10
|
domains?: Domain[];
|
|
11
11
|
silent?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Compute everything, write nothing. `filesWritten` then lists the files
|
|
14
|
+
* that WOULD be written. Exists so users can preview the (large, one-time)
|
|
15
|
+
* diff the 2.7.1 recursive walk produces before committing to it.
|
|
16
|
+
*/
|
|
17
|
+
dryRun?: boolean;
|
|
12
18
|
}
|
|
13
19
|
export interface RegenerateResult {
|
|
14
20
|
/** Per-domain document counts — all domains, regardless of the filter. */
|
|
@@ -19,9 +25,14 @@ export interface RegenerateResult {
|
|
|
19
25
|
totalDocuments: number;
|
|
20
26
|
}
|
|
21
27
|
/**
|
|
22
|
-
* List the document files in a domain directory,
|
|
23
|
-
*
|
|
24
|
-
* the domain directory does not exist.
|
|
28
|
+
* List the document files in a domain directory, walking subfolders. Returns
|
|
29
|
+
* sorted, domain-relative POSIX paths (`backend/entity-schema-contract.md`).
|
|
30
|
+
* Empty when the domain directory does not exist.
|
|
31
|
+
*
|
|
32
|
+
* This is the shared spine for three consumers — the index generator, the
|
|
33
|
+
* `index-drift` audit rule, and the `domain remove` orphan count — so what it
|
|
34
|
+
* excludes, the whole system excludes: the generated INDEX/REGISTRY at any
|
|
35
|
+
* depth, `EXCLUDED_DIRS`, and the vault's generator-owned subtrees (issue #12).
|
|
25
36
|
*/
|
|
26
37
|
export declare function listDomainDocFiles(docsPath: string, domain: string): Promise<string[]>;
|
|
27
38
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regenerate.d.ts","sourceRoot":"","sources":["../../src/generators/regenerate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"regenerate.d.ts","sourceRoot":"","sources":["../../src/generators/regenerate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAiE3D,MAAM,WAAW,iBAAiB;IAChC,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,8DAA8D;IAC9D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBnB;AAwFD;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAuE3B"}
|
|
@@ -1,24 +1,82 @@
|
|
|
1
1
|
import { readdir, readFile, writeFile } from 'fs/promises';
|
|
2
|
-
import { join } from 'path';
|
|
2
|
+
import { basename, dirname, join, relative, resolve, sep } from 'path';
|
|
3
3
|
import { getAllDomains } from '../core/domains/registry.js';
|
|
4
4
|
import { parseFrontmatter } from '../utils/frontmatter.js';
|
|
5
5
|
import { formatDate } from '../core/metadata/generator.js';
|
|
6
6
|
import { pathExists } from '../utils/glob.js';
|
|
7
|
+
import { loadPluginConfigSync, resolveVaultRoot } from '../utils/config.js';
|
|
7
8
|
import { logger } from '../utils/logger.js';
|
|
8
9
|
import { generateRootIndex, generateDomainIndexContent, } from './index-generator.js';
|
|
9
10
|
import { generateRootRegistry, generateDomainRegistryContent, } from './registry-generator.js';
|
|
10
11
|
/** Generated files that are never themselves treated as documents. */
|
|
11
12
|
const SYSTEM_FILES = new Set(['INDEX.md', 'REGISTRY.md']);
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* Directory names that are never part of the active corpus, at any depth
|
|
15
|
+
* inside a domain. Before the walk went recursive these were excluded by
|
|
16
|
+
* accident — a flat readdir physically could not reach them — so this set is
|
|
17
|
+
* what keeps a hand-made `features/archive/` or a vendored doc tree from being
|
|
18
|
+
* published into a live index.
|
|
19
|
+
*/
|
|
20
|
+
const EXCLUDED_DIRS = new Set([
|
|
21
|
+
'archive',
|
|
22
|
+
'drafts',
|
|
23
|
+
'reports',
|
|
24
|
+
'_templates',
|
|
25
|
+
'node_modules',
|
|
26
|
+
'.documentation',
|
|
27
|
+
]);
|
|
28
|
+
/**
|
|
29
|
+
* Vault subtrees that have their own generators (`facts-index`,
|
|
30
|
+
* `incidents-index`, `symptoms-index`) and their own lifecycle tiers
|
|
31
|
+
* (`fact`, `incident-narrative`, `incident-facts`).
|
|
32
|
+
*
|
|
33
|
+
* Only these are withheld from the generic domain index — not the whole vault
|
|
34
|
+
* root. A project that registers the vault root as a domain (as
|
|
35
|
+
* `knowledge-base` commonly is) still gets its top-level docs indexed as it
|
|
36
|
+
* always has; what it must never get is every fact and incident narrative
|
|
37
|
+
* swept into a generic INDEX/REGISTRY, indexed a second time and rendered as
|
|
38
|
+
* if they were ordinary guides.
|
|
39
|
+
*/
|
|
40
|
+
const VAULT_GENERATED_SUBDIRS = ['facts', 'incidents', 'symptoms'];
|
|
41
|
+
/**
|
|
42
|
+
* Prefixes, relative to the docs root, that the vault's own generators own —
|
|
43
|
+
* e.g. `['knowledge-base/facts', 'knowledge-base/incidents', ...]`. Empty when
|
|
44
|
+
* the configured vault lives outside the docs tree entirely.
|
|
45
|
+
*/
|
|
46
|
+
function vaultOwnedPrefixes(docsPath) {
|
|
47
|
+
const docsAbs = resolve(docsPath);
|
|
48
|
+
const projectRoot = dirname(docsAbs);
|
|
49
|
+
const vaultAbs = resolveVaultRoot(projectRoot, loadPluginConfigSync(projectRoot));
|
|
50
|
+
const rel = relative(docsAbs, vaultAbs);
|
|
51
|
+
if (!rel || rel.startsWith('..'))
|
|
52
|
+
return [];
|
|
53
|
+
const vaultPath = rel.split(sep).join('/');
|
|
54
|
+
return VAULT_GENERATED_SUBDIRS.map((sub) => `${vaultPath}/${sub}`);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* List the document files in a domain directory, walking subfolders. Returns
|
|
58
|
+
* sorted, domain-relative POSIX paths (`backend/entity-schema-contract.md`).
|
|
59
|
+
* Empty when the domain directory does not exist.
|
|
60
|
+
*
|
|
61
|
+
* This is the shared spine for three consumers — the index generator, the
|
|
62
|
+
* `index-drift` audit rule, and the `domain remove` orphan count — so what it
|
|
63
|
+
* excludes, the whole system excludes: the generated INDEX/REGISTRY at any
|
|
64
|
+
* depth, `EXCLUDED_DIRS`, and the vault's generator-owned subtrees (issue #12).
|
|
16
65
|
*/
|
|
17
66
|
export async function listDomainDocFiles(docsPath, domain) {
|
|
67
|
+
const vaultPrefixes = vaultOwnedPrefixes(docsPath);
|
|
68
|
+
const inVault = (docRelPath) => {
|
|
69
|
+
const fromDocsRoot = `${domain}/${docRelPath}`;
|
|
70
|
+
return vaultPrefixes.some((prefix) => fromDocsRoot.startsWith(`${prefix}/`));
|
|
71
|
+
};
|
|
18
72
|
try {
|
|
19
|
-
const names = await readdir(join(docsPath, domain));
|
|
73
|
+
const names = await readdir(join(docsPath, domain), { recursive: true });
|
|
20
74
|
return names
|
|
21
|
-
.
|
|
75
|
+
.map((n) => n.split(sep).join('/'))
|
|
76
|
+
.filter((n) => n.endsWith('.md'))
|
|
77
|
+
.filter((n) => !SYSTEM_FILES.has(basename(n)))
|
|
78
|
+
.filter((n) => !n.split('/').some((seg) => EXCLUDED_DIRS.has(seg)))
|
|
79
|
+
.filter((n) => !inVault(n))
|
|
22
80
|
.sort();
|
|
23
81
|
}
|
|
24
82
|
catch {
|
|
@@ -39,9 +97,14 @@ function normalizeDate(value) {
|
|
|
39
97
|
function countWords(body) {
|
|
40
98
|
return body.split(/\s+/).filter(Boolean).length;
|
|
41
99
|
}
|
|
42
|
-
/**
|
|
100
|
+
/**
|
|
101
|
+
* Derive a human title from a file name when frontmatter has no title. Takes
|
|
102
|
+
* the basename: the input is a domain-relative subpath, and title-casing the
|
|
103
|
+
* whole thing would render `backend/entity-schema-contract.md` as
|
|
104
|
+
* "Backend/entity Schema Contract".
|
|
105
|
+
*/
|
|
43
106
|
function titleFromFileName(fileName) {
|
|
44
|
-
return fileName
|
|
107
|
+
return basename(fileName)
|
|
45
108
|
.replace(/\.md$/, '')
|
|
46
109
|
.replace(/[-_]/g, ' ')
|
|
47
110
|
.replace(/\b\w/g, (c) => c.toUpperCase());
|
|
@@ -62,7 +125,22 @@ async function buildDomainEntries(docsPath, domain, pathPrefix) {
|
|
|
62
125
|
catch {
|
|
63
126
|
continue;
|
|
64
127
|
}
|
|
65
|
-
|
|
128
|
+
// A doc with malformed YAML must not take down the whole run. Before the
|
|
129
|
+
// walk went recursive these files were simply never read; now that they
|
|
130
|
+
// are, one bad frontmatter block in one nested doc would otherwise abort
|
|
131
|
+
// `index`/`maintain` for the entire project with a gray-matter stack
|
|
132
|
+
// trace. Index it anyway — the document exists and should be findable —
|
|
133
|
+
// with filename-derived defaults, and say so.
|
|
134
|
+
let data = {};
|
|
135
|
+
let content = '';
|
|
136
|
+
try {
|
|
137
|
+
({ data, content } = parseFrontmatter(raw));
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
logger.warn(`Unparseable frontmatter in ${domain}/${fileName} — indexing it with ` +
|
|
141
|
+
`defaults. Fix the YAML to control how it appears: ` +
|
|
142
|
+
`${error instanceof Error ? error.message.split('\n')[0] : String(error)}`);
|
|
143
|
+
}
|
|
66
144
|
entries.push({
|
|
67
145
|
path: pathPrefix + fileName,
|
|
68
146
|
title: typeof data.title === 'string' && data.title.trim()
|
|
@@ -89,7 +167,7 @@ async function buildDomainEntries(docsPath, domain, pathPrefix) {
|
|
|
89
167
|
* (see https://github.com/TheGlitchKing/hit-em-with-the-docs/issues/7).
|
|
90
168
|
*/
|
|
91
169
|
export async function regenerateIndexes(options) {
|
|
92
|
-
const { docsPath, silent = false } = options;
|
|
170
|
+
const { docsPath, silent = false, dryRun = false } = options;
|
|
93
171
|
const allDomains = getAllDomains();
|
|
94
172
|
const targetDomains = options.domains ?? allDomains;
|
|
95
173
|
const result = {
|
|
@@ -117,21 +195,26 @@ export async function regenerateIndexes(options) {
|
|
|
117
195
|
continue;
|
|
118
196
|
const indexPath = join(domainDir, 'INDEX.md');
|
|
119
197
|
const registryPath = join(domainDir, 'REGISTRY.md');
|
|
120
|
-
|
|
121
|
-
|
|
198
|
+
if (!dryRun) {
|
|
199
|
+
await writeFile(indexPath, generateDomainIndexContent(domain, domainEntries), 'utf-8');
|
|
200
|
+
await writeFile(registryPath, generateDomainRegistryContent(domain, domainEntries), 'utf-8');
|
|
201
|
+
}
|
|
122
202
|
result.filesWritten.push(indexPath, registryPath);
|
|
123
203
|
}
|
|
124
204
|
// Root INDEX.md / REGISTRY.md — always refreshed.
|
|
125
205
|
if (await pathExists(docsPath)) {
|
|
126
206
|
const rootIndexPath = join(docsPath, 'INDEX.md');
|
|
127
207
|
const rootRegistryPath = join(docsPath, 'REGISTRY.md');
|
|
128
|
-
|
|
129
|
-
|
|
208
|
+
if (!dryRun) {
|
|
209
|
+
await writeFile(rootIndexPath, generateRootIndex(rootEntriesByDomain), 'utf-8');
|
|
210
|
+
await writeFile(rootRegistryPath, generateRootRegistry(), 'utf-8');
|
|
211
|
+
}
|
|
130
212
|
result.filesWritten.push(rootIndexPath, rootRegistryPath);
|
|
131
213
|
}
|
|
132
214
|
if (!silent) {
|
|
133
|
-
logger.success(
|
|
134
|
-
|
|
215
|
+
logger.success(`${dryRun ? 'Would regenerate' : 'Regenerated'} ${result.filesWritten.length} ` +
|
|
216
|
+
`index file(s) — ${result.totalDocuments} document(s) across ` +
|
|
217
|
+
`${allDomains.length} domains`);
|
|
135
218
|
}
|
|
136
219
|
return result;
|
|
137
220
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regenerate.js","sourceRoot":"","sources":["../../src/generators/regenerate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"regenerate.js","sourceRoot":"","sources":["../../src/generators/regenerate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ export * from './reports/link-report.js';
|
|
|
34
34
|
export * from './core/archive/manage.js';
|
|
35
35
|
export * from './core/archive/candidates.js';
|
|
36
36
|
export * from './core/archive/links.js';
|
|
37
|
+
export * from './core/enforce/guard.js';
|
|
37
38
|
export * from './core/metadata/errors.js';
|
|
38
39
|
export * from './core/knowledge-base/citers.js';
|
|
39
40
|
export * from './generators/facts-index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAGhD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAGhD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AAGzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AAGxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAGhD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAGhD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AAGzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AAGxC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -42,6 +42,8 @@ export * from './reports/link-report.js';
|
|
|
42
42
|
export * from './core/archive/manage.js';
|
|
43
43
|
export * from './core/archive/candidates.js';
|
|
44
44
|
export * from './core/archive/links.js';
|
|
45
|
+
// Lifecycle enforcement (2.8.0+)
|
|
46
|
+
export * from './core/enforce/guard.js';
|
|
45
47
|
// Knowledge-base primitives (2.3.0+)
|
|
46
48
|
export * from './core/metadata/errors.js';
|
|
47
49
|
export * from './core/knowledge-base/citers.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAqB;AACrB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAE7C,kBAAkB;AAClB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAE7C,YAAY;AACZ,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AAEpC,aAAa;AACb,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAE3C,kBAAkB;AAClB,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAEhD,mBAAmB;AACnB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAEhD,UAAU;AACV,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AAEzC,4BAA4B;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AAExC,qCAAqC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAqB;AACrB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAE7C,kBAAkB;AAClB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAE7C,YAAY;AACZ,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AAEpC,aAAa;AACb,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAE3C,kBAAkB;AAClB,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAEhD,mBAAmB;AACnB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAEhD,UAAU;AACV,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AAEzC,4BAA4B;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AAExC,iCAAiC;AACjC,cAAc,yBAAyB,CAAC;AAExC,qCAAqC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
package/dist/utils/config.d.ts
CHANGED
|
@@ -88,6 +88,22 @@ declare const archiveConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
88
88
|
require_orphaned?: boolean | undefined;
|
|
89
89
|
auto?: boolean | undefined;
|
|
90
90
|
}>>;
|
|
91
|
+
/**
|
|
92
|
+
* Lifecycle enforcement (2.8.0). Governs the PreToolUse guard, which is what
|
|
93
|
+
* makes the policy binding on an agent rather than merely documented. Both
|
|
94
|
+
* rules default ON — but they are opt-out, because a guard nobody can disable
|
|
95
|
+
* is a guard people uninstall the plugin to escape.
|
|
96
|
+
*/
|
|
97
|
+
declare const enforcementConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
98
|
+
block_index_edits: z.ZodDefault<z.ZodBoolean>;
|
|
99
|
+
block_doc_deletion: z.ZodDefault<z.ZodBoolean>;
|
|
100
|
+
}, "strip", z.ZodTypeAny, {
|
|
101
|
+
block_index_edits: boolean;
|
|
102
|
+
block_doc_deletion: boolean;
|
|
103
|
+
}, {
|
|
104
|
+
block_index_edits?: boolean | undefined;
|
|
105
|
+
block_doc_deletion?: boolean | undefined;
|
|
106
|
+
}>>;
|
|
91
107
|
declare const pluginConfigSchema: z.ZodObject<{
|
|
92
108
|
vault: z.ZodDefault<z.ZodObject<{
|
|
93
109
|
root: z.ZodDefault<z.ZodString>;
|
|
@@ -102,6 +118,16 @@ declare const pluginConfigSchema: z.ZodObject<{
|
|
|
102
118
|
playbook_paths?: string[] | undefined;
|
|
103
119
|
audit_window_days?: number | undefined;
|
|
104
120
|
}>>;
|
|
121
|
+
enforcement: z.ZodDefault<z.ZodObject<{
|
|
122
|
+
block_index_edits: z.ZodDefault<z.ZodBoolean>;
|
|
123
|
+
block_doc_deletion: z.ZodDefault<z.ZodBoolean>;
|
|
124
|
+
}, "strip", z.ZodTypeAny, {
|
|
125
|
+
block_index_edits: boolean;
|
|
126
|
+
block_doc_deletion: boolean;
|
|
127
|
+
}, {
|
|
128
|
+
block_index_edits?: boolean | undefined;
|
|
129
|
+
block_doc_deletion?: boolean | undefined;
|
|
130
|
+
}>>;
|
|
105
131
|
domains: z.ZodDefault<z.ZodEffects<z.ZodArray<z.ZodObject<{
|
|
106
132
|
id: z.ZodString;
|
|
107
133
|
name: z.ZodString;
|
|
@@ -161,6 +187,16 @@ declare const pluginConfigSchema: z.ZodObject<{
|
|
|
161
187
|
playbook_paths?: string[] | undefined;
|
|
162
188
|
audit_window_days?: number | undefined;
|
|
163
189
|
}>>;
|
|
190
|
+
enforcement: z.ZodDefault<z.ZodObject<{
|
|
191
|
+
block_index_edits: z.ZodDefault<z.ZodBoolean>;
|
|
192
|
+
block_doc_deletion: z.ZodDefault<z.ZodBoolean>;
|
|
193
|
+
}, "strip", z.ZodTypeAny, {
|
|
194
|
+
block_index_edits: boolean;
|
|
195
|
+
block_doc_deletion: boolean;
|
|
196
|
+
}, {
|
|
197
|
+
block_index_edits?: boolean | undefined;
|
|
198
|
+
block_doc_deletion?: boolean | undefined;
|
|
199
|
+
}>>;
|
|
164
200
|
domains: z.ZodDefault<z.ZodEffects<z.ZodArray<z.ZodObject<{
|
|
165
201
|
id: z.ZodString;
|
|
166
202
|
name: z.ZodString;
|
|
@@ -220,6 +256,16 @@ declare const pluginConfigSchema: z.ZodObject<{
|
|
|
220
256
|
playbook_paths?: string[] | undefined;
|
|
221
257
|
audit_window_days?: number | undefined;
|
|
222
258
|
}>>;
|
|
259
|
+
enforcement: z.ZodDefault<z.ZodObject<{
|
|
260
|
+
block_index_edits: z.ZodDefault<z.ZodBoolean>;
|
|
261
|
+
block_doc_deletion: z.ZodDefault<z.ZodBoolean>;
|
|
262
|
+
}, "strip", z.ZodTypeAny, {
|
|
263
|
+
block_index_edits: boolean;
|
|
264
|
+
block_doc_deletion: boolean;
|
|
265
|
+
}, {
|
|
266
|
+
block_index_edits?: boolean | undefined;
|
|
267
|
+
block_doc_deletion?: boolean | undefined;
|
|
268
|
+
}>>;
|
|
223
269
|
domains: z.ZodDefault<z.ZodEffects<z.ZodArray<z.ZodObject<{
|
|
224
270
|
id: z.ZodString;
|
|
225
271
|
name: z.ZodString;
|
|
@@ -267,6 +313,7 @@ declare const pluginConfigSchema: z.ZodObject<{
|
|
|
267
313
|
}>>;
|
|
268
314
|
}, z.ZodTypeAny, "passthrough">>;
|
|
269
315
|
export type VaultConfig = z.infer<typeof vaultConfigSchema>;
|
|
316
|
+
export type EnforcementConfig = z.infer<typeof enforcementConfigSchema>;
|
|
270
317
|
export type ArchiveConfig = z.infer<typeof archiveConfigSchema>;
|
|
271
318
|
export type PluginConfig = z.infer<typeof pluginConfigSchema>;
|
|
272
319
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AACnE,eAAO,MAAM,sBAAsB,UAA6B,CAAC;AACjE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAK5C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,0DAKzB,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAgBpE;;;;GAIG;AACH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;GAMT,CAAC;AAEf,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;GAKG;AACH,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;GAWX,CAAC;AAEf,QAAA,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AACnE,eAAO,MAAM,sBAAsB,UAA6B,CAAC;AACjE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAK5C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,0DAKzB,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAgBpE;;;;GAIG;AACH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;GAMT,CAAC;AAEf,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;GAKG;AACH,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;GAWX,CAAC;AAEf;;;;;GAKG;AACH,QAAA,MAAM,uBAAuB;;;;;;;;;GAKf,CAAC;AAEf,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAOR,CAAC;AAEjB,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBlF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAiBvE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYlC;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAElF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,YAAY,GACnB,MAAM,EAAE,CAEV"}
|
package/dist/utils/config.js
CHANGED
|
@@ -87,9 +87,22 @@ const archiveConfigSchema = z
|
|
|
87
87
|
auto: z.boolean().default(false),
|
|
88
88
|
})
|
|
89
89
|
.default({});
|
|
90
|
+
/**
|
|
91
|
+
* Lifecycle enforcement (2.8.0). Governs the PreToolUse guard, which is what
|
|
92
|
+
* makes the policy binding on an agent rather than merely documented. Both
|
|
93
|
+
* rules default ON — but they are opt-out, because a guard nobody can disable
|
|
94
|
+
* is a guard people uninstall the plugin to escape.
|
|
95
|
+
*/
|
|
96
|
+
const enforcementConfigSchema = z
|
|
97
|
+
.object({
|
|
98
|
+
block_index_edits: z.boolean().default(true),
|
|
99
|
+
block_doc_deletion: z.boolean().default(true),
|
|
100
|
+
})
|
|
101
|
+
.default({});
|
|
90
102
|
const pluginConfigSchema = z
|
|
91
103
|
.object({
|
|
92
104
|
vault: vaultConfigSchema,
|
|
105
|
+
enforcement: enforcementConfigSchema,
|
|
93
106
|
domains: lenientDomainsArray,
|
|
94
107
|
archive: archiveConfigSchema,
|
|
95
108
|
})
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|