@spences10/pi-harness 0.1.2 → 0.2.1

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.
@@ -3,25 +3,16 @@ import { harness_create_params_schema } from './schema.js';
3
3
  export const HARNESS_ASSESSMENT_CUSTOM_TYPE = 'pi-harness-assessment-state';
4
4
  export const harness_assess_params_schema = Type.Object({
5
5
  task: Type.String({
6
- description: 'Candidate task to investigate before choosing an execution path',
6
+ minLength: 1,
7
+ description: 'Optional investigation before choosing an execution path',
7
8
  }),
8
9
  });
9
10
  export const harness_assessment_submit_params_schema = Type.Object({
10
- task: Type.String({
11
- description: 'Refined outcome being assessed',
12
- }),
13
- evidence: Type.Array(Type.String({
14
- description: 'Concrete repository, documentation, or observed evidence',
15
- })),
16
- existing_primitives: Type.Array(Type.String({
17
- description: 'Existing mechanisms that already satisfy part or all of the need',
18
- })),
19
- rejected_options: Type.Array(Type.String({
20
- description: 'Rejected option and the evidence-based reason for rejection',
21
- })),
22
- smallest_vertical_slice: Type.String({
23
- description: 'Smallest useful outcome or experiment that can test the need',
24
- }),
11
+ task: Type.String(),
12
+ evidence: Type.Array(Type.String()),
13
+ existing_primitives: Type.Array(Type.String()),
14
+ rejected_options: Type.Array(Type.String()),
15
+ smallest_vertical_slice: Type.String(),
25
16
  recommendation: Type.Union([
26
17
  Type.Literal('harness'),
27
18
  Type.Literal('direct'),
@@ -29,204 +20,40 @@ export const harness_assessment_submit_params_schema = Type.Object({
29
20
  ]),
30
21
  proposed_contract: Type.Optional(harness_create_params_schema),
31
22
  });
32
- const ASSESSMENT_TOOL_NAMES = new Set([
33
- 'bash',
34
- 'context_get',
35
- 'context_list',
36
- 'context_search',
37
- 'context_stats',
38
- 'find',
39
- 'grep',
40
- 'harness_assess',
41
- 'harness_assessment_submit',
42
- 'harness_read',
43
- 'ls',
44
- 'lsp_definition',
45
- 'lsp_diagnostics',
46
- 'lsp_diagnostics_many',
47
- 'lsp_document_symbols',
48
- 'lsp_find_symbol',
49
- 'lsp_hover',
50
- 'lsp_references',
51
- 'mcp__mcp-omnisearch__ai_search',
52
- 'mcp__mcp-omnisearch__web_extract',
53
- 'mcp__mcp-omnisearch__web_search',
54
- 'mcp__mcp-sqlite-tools__close_database',
55
- 'mcp__mcp-sqlite-tools__database_info',
56
- 'mcp__mcp-sqlite-tools__describe_table',
57
- 'mcp__mcp-sqlite-tools__execute_read_query',
58
- 'mcp__mcp-sqlite-tools__export_schema',
59
- 'mcp__mcp-sqlite-tools__list_databases',
60
- 'mcp__mcp-sqlite-tools__list_tables',
61
- 'mcp__mcp-sqlite-tools__open_database',
62
- 'read',
63
- ]);
64
- const SAFE_COMMAND_PATTERNS = [
65
- /^(?:pwd|whoami|uname|date|uptime)(?:\s+.*)?$/,
66
- /^(?:cat|head|tail|less|more|grep|rg|ls|wc|sort|uniq|diff|file|stat|du|df|tree|which|whereis|type|bat|eza)(?:\s+.*)?$/,
67
- /^find(?:\s+.*)?$/,
68
- /^git\s+(?:status|log|diff|show|rev-parse|ls-files|ls-tree|grep)(?:\s+.*)?$/,
69
- /^git\s+branch(?:\s+(?:--list|-a|--all|-r|--remotes|--show-current|--contains|--merged|--no-merged)(?:\s+.*)?)?$/,
70
- /^git\s+remote(?:\s+(?:-v|show|get-url)(?:\s+.*)?)?$/,
71
- /^git\s+config\s+--get(?:\s+.*)?$/,
72
- /^gh\s+(?:issue\s+(?:list|view)|pr\s+(?:list|view|diff|checks)|repo\s+view)(?:\s+.*)?$/,
73
- /^gh\s+api(?:\s+.*)?$/,
74
- /^(?:npm|pnpm|yarn)\s+(?:list|ls|view|info|why|outdated)(?:\s+.*)?$/,
75
- /^(?:node|python|python3)\s+--version$/,
76
- /^jq(?:\s+.*)?$/,
77
- /^sed\s+-n(?:\s+.*)?$/,
78
- ];
79
- const UNSAFE_READ_COMMAND_PATTERNS = [
80
- /\bfind\b.*\s-(?:delete|exec|execdir|ok|okdir|fprint|fprintf|fls)\b/i,
81
- /\brg\b.*\s--pre(?:-glob)?\b/i,
82
- /\b(?:git\s+(?:log|diff|show)|sort)\b.*(?:\s--output(?:=|\s+)|\s-o\s+)/i,
83
- /\bsed\b.*\s-i(?:\s|$|[^a-z])/i,
84
- /\bgh\s+api\b.*(?:\s-X\s*|\s--method(?:=|\s+))(?!GET\b)/i,
85
- /\bgh\s+api\b.*(?:\s-f\s|\s-F\s|\s--field(?:=|\s+)|\s--raw-field(?:=|\s+))/i,
86
- /\bgit\s+branch\b.*\s-[dDmM]\b/i,
87
- ];
88
- export function create_assessment_state(task, source, tools_before_assessment, now = new Date()) {
89
- const normalized_task = task.trim();
90
- if (!normalized_task) {
23
+ export function create_assessment_state(task, source, tools_before_assessment = [], now = new Date()) {
24
+ if (!task.trim())
91
25
  throw new Error('Assessment task is required');
92
- }
93
26
  return {
94
27
  id: `assessment-${now.getTime().toString(36)}`,
95
28
  version: 1,
96
29
  status: 'assessing',
97
- task: normalized_task,
30
+ task: task.trim(),
98
31
  source,
99
32
  started_at: now.toISOString(),
100
- tools_before_assessment: [...new Set(tools_before_assessment)],
33
+ tools_before_assessment,
101
34
  };
102
35
  }
103
36
  export function submit_assessment_record(state, record) {
104
- if (record.recommendation === 'harness') {
105
- if (!record.proposed_contract) {
106
- throw new Error('A harness recommendation requires a proposed contract');
107
- }
108
- if (!record.proposed_contract.allowed_paths?.length) {
109
- throw new Error('An approved harness contract requires explicit allowed paths');
110
- }
111
- if (!record.proposed_contract.validation_commands?.length) {
112
- throw new Error('An approved harness contract requires validation commands');
113
- }
114
- }
115
37
  return {
116
38
  ...state,
117
39
  version: state.version + 1,
118
- status: 'awaiting_approval',
40
+ status: 'assessed',
119
41
  task: record.task.trim(),
120
42
  record,
121
- decision: undefined,
122
43
  };
123
44
  }
124
45
  export function assessment_active(state) {
125
- return (state?.status === 'assessing' ||
126
- state?.status === 'awaiting_approval');
127
- }
128
- export function assessment_tool_names(active_tool_names) {
129
- const read_tools = [...new Set(active_tool_names)].filter((name) => ASSESSMENT_TOOL_NAMES.has(name));
130
- return [
131
- ...new Set([
132
- ...read_tools,
133
- 'harness_assess',
134
- 'harness_assessment_submit',
135
- 'harness_read',
136
- ]),
137
- ];
138
- }
139
- export function is_assessment_tool_allowed(tool_name) {
140
- return ASSESSMENT_TOOL_NAMES.has(tool_name);
141
- }
142
- function has_unquoted_shell_control(command) {
143
- let quote;
144
- for (let index = 0; index < command.length; index++) {
145
- const character = command[index];
146
- const next = command[index + 1];
147
- if (quote === 'single') {
148
- if (character === "'")
149
- quote = undefined;
150
- continue;
151
- }
152
- if (quote === 'double') {
153
- if (character === '\\') {
154
- index++;
155
- continue;
156
- }
157
- if (character === '"') {
158
- quote = undefined;
159
- continue;
160
- }
161
- if (character === '`' || (character === '$' && next === '(')) {
162
- return true;
163
- }
164
- continue;
165
- }
166
- if (character === '\\') {
167
- index++;
168
- continue;
169
- }
170
- if (character === "'") {
171
- quote = 'single';
172
- continue;
173
- }
174
- if (character === '"') {
175
- quote = 'double';
176
- continue;
177
- }
178
- if (character === '\n' ||
179
- character === '\r' ||
180
- character === ';' ||
181
- character === '&' ||
182
- character === '|' ||
183
- character === '<' ||
184
- character === '>' ||
185
- character === '`' ||
186
- (character === '$' && next === '(')) {
187
- return true;
188
- }
189
- }
190
- return quote !== undefined;
191
- }
192
- export function check_assessment_command(command) {
193
- const normalized = command.trim();
194
- if (!normalized) {
195
- return { ok: false, reason: 'Assessment mode: empty command' };
196
- }
197
- if (has_unquoted_shell_control(normalized) ||
198
- UNSAFE_READ_COMMAND_PATTERNS.some((pattern) => pattern.test(normalized))) {
199
- return {
200
- ok: false,
201
- reason: 'Assessment mode: shell composition or a mutating command option is not allowed',
202
- };
203
- }
204
- if (!SAFE_COMMAND_PATTERNS.some((pattern) => pattern.test(normalized))) {
205
- return {
206
- ok: false,
207
- reason: 'Assessment mode: command is not in the read-only allowlist; use one read command per call',
208
- };
209
- }
210
- return { ok: true };
46
+ return state?.status === 'assessing';
211
47
  }
212
48
  export function assessment_context(state) {
213
- const approval = state.status === 'awaiting_approval'
214
- ? 'An assessment record is waiting for direct user approval. Do not start implementation or call harness_create.'
215
- : 'Investigate with read-only tools, then call harness_assessment_submit with one evidence-based recommendation.';
216
- return `## Active harness assessment\n\nAssessment: \`${state.id}\` v${state.version}\nTask: ${state.task}\n\nRepository mutation is disabled. Treat proposed capabilities as candidates, not tasks. Establish the current source of truth, find existing primitives, reject unsupported options, and define the smallest useful vertical slice. A harness contract is optional and is valid only when the evidence shows that an enforceable execution contract adds value. Bash accepts one allowlisted read command per call; use the dedicated read, find, grep, LSP, and research tools when available.\n\n${approval}`;
49
+ return `## Optional harness assessment\n\nTask: ${state.task}\n\nInvestigate the need, existing primitives, and smallest useful change before recommending an execution path. This is advisory planning, not a read-only security mode: tools remain available and normal user authorization still applies. Submit findings with harness_assessment_submit. Assessment is not required to create a harness.`;
217
50
  }
218
51
  export function format_assessment_record(state) {
219
52
  const record = state.record;
220
- if (!record) {
221
- return `Assessment ${state.id} v${state.version}: ${state.status}\n\nTask: ${state.task}`;
222
- }
223
- const list = (values, empty) => values.length
224
- ? values.map((value) => `- ${value}`).join('\n')
225
- : `- ${empty}`;
226
- const contract = record.proposed_contract;
227
- const contract_section = contract
228
- ? `\n\n## Proposed harness contract\n\n- Task: ${contract.task}\n- Cwd: ${contract.cwd ?? 'current project'}\n- Allowed paths: ${contract.allowed_paths?.join(', ') ?? 'none'}\n- Validation: ${contract.validation_commands?.join(' && ') ?? 'none'}\n- Test changes: ${contract.allow_test_changes ? 'allowed' : 'not allowed'}\n- Forbidden paths: ${contract.forbidden_paths?.join(', ') ?? 'defaults'}\n- Forbidden commands: ${contract.forbidden_commands?.join(', ') ?? 'defaults'}\n- Escalation rules: ${contract.escalation_rules?.join('; ') ?? 'defaults'}\n- Planner: ${contract.planner_model ?? 'default'} (${contract.planner_thinking ?? 'default'})\n- Executor: ${contract.executor_model ?? 'default'} (${contract.executor_thinking ?? 'default'})\n- Reviewer: ${contract.reviewer_model ?? 'default'} (${contract.reviewer_thinking ?? 'default'})`
229
- : '';
230
- return `# Harness assessment: ${state.id} v${state.version}\n\n- Status: ${state.status}\n- Recommendation: ${record.recommendation}\n\n## Outcome\n\n${record.task}\n\n## Evidence\n\n${list(record.evidence, 'No evidence recorded')}\n\n## Existing primitives\n\n${list(record.existing_primitives, 'None found')}\n\n## Rejected options\n\n${list(record.rejected_options, 'None recorded')}\n\n## Smallest vertical slice\n\n${record.smallest_vertical_slice}${contract_section}`;
53
+ if (!record)
54
+ return `Assessment ${state.id}: ${state.task}`;
55
+ const list = (values) => values.map((value) => `- ${value}`).join('\n') ||
56
+ '- None recorded';
57
+ return `# Harness assessment\n\n${record.task}\n\nRecommendation: ${record.recommendation}\n\n## Evidence\n\n${list(record.evidence)}\n\n## Existing primitives\n\n${list(record.existing_primitives)}\n\n## Rejected options\n\n${list(record.rejected_options)}\n\n## Smallest vertical slice\n\n${record.smallest_vertical_slice}`;
231
58
  }
232
59
  //# sourceMappingURL=assessment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"assessment.js","sourceRoot":"","sources":["../src/assessment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assessment.js","sourceRoot":"","sources":["../src/assessment.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { HarnessContract } from '../schema.js';
2
+ export declare function pattern_matches(cwd: string, pattern: string, path: string): boolean;
2
3
  export declare function check_path_allowed(contract: HarnessContract, input_path: string): {
3
4
  ok: true;
4
5
  } | {
@@ -11,3 +12,4 @@ export declare function check_command_allowed(contract: HarnessContract, command
11
12
  ok: false;
12
13
  reason: string;
13
14
  };
15
+ export declare function build_path_helpers(): string;
@@ -1,86 +1,60 @@
1
- import { isAbsolute, relative, resolve } from 'node:path';
2
- function resolve_project_path(cwd, input_path) {
3
- return resolve(cwd, input_path);
4
- }
5
- function pattern_to_relative(cwd, pattern) {
6
- const normalized_pattern = pattern.replaceAll('\\', '/');
7
- if (!isAbsolute(pattern))
8
- return normalized_pattern;
9
- return relative(cwd, resolve(pattern)).replaceAll('\\', '/');
10
- }
11
- function pattern_matches(cwd, pattern, absolute_path) {
12
- const normalized_pattern = pattern_to_relative(cwd, pattern);
13
- const relative_path = relative(cwd, absolute_path).replaceAll('\\', '/');
14
- if (normalized_pattern === '.')
1
+ import { isAbsolute, matchesGlob, relative, resolve, } from 'node:path';
2
+ export function pattern_matches(cwd, pattern, path) {
3
+ const normalized = (isAbsolute(pattern) ? relative(cwd, pattern) : pattern).replaceAll('\\', '/');
4
+ const candidate = relative(cwd, resolve(cwd, path)).replaceAll('\\', '/');
5
+ if (normalized === '.')
15
6
  return true;
16
- if (normalized_pattern.endsWith('/**')) {
17
- const prefix = normalized_pattern.slice(0, -3);
18
- return (relative_path === prefix ||
19
- relative_path.startsWith(`${prefix}/`));
7
+ if (!/[*?[{]/.test(normalized)) {
8
+ return (candidate === normalized ||
9
+ candidate.startsWith(`${normalized}/`));
20
10
  }
21
- if (normalized_pattern.includes('*')) {
22
- const regex = new RegExp(`^${normalized_pattern
23
- .replace(/[.+?^${}()|[\]\\]/g, '\\$&')
24
- .replaceAll('**', '.*')
25
- .replaceAll('*', '[^/]*')}$`);
26
- return regex.test(relative_path);
27
- }
28
- const target = isAbsolute(pattern)
29
- ? resolve(pattern)
30
- : resolve_project_path(cwd, pattern);
31
- return (absolute_path === target || absolute_path.startsWith(`${target}/`));
32
- }
33
- function is_test_path(absolute_path) {
34
- const path = absolute_path.replaceAll('\\', '/');
35
- return (/(^|\/)(__tests__|tests?)\//.test(path) ||
36
- /\.(test|spec)\.[cm]?[jt]sx?$/.test(path));
11
+ return matchesGlob(candidate, normalized);
37
12
  }
38
13
  export function check_path_allowed(contract, input_path) {
39
14
  const cwd = resolve(contract.policy.cwd);
40
- const absolute_path = resolve_project_path(cwd, input_path);
41
- const inside_cwd = absolute_path === cwd || absolute_path.startsWith(`${cwd}/`);
42
- if (!inside_cwd) {
43
- return {
44
- ok: false,
45
- reason: `Harness ${contract.id}: path is outside cwd: ${input_path}`,
46
- };
47
- }
48
- if (contract.policy.forbidden_paths.some((pattern) => pattern_matches(cwd, pattern, absolute_path))) {
49
- return {
50
- ok: false,
51
- reason: `Harness ${contract.id}: path is forbidden: ${input_path}`,
52
- };
53
- }
54
- if (!contract.scaffold.allow_test_changes &&
55
- is_test_path(absolute_path)) {
56
- return {
15
+ const absolute_path = resolve(cwd, input_path);
16
+ let reason;
17
+ if (absolute_path !== cwd && !absolute_path.startsWith(`${cwd}/`)) {
18
+ reason = 'path is outside cwd';
19
+ }
20
+ else if (contract.policy.forbidden_paths.some((pattern) => pattern_matches(cwd, pattern, input_path))) {
21
+ reason = 'path is forbidden';
22
+ }
23
+ else if ((!contract.scaffold.allow_test_changes ||
24
+ contract.policy.allow_test_changes === false) &&
25
+ (/(^|\/)(__tests__|tests?)\//.test(input_path) ||
26
+ /\.(test|spec)\.[cm]?[jt]sx?$/.test(input_path))) {
27
+ reason = 'test changes are not allowed by harness.json';
28
+ }
29
+ else if (!contract.scaffold.allowed_paths.some((pattern) => pattern_matches(cwd, pattern, input_path)) ||
30
+ !(contract.policy.allowed_paths ?? contract.scaffold.allowed_paths).some((pattern) => pattern_matches(cwd, pattern, input_path))) {
31
+ reason = 'path is outside allowed_paths';
32
+ }
33
+ return reason
34
+ ? {
57
35
  ok: false,
58
- reason: `Harness ${contract.id}: test changes are not allowed by harness.json`,
59
- };
60
- }
61
- if (!contract.scaffold.allowed_paths.some((pattern) => pattern_matches(cwd, pattern, absolute_path))) {
62
- return {
63
- ok: false,
64
- reason: `Harness ${contract.id}: path is outside allowed_paths: ${input_path}`,
65
- };
66
- }
67
- return { ok: true };
36
+ reason: `Harness ${contract.id}: ${reason}: ${input_path}`,
37
+ }
38
+ : { ok: true };
68
39
  }
69
40
  export function check_command_allowed(contract, command) {
70
41
  const blocked = contract.policy.forbidden_commands.find((needle) => command.includes(needle));
71
- if (blocked) {
72
- return {
42
+ return blocked
43
+ ? {
73
44
  ok: false,
74
45
  reason: `Harness ${contract.id}: command contains forbidden pattern: ${blocked}`,
75
- };
76
- }
77
- if (!contract.scaffold.allow_test_changes &&
78
- /\brm\b.*((^|\/)(__tests__|tests?)\/|\.(test|spec)\.)/.test(command)) {
79
- return {
80
- ok: false,
81
- reason: `Harness ${contract.id}: deleting tests is not allowed`,
82
- };
83
- }
84
- return { ok: true };
46
+ }
47
+ : { ok: true };
48
+ }
49
+ export function build_path_helpers() {
50
+ return String.raw `
51
+ function pattern_matches(pattern, path) {
52
+ const normalized = (isAbsolute(pattern) ? relative(cwd, pattern) : pattern).replaceAll('\\', '/');
53
+ const candidate = relative(cwd, resolve(cwd, path)).replaceAll('\\', '/');
54
+ if (normalized === '.') return true;
55
+ if (!/[*?[{]/.test(normalized)) return candidate === normalized || candidate.startsWith(normalized + '/');
56
+ return matchesGlob(candidate, normalized);
57
+ }
58
+ `;
85
59
  }
86
60
  //# sourceMappingURL=policy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/enforcement/policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/enforcement/policy.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { BeforeAgentStartEvent, ExtensionAPI } from '@earendil-works/pi-coding-agent';
2
2
  export declare function should_inject_harness_prompt(event: Pick<BeforeAgentStartEvent, 'systemPromptOptions'>): boolean;
3
- export default function harness(pi: ExtensionAPI): Promise<void>;
3
+ export default function harness(pi: ExtensionAPI): void;