persona-harness 0.3.0-alpha.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/.persona/harness.jsonc +9 -0
- package/.persona/rules/backend/gradle-bootstrap.md +27 -0
- package/.persona/rules/backend/java-backend-bootstrap.md +28 -0
- package/.persona/rules/backend/java-common.md +22 -0
- package/.persona/rules/backend/layered-architecture.md +19 -0
- package/.persona/rules/backend/package-structure.md +21 -0
- package/.persona/rules/backend/spring-controller.md +19 -0
- package/.persona/rules/backend/spring-dto.md +21 -0
- package/.persona/rules/backend/spring-entity.md +22 -0
- package/.persona/rules/backend/spring-repository.md +22 -0
- package/.persona/rules/backend/spring-service.md +23 -0
- package/.persona/rules/backend/spring-test.md +32 -0
- package/.persona/rules/backend/step1-api-contract.md +29 -0
- package/.persona/rules/backend/step2-3-api-contract.md +24 -0
- package/.persona/rules/backend/validation-exception.md +18 -0
- package/.persona/rules/clean-code/abstraction.md +18 -0
- package/.persona/rules/clean-code/common.md +21 -0
- package/.persona/rules/clean-code/method-design.md +20 -0
- package/.persona/rules/clean-code/naming.md +19 -0
- package/.persona/rules/clean-code/oop.md +18 -0
- package/.persona/rules/clean-code/testability.md +19 -0
- package/CHANGELOG.md +40 -0
- package/LICENSE +201 -0
- package/README.ja.md +95 -0
- package/README.ko.md +95 -0
- package/README.md +125 -0
- package/README.zh-cn.md +95 -0
- package/dist/cli/bearshell.d.ts +12 -0
- package/dist/cli/bearshell.js +189 -0
- package/dist/cli/bearshell.js.map +1 -0
- package/dist/cli/history.d.ts +15 -0
- package/dist/cli/history.js +156 -0
- package/dist/cli/history.js.map +1 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.js +117 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +21 -0
- package/dist/cli/init.js +194 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/intake-profile.d.ts +52 -0
- package/dist/cli/intake-profile.js +167 -0
- package/dist/cli/intake-profile.js.map +1 -0
- package/dist/cli/intake.d.ts +14 -0
- package/dist/cli/intake.js +209 -0
- package/dist/cli/intake.js.map +1 -0
- package/dist/cli/plan-command.d.ts +4 -0
- package/dist/cli/plan-command.js +130 -0
- package/dist/cli/plan-command.js.map +1 -0
- package/dist/cli/plan-status.d.ts +11 -0
- package/dist/cli/plan-status.js +41 -0
- package/dist/cli/plan-status.js.map +1 -0
- package/dist/cli/plan.d.ts +10 -0
- package/dist/cli/plan.js +199 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/policy.d.ts +7 -0
- package/dist/cli/policy.js +139 -0
- package/dist/cli/policy.js.map +1 -0
- package/dist/cli/report-status.d.ts +13 -0
- package/dist/cli/report-status.js +40 -0
- package/dist/cli/report-status.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/phase0/drift-detector.d.ts +24 -0
- package/dist/phase0/drift-detector.js +334 -0
- package/dist/phase0/drift-detector.js.map +1 -0
- package/dist/phase0/evidence.d.ts +9 -0
- package/dist/phase0/evidence.js +36 -0
- package/dist/phase0/evidence.js.map +1 -0
- package/dist/phase0/file-role.d.ts +5 -0
- package/dist/phase0/file-role.js +55 -0
- package/dist/phase0/file-role.js.map +1 -0
- package/dist/phase0/harness-config.d.ts +12 -0
- package/dist/phase0/harness-config.js +115 -0
- package/dist/phase0/harness-config.js.map +1 -0
- package/dist/phase0/hooks.d.ts +8 -0
- package/dist/phase0/hooks.js +127 -0
- package/dist/phase0/hooks.js.map +1 -0
- package/dist/phase0/injection.d.ts +2 -0
- package/dist/phase0/injection.js +77 -0
- package/dist/phase0/injection.js.map +1 -0
- package/dist/phase0/java-role-discovery.d.ts +6 -0
- package/dist/phase0/java-role-discovery.js +90 -0
- package/dist/phase0/java-role-discovery.js.map +1 -0
- package/dist/phase0/messages.d.ts +2 -0
- package/dist/phase0/messages.js +30 -0
- package/dist/phase0/messages.js.map +1 -0
- package/dist/phase0/policy-overlay.d.ts +12 -0
- package/dist/phase0/policy-overlay.js +171 -0
- package/dist/phase0/policy-overlay.js.map +1 -0
- package/dist/phase0/project-profile.d.ts +1 -0
- package/dist/phase0/project-profile.js +148 -0
- package/dist/phase0/project-profile.js.map +1 -0
- package/dist/phase0/rule-catalog.d.ts +14 -0
- package/dist/phase0/rule-catalog.js +77 -0
- package/dist/phase0/rule-catalog.js.map +1 -0
- package/dist/phase0/rule-diagnostics-report.d.ts +17 -0
- package/dist/phase0/rule-diagnostics-report.js +51 -0
- package/dist/phase0/rule-diagnostics-report.js.map +1 -0
- package/dist/phase0/rule-frontmatter-diagnostics.d.ts +19 -0
- package/dist/phase0/rule-frontmatter-diagnostics.js +65 -0
- package/dist/phase0/rule-frontmatter-diagnostics.js.map +1 -0
- package/dist/phase0/rule-frontmatter.d.ts +23 -0
- package/dist/phase0/rule-frontmatter.js +172 -0
- package/dist/phase0/rule-frontmatter.js.map +1 -0
- package/dist/phase0/rule-glob.d.ts +2 -0
- package/dist/phase0/rule-glob.js +38 -0
- package/dist/phase0/rule-glob.js.map +1 -0
- package/dist/phase0/rule-loader.d.ts +13 -0
- package/dist/phase0/rule-loader.js +143 -0
- package/dist/phase0/rule-loader.js.map +1 -0
- package/dist/phase0/shared-skill-router.d.ts +14 -0
- package/dist/phase0/shared-skill-router.js +85 -0
- package/dist/phase0/shared-skill-router.js.map +1 -0
- package/dist/phase0/store.d.ts +6 -0
- package/dist/phase0/store.js +14 -0
- package/dist/phase0/store.js.map +1 -0
- package/dist/phase0/target-file.d.ts +2 -0
- package/dist/phase0/target-file.js +41 -0
- package/dist/phase0/target-file.js.map +1 -0
- package/dist/phase0/types.d.ts +38 -0
- package/dist/phase0/types.js +2 -0
- package/dist/phase0/types.js.map +1 -0
- package/dist/phase1/observer/controller-repository-observer.d.ts +17 -0
- package/dist/phase1/observer/controller-repository-observer.js +210 -0
- package/dist/phase1/observer/controller-repository-observer.js.map +1 -0
- package/dist/phase1/observer/controller-sql-observer.d.ts +20 -0
- package/dist/phase1/observer/controller-sql-observer.js +148 -0
- package/dist/phase1/observer/controller-sql-observer.js.map +1 -0
- package/dist/phase1/observer/java-source.d.ts +9 -0
- package/dist/phase1/observer/java-source.js +88 -0
- package/dist/phase1/observer/java-source.js.map +1 -0
- package/dist/phase1/observer/report.d.ts +52 -0
- package/dist/phase1/observer/report.js +173 -0
- package/dist/phase1/observer/report.js.map +1 -0
- package/dist/phase1/observer/service-storage-observer.d.ts +20 -0
- package/dist/phase1/observer/service-storage-observer.js +155 -0
- package/dist/phase1/observer/service-storage-observer.js.map +1 -0
- package/dist/phase1/observer/test-contract-anchor-matchers.d.ts +10 -0
- package/dist/phase1/observer/test-contract-anchor-matchers.js +198 -0
- package/dist/phase1/observer/test-contract-anchor-matchers.js.map +1 -0
- package/dist/phase1/observer/test-contract-observer.d.ts +21 -0
- package/dist/phase1/observer/test-contract-observer.js +70 -0
- package/dist/phase1/observer/test-contract-observer.js.map +1 -0
- package/docs/README.md +34 -0
- package/docs/current/README.md +35 -0
- package/docs/current/java-backend-mvp-install-guide.md +160 -0
- package/docs/current/persona-harness-detailed-usage.md +782 -0
- package/docs/current/release/README.md +6 -0
- package/docs/current/release/release-checklist.md +113 -0
- package/docs/current/release/release-notes-template.md +68 -0
- package/docs/current/v0.3.0-alpha-publish-readiness.md +185 -0
- package/docs/current/v0.3.0-external-tester-feedback-template.md +214 -0
- package/docs/current/v0.3.0-external-tester-guide.md +217 -0
- package/docs/current/v0.3.0-gradle-spring-build-guidance.md +100 -0
- package/package.json +87 -0
- package/packages/shared-skills/skills/programming/SKILL.md +490 -0
- package/packages/shared-skills/skills/programming/references/java/README.md +193 -0
- package/packages/shared-skills/skills/programming/references/java/anti-patterns.md +85 -0
- package/packages/shared-skills/skills/programming/references/java/application-layer.md +200 -0
- package/packages/shared-skills/skills/programming/references/java/architecture.md +152 -0
- package/packages/shared-skills/skills/programming/references/java/backend.md +152 -0
- package/packages/shared-skills/skills/programming/references/java/code-quality-refactoring.md +146 -0
- package/packages/shared-skills/skills/programming/references/java/concurrency-discipline.md +98 -0
- package/packages/shared-skills/skills/programming/references/java/domain-model.md +214 -0
- package/packages/shared-skills/skills/programming/references/java/error-handling.md +179 -0
- package/packages/shared-skills/skills/programming/references/java/foundations.md +49 -0
- package/packages/shared-skills/skills/programming/references/java/java-idioms.md +108 -0
- package/packages/shared-skills/skills/programming/references/java/language-core.md +96 -0
- package/packages/shared-skills/skills/programming/references/java/method-and-naming.md +164 -0
- package/packages/shared-skills/skills/programming/references/java/object-collaboration.md +140 -0
- package/packages/shared-skills/skills/programming/references/java/performance-discipline.md +115 -0
- package/packages/shared-skills/skills/programming/references/java/repository-pattern.md +181 -0
- package/packages/shared-skills/skills/programming/references/java/technology-seams.md +92 -0
- package/packages/shared-skills/skills/programming/references/java/test-design.md +149 -0
- package/packages/shared-skills/skills/programming/references/java/testing.md +188 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { malformedFrontmatter, validateRuleFrontmatter, } from "./rule-frontmatter-diagnostics.js";
|
|
2
|
+
const STEP1_API_CONTRACT_RULE = "backend/step1-api-contract.md";
|
|
3
|
+
const STEP2_3_API_CONTRACT_RULE = "backend/step2-3-api-contract.md";
|
|
4
|
+
export function extractBulletPolicies(markdown) {
|
|
5
|
+
const body = markdown.startsWith("---") ? markdown.split("---").slice(2).join("---") : markdown;
|
|
6
|
+
return body
|
|
7
|
+
.split("\n")
|
|
8
|
+
.map((line) => line.trim())
|
|
9
|
+
.filter((line) => line.startsWith("- "))
|
|
10
|
+
.map((line) => line.slice(2).replace(/`/g, ""));
|
|
11
|
+
}
|
|
12
|
+
function scenarioForRulePath(rulePath) {
|
|
13
|
+
if (rulePath === STEP1_API_CONTRACT_RULE) {
|
|
14
|
+
return "step1";
|
|
15
|
+
}
|
|
16
|
+
if (rulePath === STEP2_3_API_CONTRACT_RULE) {
|
|
17
|
+
return "step2-3";
|
|
18
|
+
}
|
|
19
|
+
return "all";
|
|
20
|
+
}
|
|
21
|
+
function parseSupportedField(rawKey) {
|
|
22
|
+
if (rawKey === "id")
|
|
23
|
+
return "id";
|
|
24
|
+
if (rawKey === "source")
|
|
25
|
+
return "source";
|
|
26
|
+
if (rawKey === "domain")
|
|
27
|
+
return "domain";
|
|
28
|
+
if (rawKey === "topic")
|
|
29
|
+
return "topic";
|
|
30
|
+
if (rawKey === "globs")
|
|
31
|
+
return "globs";
|
|
32
|
+
if (rawKey === "scenario")
|
|
33
|
+
return "scenario";
|
|
34
|
+
if (rawKey === "severity")
|
|
35
|
+
return "severity";
|
|
36
|
+
if (rawKey === "max_bullets")
|
|
37
|
+
return "max_bullets";
|
|
38
|
+
if (rawKey === "enforcement")
|
|
39
|
+
return "enforcement";
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
function cleanScalar(value) {
|
|
43
|
+
const trimmed = value.trim();
|
|
44
|
+
const first = trimmed.at(0);
|
|
45
|
+
const last = trimmed.at(-1);
|
|
46
|
+
if (trimmed.length >= 2 && ((first === '"' && last === '"') || (first === "'" && last === "'"))) {
|
|
47
|
+
return trimmed.slice(1, -1);
|
|
48
|
+
}
|
|
49
|
+
return trimmed;
|
|
50
|
+
}
|
|
51
|
+
function isRuleScenario(value) {
|
|
52
|
+
return value === "step1" || value === "step2-3" || value === "all";
|
|
53
|
+
}
|
|
54
|
+
function parseScenario(value, fallback) {
|
|
55
|
+
if (isRuleScenario(value)) {
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
return fallback;
|
|
59
|
+
}
|
|
60
|
+
function parsePositiveInteger(value) {
|
|
61
|
+
if (value === undefined) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const parsed = Number(value);
|
|
65
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
66
|
+
}
|
|
67
|
+
function parseSeverity(value) {
|
|
68
|
+
if (value === "must" || value === "should" || value === "prefer") {
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
function addListValue(field, value, globs) {
|
|
74
|
+
if (field === "globs") {
|
|
75
|
+
globs.push(value);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export function fallbackRuleMetadata(rulePath) {
|
|
79
|
+
return { id: rulePath, globs: [], scenario: scenarioForRulePath(rulePath) };
|
|
80
|
+
}
|
|
81
|
+
export function parseRuleFrontmatter(rulePath, markdown) {
|
|
82
|
+
const lines = markdown.split("\n");
|
|
83
|
+
let id;
|
|
84
|
+
let source;
|
|
85
|
+
let domain;
|
|
86
|
+
let topic;
|
|
87
|
+
const globs = [];
|
|
88
|
+
let scenarioValue;
|
|
89
|
+
let severityValue;
|
|
90
|
+
let severity;
|
|
91
|
+
let maxBullets;
|
|
92
|
+
let enforcement;
|
|
93
|
+
let listField;
|
|
94
|
+
const malformedMessages = [];
|
|
95
|
+
if (lines[0] !== "---") {
|
|
96
|
+
return {
|
|
97
|
+
metadata: fallbackRuleMetadata(rulePath),
|
|
98
|
+
diagnostics: [malformedFrontmatter("Frontmatter block is missing an opening marker.")],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (!lines.slice(1).includes("---")) {
|
|
102
|
+
malformedMessages.push("Frontmatter block is missing a closing marker.");
|
|
103
|
+
}
|
|
104
|
+
for (const line of lines.slice(1)) {
|
|
105
|
+
if (line === "---") {
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
const listMatch = line.match(/^\s*-\s+(.*)$/);
|
|
109
|
+
if (listMatch?.[1] !== undefined && listField !== undefined) {
|
|
110
|
+
addListValue(listField, cleanScalar(listMatch[1]), globs);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const fieldMatch = line.match(/^([A-Za-z_][A-Za-z0-9_-]*):\s*(.*)$/);
|
|
114
|
+
if (fieldMatch?.[1] === undefined || fieldMatch[2] === undefined) {
|
|
115
|
+
listField = undefined;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const field = parseSupportedField(fieldMatch[1]);
|
|
119
|
+
const value = cleanScalar(fieldMatch[2]);
|
|
120
|
+
listField = value === "" ? field : undefined;
|
|
121
|
+
if (field === "id" && value !== "")
|
|
122
|
+
id = value;
|
|
123
|
+
if (field === "source" && value !== "")
|
|
124
|
+
source = value;
|
|
125
|
+
if (field === "domain" && value !== "")
|
|
126
|
+
domain = value;
|
|
127
|
+
if (field === "topic" && value !== "")
|
|
128
|
+
topic = value;
|
|
129
|
+
if (field === "scenario" && value !== "")
|
|
130
|
+
scenarioValue = value;
|
|
131
|
+
if (field === "severity" && value !== "") {
|
|
132
|
+
severityValue = value;
|
|
133
|
+
severity = parseSeverity(value);
|
|
134
|
+
}
|
|
135
|
+
if (field === "max_bullets")
|
|
136
|
+
maxBullets = parsePositiveInteger(value);
|
|
137
|
+
if (field === "enforcement" && value !== "")
|
|
138
|
+
enforcement = value;
|
|
139
|
+
if (field === "globs" && value !== "") {
|
|
140
|
+
addListValue(field, value, globs);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const diagnostics = validateRuleFrontmatter({
|
|
144
|
+
id,
|
|
145
|
+
source,
|
|
146
|
+
domain,
|
|
147
|
+
topic,
|
|
148
|
+
globs,
|
|
149
|
+
scenario: scenarioValue,
|
|
150
|
+
severity: severityValue,
|
|
151
|
+
enforcement,
|
|
152
|
+
malformedMessages,
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
metadata: {
|
|
156
|
+
id: id ?? rulePath,
|
|
157
|
+
source,
|
|
158
|
+
domain,
|
|
159
|
+
topic,
|
|
160
|
+
globs,
|
|
161
|
+
scenario: parseScenario(scenarioValue, scenarioForRulePath(rulePath)),
|
|
162
|
+
severity,
|
|
163
|
+
maxBullets,
|
|
164
|
+
enforcement,
|
|
165
|
+
},
|
|
166
|
+
diagnostics,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
export function parseRuleMetadata(rulePath, markdown) {
|
|
170
|
+
return parseRuleFrontmatter(rulePath, markdown).metadata;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=rule-frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-frontmatter.js","sourceRoot":"","sources":["../../src/phase0/rule-frontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function normalizePath(path) {
|
|
2
|
+
return path.replace(/\\/g, "/");
|
|
3
|
+
}
|
|
4
|
+
function escapeRegExp(value) {
|
|
5
|
+
return value.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
6
|
+
}
|
|
7
|
+
function globToRegExp(glob) {
|
|
8
|
+
let pattern = "^";
|
|
9
|
+
for (let index = 0; index < glob.length; index += 1) {
|
|
10
|
+
const current = glob[index];
|
|
11
|
+
const next = glob[index + 1];
|
|
12
|
+
const afterNext = glob[index + 2];
|
|
13
|
+
if (current === "*" && next === "*" && afterNext === "/") {
|
|
14
|
+
pattern += "(?:.*/)?";
|
|
15
|
+
index += 2;
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (current === "*" && next === "*") {
|
|
19
|
+
pattern += ".*";
|
|
20
|
+
index += 1;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (current === "*") {
|
|
24
|
+
pattern += "[^/]*";
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (current === "?") {
|
|
28
|
+
pattern += "[^/]";
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
pattern += escapeRegExp(current ?? "");
|
|
32
|
+
}
|
|
33
|
+
return new RegExp(`${pattern}$`);
|
|
34
|
+
}
|
|
35
|
+
export function matchesAnyGlob(globs, targetPath) {
|
|
36
|
+
return globs.length === 0 || globs.some((glob) => globToRegExp(glob).test(targetPath));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=rule-glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-glob.js","sourceRoot":"","sources":["../../src/phase0/rule-glob.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAA;AACnD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,OAAO,GAAG,GAAG,CAAA;IACjB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QAEjC,IAAI,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACzD,OAAO,IAAI,UAAU,CAAA;YACrB,KAAK,IAAI,CAAC,CAAA;YACV,SAAQ;QACV,CAAC;QACD,IAAI,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACpC,OAAO,IAAI,IAAI,CAAA;YACf,KAAK,IAAI,CAAC,CAAA;YACV,SAAQ;QACV,CAAC;QACD,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,OAAO,IAAI,OAAO,CAAA;YAClB,SAAQ;QACV,CAAC;QACD,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,OAAO,IAAI,MAAM,CAAA;YACjB,SAAQ;QACV,CAAC;QACD,OAAO,IAAI,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAwB,EAAE,UAAkB;IACzE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;AACxF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FileRole } from "./types.js";
|
|
2
|
+
import { type Phase0Scenario } from "./rule-catalog.js";
|
|
3
|
+
import { type RuleMetadata } from "./rule-frontmatter.js";
|
|
4
|
+
import type { RuleFrontmatterDiagnostic } from "./rule-frontmatter-diagnostics.js";
|
|
5
|
+
export type { Phase0Scenario } from "./rule-catalog.js";
|
|
6
|
+
export type LoadedRule = {
|
|
7
|
+
readonly path: string;
|
|
8
|
+
readonly metadata: RuleMetadata;
|
|
9
|
+
readonly diagnostics: readonly RuleFrontmatterDiagnostic[];
|
|
10
|
+
readonly policies: readonly string[];
|
|
11
|
+
};
|
|
12
|
+
export declare function selectRulePaths(fileRole: FileRole, scenario?: Phase0Scenario): string[];
|
|
13
|
+
export declare function loadRulesForRole(projectDir: string, fileRole: FileRole, targetFile?: string): LoadedRule[];
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { loadHarnessConfig, resolveConfiguredPath } from "./harness-config.js";
|
|
4
|
+
import { isRuleEligibleForTarget, loadRuleCatalog, targetPathForMatching, } from "./rule-catalog.js";
|
|
5
|
+
import { extractBulletPolicies, fallbackRuleMetadata } from "./rule-frontmatter.js";
|
|
6
|
+
const DEFAULT_SCENARIO = "step1";
|
|
7
|
+
const STEP1_API_CONTRACT_RULE = "backend/step1-api-contract.md";
|
|
8
|
+
const STEP2_3_API_CONTRACT_RULE = "backend/step2-3-api-contract.md";
|
|
9
|
+
const CONTRACT_RULE_ROLES = new Set(["controller", "request-dto", "response-dto", "test"]);
|
|
10
|
+
const COMMON_RULES = [
|
|
11
|
+
"clean-code/common.md",
|
|
12
|
+
"clean-code/method-design.md",
|
|
13
|
+
"backend/java-common.md",
|
|
14
|
+
];
|
|
15
|
+
const ROLE_RULES = {
|
|
16
|
+
controller: ["backend/spring-controller.md", "backend/spring-dto.md", STEP1_API_CONTRACT_RULE],
|
|
17
|
+
service: ["backend/spring-service.md", "backend/validation-exception.md"],
|
|
18
|
+
repository: ["backend/spring-repository.md"],
|
|
19
|
+
entity: ["clean-code/oop.md", "backend/spring-entity.md"],
|
|
20
|
+
domain: ["clean-code/oop.md", "backend/layered-architecture.md"],
|
|
21
|
+
"request-dto": ["backend/spring-dto.md", STEP1_API_CONTRACT_RULE],
|
|
22
|
+
"response-dto": ["backend/spring-dto.md", STEP1_API_CONTRACT_RULE],
|
|
23
|
+
exception: ["backend/validation-exception.md"],
|
|
24
|
+
test: ["clean-code/testability.md", "backend/spring-test.md", STEP1_API_CONTRACT_RULE],
|
|
25
|
+
"java-common": ["clean-code/abstraction.md", "backend/layered-architecture.md"],
|
|
26
|
+
"project-bootstrap": ["backend/java-backend-bootstrap.md"],
|
|
27
|
+
"requirements-bootstrap": ["backend/java-backend-bootstrap.md"],
|
|
28
|
+
"gradle-bootstrap": ["backend/gradle-bootstrap.md", "backend/java-backend-bootstrap.md"],
|
|
29
|
+
};
|
|
30
|
+
function isRuleFileRole(fileRole) {
|
|
31
|
+
switch (fileRole) {
|
|
32
|
+
case "controller":
|
|
33
|
+
case "service":
|
|
34
|
+
case "repository":
|
|
35
|
+
case "entity":
|
|
36
|
+
case "domain":
|
|
37
|
+
case "request-dto":
|
|
38
|
+
case "response-dto":
|
|
39
|
+
case "exception":
|
|
40
|
+
case "test":
|
|
41
|
+
case "java-common":
|
|
42
|
+
case "project-bootstrap":
|
|
43
|
+
case "requirements-bootstrap":
|
|
44
|
+
case "gradle-bootstrap":
|
|
45
|
+
return true;
|
|
46
|
+
case "typescript":
|
|
47
|
+
case "frontend":
|
|
48
|
+
case "infra":
|
|
49
|
+
case "shared-skill":
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function takePoliciesForInjection(rulePath, policies, maxBullets) {
|
|
54
|
+
if (maxBullets !== undefined) {
|
|
55
|
+
return policies.slice(0, maxBullets);
|
|
56
|
+
}
|
|
57
|
+
if (rulePath === STEP1_API_CONTRACT_RULE || rulePath === STEP2_3_API_CONTRACT_RULE) {
|
|
58
|
+
return policies.slice(0, 3);
|
|
59
|
+
}
|
|
60
|
+
if (rulePath === "backend/layered-architecture.md") {
|
|
61
|
+
return policies.slice(0, 4);
|
|
62
|
+
}
|
|
63
|
+
if (rulePath === "backend/java-common.md") {
|
|
64
|
+
return policies.slice(0, 3);
|
|
65
|
+
}
|
|
66
|
+
if (rulePath === "backend/java-backend-bootstrap.md") {
|
|
67
|
+
return policies.slice(0, 8);
|
|
68
|
+
}
|
|
69
|
+
if (rulePath === "backend/gradle-bootstrap.md") {
|
|
70
|
+
return policies.slice(0, 4);
|
|
71
|
+
}
|
|
72
|
+
const limit = rulePath === "clean-code/method-design.md" ? 1 : 2;
|
|
73
|
+
return policies.slice(0, limit);
|
|
74
|
+
}
|
|
75
|
+
function contractRuleForScenario(scenario) {
|
|
76
|
+
return scenario === "step2-3" ? STEP2_3_API_CONTRACT_RULE : STEP1_API_CONTRACT_RULE;
|
|
77
|
+
}
|
|
78
|
+
function isStepContractRule(rulePath) {
|
|
79
|
+
return rulePath === STEP1_API_CONTRACT_RULE || rulePath === STEP2_3_API_CONTRACT_RULE;
|
|
80
|
+
}
|
|
81
|
+
function isRoomescapeStepFixtureTarget(targetPath) {
|
|
82
|
+
const normalizedTargetPath = targetPath.toLowerCase();
|
|
83
|
+
return normalizedTargetPath.startsWith("roomescape/") || normalizedTargetPath.includes("/roomescape/");
|
|
84
|
+
}
|
|
85
|
+
function isRulePathInTargetScope(rulePath, targetPath) {
|
|
86
|
+
if (!isStepContractRule(rulePath)) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
return isRoomescapeStepFixtureTarget(targetPath);
|
|
90
|
+
}
|
|
91
|
+
function scenarioAwareRoleRules(fileRole, scenario) {
|
|
92
|
+
if (!isRuleFileRole(fileRole)) {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
const roleRules = ROLE_RULES[fileRole];
|
|
96
|
+
if (!CONTRACT_RULE_ROLES.has(fileRole)) {
|
|
97
|
+
return roleRules;
|
|
98
|
+
}
|
|
99
|
+
const contractRule = contractRuleForScenario(scenario);
|
|
100
|
+
return roleRules.map((rulePath) => (rulePath === STEP1_API_CONTRACT_RULE ? contractRule : rulePath));
|
|
101
|
+
}
|
|
102
|
+
export function selectRulePaths(fileRole, scenario = DEFAULT_SCENARIO) {
|
|
103
|
+
if (!isRuleFileRole(fileRole)) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
return Array.from(new Set([...COMMON_RULES, ...scenarioAwareRoleRules(fileRole, scenario)]));
|
|
107
|
+
}
|
|
108
|
+
export function loadRulesForRole(projectDir, fileRole, targetFile) {
|
|
109
|
+
const config = loadHarnessConfig(projectDir);
|
|
110
|
+
const scenario = config.scenario;
|
|
111
|
+
const targetPath = targetPathForMatching(projectDir, fileRole, targetFile);
|
|
112
|
+
const catalog = new Map(loadRuleCatalog(projectDir).map((entry) => [entry.path, entry]));
|
|
113
|
+
const rulesDir = resolveConfiguredPath(projectDir, config.rulesDir);
|
|
114
|
+
return selectRulePaths(fileRole, scenario).flatMap((rulePath) => {
|
|
115
|
+
if (!isRulePathInTargetScope(rulePath, targetPath)) {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
const catalogEntry = catalog.get(rulePath);
|
|
119
|
+
if (catalogEntry !== undefined) {
|
|
120
|
+
if (!isRuleEligibleForTarget(catalogEntry, fileRole, scenario, targetPath)) {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
path: rulePath,
|
|
125
|
+
metadata: catalogEntry.metadata,
|
|
126
|
+
diagnostics: catalogEntry.diagnostics,
|
|
127
|
+
policies: takePoliciesForInjection(rulePath, catalogEntry.policies, catalogEntry.metadata.maxBullets),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const absolutePath = join(rulesDir, rulePath);
|
|
131
|
+
const metadata = fallbackRuleMetadata(rulePath);
|
|
132
|
+
if (!existsSync(absolutePath)) {
|
|
133
|
+
return { path: rulePath, metadata, diagnostics: [], policies: [] };
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
path: rulePath,
|
|
137
|
+
metadata,
|
|
138
|
+
diagnostics: [],
|
|
139
|
+
policies: takePoliciesForInjection(rulePath, extractBulletPolicies(readFileSync(absolutePath, "utf8"))),
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=rule-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-loader.js","sourceRoot":"","sources":["../../src/phase0/rule-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FileRole } from "./types.js";
|
|
2
|
+
export declare const ACTIVE_SHARED_SKILL_NAMES: readonly ["programming", "frontend"];
|
|
3
|
+
export declare const INACTIVE_VENDORED_SHARED_SKILL_NAMES: readonly ["debugging", "visual-qa", "ast-grep", "git-master", "refactor", "review-work", "start-work", "ulw-plan", "ultraresearch", "init-deep", "remove-ai-slops", "lsp-setup"];
|
|
4
|
+
export declare const REMOVED_SHARED_SKILL_NAMES: readonly ["lcx-report-bug", "lcx-contribute-bug-fix", "lcx-doctor"];
|
|
5
|
+
export type SharedSkillDomain = "programming" | "frontend";
|
|
6
|
+
export type SharedSkillName = (typeof ACTIVE_SHARED_SKILL_NAMES)[number];
|
|
7
|
+
export type SelectedSharedSkill = {
|
|
8
|
+
readonly name: SharedSkillName;
|
|
9
|
+
readonly domain: SharedSkillDomain;
|
|
10
|
+
readonly path: string;
|
|
11
|
+
readonly reason: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function selectSharedSkillsForTarget(targetFile: string): readonly SelectedSharedSkill[];
|
|
14
|
+
export declare function resolveSharedSkillFileRole(selectedSkills: readonly SelectedSharedSkill[], targetFile?: string): FileRole;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export const ACTIVE_SHARED_SKILL_NAMES = ["programming", "frontend"];
|
|
2
|
+
export const INACTIVE_VENDORED_SHARED_SKILL_NAMES = [
|
|
3
|
+
"debugging",
|
|
4
|
+
"visual-qa",
|
|
5
|
+
"ast-grep",
|
|
6
|
+
"git-master",
|
|
7
|
+
"refactor",
|
|
8
|
+
"review-work",
|
|
9
|
+
"start-work",
|
|
10
|
+
"ulw-plan",
|
|
11
|
+
"ultraresearch",
|
|
12
|
+
"init-deep",
|
|
13
|
+
"remove-ai-slops",
|
|
14
|
+
"lsp-setup",
|
|
15
|
+
];
|
|
16
|
+
export const REMOVED_SHARED_SKILL_NAMES = ["lcx-report-bug", "lcx-contribute-bug-fix", "lcx-doctor"];
|
|
17
|
+
const TYPESCRIPT_FILE_PATTERN = /\.(ts|tsx|mts|cts)$/i;
|
|
18
|
+
const JAVA_FILE_PATTERN = /\.java$/i;
|
|
19
|
+
const GRADLE_BUILD_FILE_PATTERN = /(^|\/)(build|settings)\.gradle(\.kts)?$/i;
|
|
20
|
+
const REACT_FILE_PATTERN = /\.tsx$/i;
|
|
21
|
+
const FRONTEND_PATH_PATTERN = /(^|\/)(app|components|frontend|pages|routes|ui|web)(\/|$)/i;
|
|
22
|
+
const INFRA_FILE_PATTERN = /(^|\/)(Dockerfile|docker-compose\.ya?ml|.*\.(tf|tfvars|ya?ml))$/i;
|
|
23
|
+
function normalizePath(targetFile) {
|
|
24
|
+
return targetFile.replace(/\\/g, "/");
|
|
25
|
+
}
|
|
26
|
+
function isTypeScriptTarget(normalizedPath) {
|
|
27
|
+
return TYPESCRIPT_FILE_PATTERN.test(normalizedPath);
|
|
28
|
+
}
|
|
29
|
+
function isJavaProgrammingTarget(normalizedPath) {
|
|
30
|
+
return JAVA_FILE_PATTERN.test(normalizedPath) || GRADLE_BUILD_FILE_PATTERN.test(normalizedPath);
|
|
31
|
+
}
|
|
32
|
+
function isGradleBuildFile(normalizedPath) {
|
|
33
|
+
return GRADLE_BUILD_FILE_PATTERN.test(normalizedPath);
|
|
34
|
+
}
|
|
35
|
+
function isFrontendTarget(normalizedPath) {
|
|
36
|
+
return REACT_FILE_PATTERN.test(normalizedPath) || FRONTEND_PATH_PATTERN.test(normalizedPath);
|
|
37
|
+
}
|
|
38
|
+
function isInfraTarget(normalizedPath) {
|
|
39
|
+
return INFRA_FILE_PATTERN.test(normalizedPath);
|
|
40
|
+
}
|
|
41
|
+
export function selectSharedSkillsForTarget(targetFile) {
|
|
42
|
+
const normalizedPath = normalizePath(targetFile);
|
|
43
|
+
const selected = [];
|
|
44
|
+
if (isTypeScriptTarget(normalizedPath) || isJavaProgrammingTarget(normalizedPath)) {
|
|
45
|
+
selected.push({
|
|
46
|
+
name: "programming",
|
|
47
|
+
domain: "programming",
|
|
48
|
+
path: "packages/shared-skills/skills/programming/SKILL.md",
|
|
49
|
+
reason: isJavaProgrammingTarget(normalizedPath)
|
|
50
|
+
? isGradleBuildFile(normalizedPath)
|
|
51
|
+
? "Gradle Java build file detected; apply shared programming discipline."
|
|
52
|
+
: "Java target detected; apply shared programming discipline."
|
|
53
|
+
: "TypeScript target detected; apply shared programming discipline.",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
if (isTypeScriptTarget(normalizedPath) && isFrontendTarget(normalizedPath)) {
|
|
57
|
+
selected.push({
|
|
58
|
+
name: "frontend",
|
|
59
|
+
domain: "frontend",
|
|
60
|
+
path: "packages/shared-skills/skills/frontend/SKILL.md",
|
|
61
|
+
reason: "React/frontend TypeScript target detected; apply frontend guidance as an overlay.",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (isInfraTarget(normalizedPath)) {
|
|
65
|
+
return selected;
|
|
66
|
+
}
|
|
67
|
+
return selected;
|
|
68
|
+
}
|
|
69
|
+
export function resolveSharedSkillFileRole(selectedSkills, targetFile = "") {
|
|
70
|
+
const normalizedPath = normalizePath(targetFile);
|
|
71
|
+
if (isInfraTarget(normalizedPath)) {
|
|
72
|
+
return "infra";
|
|
73
|
+
}
|
|
74
|
+
if (selectedSkills.some((skill) => skill.domain === "frontend")) {
|
|
75
|
+
return "frontend";
|
|
76
|
+
}
|
|
77
|
+
if (isJavaProgrammingTarget(normalizedPath)) {
|
|
78
|
+
return "java-common";
|
|
79
|
+
}
|
|
80
|
+
if (selectedSkills.some((skill) => skill.domain === "programming")) {
|
|
81
|
+
return "typescript";
|
|
82
|
+
}
|
|
83
|
+
return "shared-skill";
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=shared-skill-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-skill-router.js","sourceRoot":"","sources":["../../src/phase0/shared-skill-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export class PendingInjectionStore {
|
|
2
|
+
pendingBySession = new Map();
|
|
3
|
+
set(sessionId, injection) {
|
|
4
|
+
this.pendingBySession.set(sessionId, injection);
|
|
5
|
+
}
|
|
6
|
+
take(sessionId) {
|
|
7
|
+
const injection = this.pendingBySession.get(sessionId);
|
|
8
|
+
if (injection) {
|
|
9
|
+
this.pendingBySession.delete(sessionId);
|
|
10
|
+
}
|
|
11
|
+
return injection;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/phase0/store.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,qBAAqB;IACf,gBAAgB,GAAG,IAAI,GAAG,EAA4B,CAAA;IAEvE,GAAG,CAAC,SAAiB,EAAE,SAA2B;QAChD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,CAAC,SAAiB;QACpB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACtD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACzC,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const TARGET_FILE_ARG_NAMES = [
|
|
2
|
+
"targetFile",
|
|
3
|
+
"filePath",
|
|
4
|
+
"filepath",
|
|
5
|
+
"file_path",
|
|
6
|
+
"path",
|
|
7
|
+
"file",
|
|
8
|
+
];
|
|
9
|
+
const TARGETING_TOOL_NAMES = new Set([
|
|
10
|
+
"read",
|
|
11
|
+
"edit",
|
|
12
|
+
"write",
|
|
13
|
+
"patch",
|
|
14
|
+
"multiedit",
|
|
15
|
+
"multi_edit",
|
|
16
|
+
]);
|
|
17
|
+
const INSTALLED_PERSONA_HARNESS_PACKAGE_PATTERN = /(^|\/)node_modules\/persona-harness\//;
|
|
18
|
+
function normalizePath(targetFile) {
|
|
19
|
+
return targetFile.replace(/\\/g, "/");
|
|
20
|
+
}
|
|
21
|
+
export function isInstalledPersonaHarnessPackageFile(targetFile) {
|
|
22
|
+
return INSTALLED_PERSONA_HARNESS_PACKAGE_PATTERN.test(normalizePath(targetFile));
|
|
23
|
+
}
|
|
24
|
+
export function extractTargetFile(toolName, args) {
|
|
25
|
+
const normalizedToolName = toolName.toLowerCase();
|
|
26
|
+
const mayTargetFile = TARGETING_TOOL_NAMES.has(normalizedToolName) ||
|
|
27
|
+
normalizedToolName.includes("read") ||
|
|
28
|
+
normalizedToolName.includes("edit") ||
|
|
29
|
+
normalizedToolName.includes("write");
|
|
30
|
+
if (!mayTargetFile) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
for (const argName of TARGET_FILE_ARG_NAMES) {
|
|
34
|
+
const value = args[argName];
|
|
35
|
+
if (typeof value === "string" && value.trim().length > 0) {
|
|
36
|
+
return value.trim();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=target-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target-file.js","sourceRoot":"","sources":["../../src/phase0/target-file.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAAG;IAC5B,YAAY;IACZ,UAAU;IACV,UAAU;IACV,WAAW;IACX,MAAM;IACN,MAAM;CACE,CAAA;AAEV,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,WAAW;IACX,YAAY;CACb,CAAC,CAAA;AAEF,MAAM,yCAAyC,GAAG,uCAAuC,CAAA;AAEzF,SAAS,aAAa,CAAC,UAAkB;IACvC,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,UAAkB;IACrE,OAAO,yCAAyC,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,IAA6B;IAC/E,MAAM,kBAAkB,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;IACjD,MAAM,aAAa,GACjB,oBAAoB,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC5C,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnC,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEtC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAA;QACrB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Hooks } from "@opencode-ai/plugin";
|
|
2
|
+
export type FileRole = "controller" | "service" | "repository" | "entity" | "domain" | "request-dto" | "response-dto" | "exception" | "test" | "java-common" | "project-bootstrap" | "requirements-bootstrap" | "gradle-bootstrap" | "typescript" | "frontend" | "infra" | "shared-skill";
|
|
3
|
+
export type SelectedSharedSkill = {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly domain: string;
|
|
6
|
+
readonly path: string;
|
|
7
|
+
readonly reason: string;
|
|
8
|
+
};
|
|
9
|
+
export type SelectedPolicyOverlay = {
|
|
10
|
+
readonly enabled: boolean;
|
|
11
|
+
readonly sources: readonly ("company" | "personal")[];
|
|
12
|
+
readonly diagnostics: readonly string[];
|
|
13
|
+
};
|
|
14
|
+
export type PendingInjection = {
|
|
15
|
+
readonly targetFile: string;
|
|
16
|
+
readonly fileRole: FileRole;
|
|
17
|
+
readonly selectedRules: string[];
|
|
18
|
+
readonly selectedRuleMetadata: SelectedRuleMetadata[];
|
|
19
|
+
readonly selectedSharedSkills: readonly SelectedSharedSkill[];
|
|
20
|
+
readonly selectedPolicyOverlay: SelectedPolicyOverlay;
|
|
21
|
+
readonly policies: string[];
|
|
22
|
+
readonly block: string;
|
|
23
|
+
};
|
|
24
|
+
export type SelectedRuleMetadata = {
|
|
25
|
+
readonly path: string;
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly source?: string;
|
|
28
|
+
readonly domain?: string;
|
|
29
|
+
readonly topic?: string;
|
|
30
|
+
readonly severity?: string;
|
|
31
|
+
};
|
|
32
|
+
type HookHandler<T> = NonNullable<T>;
|
|
33
|
+
export type ToolBeforeInput = Parameters<HookHandler<Hooks["tool.execute.before"]>>[0];
|
|
34
|
+
export type ToolBeforeOutput = Parameters<HookHandler<Hooks["tool.execute.before"]>>[1];
|
|
35
|
+
export type ToolAfterInput = Parameters<HookHandler<Hooks["tool.execute.after"]>>[0];
|
|
36
|
+
export type ToolAfterOutput = Parameters<HookHandler<Hooks["tool.execute.after"]>>[1];
|
|
37
|
+
export type TransformMessagesOutput = Parameters<HookHandler<Hooks["experimental.chat.messages.transform"]>>[1];
|
|
38
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/phase0/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type ObserverFinding = "PASS" | "WARN" | "UNKNOWN";
|
|
2
|
+
export type ControllerRepositoryEvidence = {
|
|
3
|
+
readonly imports: readonly string[];
|
|
4
|
+
readonly fields: readonly string[];
|
|
5
|
+
readonly constructorParameters: readonly string[];
|
|
6
|
+
readonly methodCalls: readonly string[];
|
|
7
|
+
};
|
|
8
|
+
export type ControllerRepositoryObservation = {
|
|
9
|
+
readonly finding: ObserverFinding;
|
|
10
|
+
readonly evidence: ControllerRepositoryEvidence;
|
|
11
|
+
readonly limitations: readonly string[];
|
|
12
|
+
};
|
|
13
|
+
export type ObserveControllerRepositoryDependencyInput = {
|
|
14
|
+
readonly filePath: string;
|
|
15
|
+
readonly source: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function observeControllerRepositoryDependency(input: ObserveControllerRepositoryDependencyInput): ControllerRepositoryObservation;
|