@isaacriehm/cairn-core 0.22.5 → 0.23.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/.tsbuildinfo +1 -1
- package/dist/attention/index.d.ts +0 -1
- package/dist/attention/index.js +0 -1
- package/dist/attention/index.js.map +1 -1
- package/dist/cites/expand.d.ts +75 -0
- package/dist/cites/expand.js +197 -0
- package/dist/cites/expand.js.map +1 -0
- package/dist/doctor/index.d.ts +10 -4
- package/dist/doctor/index.js +25 -97
- package/dist/doctor/index.js.map +1 -1
- package/dist/gc/apply.d.ts +1 -1
- package/dist/gc/apply.js +1 -1
- package/dist/gc/classify.d.ts +4 -8
- package/dist/gc/classify.js +6 -12
- package/dist/gc/classify.js.map +1 -1
- package/dist/gc/completion-integrity.d.ts +0 -1
- package/dist/gc/completion-integrity.js +0 -6
- package/dist/gc/completion-integrity.js.map +1 -1
- package/dist/gc/index.d.ts +1 -1
- package/dist/gc/index.js +1 -1
- package/dist/gc/sweep.d.ts +1 -3
- package/dist/gc/sweep.js +2 -7
- package/dist/gc/sweep.js.map +1 -1
- package/dist/gc/types.d.ts +5 -6
- package/dist/gc/types.js +4 -5
- package/dist/gc/types.js.map +1 -1
- package/dist/hooks/post-tool-use/index.d.ts +1 -1
- package/dist/hooks/post-tool-use/index.js +1 -1
- package/dist/hooks/post-tool-use/index.js.map +1 -1
- package/dist/hooks/post-tool-use/sot-align.js +52 -21
- package/dist/hooks/post-tool-use/sot-align.js.map +1 -1
- package/dist/hooks/sot-align-common.d.ts +13 -0
- package/dist/hooks/sot-align-common.js +69 -0
- package/dist/hooks/sot-align-common.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/init/baseline-audit.js +3 -16
- package/dist/init/baseline-audit.js.map +1 -1
- package/dist/init/claude-rule.d.ts +1 -0
- package/dist/init/claude-rule.js +1 -1
- package/dist/init/claude-rule.js.map +1 -1
- package/dist/init/index.d.ts +0 -2
- package/dist/init/index.js +0 -1
- package/dist/init/index.js.map +1 -1
- package/dist/init/init.d.ts +2 -2
- package/dist/init/init.js +12 -27
- package/dist/init/init.js.map +1 -1
- package/dist/init/mapper-merge.d.ts +1 -4
- package/dist/init/mapper-merge.js +6 -22
- package/dist/init/mapper-merge.js.map +1 -1
- package/dist/init/mapper-parallel.d.ts +0 -4
- package/dist/init/mapper-parallel.js +3 -69
- package/dist/init/mapper-parallel.js.map +1 -1
- package/dist/init/mapper-prompts.d.ts +1 -25
- package/dist/init/mapper-prompts.js +2 -20
- package/dist/init/mapper-prompts.js.map +1 -1
- package/dist/init/mapper.d.ts +0 -4
- package/dist/init/mapper.js +2 -9
- package/dist/init/mapper.js.map +1 -1
- package/dist/init/overlay.js +6 -8
- package/dist/init/overlay.js.map +1 -1
- package/dist/init/phases/11-baseline.js +0 -10
- package/dist/init/phases/11-baseline.js.map +1 -1
- package/dist/init/phases/4-seed.js +0 -4
- package/dist/init/phases/4-seed.js.map +1 -1
- package/dist/init/source-comments/ingest.d.ts +0 -8
- package/dist/init/source-comments/ingest.js +11 -8
- package/dist/init/source-comments/ingest.js.map +1 -1
- package/dist/init/walker.d.ts +2 -3
- package/dist/init/walker.js +2 -3
- package/dist/init/walker.js.map +1 -1
- package/dist/init/workflow-block.d.ts +0 -4
- package/dist/init/workflow-block.js +0 -16
- package/dist/init/workflow-block.js.map +1 -1
- package/dist/invariants/prune.d.ts +50 -0
- package/dist/invariants/prune.js +113 -0
- package/dist/invariants/prune.js.map +1 -0
- package/dist/mcp/schemas.d.ts +8 -8
- package/dist/mcp/tools/mission-set-exit-gate.d.ts +1 -1
- package/dist/migrate/migrations/0004-drop-glob-settings.d.ts +16 -0
- package/dist/migrate/migrations/0004-drop-glob-settings.js +34 -0
- package/dist/migrate/migrations/0004-drop-glob-settings.js.map +1 -0
- package/dist/migrate/registry.js +2 -0
- package/dist/migrate/registry.js.map +1 -1
- package/dist/profiles/types.d.ts +0 -2
- package/dist/profiles/unknown.d.ts +2 -2
- package/dist/profiles/unknown.js +2 -3
- package/dist/profiles/unknown.js.map +1 -1
- package/dist/sensors/diff.d.ts +1 -1
- package/dist/sensors/diff.js +1 -1
- package/dist/sensors/index.d.ts +2 -3
- package/dist/sensors/index.js +1 -2
- package/dist/sensors/index.js.map +1 -1
- package/dist/sensors/runner.d.ts +7 -10
- package/dist/sensors/runner.js +6 -39
- package/dist/sensors/runner.js.map +1 -1
- package/dist/sensors/types.d.ts +0 -13
- package/dist/uninstall/index.d.ts +44 -0
- package/dist/uninstall/index.js +185 -0
- package/dist/uninstall/index.js.map +1 -0
- package/package.json +2 -2
- package/templates/.cairn/config/sensors.yaml +12 -91
- package/templates/.cairn/config/workflow.md +2 -5
- package/dist/attention/scoring.d.ts +0 -47
- package/dist/attention/scoring.js +0 -87
- package/dist/attention/scoring.js.map +0 -1
- package/dist/hooks/read-enrich.d.ts +0 -6
- package/dist/hooks/read-enrich.js +0 -11
- package/dist/hooks/read-enrich.js.map +0 -1
- package/dist/hooks/write-guard.d.ts +0 -6
- package/dist/hooks/write-guard.js +0 -11
- package/dist/hooks/write-guard.js.map +0 -1
- package/dist/init/glob-inference.d.ts +0 -16
- package/dist/init/glob-inference.js +0 -132
- package/dist/init/glob-inference.js.map +0 -1
- package/dist/init/phases/12-strip.d.ts +0 -10
- package/dist/init/phases/12-strip.js +0 -88
- package/dist/init/phases/12-strip.js.map +0 -1
- package/dist/sensors/structural.d.ts +0 -31
- package/dist/sensors/structural.js +0 -196
- package/dist/sensors/structural.js.map +0 -1
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Layer C — generic project-agnostic structural sensors.
|
|
3
|
-
*
|
|
4
|
-
* Triggered when the diff touches files matching the project's glob keys.
|
|
5
|
-
* Each sensor inspects the POST-change content of those files (not just
|
|
6
|
-
* the diff) — Layer C is "do these load-bearing files follow contract",
|
|
7
|
-
* which is stricter than Layer A's "did this run add new debt".
|
|
8
|
-
*
|
|
9
|
-
* route-handler-non-empty — every method in a route/controller class has a
|
|
10
|
-
* non-trivial body. Catches "added handler that
|
|
11
|
-
* does nothing" disguised as completion.
|
|
12
|
-
* dto-no-fake-fields — @IsOptional() fields with no other validator
|
|
13
|
-
* are fake-thoroughness; they look like work and
|
|
14
|
-
* do nothing.
|
|
15
|
-
*
|
|
16
|
-
* Both are pattern-based; profiles plug stack-specific globs. The regex is
|
|
17
|
-
* intentionally conservative (false-negatives over false-positives) — sensors
|
|
18
|
-
* that fail-loud-on-noise get disabled which defeats the purpose.
|
|
19
|
-
*/
|
|
20
|
-
import { lineOf, matchAnyGlob } from "@isaacriehm/cairn-state";
|
|
21
|
-
const ROUTE_SENSOR_ID = "route-handler-non-empty";
|
|
22
|
-
const DTO_SENSOR_ID = "dto-no-fake-fields";
|
|
23
|
-
/** Method body that's effectively a no-op — language-agnostic regex. */
|
|
24
|
-
const EMPTY_BODY_PATTERNS = [
|
|
25
|
-
// TypeScript/JavaScript class method with empty body or null/undefined return.
|
|
26
|
-
{
|
|
27
|
-
regex: /^\s*(?:public|private|protected|async)?\s*(?:async\s+)?(\w+)\s*\([^)]*\)\s*(?::\s*[^{]+)?\{\s*(?:return\s*(?:null|undefined)?\s*;?)?\s*\}/gm,
|
|
28
|
-
reason: "empty / return-null / return-undefined body",
|
|
29
|
-
},
|
|
30
|
-
// throw new Error('not implemented').
|
|
31
|
-
{
|
|
32
|
-
regex: /\b(\w+)\s*\([^)]*\)\s*(?::\s*[^{]+)?\{\s*throw\s+new\s+Error\s*\(\s*['"`][^'"`]*not[\s_]?implemented/gi,
|
|
33
|
-
reason: "throws not-implemented",
|
|
34
|
-
},
|
|
35
|
-
// Python: `def foo(...): pass` with nothing else.
|
|
36
|
-
{
|
|
37
|
-
regex: /def\s+(\w+)\s*\([^)]*\)\s*(?:->[^:]+)?:\s*\n\s*pass\s*\n/g,
|
|
38
|
-
reason: "Python def with `pass` body",
|
|
39
|
-
},
|
|
40
|
-
// Python: `def foo(...): return None`.
|
|
41
|
-
{
|
|
42
|
-
regex: /def\s+(\w+)\s*\([^)]*\)\s*(?:->[^:]+)?:\s*\n\s*return(?:\s+None)?\s*\n/g,
|
|
43
|
-
reason: "Python def returning None",
|
|
44
|
-
},
|
|
45
|
-
];
|
|
46
|
-
/** Detect a class context for TypeScript/JavaScript controllers. */
|
|
47
|
-
const TS_CONTROLLER_HINT = /\bclass\s+\w+(?:Controller|Resource|Resolver|Handler)\b|@(?:Controller|Resource|Resolver|Handler)\b|extends\s+(?:Controller|Resource)\b/;
|
|
48
|
-
/** Detect Python route registration. */
|
|
49
|
-
const PY_ROUTE_HINT = /@(?:app|router|blueprint|bp)\.(?:get|post|put|patch|delete|route)\b|@route\b|class\s+\w+(?:View|Resource)\b/;
|
|
50
|
-
/** Run route-handler-non-empty against changed files matching globs. */
|
|
51
|
-
export function runRouteHandlerNonEmpty(args) {
|
|
52
|
-
const startedAt = Date.now();
|
|
53
|
-
const findings = [];
|
|
54
|
-
if (!args.globs || args.globs.length === 0) {
|
|
55
|
-
return {
|
|
56
|
-
sensor_id: ROUTE_SENSOR_ID,
|
|
57
|
-
ok: true,
|
|
58
|
-
duration_ms: Date.now() - startedAt,
|
|
59
|
-
findings,
|
|
60
|
-
skipped: { reason: "route_handler_globs not configured for this project" },
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
const inScope = args.diff.filter((d) => d.status !== "deleted" && matchAnyGlob(d.path, args.globs ?? []));
|
|
64
|
-
if (inScope.length === 0) {
|
|
65
|
-
return {
|
|
66
|
-
sensor_id: ROUTE_SENSOR_ID,
|
|
67
|
-
ok: true,
|
|
68
|
-
duration_ms: Date.now() - startedAt,
|
|
69
|
-
findings,
|
|
70
|
-
skipped: { reason: "no diff entries match route_handler_globs" },
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
for (const entry of inScope) {
|
|
74
|
-
const text = entry.afterContent ?? "";
|
|
75
|
-
if (text.length === 0)
|
|
76
|
-
continue;
|
|
77
|
-
if (!isRouteHandlerFile(entry.path, text))
|
|
78
|
-
continue;
|
|
79
|
-
for (const { regex, reason } of EMPTY_BODY_PATTERNS) {
|
|
80
|
-
const re = new RegExp(regex.source, regex.flags);
|
|
81
|
-
let m;
|
|
82
|
-
while ((m = re.exec(text)) !== null) {
|
|
83
|
-
const methodName = m[1] ?? "<anon>";
|
|
84
|
-
if (METHOD_ALLOWLIST.has(methodName))
|
|
85
|
-
continue;
|
|
86
|
-
const line = lineOf(text, m.index);
|
|
87
|
-
findings.push({
|
|
88
|
-
sensor_id: ROUTE_SENSOR_ID,
|
|
89
|
-
path: entry.path,
|
|
90
|
-
line,
|
|
91
|
-
matched_text: m[0].slice(0, 200),
|
|
92
|
-
message: `${entry.path}:${line} route-handler method \`${methodName}\` — ${reason}`,
|
|
93
|
-
severity: "hard",
|
|
94
|
-
});
|
|
95
|
-
if (re.lastIndex === m.index)
|
|
96
|
-
re.lastIndex += 1;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return {
|
|
101
|
-
sensor_id: ROUTE_SENSOR_ID,
|
|
102
|
-
ok: findings.length === 0,
|
|
103
|
-
duration_ms: Date.now() - startedAt,
|
|
104
|
-
findings,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
/** Run dto-no-fake-fields against changed files matching globs. */
|
|
108
|
-
export function runDtoNoFakeFields(args) {
|
|
109
|
-
const startedAt = Date.now();
|
|
110
|
-
const findings = [];
|
|
111
|
-
if (!args.globs || args.globs.length === 0) {
|
|
112
|
-
return {
|
|
113
|
-
sensor_id: DTO_SENSOR_ID,
|
|
114
|
-
ok: true,
|
|
115
|
-
duration_ms: Date.now() - startedAt,
|
|
116
|
-
findings,
|
|
117
|
-
skipped: { reason: "dto_globs not configured for this project" },
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
const inScope = args.diff.filter((d) => d.status !== "deleted" && matchAnyGlob(d.path, args.globs ?? []));
|
|
121
|
-
if (inScope.length === 0) {
|
|
122
|
-
return {
|
|
123
|
-
sensor_id: DTO_SENSOR_ID,
|
|
124
|
-
ok: true,
|
|
125
|
-
duration_ms: Date.now() - startedAt,
|
|
126
|
-
findings,
|
|
127
|
-
skipped: { reason: "no diff entries match dto_globs" },
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
for (const entry of inScope) {
|
|
131
|
-
const text = entry.afterContent ?? "";
|
|
132
|
-
if (text.length === 0)
|
|
133
|
-
continue;
|
|
134
|
-
findings.push(...findFakeOptionalFields(entry.path, text));
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
sensor_id: DTO_SENSOR_ID,
|
|
138
|
-
ok: findings.every((f) => f.severity !== "hard"),
|
|
139
|
-
duration_ms: Date.now() - startedAt,
|
|
140
|
-
findings,
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* `@IsOptional()` followed by a property declaration with NO additional
|
|
145
|
-
* validator decorator on the same or preceding line(s). Capture group 1 is
|
|
146
|
-
* the field name.
|
|
147
|
-
*/
|
|
148
|
-
function findFakeOptionalFields(path, text) {
|
|
149
|
-
const findings = [];
|
|
150
|
-
// Match `@IsOptional()\n fieldName?: Type;` with no other validator.
|
|
151
|
-
const re = /@IsOptional\s*\(\s*\)\s*\n((?:\s*@[A-Z]\w+\s*\([^)]*\)\s*\n)*)\s*(\w+)\s*\??\s*:\s*[^;\n]+;?/g;
|
|
152
|
-
let m;
|
|
153
|
-
while ((m = re.exec(text)) !== null) {
|
|
154
|
-
const otherDecorators = m[1] ?? "";
|
|
155
|
-
const field = m[2] ?? "";
|
|
156
|
-
// If only `@IsOptional()` and nothing else, that's fake-thoroughness.
|
|
157
|
-
if (otherDecorators.trim().length === 0) {
|
|
158
|
-
const line = lineOf(text, m.index);
|
|
159
|
-
findings.push({
|
|
160
|
-
sensor_id: DTO_SENSOR_ID,
|
|
161
|
-
path,
|
|
162
|
-
line,
|
|
163
|
-
matched_text: m[0].slice(0, 200),
|
|
164
|
-
message: `${path}:${line} field \`${field}\` decorated only with @IsOptional() — add a validator (@IsString, @IsNumber, etc.) or remove the decorator`,
|
|
165
|
-
severity: "soft",
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
if (re.lastIndex === m.index)
|
|
169
|
-
re.lastIndex += 1;
|
|
170
|
-
}
|
|
171
|
-
return findings;
|
|
172
|
-
}
|
|
173
|
-
/** Methods we don't want to flag: constructors, framework hooks, etc. */
|
|
174
|
-
const METHOD_ALLOWLIST = new Set([
|
|
175
|
-
"constructor",
|
|
176
|
-
"ngOnInit",
|
|
177
|
-
"ngOnDestroy",
|
|
178
|
-
"onModuleInit",
|
|
179
|
-
"onModuleDestroy",
|
|
180
|
-
"onApplicationBootstrap",
|
|
181
|
-
"onApplicationShutdown",
|
|
182
|
-
"render",
|
|
183
|
-
]);
|
|
184
|
-
/** Heuristic: file LOOKS like a route/controller before regex-scanning bodies. */
|
|
185
|
-
function isRouteHandlerFile(path, text) {
|
|
186
|
-
if (TS_CONTROLLER_HINT.test(text))
|
|
187
|
-
return true;
|
|
188
|
-
if (PY_ROUTE_HINT.test(text))
|
|
189
|
-
return true;
|
|
190
|
-
// Conservative fallback — if the path matches the glob but the file doesn't
|
|
191
|
-
// declare a class or route decorator, skip rather than false-positive.
|
|
192
|
-
void path;
|
|
193
|
-
return false;
|
|
194
|
-
}
|
|
195
|
-
/** 1-based line number from a character offset. */
|
|
196
|
-
//# sourceMappingURL=structural.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"structural.js","sourceRoot":"","sources":["../../src/sensors/structural.ts"],"names":[],"mappings":"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"}
|