@event4u/agent-config 8.6.0 → 8.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 +1 -1
- package/CHANGELOG.md +81 -0
- package/CONTRIBUTING.md +25 -0
- package/README.md +7 -4
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/orchestration-benchmark-gate.md +28 -16
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +15 -0
- package/dist/agent-src/rules/active-remediation.md +92 -0
- package/dist/agent-src/rules/broken-access-control.md +106 -0
- package/dist/agent-src/rules/communication-through-line.md +42 -0
- package/dist/agent-src/rules/decision-revisit-gate.md +8 -0
- package/dist/agent-src/rules/minimal-safe-diff.md +18 -1
- package/dist/agent-src/rules/prefer-enums-over-literals.md +65 -0
- package/dist/agent-src/rules/senior-engineering-discipline.md +82 -0
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +105 -0
- package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +52 -0
- package/dist/agent-src/skills/authz-review/SKILL.md +21 -4
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +20 -0
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +104 -0
- package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +52 -0
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +7 -0
- package/dist/agent-src/skills/skill-writing/SKILL.md +4 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +100 -0
- package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +52 -0
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +43 -2
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +24 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +196 -16
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +13 -5
- package/dist/discovery/trust-report.md +11 -11
- package/dist/discovery/workspaces.json +12 -4
- package/dist/install/emit_host_rules_cli.js +185 -0
- package/dist/install/emit_host_rules_cli.js.map +1 -0
- package/dist/install/install.mjs +11 -2
- package/dist/install/plan.js +4 -1
- package/dist/install/plan.js.map +1 -1
- package/dist/install/rule_scope.js +109 -0
- package/dist/install/rule_scope.js.map +1 -0
- package/dist/install/rule_scope_cli.js +77 -0
- package/dist/install/rule_scope_cli.js.map +1 -0
- package/dist/install/wizard-plan.js +14 -1
- package/dist/install/wizard-plan.js.map +1 -1
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +4 -4
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +963 -0
- package/dist/scripts/_lib/agent_settings.js.map +1 -0
- package/dist/scripts/_lib/agent_src.js +607 -0
- package/dist/scripts/_lib/agent_src.js.map +1 -0
- package/dist/scripts/_lib/claude_settings_hooks.js +209 -0
- package/dist/scripts/_lib/claude_settings_hooks.js.map +1 -0
- package/dist/scripts/_lib/model_tier.js +64 -0
- package/dist/scripts/_lib/model_tier.js.map +1 -0
- package/dist/scripts/_lib/script_output.js +140 -0
- package/dist/scripts/_lib/script_output.js.map +1 -0
- package/dist/scripts/_lib/user_global_paths.js +297 -0
- package/dist/scripts/_lib/user_global_paths.js.map +1 -0
- package/dist/scripts/condense.js +2181 -0
- package/dist/scripts/condense.js.map +1 -0
- package/dist/server/routes/install.js +18 -2
- package/dist/server/routes/install.js.map +1 -1
- package/dist/server/schemas/settings.js +4 -1
- package/dist/server/schemas/settings.js.map +1 -1
- package/docs/CLAIMS.md +30 -2
- package/docs/architecture.md +2 -2
- package/docs/catalog.md +14 -0
- package/docs/contracts/mcp-tool-inventory.md +31 -30
- package/docs/decisions/ADR-105-automatic-subagent-orchestration.md +6 -0
- package/docs/decisions/ADR-116-memory-tripwire-activation-path.md +2 -2
- package/docs/decisions/ADR-117-subagents-auto-default-on.md +88 -0
- package/docs/decisions/INDEX.md +1 -0
- package/docs/experiences/content_creator.md +2 -0
- package/docs/experiences/finance.md +2 -0
- package/docs/experiences/founder.md +2 -0
- package/docs/experiences/ops.md +2 -0
- package/docs/featured-skills.md +2 -2
- package/docs/getting-started-by-role.md +1 -1
- package/docs/getting-started.md +1 -1
- package/docs/governance-advantage.md +1 -1
- package/docs/guidelines/agent-infra/memory-access.md +12 -0
- package/docs/proof.md +45 -3
- package/docs/release-runbook.md +138 -0
- package/docs/second-brain-scope.md +73 -0
- package/docs/succession.md +80 -0
- package/package.json +2 -2
- package/src/config/agent-settings.template.yml +29 -8
- package/src/install/emit_host_rules_cli.ts +190 -0
- package/src/install/plan.ts +11 -1
- package/src/install/rule_scope.ts +120 -0
- package/src/install/rule_scope_cli.ts +79 -0
- package/src/install/wizard-plan.ts +22 -1
- package/src/scripts/_lib/orchestration_gate.ts +12 -8
- package/src/scripts/_lib/orchestration_savings.ts +127 -0
- package/src/scripts/build_proof.ts +38 -0
- package/src/scripts/chat_history.ts +79 -7
- package/src/scripts/check_trigger_eval_presence.ts +171 -0
- package/src/scripts/domain_soundness_status.ts +236 -0
- package/src/scripts/generate_index.ts +14 -0
- package/src/scripts/hot_context_hook.ts +47 -2
- package/src/scripts/install.sh +118 -4
- package/src/scripts/lint_behavioural_eval_freshness.ts +140 -0
- package/src/scripts/mcp_server/consumer_tool_catalog.json +22 -3
- package/src/scripts/mcp_server/tools.ts +159 -1
- package/src/scripts/memory_lookup.ts +184 -6
- package/src/scripts/memory_replay.ts +285 -0
- package/src/scripts/orchestration_savings_report.ts +100 -0
- package/src/scripts/schemas/domain-truth.schema.json +94 -0
- package/src/scripts/schemas/evals.schema.json +113 -0
- package/src/scripts/second_brain_score.ts +186 -0
- package/src/scripts/session_memory_index.ts +94 -0
- package/src/scripts/skill_eval_coverage.ts +318 -0
- package/src/scripts/trigger_eval_grandfather.json +226 -0
- package/src/server/schemas/settings.ts +11 -2
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"checksum": "sha256:
|
|
3
|
-
"generated_at": "2026-07-
|
|
2
|
+
"checksum": "sha256:236db1c9e47c8fb6c769af3954d78b738af4308cccd100d55683fbc64ed05fd1",
|
|
3
|
+
"generated_at": "2026-07-09T12:23:58Z",
|
|
4
4
|
"packs": [
|
|
5
5
|
{
|
|
6
6
|
"always_on": false,
|
|
7
|
-
"artefact_count":
|
|
7
|
+
"artefact_count": 103,
|
|
8
8
|
"artefacts": [
|
|
9
9
|
"src/domains/engineering-base/mission/upgrade/command.md",
|
|
10
|
+
"src/rules/active-remediation.md",
|
|
11
|
+
"src/rules/broken-access-control.md",
|
|
10
12
|
"src/rules/commit-conventions.md",
|
|
11
13
|
"src/rules/commit-policy.md",
|
|
14
|
+
"src/rules/communication-through-line.md",
|
|
12
15
|
"src/rules/delegation-policy.md",
|
|
13
16
|
"src/rules/docker-commands.md",
|
|
14
17
|
"src/rules/downstream-changes.md",
|
|
@@ -20,8 +23,10 @@
|
|
|
20
23
|
"src/rules/minimal-safe-diff.md",
|
|
21
24
|
"src/rules/non-destructive-by-default.md",
|
|
22
25
|
"src/rules/output-discipline.md",
|
|
26
|
+
"src/rules/prefer-enums-over-literals.md",
|
|
23
27
|
"src/rules/scope-control.md",
|
|
24
28
|
"src/rules/security-sensitive-stop.md",
|
|
29
|
+
"src/rules/senior-engineering-discipline.md",
|
|
25
30
|
"src/rules/source-discovery-gate.md",
|
|
26
31
|
"src/rules/think-before-action.md",
|
|
27
32
|
"src/rules/untrusted-input-defense.md",
|
|
@@ -29,6 +34,7 @@
|
|
|
29
34
|
"src/skills/accessibility-auditor/SKILL.md",
|
|
30
35
|
"src/skills/adversarial-review/SKILL.md",
|
|
31
36
|
"src/skills/agent-security-review/SKILL.md",
|
|
37
|
+
"src/skills/ai-code-blindspots/SKILL.md",
|
|
32
38
|
"src/skills/api-design/SKILL.md",
|
|
33
39
|
"src/skills/api-endpoint/SKILL.md",
|
|
34
40
|
"src/skills/api-testing/SKILL.md",
|
|
@@ -57,6 +63,7 @@
|
|
|
57
63
|
"src/skills/fe-design/SKILL.md",
|
|
58
64
|
"src/skills/finishing-a-development-branch/SKILL.md",
|
|
59
65
|
"src/skills/form-handler/SKILL.md",
|
|
66
|
+
"src/skills/frontend-render-security/SKILL.md",
|
|
60
67
|
"src/skills/git-workflow/SKILL.md",
|
|
61
68
|
"src/skills/github-ci/SKILL.md",
|
|
62
69
|
"src/skills/grafana/SKILL.md",
|
|
@@ -86,6 +93,7 @@
|
|
|
86
93
|
"src/skills/source-discovery/SKILL.md",
|
|
87
94
|
"src/skills/sql-writing/SKILL.md",
|
|
88
95
|
"src/skills/standards-from-config/SKILL.md",
|
|
96
|
+
"src/skills/supply-chain-intake/SKILL.md",
|
|
89
97
|
"src/skills/systematic-debugging/SKILL.md",
|
|
90
98
|
"src/skills/tailwind-engineer/SKILL.md",
|
|
91
99
|
"src/skills/tech-debt-tracker/SKILL.md",
|
|
@@ -103,14 +111,14 @@
|
|
|
103
111
|
"src/skills/verify-completion-evidence/SKILL.md"
|
|
104
112
|
],
|
|
105
113
|
"by_lifecycle": {
|
|
106
|
-
"active":
|
|
114
|
+
"active": 102,
|
|
107
115
|
"archived": 0,
|
|
108
116
|
"deprecated": 0,
|
|
109
117
|
"experimental": 1
|
|
110
118
|
},
|
|
111
119
|
"by_trust_level": {
|
|
112
120
|
"advisory": 0,
|
|
113
|
-
"core":
|
|
121
|
+
"core": 101,
|
|
114
122
|
"experimental": 1,
|
|
115
123
|
"professional": 1,
|
|
116
124
|
"restricted": 0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Discovery — Trust Report
|
|
2
2
|
|
|
3
|
-
- Generated: `2026-07-
|
|
3
|
+
- Generated: `2026-07-09T12:23:58Z`
|
|
4
4
|
- Workspaces tracked: **10**
|
|
5
5
|
- Human-review-required artefacts: **3**
|
|
6
6
|
|
|
@@ -8,16 +8,16 @@
|
|
|
8
8
|
|
|
9
9
|
| Workspace | core | professional | experimental | advisory | restricted |
|
|
10
10
|
|---|---|---|---|---|---|
|
|
11
|
-
| `agent-config-maintainer` |
|
|
12
|
-
| `construction` |
|
|
13
|
-
| `engineering` |
|
|
14
|
-
| `finance` |
|
|
15
|
-
| `founder` |
|
|
16
|
-
| `gtm` |
|
|
17
|
-
| `legal-review-prep` |
|
|
18
|
-
| `ops` |
|
|
19
|
-
| `product` |
|
|
20
|
-
| `small-business` |
|
|
11
|
+
| `agent-config-maintainer` | 291 | 0 | 2 | 0 | 0 |
|
|
12
|
+
| `construction` | 23 | 0 | 0 | 0 | 0 |
|
|
13
|
+
| `engineering` | 161 | 58 | 1 | 0 | 0 |
|
|
14
|
+
| `finance` | 25 | 3 | 0 | 1 | 0 |
|
|
15
|
+
| `founder` | 30 | 0 | 0 | 1 | 0 |
|
|
16
|
+
| `gtm` | 27 | 12 | 0 | 0 | 0 |
|
|
17
|
+
| `legal-review-prep` | 23 | 0 | 0 | 6 | 0 |
|
|
18
|
+
| `ops` | 23 | 8 | 0 | 0 | 0 |
|
|
19
|
+
| `product` | 23 | 15 | 0 | 0 | 0 |
|
|
20
|
+
| `small-business` | 29 | 0 | 18 | 0 | 0 |
|
|
21
21
|
|
|
22
22
|
## Human-review-required artefacts
|
|
23
23
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"checksum": "sha256:
|
|
3
|
-
"generated_at": "2026-07-
|
|
2
|
+
"checksum": "sha256:236db1c9e47c8fb6c769af3954d78b738af4308cccd100d55683fbc64ed05fd1",
|
|
3
|
+
"generated_at": "2026-07-09T12:23:58Z",
|
|
4
4
|
"scanner_version": "f36b5a348348",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
{
|
|
7
|
-
"artefact_count":
|
|
7
|
+
"artefact_count": 182,
|
|
8
8
|
"default_packs": [
|
|
9
9
|
"engineering-base",
|
|
10
10
|
"git"
|
|
@@ -27,11 +27,14 @@
|
|
|
27
27
|
],
|
|
28
28
|
"packs": [
|
|
29
29
|
{
|
|
30
|
-
"artefact_count":
|
|
30
|
+
"artefact_count": 103,
|
|
31
31
|
"artefacts": [
|
|
32
32
|
"src/domains/engineering-base/mission/upgrade/command.md",
|
|
33
|
+
"src/rules/active-remediation.md",
|
|
34
|
+
"src/rules/broken-access-control.md",
|
|
33
35
|
"src/rules/commit-conventions.md",
|
|
34
36
|
"src/rules/commit-policy.md",
|
|
37
|
+
"src/rules/communication-through-line.md",
|
|
35
38
|
"src/rules/delegation-policy.md",
|
|
36
39
|
"src/rules/docker-commands.md",
|
|
37
40
|
"src/rules/downstream-changes.md",
|
|
@@ -43,8 +46,10 @@
|
|
|
43
46
|
"src/rules/minimal-safe-diff.md",
|
|
44
47
|
"src/rules/non-destructive-by-default.md",
|
|
45
48
|
"src/rules/output-discipline.md",
|
|
49
|
+
"src/rules/prefer-enums-over-literals.md",
|
|
46
50
|
"src/rules/scope-control.md",
|
|
47
51
|
"src/rules/security-sensitive-stop.md",
|
|
52
|
+
"src/rules/senior-engineering-discipline.md",
|
|
48
53
|
"src/rules/source-discovery-gate.md",
|
|
49
54
|
"src/rules/think-before-action.md",
|
|
50
55
|
"src/rules/untrusted-input-defense.md",
|
|
@@ -52,6 +57,7 @@
|
|
|
52
57
|
"src/skills/accessibility-auditor/SKILL.md",
|
|
53
58
|
"src/skills/adversarial-review/SKILL.md",
|
|
54
59
|
"src/skills/agent-security-review/SKILL.md",
|
|
60
|
+
"src/skills/ai-code-blindspots/SKILL.md",
|
|
55
61
|
"src/skills/api-design/SKILL.md",
|
|
56
62
|
"src/skills/api-endpoint/SKILL.md",
|
|
57
63
|
"src/skills/api-testing/SKILL.md",
|
|
@@ -80,6 +86,7 @@
|
|
|
80
86
|
"src/skills/fe-design/SKILL.md",
|
|
81
87
|
"src/skills/finishing-a-development-branch/SKILL.md",
|
|
82
88
|
"src/skills/form-handler/SKILL.md",
|
|
89
|
+
"src/skills/frontend-render-security/SKILL.md",
|
|
83
90
|
"src/skills/git-workflow/SKILL.md",
|
|
84
91
|
"src/skills/github-ci/SKILL.md",
|
|
85
92
|
"src/skills/grafana/SKILL.md",
|
|
@@ -109,6 +116,7 @@
|
|
|
109
116
|
"src/skills/source-discovery/SKILL.md",
|
|
110
117
|
"src/skills/sql-writing/SKILL.md",
|
|
111
118
|
"src/skills/standards-from-config/SKILL.md",
|
|
119
|
+
"src/skills/supply-chain-intake/SKILL.md",
|
|
112
120
|
"src/skills/systematic-debugging/SKILL.md",
|
|
113
121
|
"src/skills/tailwind-engineer/SKILL.md",
|
|
114
122
|
"src/skills/tech-debt-tracker/SKILL.md",
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Consumer host-native rule emission
|
|
4
|
+
* (road-to-request-scoped-rule-load Phase 1b Step 3).
|
|
5
|
+
*
|
|
6
|
+
* Before this CLI, consumer Cursor got a symlink farm to raw `.md` (no
|
|
7
|
+
* `.mdc`, no auto-attach globs) and consumer `.windsurfrules` was built by
|
|
8
|
+
* a bash concatenator that STRIPPED all frontmatter — destroying the
|
|
9
|
+
* host-native trigger signal Phase 2 added to the projection path.
|
|
10
|
+
*
|
|
11
|
+
* ## Recorded decision — install-time emission, not dist artifacts
|
|
12
|
+
*
|
|
13
|
+
* Phase 1b Step 3 asked for one recorded choice: pre-built host artifacts
|
|
14
|
+
* in `dist/` vs emission at install time. Decision: INSTALL-TIME EMISSION,
|
|
15
|
+
* re-using the exported condense emitters (`_emit_cursor_mdc`,
|
|
16
|
+
* `_emit_windsurf_rule`, `strip_frontmatter`) verbatim. Rationale:
|
|
17
|
+
* - a new `dist/agent-src/hosts/` tree would cascade through the
|
|
18
|
+
* discovery manifest, artefact checksums, condensation hashes and the
|
|
19
|
+
* always-budget gates for what is derived data;
|
|
20
|
+
* - dist artifacts are scope-agnostic — install-time emission runs AFTER
|
|
21
|
+
* the Phase-1b rule filter, so scoped installs get scoped host files
|
|
22
|
+
* for free;
|
|
23
|
+
* - re-using the exported emitters keeps consumer output byte-identical
|
|
24
|
+
* to the maintainer projection (Pipeline B never drifts from A).
|
|
25
|
+
* The trade-off (node required at install time) matches the rule-scope
|
|
26
|
+
* resolver: no node → install.sh keeps its legacy fallback surfaces.
|
|
27
|
+
*
|
|
28
|
+
* Usage:
|
|
29
|
+
* emit_host_rules_cli.ts --rules-dir <installed rules dir>
|
|
30
|
+
* --project-root <consumer root>
|
|
31
|
+
* --tools cursor,windsurf
|
|
32
|
+
*
|
|
33
|
+
* Exit codes: 0 emitted · 2 usage error · 1 emission failure (caller falls
|
|
34
|
+
* back to the legacy surface).
|
|
35
|
+
*/
|
|
36
|
+
import * as fs from 'node:fs';
|
|
37
|
+
import * as path from 'node:path';
|
|
38
|
+
import process from 'node:process';
|
|
39
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
40
|
+
import { _emit_cursor_mdc, _emit_windsurf_rule, strip_frontmatter, } from '../scripts/condense.js';
|
|
41
|
+
function _ruleFiles(rulesDir) {
|
|
42
|
+
return fs
|
|
43
|
+
.readdirSync(rulesDir)
|
|
44
|
+
.filter((n) => n.endsWith('.md'))
|
|
45
|
+
.sort()
|
|
46
|
+
.map((n) => path.join(rulesDir, n))
|
|
47
|
+
.filter((p) => {
|
|
48
|
+
try {
|
|
49
|
+
return fs.statSync(p).isFile();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** Remove entries not in `valid` (mirror of condense's `_clean_modern_dir`). */
|
|
57
|
+
function _cleanDir(dir, valid) {
|
|
58
|
+
let entries;
|
|
59
|
+
try {
|
|
60
|
+
entries = fs.readdirSync(dir);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
for (const name of entries) {
|
|
66
|
+
if (name === 'README.md' || valid.has(name)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const full = path.join(dir, name);
|
|
70
|
+
try {
|
|
71
|
+
if (fs.lstatSync(full).isDirectory()) {
|
|
72
|
+
fs.rmSync(full, { recursive: true, force: true });
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
fs.unlinkSync(full);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
/* best-effort clean */
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function emitCursor(rulesDir, projectRoot) {
|
|
84
|
+
const targetDir = path.join(projectRoot, '.cursor', 'rules');
|
|
85
|
+
const files = _ruleFiles(rulesDir);
|
|
86
|
+
const valid = new Set();
|
|
87
|
+
for (const src of files) {
|
|
88
|
+
const name = `${path.basename(src, '.md')}.mdc`;
|
|
89
|
+
_emit_cursor_mdc(src, path.join(targetDir, name));
|
|
90
|
+
valid.add(name);
|
|
91
|
+
}
|
|
92
|
+
_cleanDir(targetDir, valid);
|
|
93
|
+
return files.length;
|
|
94
|
+
}
|
|
95
|
+
export function emitWindsurf(rulesDir, projectRoot) {
|
|
96
|
+
const perRuleDir = path.join(projectRoot, '.windsurf', 'rules');
|
|
97
|
+
const files = _ruleFiles(rulesDir);
|
|
98
|
+
const valid = new Set();
|
|
99
|
+
for (const src of files) {
|
|
100
|
+
const name = path.basename(src);
|
|
101
|
+
_emit_windsurf_rule(src, path.join(perRuleDir, name));
|
|
102
|
+
valid.add(name);
|
|
103
|
+
}
|
|
104
|
+
_cleanDir(perRuleDir, valid);
|
|
105
|
+
// Concatenated legacy surface — same format as the projection-path
|
|
106
|
+
// generator (condense.generate_windsurfrules), consumer-sourced header.
|
|
107
|
+
const parts = ['# Auto-generated from .augment/rules/ — do not edit directly\n'];
|
|
108
|
+
for (const src of files) {
|
|
109
|
+
const content = strip_frontmatter(fs.readFileSync(src, 'utf-8'));
|
|
110
|
+
parts.push(`---\n\n${content.trim()}\n`);
|
|
111
|
+
}
|
|
112
|
+
fs.writeFileSync(path.join(projectRoot, '.windsurfrules'), parts.join('\n') + '\n', 'utf-8');
|
|
113
|
+
return files.length;
|
|
114
|
+
}
|
|
115
|
+
export function main(argv = process.argv.slice(2)) {
|
|
116
|
+
let rulesDir = '';
|
|
117
|
+
let projectRoot = '';
|
|
118
|
+
let tools = [];
|
|
119
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
120
|
+
const arg = argv[i];
|
|
121
|
+
if (arg === '--rules-dir') {
|
|
122
|
+
rulesDir = argv[i + 1] ?? '';
|
|
123
|
+
i += 1;
|
|
124
|
+
}
|
|
125
|
+
else if (arg === '--project-root') {
|
|
126
|
+
projectRoot = argv[i + 1] ?? '';
|
|
127
|
+
i += 1;
|
|
128
|
+
}
|
|
129
|
+
else if (arg === '--tools') {
|
|
130
|
+
tools = (argv[i + 1] ?? '').split(',').filter((t) => t.length > 0);
|
|
131
|
+
i += 1;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
process.stderr.write(`emit_host_rules_cli: unknown argument: ${arg}\n`);
|
|
135
|
+
return 2;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (rulesDir === '' || projectRoot === '' || tools.length === 0) {
|
|
139
|
+
process.stderr.write('usage: emit_host_rules_cli.ts --rules-dir <dir> --project-root <dir> --tools cursor,windsurf\n');
|
|
140
|
+
return 2;
|
|
141
|
+
}
|
|
142
|
+
if (!fs.existsSync(rulesDir)) {
|
|
143
|
+
process.stderr.write(`emit_host_rules_cli: rules dir not found: ${rulesDir}\n`);
|
|
144
|
+
return 1;
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
for (const tool of tools) {
|
|
148
|
+
if (tool === 'cursor') {
|
|
149
|
+
const n = emitCursor(rulesDir, path.resolve(projectRoot));
|
|
150
|
+
process.stdout.write(`cursor: ${n} .mdc rule(s)\n`);
|
|
151
|
+
}
|
|
152
|
+
else if (tool === 'windsurf') {
|
|
153
|
+
const n = emitWindsurf(rulesDir, path.resolve(projectRoot));
|
|
154
|
+
process.stdout.write(`windsurf: ${n} rule(s) + .windsurfrules\n`);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
process.stderr.write(`emit_host_rules_cli: unknown tool: ${tool}\n`);
|
|
158
|
+
return 2;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return 0;
|
|
162
|
+
}
|
|
163
|
+
catch (e) {
|
|
164
|
+
process.stderr.write(`emit_host_rules_cli: emission failed: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
165
|
+
return 1;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function _isCliEntry() {
|
|
169
|
+
if (process.argv[1] === undefined)
|
|
170
|
+
return false;
|
|
171
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
172
|
+
if (import.meta.url === argvUrl)
|
|
173
|
+
return true;
|
|
174
|
+
try {
|
|
175
|
+
return (fs.realpathSync(fileURLToPath(import.meta.url)) ===
|
|
176
|
+
fs.realpathSync(path.resolve(process.argv[1])));
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (_isCliEntry()) {
|
|
183
|
+
process.exit(main());
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=emit_host_rules_cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit_host_rules_cli.js","sourceRoot":"","sources":["../../src/install/emit_host_rules_cli.ts"],"names":[],"mappings":"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"}
|
package/dist/install/install.mjs
CHANGED
|
@@ -13877,6 +13877,12 @@ var settingsSchema = external_exports.object({
|
|
|
13877
13877
|
projection: external_exports.object({
|
|
13878
13878
|
mode: projectionMode.default("legacy-all").describe(
|
|
13879
13879
|
"Whether the per-tool projector writes EVERY artefact into the host-tool trees (.claude/ .cursor/ .windsurf/) or only the active profile + packs' artefacts (ADR-040, docs/contracts/capability-packs.md). legacy-all = (default, non-breaking) project the full surface exactly as 5.x did. scoped = project only the active profile's packs unioned with the runtime.active_packs overlay, expanded over the requires graph \u2014 opt in with `agent-config use --profile=<id>`. A failed scoped projection restores the full tree."
|
|
13880
|
+
),
|
|
13881
|
+
rule_workspaces: external_exports.array(external_exports.string()).default([]).describe(
|
|
13882
|
+
"Workspace scope for the RULE layer only (road-to-request-scoped-rule-load P1/P1b, opt-in). Absent or empty = legacy-all: every rule projects AND installs. Non-empty = only rules whose workspaces frontmatter intersects this list are projected (condense) and installed (install.sh + global wizard payload). Kernel rules always ship; untagged rules fail safe. The default flip to a scoped value is a HUMAN release gate \u2014 do not set this from automation."
|
|
13883
|
+
),
|
|
13884
|
+
rule_packs: external_exports.array(external_exports.string()).default([]).describe(
|
|
13885
|
+
"Optional second scoping axis for the RULE layer, per pack ids (src/config/discovery/packs.yml). When set, a non-kernel rule also needs a packs frontmatter intersection to ship \u2014 e.g. deselecting frontend-design drops ui-audit-gate + design-fidelity. Same opt-in / human-gate semantics as rule_workspaces."
|
|
13880
13886
|
)
|
|
13881
13887
|
}).default({ mode: "legacy-all" }),
|
|
13882
13888
|
rule_loading_tier: ruleLoadingTier.default("balanced").describe(
|
|
@@ -14072,8 +14078,8 @@ var settingsSchema = external_exports.object({
|
|
|
14072
14078
|
enabled: external_exports.boolean().default(true).describe(
|
|
14073
14079
|
"Global master switch for the subagent layer. true (default) = available; false = fully disabled (the canonical kill-switch \u2014 no auto-dispatch, no routing, everything runs in-session)."
|
|
14074
14080
|
),
|
|
14075
|
-
auto: external_exports.enum(["off", "ask", "on"]).default("
|
|
14076
|
-
"Automatic-dispatch mode. off = subagents only via explicit command. ask = classify the task and ask once before dispatching. on = auto-dispatch delegable tasks (surface the choice in one line). Shipped default is
|
|
14081
|
+
auto: external_exports.enum(["off", "ask", "on"]).default("on").describe(
|
|
14082
|
+
"Automatic-dispatch mode. off = subagents only via explicit command. ask = classify the task and ask once before dispatching. on = auto-dispatch delegable tasks (surface the choice in one line). Shipped default is on on subagent-capable hosts (flipped from ask 2026-07-09, ADR-117), off elsewhere; no-op where the host has no subagent primitive."
|
|
14077
14083
|
),
|
|
14078
14084
|
downshift: external_exports.boolean().default(true).describe(
|
|
14079
14085
|
"Route delegable sub-tasks to the lowest-capable model tier (cost + speed via model downshift). false = every subagent runs on the session tier."
|
|
@@ -14147,6 +14153,9 @@ var settingsSchema = external_exports.object({
|
|
|
14147
14153
|
),
|
|
14148
14154
|
redact_patterns: external_exports.array(external_exports.string()).default([]).describe(
|
|
14149
14155
|
"Regex patterns (one per line) that scrub matches from chat-history transcripts and memory before they hit disk. Use for secrets, customer names, internal URLs. Patterns are anchored and case-insensitive."
|
|
14156
|
+
),
|
|
14157
|
+
session_index: external_exports.enum(["on", "off"]).default("off").describe(
|
|
14158
|
+
"Opt-in compact memory index at session start (road-to-memory-retrieval-economy P5). on = inject a compact id + title + ~tokens index of curated entries (hard cap 30 rows, bodies never included) through the hot-context hook; the agent fetches full entries via memory_get on demand. off (default) = no injection \u2014 the ship-criterion (measured hit-rate gain) is unproven, so off unless proven."
|
|
14150
14159
|
)
|
|
14151
14160
|
}),
|
|
14152
14161
|
knowledge: external_exports.object({
|
package/dist/install/plan.js
CHANGED
|
@@ -103,7 +103,10 @@ export function buildInstallPlan(inputs) {
|
|
|
103
103
|
const filesByTool = {};
|
|
104
104
|
for (const source of inputs.sources) {
|
|
105
105
|
const bucket = filesByTool[source.toolId] ?? [];
|
|
106
|
-
|
|
106
|
+
let files = walkSourceTree(source.srcDir);
|
|
107
|
+
if (source.fileFilter !== undefined) {
|
|
108
|
+
files = files.filter(source.fileFilter);
|
|
109
|
+
}
|
|
107
110
|
for (const srcFile of files) {
|
|
108
111
|
const rel = relative(source.srcDir, srcFile);
|
|
109
112
|
const destPath = resolve(source.destDir, rel);
|
package/dist/install/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/install/plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/install/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install-time rule scoping — Pipeline B of consumer-scoped rule projection
|
|
3
|
+
* (road-to-request-scoped-rule-load Phase 1b).
|
|
4
|
+
*
|
|
5
|
+
* The projection filter (`rule_in_scope`, condense.ts) covered only the
|
|
6
|
+
* maintainer projection; the consumer install pipeline shipped rules
|
|
7
|
+
* unfiltered (dead `EXCLUDE_RULES` in install.sh; no exclude at all on the
|
|
8
|
+
* global payload). This module is the ONE scoping surface both install
|
|
9
|
+
* paths consume — it deliberately re-uses `rule_in_scope` so the install
|
|
10
|
+
* semantics can never drift from the projection semantics.
|
|
11
|
+
*
|
|
12
|
+
* ## The `source-of-truth.md` decision (Phase 1b Step 2 — recorded here)
|
|
13
|
+
*
|
|
14
|
+
* Before this module, `install.sh` excluded `source-of-truth.md` from
|
|
15
|
+
* PROJECT installs (hardcoded name) while the GLOBAL payload shipped it —
|
|
16
|
+
* the documented contradiction. Decision: the rule is excluded from BOTH
|
|
17
|
+
* consumer paths, always (even under legacy-all). Rationale: its Iron Law
|
|
18
|
+
* ("NEVER EDIT ANY GENERATED PROJECTION … ALWAYS WORK IN src/") describes
|
|
19
|
+
* THIS repository's build layout; in a consumer project there is no `src/`
|
|
20
|
+
* authoring tree and the installed files ARE the working surface — the rule
|
|
21
|
+
* is not merely useless there, it actively forbids legitimate consumer
|
|
22
|
+
* edits. Shipping it globally was the bug; project installs had it right.
|
|
23
|
+
* The compat list below is the pre-flip carrier of that decision; once the
|
|
24
|
+
* Phase-1 human gate flips consumer defaults to scoped, the rule drops out
|
|
25
|
+
* via its maintainer-only workspace tag and this list can retire.
|
|
26
|
+
*/
|
|
27
|
+
import * as fs from 'node:fs';
|
|
28
|
+
import * as path from 'node:path';
|
|
29
|
+
import { rule_in_scope } from '../scripts/condense.js';
|
|
30
|
+
/**
|
|
31
|
+
* Rules excluded from EVERY consumer install path regardless of scope —
|
|
32
|
+
* same treatment on project and global (see module doc for the decision).
|
|
33
|
+
*/
|
|
34
|
+
export const COMPAT_ALWAYS_EXCLUDED = ['source-of-truth.md'];
|
|
35
|
+
export const LEGACY_ALL = { workspaces: null, packs: null };
|
|
36
|
+
/** Non-empty string-array extraction; anything else → null (legacy-all). */
|
|
37
|
+
function _list(value) {
|
|
38
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
39
|
+
return value.map((v) => String(v));
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Extract `projection.rule_workspaces` / `projection.rule_packs` from an
|
|
45
|
+
* already-parsed settings object (same key contract as condense's
|
|
46
|
+
* `_read_projection_list` — absent / empty = legacy-all).
|
|
47
|
+
*/
|
|
48
|
+
export function ruleScopeFromSettings(settings) {
|
|
49
|
+
const proj = settings['projection'];
|
|
50
|
+
if (typeof proj !== 'object' || proj === null || Array.isArray(proj)) {
|
|
51
|
+
return LEGACY_ALL;
|
|
52
|
+
}
|
|
53
|
+
const p = proj;
|
|
54
|
+
return {
|
|
55
|
+
workspaces: _list(p['rule_workspaces']),
|
|
56
|
+
packs: _list(p['rule_packs']),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Whether a rule FILE (path into the shipped `dist/agent-src/rules` tree)
|
|
61
|
+
* arrives in a consumer install under `scope`.
|
|
62
|
+
*
|
|
63
|
+
* Delegates the scoping decision to the projection-path predicate
|
|
64
|
+
* (`rule_in_scope` — kernel always ships, untagged axes fail safe) and adds
|
|
65
|
+
* the compat exclusion on top. Non-rule files (non-`.md`) always arrive.
|
|
66
|
+
*/
|
|
67
|
+
export function ruleFileArrives(sourcePath, scope) {
|
|
68
|
+
if (!sourcePath.endsWith('.md')) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
const basename = path.basename(sourcePath);
|
|
72
|
+
if (COMPAT_ALWAYS_EXCLUDED.includes(basename)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return rule_in_scope(sourcePath, scope.workspaces, scope.packs);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Basenames from `rulesDir` that are EXCLUDED under `scope` — the shape the
|
|
79
|
+
* bash installer consumes (one basename per line via the CLI below).
|
|
80
|
+
*/
|
|
81
|
+
export function excludedRuleBasenames(rulesDir, scope) {
|
|
82
|
+
let entries;
|
|
83
|
+
try {
|
|
84
|
+
entries = fs.readdirSync(rulesDir).sort();
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
const out = [];
|
|
90
|
+
for (const name of entries) {
|
|
91
|
+
if (!name.endsWith('.md')) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const full = path.join(rulesDir, name);
|
|
95
|
+
try {
|
|
96
|
+
if (!fs.statSync(full).isFile()) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (!ruleFileArrives(full, scope)) {
|
|
104
|
+
out.push(name);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=rule_scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule_scope.js","sourceRoot":"","sources":["../../src/install/rule_scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* CLI twin surface of {@link module:install/rule_scope} for the bash
|
|
4
|
+
* installer (road-to-request-scoped-rule-load Phase 1b).
|
|
5
|
+
*
|
|
6
|
+
* Prints one EXCLUDED rule basename per line for the given rules source
|
|
7
|
+
* dir + consumer settings file. `install.sh` consumes this to replace its
|
|
8
|
+
* dead hardcoded `EXCLUDE_RULES` list; on any failure the caller falls back
|
|
9
|
+
* to the static compat exclusion (fail-safe: over-ship, never under-ship).
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* rule_scope_cli.ts --rules-dir <dist/agent-src/rules> [--settings <file>]
|
|
13
|
+
*
|
|
14
|
+
* Exit codes: 0 ok (list on stdout, possibly empty) · 2 usage error.
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from 'node:fs';
|
|
17
|
+
import * as path from 'node:path';
|
|
18
|
+
import process from 'node:process';
|
|
19
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
20
|
+
import { load_agent_settings } from '../scripts/_lib/agent_settings.js';
|
|
21
|
+
import { excludedRuleBasenames, ruleScopeFromSettings, LEGACY_ALL } from './rule_scope.js';
|
|
22
|
+
export function main(argv = process.argv.slice(2)) {
|
|
23
|
+
let rulesDir = '';
|
|
24
|
+
let settingsFile = '';
|
|
25
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
26
|
+
const arg = argv[i];
|
|
27
|
+
if (arg === '--rules-dir') {
|
|
28
|
+
rulesDir = argv[i + 1] ?? '';
|
|
29
|
+
i += 1;
|
|
30
|
+
}
|
|
31
|
+
else if (arg === '--settings') {
|
|
32
|
+
settingsFile = argv[i + 1] ?? '';
|
|
33
|
+
i += 1;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
process.stderr.write(`rule_scope_cli: unknown argument: ${arg}\n`);
|
|
37
|
+
return 2;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (rulesDir === '') {
|
|
41
|
+
process.stderr.write('usage: rule_scope_cli.ts --rules-dir <dir> [--settings <file>]\n');
|
|
42
|
+
return 2;
|
|
43
|
+
}
|
|
44
|
+
let scope = LEGACY_ALL;
|
|
45
|
+
if (settingsFile !== '' && fs.existsSync(settingsFile)) {
|
|
46
|
+
try {
|
|
47
|
+
const settings = load_agent_settings({ project_path: settingsFile });
|
|
48
|
+
scope = ruleScopeFromSettings(settings);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Unreadable settings → legacy-all (fail-safe: over-ship).
|
|
52
|
+
scope = LEGACY_ALL;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
for (const name of excludedRuleBasenames(path.resolve(rulesDir), scope)) {
|
|
56
|
+
process.stdout.write(`${name}\n`);
|
|
57
|
+
}
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
function _isCliEntry() {
|
|
61
|
+
if (process.argv[1] === undefined)
|
|
62
|
+
return false;
|
|
63
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
64
|
+
if (import.meta.url === argvUrl)
|
|
65
|
+
return true;
|
|
66
|
+
try {
|
|
67
|
+
return (fs.realpathSync(fileURLToPath(import.meta.url)) ===
|
|
68
|
+
fs.realpathSync(path.resolve(process.argv[1])));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (_isCliEntry()) {
|
|
75
|
+
process.exit(main());
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=rule_scope_cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule_scope_cli.js","sourceRoot":"","sources":["../../src/install/rule_scope_cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE3F,MAAM,UAAU,IAAI,CAAC,OAA0B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YACxB,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,CAAC,IAAI,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAC9B,YAAY,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,CAAC,IAAI,CAAC,CAAC;QACX,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,GAAG,IAAI,CAAC,CAAC;YACnE,OAAO,CAAC,CAAC;QACb,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACzF,OAAO,CAAC,CAAC;IACb,CAAC;IAED,IAAI,KAAK,GAAG,UAAU,CAAC;IACvB,IAAI,YAAY,KAAK,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;YACrE,KAAK,GAAG,qBAAqB,CAAC,QAAmC,CAAC,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACL,2DAA2D;YAC3D,KAAK,GAAG,UAAU,CAAC;QACvB,CAAC;IACL,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,CAAC;AACb,CAAC;AAED,SAAS,WAAW;IAChB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC;QACD,OAAO,CACH,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/C,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CACjD,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,IAAI,WAAW,EAAE,EAAE,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACzB,CAAC"}
|