etymd 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # etymd
2
2
 
3
+ ## 0.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 9b45d54: screen: the machine-path check now also skips on upstream-owned files
8
+
9
+ The upstream-ownership exemption (0.12.0) skipped vocabulary-class patterns on files
10
+ byte-identical to public upstream, but the absolute-home-path check still fired on
11
+ them. Forks of container-based projects carry upstream docs full of generic container
12
+ paths (the `/home/<user>/...` shape), so a sync kept blocking on paths that are
13
+ already public in the upstream repo and never name the local machine.
14
+
15
+ An upstream-owned file is byte-identical to a public upstream blob, so any path it
16
+ names is already public and cannot leak this machine. The machine-path check is now
17
+ skipped for upstream-owned files, exactly like vocabulary-class patterns. Secret-class
18
+ patterns stay absolute on every file, and the machine-path check still fires on all
19
+ non-upstream files (the common case) unchanged.
20
+
3
21
  ## 0.12.0
4
22
 
5
23
  ### Minor Changes
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { section, theme, print, renderBaselineDrift, glyph } from './chunk-5BVKFJWM.js';
3
- import { scanProject } from './chunk-MTVEJ33D.js';
4
- import { VERSION } from './chunk-YFNRDXUY.js';
3
+ import { scanProject } from './chunk-YXOAPMQH.js';
4
+ import { VERSION } from './chunk-D3R74TJ2.js';
5
5
  import { readBaseline, summarizeBaselineDrift, isDriftEmpty, writeBaseline, deriveProfile } from './chunk-JHZ2BN4U.js';
6
6
  import { PACK_VERSION } from './chunk-LSZGCKIQ.js';
7
7
  import './chunk-4VPBP6K6.js';
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- export { run } from './chunk-SWA4NQHB.js';
3
- import './chunk-O3PHW4OP.js';
2
+ export { run } from './chunk-DSAQ5S5D.js';
3
+ import './chunk-PXRLOEN5.js';
4
4
  import './chunk-F75Q43BC.js';
5
5
  import './chunk-3E2IPCRY.js';
6
6
  import './chunk-DWL2IKZH.js';
7
7
  import './chunk-5BVKFJWM.js';
8
- import './chunk-MTVEJ33D.js';
9
- import './chunk-YFNRDXUY.js';
8
+ import './chunk-YXOAPMQH.js';
9
+ import './chunk-D3R74TJ2.js';
10
10
  import './chunk-JHZ2BN4U.js';
11
11
  import './chunk-LSZGCKIQ.js';
12
12
  import './chunk-4VPBP6K6.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { print, theme } from './chunk-5BVKFJWM.js';
3
- import { scanProject } from './chunk-MTVEJ33D.js';
4
- import './chunk-YFNRDXUY.js';
3
+ import { scanProject } from './chunk-YXOAPMQH.js';
4
+ import './chunk-D3R74TJ2.js';
5
5
  import { ETYMD_DIR } from './chunk-JHZ2BN4U.js';
6
6
  import './chunk-LSZGCKIQ.js';
7
7
  import './chunk-4VPBP6K6.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // package.json
3
3
  var package_default = {
4
- version: "0.12.0"};
4
+ version: "0.13.0"};
5
5
 
6
6
  // src/version.ts
7
7
  var VERSION = package_default.version;
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { parseFailOnTier, runAudit, meetsFailOn } from './chunk-O3PHW4OP.js';
2
+ import { parseFailOnTier, runAudit, meetsFailOn } from './chunk-PXRLOEN5.js';
3
3
  import { print, section, theme, renderLensCoverage, renderFindings, renderLedgerDiff } from './chunk-5BVKFJWM.js';
4
4
 
5
5
  // src/commands/audit.ts
@@ -2,7 +2,7 @@
2
2
  import { measureContext } from './chunk-F75Q43BC.js';
3
3
  import { readLedger, reconcileLedger, writeLedger, visibleFindings } from './chunk-3E2IPCRY.js';
4
4
  import { DEFAULT_CONFIG, readConfig, CONFIG_FILE } from './chunk-DWL2IKZH.js';
5
- import { scanProject, expandFileGlobs } from './chunk-MTVEJ33D.js';
5
+ import { scanProject, expandFileGlobs } from './chunk-YXOAPMQH.js';
6
6
  import { ETYMD_DIR, writeCachedFacts, readBaseline, deriveProfile, baselineCarriesMachinePath, BASELINE_FILE } from './chunk-JHZ2BN4U.js';
7
7
  import { PACK_VERSION } from './chunk-LSZGCKIQ.js';
8
8
  import { pathExists, readJson, readText, isDirectory, matchesAnyGlob, git, normalizeRelPath, isCiEnvironment, isExecutable } from './chunk-4VPBP6K6.js';
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { VERSION } from './chunk-YFNRDXUY.js';
2
+ import { VERSION } from './chunk-D3R74TJ2.js';
3
3
  import { PACK_VERSION } from './chunk-LSZGCKIQ.js';
4
4
  import { normalizeRelPath, isDirectory, readJson, git, matchesAnyGlob, pathExists, readText } from './chunk-4VPBP6K6.js';
5
5
  import path from 'path';
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { VERSION } from './chunk-YFNRDXUY.js';
2
+ import { VERSION } from './chunk-D3R74TJ2.js';
3
3
  import path from 'path';
4
4
  import { Command } from 'commander';
5
5
  import pc from 'picocolors';
@@ -31,7 +31,7 @@ program.command("audit").description("Verify every instruction claim against the
31
31
  "exit non-zero when findings at/above this tier exist (risk|gap|polish)"
32
32
  ).action(
33
33
  (opts, cmd) => action(async () => {
34
- const { run } = await import('./audit-BXHJUTMJ.js');
34
+ const { run } = await import('./audit-YRT4SWSQ.js');
35
35
  await run({
36
36
  cwd: resolveCwd(cmd),
37
37
  json: opts.json,
@@ -44,7 +44,7 @@ program.command("audit").description("Verify every instruction claim against the
44
44
  );
45
45
  program.command("init").description("Onboard the truth guard: approve the baseline; scaffold AGENTS.md only if missing").option("-y, --yes", "accept defaults without prompting (never overwrites)").action(
46
46
  (opts, cmd) => action(async () => {
47
- const { run } = await import('./init-EKQ33WYS.js');
47
+ const { run } = await import('./init-XJEYU2HC.js');
48
48
  await run({ cwd: resolveCwd(cmd), yes: opts.yes });
49
49
  })
50
50
  );
@@ -52,19 +52,19 @@ program.command("approve").description(
52
52
  "Re-approve the committed baseline after intentional structural changes (non-interactive)"
53
53
  ).action(
54
54
  (_opts, cmd) => action(async () => {
55
- const { run } = await import('./approve-PP2QJQ3Y.js');
55
+ const { run } = await import('./approve-YUT43YLC.js');
56
56
  await run({ cwd: resolveCwd(cmd) });
57
57
  })
58
58
  );
59
59
  program.command("scan").description("Deterministically reckon the project into a facts index").option("--json", "print the raw facts as JSON").option("--no-save", "do not write the .etymd cache").action(
60
60
  (opts, cmd) => action(async () => {
61
- const { run } = await import('./scan-XS4JPS7J.js');
61
+ const { run } = await import('./scan-B24RZAV2.js');
62
62
  await run({ cwd: resolveCwd(cmd), json: opts.json, save: opts.save });
63
63
  })
64
64
  );
65
65
  program.command("doctor").description('Alias for `audit --truth` \u2014 "are the recorded instructions still true?"').option("--json", "print findings as JSON").action(
66
66
  (opts, cmd) => action(async () => {
67
- const { run } = await import('./doctor-7SLSUSVK.js');
67
+ const { run } = await import('./doctor-7YKDXSKM.js');
68
68
  await run({ cwd: resolveCwd(cmd), json: opts.json });
69
69
  })
70
70
  );
@@ -76,7 +76,7 @@ program.command("context").description("Measure the always-loaded context footpr
76
76
  );
77
77
  program.command("brief").description("Emit a grounded briefing for the in-repo agent to complete the semantic layer").option("--human", "write a human onboarding brief instead of the agent briefing").action(
78
78
  (opts, cmd) => action(async () => {
79
- const { run } = await import('./brief-GDLJEG6X.js');
79
+ const { run } = await import('./brief-Z5S6OY2M.js');
80
80
  await run({ cwd: resolveCwd(cmd), human: opts.human });
81
81
  })
82
82
  );
@@ -111,7 +111,7 @@ var fleet = program.command("fleet").description(
111
111
  "exit non-zero when findings at/above this tier exist (risk|gap|polish)"
112
112
  ).action(
113
113
  (opts, cmd) => action(async () => {
114
- const { sweep } = await import('./fleet-5NVOUIZD.js');
114
+ const { sweep } = await import('./fleet-YQ35KGEP.js');
115
115
  await sweep({
116
116
  cwd: resolveCwd(cmd),
117
117
  manifest: opts.manifest,
@@ -126,7 +126,7 @@ var fleet = program.command("fleet").description(
126
126
  );
127
127
  fleet.command("check").description("Validate the manifest pair only \u2014 no lenses: dangling mappings, duplicates, leaks").option("--manifest <file>", "the fleet manifest \u2014 required unless the cwd holds registry.json").option("--json", "print the findings as JSON (EXPERIMENTAL through 0.2.x)").action(
128
128
  (_opts, cmd) => action(async () => {
129
- const { check } = await import('./fleet-5NVOUIZD.js');
129
+ const { check } = await import('./fleet-YQ35KGEP.js');
130
130
  const opts = cmd.optsWithGlobals();
131
131
  await check({ cwd: resolveCwd(cmd), manifest: opts.manifest, json: opts.json });
132
132
  })
@@ -136,7 +136,7 @@ fleet.command("add").argument("<dir>", "directory of the project to register").d
136
136
  "public-repo | public-bound | private \u2014 mandatory for personal entries"
137
137
  ).option("-y, --yes", "skip prompts; every mandatory value must be passed as a flag").option("--manifest <file>", "the fleet manifest \u2014 required unless the cwd holds registry.json").action(
138
138
  (dir, opts, cmd) => action(async () => {
139
- const { add } = await import('./fleet-5NVOUIZD.js');
139
+ const { add } = await import('./fleet-YQ35KGEP.js');
140
140
  const shared = cmd.optsWithGlobals();
141
141
  await add({
142
142
  cwd: resolveCwd(cmd),
@@ -159,7 +159,7 @@ fleet.command("dismiss").argument("<name>", "the registered project name").argum
159
159
  "Dismiss a project's finding from any cwd \u2014 corp ledgers persist beside the manifest"
160
160
  ).requiredOption("--reason <text>", "why it is dismissed \u2014 recorded so the decision survives").option("--manifest <file>", "the fleet manifest \u2014 required unless the cwd holds registry.json").action(
161
161
  (name, id, _opts, cmd) => action(async () => {
162
- const { dismiss } = await import('./fleet-5NVOUIZD.js');
162
+ const { dismiss } = await import('./fleet-YQ35KGEP.js');
163
163
  const opts = cmd.optsWithGlobals();
164
164
  await dismiss({
165
165
  cwd: resolveCwd(cmd),
@@ -174,7 +174,7 @@ fleet.command("accept").argument("<name>", "the registered project name").argume
174
174
  "Accept a project's finding as a known trade-off \u2014 corp ledgers persist beside the manifest"
175
175
  ).option("--reason <text>", "optional note on why the trade-off is accepted").option("--manifest <file>", "the fleet manifest \u2014 required unless the cwd holds registry.json").action(
176
176
  (name, id, _opts, cmd) => action(async () => {
177
- const { accept } = await import('./fleet-5NVOUIZD.js');
177
+ const { accept } = await import('./fleet-YQ35KGEP.js');
178
178
  const opts = cmd.optsWithGlobals();
179
179
  await accept({ cwd: resolveCwd(cmd), manifest: opts.manifest, name, id, reason: opts.reason });
180
180
  })
@@ -186,7 +186,7 @@ program.command("screen").description(
186
186
  "fork's upstream remote: files byte-identical to its refs skip vocabulary-class patterns (secret patterns stay absolute)"
187
187
  ).action(
188
188
  (opts, cmd) => action(async () => {
189
- const { run } = await import('./screen-UF7VZ26C.js');
189
+ const { run } = await import('./screen-CS6PSG7U.js');
190
190
  const scope = opts.message ? "message" : opts.dir ? "dir" : opts.tree ? "tree" : "staged";
191
191
  await run({
192
192
  cwd: resolveCwd(cmd),
@@ -200,7 +200,7 @@ program.command("screen").description(
200
200
  );
201
201
  program.command("gates").description("Install the local git-hook gates (process \u2192 pre-commit, correctness \u2192 pre-push)").option("--ci", "note about the CI review gate (ships later; local gates install now)").option("-y, --yes", "skip prompts; never overwrites a hand-edited hook").action(
202
202
  (opts, cmd) => action(async () => {
203
- const { run } = await import('./gates-OS5V3P4C.js');
203
+ const { run } = await import('./gates-DU6SDH2M.js');
204
204
  await run({ cwd: resolveCwd(cmd), ci: opts.ci, yes: opts.yes });
205
205
  })
206
206
  );
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import { run } from './chunk-SWA4NQHB.js';
3
- import './chunk-O3PHW4OP.js';
2
+ import { run } from './chunk-DSAQ5S5D.js';
3
+ import './chunk-PXRLOEN5.js';
4
4
  import './chunk-F75Q43BC.js';
5
5
  import './chunk-3E2IPCRY.js';
6
6
  import './chunk-DWL2IKZH.js';
7
7
  import './chunk-5BVKFJWM.js';
8
- import './chunk-MTVEJ33D.js';
9
- import './chunk-YFNRDXUY.js';
8
+ import './chunk-YXOAPMQH.js';
9
+ import './chunk-D3R74TJ2.js';
10
10
  import './chunk-JHZ2BN4U.js';
11
11
  import './chunk-LSZGCKIQ.js';
12
12
  import './chunk-4VPBP6K6.js';
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { dismiss, accept } from './chunk-2VLNI3L2.js';
3
- import { parseFailOnTier, meetsFailOn, runAudit } from './chunk-O3PHW4OP.js';
3
+ import { parseFailOnTier, meetsFailOn, runAudit } from './chunk-PXRLOEN5.js';
4
4
  import './chunk-F75Q43BC.js';
5
5
  import { readLedger } from './chunk-3E2IPCRY.js';
6
6
  import { DEFAULT_CONFIG } from './chunk-DWL2IKZH.js';
7
7
  import { print, theme, section, renderFleetRows, renderFleetNotes, renderFindings, TIER_BADGE, glyph } from './chunk-5BVKFJWM.js';
8
- import { scanProject } from './chunk-MTVEJ33D.js';
9
- import './chunk-YFNRDXUY.js';
8
+ import { scanProject } from './chunk-YXOAPMQH.js';
9
+ import './chunk-D3R74TJ2.js';
10
10
  import { ETYMD_DIR } from './chunk-JHZ2BN4U.js';
11
11
  import './chunk-LSZGCKIQ.js';
12
12
  import { readText, pathExists, git, isDirectory } from './chunk-4VPBP6K6.js';
@@ -688,7 +688,7 @@ async function checkCorpEmails(manifest, findings, disclosures) {
688
688
  }
689
689
  async function checkGateDrift(manifest, findings, disclosures) {
690
690
  const { planWorkflow } = await import('./generate-PMCP37DC.js');
691
- const { scanProject: scanProject2 } = await import('./scan-N4BKVL5F.js');
691
+ const { scanProject: scanProject2 } = await import('./scan-QDNN7ER3.js');
692
692
  const { readConfig } = await import('./config-XAH6PA5G.js');
693
693
  for (const entry of manifest.entries) {
694
694
  const root = entry.resolvedRoot;
@@ -3,8 +3,8 @@ import { applyFiles } from './chunk-GWGKEPRX.js';
3
3
  import { deriveFailOn, derivedCommands, planWorkflow, runPrefix, isSafeGateCommand } from './chunk-HRJJQCMT.js';
4
4
  import { readConfig, CONFIG_FILE, configPath } from './chunk-DWL2IKZH.js';
5
5
  import { section, print, glyph, theme, renderPlan } from './chunk-5BVKFJWM.js';
6
- import { scanProject } from './chunk-MTVEJ33D.js';
7
- import './chunk-YFNRDXUY.js';
6
+ import { scanProject } from './chunk-YXOAPMQH.js';
7
+ import './chunk-D3R74TJ2.js';
8
8
  import './chunk-JHZ2BN4U.js';
9
9
  import './chunk-LSZGCKIQ.js';
10
10
  import { readText, git } from './chunk-4VPBP6K6.js';
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ var init_package = __esm({
30
30
  "package.json"() {
31
31
  package_default = {
32
32
  name: "etymd",
33
- version: "0.12.0",
33
+ version: "0.13.0",
34
34
  description: "Keep your agent instructions true \u2014 verify AGENTS.md, CLAUDE.md, rules & skills against the actual repo, with drift caught over time and a regression ledger.",
35
35
  keywords: [
36
36
  "cli",
@@ -3,8 +3,8 @@ import { applyFiles } from './chunk-GWGKEPRX.js';
3
3
  import { planWorkflow } from './chunk-HRJJQCMT.js';
4
4
  import './chunk-DWL2IKZH.js';
5
5
  import { theme, renderFacts, print, renderPlan, section, glyph } from './chunk-5BVKFJWM.js';
6
- import { scanProject } from './chunk-MTVEJ33D.js';
7
- import { VERSION } from './chunk-YFNRDXUY.js';
6
+ import { scanProject } from './chunk-YXOAPMQH.js';
7
+ import { VERSION } from './chunk-D3R74TJ2.js';
8
8
  import { writeCachedFacts, deriveProfile, writeBaseline, CACHE_DIR } from './chunk-JHZ2BN4U.js';
9
9
  import { PACK_VERSION } from './chunk-LSZGCKIQ.js';
10
10
  import { git, readText } from './chunk-4VPBP6K6.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { print, renderFacts, theme } from './chunk-5BVKFJWM.js';
3
- import { scanProject } from './chunk-MTVEJ33D.js';
4
- import './chunk-YFNRDXUY.js';
3
+ import { scanProject } from './chunk-YXOAPMQH.js';
4
+ import './chunk-D3R74TJ2.js';
5
5
  import { writeCachedFacts } from './chunk-JHZ2BN4U.js';
6
6
  import './chunk-LSZGCKIQ.js';
7
7
  import './chunk-4VPBP6K6.js';
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ export { scanProject } from './chunk-YXOAPMQH.js';
3
+ import './chunk-D3R74TJ2.js';
4
+ import './chunk-LSZGCKIQ.js';
5
+ import './chunk-4VPBP6K6.js';
@@ -116,11 +116,11 @@ async function selfIdentities(cwd) {
116
116
  names.delete("");
117
117
  return [...names];
118
118
  }
119
- function screenText(text, file, patterns, allow = [], skipVocabulary = false) {
119
+ function screenText(text, file, patterns, allow = [], upstreamOwned = false) {
120
120
  const classed = patterns.map(
121
121
  (p) => p instanceof RegExp ? { re: p, cls: "secret" } : p
122
122
  );
123
- const active = skipVocabulary ? classed.filter((p) => p.cls === "secret") : classed;
123
+ const active = upstreamOwned ? classed.filter((p) => p.cls === "secret") : classed;
124
124
  const hits = [];
125
125
  const lines = text.split("\n");
126
126
  for (const [i, line] of lines.entries()) {
@@ -132,7 +132,7 @@ function screenText(text, file, patterns, allow = [], skipVocabulary = false) {
132
132
  break;
133
133
  }
134
134
  }
135
- if (MACHINE_PATH_RE.test(line)) {
135
+ if (!upstreamOwned && MACHINE_PATH_RE.test(line)) {
136
136
  hits.push({
137
137
  file,
138
138
  line: i + 1,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "etymd",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Keep your agent instructions true — verify AGENTS.md, CLAUDE.md, rules & skills against the actual repo, with drift caught over time and a regression ledger.",
5
5
  "keywords": [
6
6
  "cli",
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env node
2
- export { scanProject } from './chunk-MTVEJ33D.js';
3
- import './chunk-YFNRDXUY.js';
4
- import './chunk-LSZGCKIQ.js';
5
- import './chunk-4VPBP6K6.js';