open-research-protocol 0.3.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/AGENT_INTEGRATION.md +94 -0
- package/INSTALL.md +159 -0
- package/LICENSE +22 -0
- package/PROTOCOL.md +140 -0
- package/README.md +312 -0
- package/bin/orp.js +38 -0
- package/cli/orp.py +3595 -0
- package/cone/CONTEXT_LOG.md +33 -0
- package/docs/AGENT_LOOP.md +63 -0
- package/docs/CHOOSING_OR_IGNORING_INSTRUMENTS.md +128 -0
- package/docs/CODA_ORP_CONTRACT.md +222 -0
- package/docs/CORE_ABILITY_REFOCUS_CHECKLIST.md +62 -0
- package/docs/DISCOVER.md +69 -0
- package/docs/EXTERNAL_CONTRIBUTION_GOVERNANCE.md +275 -0
- package/docs/MATHLIB_COLLABORATION_FLOW_PROMPT.md +112 -0
- package/docs/NPM_RELEASE_CHECKLIST.md +55 -0
- package/docs/ORP_V1_ATOMIC_DISCOVERY_EVOLUTION.md +186 -0
- package/docs/OSS_CONTRIBUTION_AGENT_LOOP.md +69 -0
- package/docs/PRESENTATION_BOW.md +100 -0
- package/docs/PROFILE_PACKS.md +227 -0
- package/docs/SUNFLOWER_CODA_PR_GOVERNANCE_MAPPING.md +77 -0
- package/docs/WHY_INSTRUMENTS.md +118 -0
- package/examples/README.md +21 -0
- package/examples/example_claim.md +33 -0
- package/examples/example_failed.md +24 -0
- package/examples/example_verification.md +36 -0
- package/examples/orp.erdos-problems.catalog.yml +88 -0
- package/examples/orp.external-pr-governance.yml +223 -0
- package/examples/orp.sunflower-coda.atomic.yml +144 -0
- package/examples/orp.sunflower-coda.live-compare.yml +181 -0
- package/examples/orp.sunflower-coda.pr-governance.yml +253 -0
- package/examples/packet.problem_scope.example.json +123 -0
- package/examples/reports/README.md +16 -0
- package/examples/reports/sunflower_live_compare_20.RUN_SUMMARY.md +37 -0
- package/examples/reports/sunflower_live_compare_367.RUN_SUMMARY.md +37 -0
- package/examples/reports/sunflower_live_compare_857.RUN_SUMMARY.md +37 -0
- package/llms.txt +58 -0
- package/modules/instruments/ADVERSARIAL/README.md +109 -0
- package/modules/instruments/ADVERSARIAL/TEMPLATE.md +27 -0
- package/modules/instruments/COMPRESSION/README.md +112 -0
- package/modules/instruments/COMPRESSION/TEMPLATE.md +27 -0
- package/modules/instruments/INSTRUMENT_TEMPLATE.md +30 -0
- package/modules/instruments/ORBIT/README.md +124 -0
- package/modules/instruments/ORBIT/TEMPLATE.md +28 -0
- package/modules/instruments/README.md +179 -0
- package/package.json +54 -0
- package/packs/README.md +16 -0
- package/packs/erdos-open-problems/README.md +287 -0
- package/packs/erdos-open-problems/data/README.md +43 -0
- package/packs/erdos-open-problems/data/erdos_open_problems.md +697 -0
- package/packs/erdos-open-problems/data/erdos_problems.active.json +15561 -0
- package/packs/erdos-open-problems/data/erdos_problems.all.json +26289 -0
- package/packs/erdos-open-problems/data/erdos_problems.closed.json +10760 -0
- package/packs/erdos-open-problems/data/erdos_problems.open.json +15561 -0
- package/packs/erdos-open-problems/docs/SUNFLOWER_ADAPTER_DEPENDENCIES.md +63 -0
- package/packs/erdos-open-problems/pack.yml +131 -0
- package/packs/erdos-open-problems/profiles/erdos-problems-catalog-sync.yml.tmpl +99 -0
- package/packs/erdos-open-problems/profiles/sunflower-live-compare.yml.tmpl +188 -0
- package/packs/erdos-open-problems/profiles/sunflower-mathlib-pr-governance.yml.tmpl +253 -0
- package/packs/erdos-open-problems/profiles/sunflower-problem857-discovery-public-repo.yml.tmpl +152 -0
- package/packs/erdos-open-problems/profiles/sunflower-problem857-discovery.yml.tmpl +154 -0
- package/packs/external-pr-governance/README.md +116 -0
- package/packs/external-pr-governance/adapters/formal-conjectures/README.md +35 -0
- package/packs/external-pr-governance/adapters/mathlib/README.md +37 -0
- package/packs/external-pr-governance/pack.yml +146 -0
- package/packs/external-pr-governance/profiles/oss-feedback-hardening.yml.tmpl +92 -0
- package/packs/external-pr-governance/profiles/oss-pr-governance.yml.tmpl +233 -0
- package/packs/issue-smashers/README.md +92 -0
- package/packs/issue-smashers/adapters/formal-conjectures/README.md +17 -0
- package/packs/issue-smashers/adapters/generic-github/README.md +16 -0
- package/packs/issue-smashers/adapters/mathlib/README.md +32 -0
- package/packs/issue-smashers/bootstrap/README.md +19 -0
- package/packs/issue-smashers/bootstrap/setup-issue-smashers.sh +18 -0
- package/packs/issue-smashers/examples/issue-smashers.workspace.yml +24 -0
- package/packs/issue-smashers/pack.yml +178 -0
- package/packs/issue-smashers/profiles/issue-smashers-feedback-hardening.yml.tmpl +102 -0
- package/packs/issue-smashers/profiles/issue-smashers.yml.tmpl +258 -0
- package/scripts/npm-postinstall-check.js +31 -0
- package/scripts/orp +11 -0
- package/scripts/orp-agent-integrate.sh +197 -0
- package/scripts/orp-checkpoint.sh +184 -0
- package/scripts/orp-erdos-problems-sync.py +580 -0
- package/scripts/orp-init.sh +50 -0
- package/scripts/orp-pack-fetch.py +155 -0
- package/scripts/orp-pack-install.py +2273 -0
- package/scripts/orp-pack-render.py +188 -0
- package/spec/v1/LIFECYCLE_MAPPING.md +40 -0
- package/spec/v1/orp.config.schema.json +385 -0
- package/spec/v1/packet.schema.json +552 -0
- package/spec/v1/profile-pack.schema.json +95 -0
- package/templates/CLAIM.md +33 -0
- package/templates/FAILED_TOPIC.md +19 -0
- package/templates/ISSUE_TEMPLATE.md +22 -0
- package/templates/VERIFICATION_RECORD.md +34 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Issue Smashers Bootstrap
|
|
2
|
+
|
|
3
|
+
This pack bootstraps a small operator-facing workspace scaffold into the install
|
|
4
|
+
target.
|
|
5
|
+
|
|
6
|
+
Generated by default:
|
|
7
|
+
|
|
8
|
+
- `issue-smashers/README.md`
|
|
9
|
+
- `issue-smashers/WORKSPACE_RULES.md`
|
|
10
|
+
- `issue-smashers/setup-issue-smashers.sh`
|
|
11
|
+
- `issue-smashers/analysis/PR_DRAFT_BODY.md`
|
|
12
|
+
- `issue-smashers/analysis/ISSUE_SMASHERS_WATCHLIST.json`
|
|
13
|
+
- `issue-smashers/analysis/ISSUE_SMASHERS_STATUS.md`
|
|
14
|
+
- directory placeholders under `repos/`, `worktrees/`, `scratch/`, and
|
|
15
|
+
`archive/`
|
|
16
|
+
|
|
17
|
+
The bootstrap intentionally does not clone repos automatically. It creates the
|
|
18
|
+
workspace shape and leaves repo-specific cloning, remotes, hooks, and adapter
|
|
19
|
+
commands to the operator or higher-level tooling.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -eu
|
|
3
|
+
|
|
4
|
+
ROOT="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
|
|
5
|
+
|
|
6
|
+
mkdir -p \
|
|
7
|
+
"$ROOT/analysis" \
|
|
8
|
+
"$ROOT/repos" \
|
|
9
|
+
"$ROOT/worktrees" \
|
|
10
|
+
"$ROOT/scratch" \
|
|
11
|
+
"$ROOT/archive"
|
|
12
|
+
|
|
13
|
+
printf 'workspace_root=%s\n' "$ROOT"
|
|
14
|
+
printf 'ensured=analysis\n'
|
|
15
|
+
printf 'ensured=repos\n'
|
|
16
|
+
printf 'ensured=worktrees\n'
|
|
17
|
+
printf 'ensured=scratch\n'
|
|
18
|
+
printf 'ensured=archive\n'
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
workspace:
|
|
2
|
+
root: issue-smashers
|
|
3
|
+
analysis_dir: issue-smashers/analysis
|
|
4
|
+
repos_dir: issue-smashers/repos
|
|
5
|
+
worktrees_dir: issue-smashers/worktrees
|
|
6
|
+
scratch_dir: issue-smashers/scratch
|
|
7
|
+
archive_dir: issue-smashers/archive
|
|
8
|
+
|
|
9
|
+
watch_targets:
|
|
10
|
+
- repo: leanprover-community/mathlib4
|
|
11
|
+
issue: "5617"
|
|
12
|
+
lane: mathlib4/issue-5617
|
|
13
|
+
state: watch
|
|
14
|
+
- repo: google-deepmind/formal-conjectures
|
|
15
|
+
issue: "erdos-857"
|
|
16
|
+
lane: formal-conjectures/erdos-857
|
|
17
|
+
state: backlog
|
|
18
|
+
|
|
19
|
+
policy:
|
|
20
|
+
workspace_git_repo: false
|
|
21
|
+
one_worktree_per_issue: true
|
|
22
|
+
fork_remote_name: origin
|
|
23
|
+
upstream_remote_name: upstream
|
|
24
|
+
process_only: true
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
schema_version: "1.0.0"
|
|
2
|
+
pack_id: issue-smashers
|
|
3
|
+
name: Issue Smashers Pack
|
|
4
|
+
version: "0.1.0"
|
|
5
|
+
description: >
|
|
6
|
+
Opinionated ORP workspace pack for organized multi-repo external contribution
|
|
7
|
+
work, combining an issue-smashers directory convention with reusable PR
|
|
8
|
+
governance and feedback-hardening profiles.
|
|
9
|
+
orp_version_min: "0.3.0"
|
|
10
|
+
|
|
11
|
+
variables:
|
|
12
|
+
TARGET_REPO_ROOT:
|
|
13
|
+
description: Absolute path to the install target that will contain the issue-smashers workspace.
|
|
14
|
+
required: true
|
|
15
|
+
ISSUE_SMASHERS_ROOT:
|
|
16
|
+
description: Workspace root relative to TARGET_REPO_ROOT.
|
|
17
|
+
required: false
|
|
18
|
+
default: "issue-smashers"
|
|
19
|
+
ISSUE_SMASHERS_REPOS_DIR:
|
|
20
|
+
description: Base clone directory relative to TARGET_REPO_ROOT.
|
|
21
|
+
required: false
|
|
22
|
+
default: "issue-smashers/repos"
|
|
23
|
+
ISSUE_SMASHERS_WORKTREES_DIR:
|
|
24
|
+
description: Active issue worktree directory relative to TARGET_REPO_ROOT.
|
|
25
|
+
required: false
|
|
26
|
+
default: "issue-smashers/worktrees"
|
|
27
|
+
ISSUE_SMASHERS_SCRATCH_DIR:
|
|
28
|
+
description: Disposable scratch directory relative to TARGET_REPO_ROOT.
|
|
29
|
+
required: false
|
|
30
|
+
default: "issue-smashers/scratch"
|
|
31
|
+
ISSUE_SMASHERS_ARCHIVE_DIR:
|
|
32
|
+
description: Optional archive directory relative to TARGET_REPO_ROOT.
|
|
33
|
+
required: false
|
|
34
|
+
default: "issue-smashers/archive"
|
|
35
|
+
WATCHLIST_FILE:
|
|
36
|
+
description: Watchlist JSON path relative to TARGET_REPO_ROOT.
|
|
37
|
+
required: false
|
|
38
|
+
default: "issue-smashers/analysis/ISSUE_SMASHERS_WATCHLIST.json"
|
|
39
|
+
STATUS_FILE:
|
|
40
|
+
description: Human-readable status board path relative to TARGET_REPO_ROOT.
|
|
41
|
+
required: false
|
|
42
|
+
default: "issue-smashers/analysis/ISSUE_SMASHERS_STATUS.md"
|
|
43
|
+
WORKSPACE_RULES_FILE:
|
|
44
|
+
description: Workspace rules document path relative to TARGET_REPO_ROOT.
|
|
45
|
+
required: false
|
|
46
|
+
default: "issue-smashers/WORKSPACE_RULES.md"
|
|
47
|
+
DEFAULT_PR_BODY_FILE:
|
|
48
|
+
description: Default PR body file path relative to TARGET_REPO_ROOT.
|
|
49
|
+
required: false
|
|
50
|
+
default: "issue-smashers/analysis/PR_DRAFT_BODY.md"
|
|
51
|
+
TARGET_GITHUB_REPO:
|
|
52
|
+
description: GitHub repo receiving the contribution, for example leanprover-community/mathlib4.
|
|
53
|
+
required: false
|
|
54
|
+
default: "owner/repo"
|
|
55
|
+
TARGET_GITHUB_AUTHOR:
|
|
56
|
+
description: GitHub login used for coordination and overlap checks.
|
|
57
|
+
required: false
|
|
58
|
+
default: "your-login"
|
|
59
|
+
ORP_TIMEOUT_SEC:
|
|
60
|
+
description: Default gate timeout in seconds.
|
|
61
|
+
required: false
|
|
62
|
+
default: "1200"
|
|
63
|
+
WATCH_SELECT_COMMAND:
|
|
64
|
+
description: Command that selects a contribution target and records why it is worth pursuing.
|
|
65
|
+
required: false
|
|
66
|
+
default: "printf 'configure WATCH_SELECT_COMMAND\\n' >&2; exit 2"
|
|
67
|
+
WATCH_SELECT_PASS_TOKEN:
|
|
68
|
+
description: Stdout token indicating the watch/select gate passed.
|
|
69
|
+
required: false
|
|
70
|
+
default: "selection=PASS"
|
|
71
|
+
VIABILITY_COMMAND:
|
|
72
|
+
description: Command that decides whether starting work is etiquette-safe.
|
|
73
|
+
required: false
|
|
74
|
+
default: "printf 'configure VIABILITY_COMMAND\\n' >&2; exit 2"
|
|
75
|
+
VIABILITY_PASS_TOKEN:
|
|
76
|
+
description: Stdout token indicating the viability gate passed.
|
|
77
|
+
required: false
|
|
78
|
+
default: "decision=PASS"
|
|
79
|
+
OVERLAP_COMMAND:
|
|
80
|
+
description: Command that checks external overlap or confirms coordination is clear.
|
|
81
|
+
required: false
|
|
82
|
+
default: "printf 'configure OVERLAP_COMMAND\\n' >&2; exit 2"
|
|
83
|
+
OVERLAP_PASS_TOKEN:
|
|
84
|
+
description: Stdout token indicating the overlap gate passed.
|
|
85
|
+
required: false
|
|
86
|
+
default: "overlap=PASS"
|
|
87
|
+
LOCAL_GATE_COMMAND:
|
|
88
|
+
description: Command that performs the local-first verification gate.
|
|
89
|
+
required: false
|
|
90
|
+
default: "printf 'configure LOCAL_GATE_COMMAND\\n' >&2; exit 2"
|
|
91
|
+
LOCAL_GATE_PASS_TOKEN:
|
|
92
|
+
description: Stdout token indicating the local gate passed.
|
|
93
|
+
required: false
|
|
94
|
+
default: "gate=PASS"
|
|
95
|
+
READY_TO_DRAFT_COMMAND:
|
|
96
|
+
description: Command that freezes the branch as ready to open or update a draft PR on the same HEAD.
|
|
97
|
+
required: false
|
|
98
|
+
default: "printf 'configure READY_TO_DRAFT_COMMAND\\n' >&2; exit 2"
|
|
99
|
+
READY_TO_DRAFT_PASS_TOKEN:
|
|
100
|
+
description: Stdout token indicating the ready-to-draft gate passed.
|
|
101
|
+
required: false
|
|
102
|
+
default: "ready_to_draft=PASS"
|
|
103
|
+
PR_BODY_PREFLIGHT_COMMAND:
|
|
104
|
+
description: Command that validates portable public PR text.
|
|
105
|
+
required: false
|
|
106
|
+
default: "printf 'configure PR_BODY_PREFLIGHT_COMMAND\\n' >&2; exit 2"
|
|
107
|
+
PR_BODY_PASS_TOKEN:
|
|
108
|
+
description: Stdout token indicating PR body preflight passed.
|
|
109
|
+
required: false
|
|
110
|
+
default: "gate=PASS"
|
|
111
|
+
DRAFT_PR_TRANSITION_COMMAND:
|
|
112
|
+
description: Command that opens or updates the draft PR and refuses if ready markers no longer match the current HEAD.
|
|
113
|
+
required: false
|
|
114
|
+
default: "printf 'configure DRAFT_PR_TRANSITION_COMMAND\\n' >&2; exit 2"
|
|
115
|
+
DRAFT_PR_TRANSITION_PASS_TOKEN:
|
|
116
|
+
description: Stdout token indicating the draft PR open/update transition passed.
|
|
117
|
+
required: false
|
|
118
|
+
default: "draft_pr=PASS"
|
|
119
|
+
DRAFT_CI_COMMAND:
|
|
120
|
+
description: Command that checks draft CI or draft lifecycle readiness.
|
|
121
|
+
required: false
|
|
122
|
+
default: "printf 'configure DRAFT_CI_COMMAND\\n' >&2; exit 2"
|
|
123
|
+
DRAFT_CI_PASS_TOKEN:
|
|
124
|
+
description: Stdout token indicating draft CI is green or otherwise acceptable.
|
|
125
|
+
required: false
|
|
126
|
+
default: "draft_ci=PASS"
|
|
127
|
+
READY_FOR_REVIEW_COMMAND:
|
|
128
|
+
description: Command that decides whether the PR can be promoted from draft to ready.
|
|
129
|
+
required: false
|
|
130
|
+
default: "printf 'configure READY_FOR_REVIEW_COMMAND\\n' >&2; exit 2"
|
|
131
|
+
READY_FOR_REVIEW_PASS_TOKEN:
|
|
132
|
+
description: Stdout token indicating ready-for-review conditions are satisfied.
|
|
133
|
+
required: false
|
|
134
|
+
default: "ready_for_review=PASS"
|
|
135
|
+
FEEDBACK_RECORD_COMMAND:
|
|
136
|
+
description: Command that records what maintainer feedback slipped and why.
|
|
137
|
+
required: false
|
|
138
|
+
default: "printf 'configure FEEDBACK_RECORD_COMMAND\\n' >&2; exit 2"
|
|
139
|
+
FEEDBACK_RECORD_PASS_TOKEN:
|
|
140
|
+
description: Stdout token indicating maintainer-feedback recording passed.
|
|
141
|
+
required: false
|
|
142
|
+
default: "feedback_recorded=PASS"
|
|
143
|
+
GUARD_VALIDATION_COMMAND:
|
|
144
|
+
description: Command that validates the new or updated guard with PASS and FAIL coverage.
|
|
145
|
+
required: false
|
|
146
|
+
default: "printf 'configure GUARD_VALIDATION_COMMAND\\n' >&2; exit 2"
|
|
147
|
+
GUARD_VALIDATION_PASS_TOKEN:
|
|
148
|
+
description: Stdout token indicating guard validation passed.
|
|
149
|
+
required: false
|
|
150
|
+
default: "guard_validation=PASS"
|
|
151
|
+
DOC_SYNC_COMMAND:
|
|
152
|
+
description: Command that confirms docs, templates, and agent instructions were updated with the guard.
|
|
153
|
+
required: false
|
|
154
|
+
default: "printf 'configure DOC_SYNC_COMMAND\\n' >&2; exit 2"
|
|
155
|
+
DOC_SYNC_PASS_TOKEN:
|
|
156
|
+
description: Stdout token indicating governance docs were synced.
|
|
157
|
+
required: false
|
|
158
|
+
default: "docs_sync=PASS"
|
|
159
|
+
|
|
160
|
+
templates:
|
|
161
|
+
issue_smashers_workspace:
|
|
162
|
+
path: profiles/issue-smashers.yml.tmpl
|
|
163
|
+
description: Opinionated issue-smashers workspace and external contribution governance profiles.
|
|
164
|
+
output_hint: orp.issue-smashers.yml
|
|
165
|
+
default_profiles:
|
|
166
|
+
- issue_smashers_watch_select
|
|
167
|
+
- issue_smashers_pre_open
|
|
168
|
+
- issue_smashers_local_readiness
|
|
169
|
+
- issue_smashers_draft_transition
|
|
170
|
+
- issue_smashers_draft_lifecycle
|
|
171
|
+
- issue_smashers_full_flow
|
|
172
|
+
|
|
173
|
+
issue_smashers_feedback_hardening:
|
|
174
|
+
path: profiles/issue-smashers-feedback-hardening.yml.tmpl
|
|
175
|
+
description: Issue-smashers maintainer-feedback hardening profile.
|
|
176
|
+
output_hint: orp.issue-smashers-feedback-hardening.yml
|
|
177
|
+
default_profiles:
|
|
178
|
+
- issue_smashers_feedback_hardening
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
version: "1"
|
|
2
|
+
|
|
3
|
+
project:
|
|
4
|
+
name: issue-smashers-feedback-hardening
|
|
5
|
+
repo_root: .
|
|
6
|
+
canonical_paths:
|
|
7
|
+
workspace_root: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
8
|
+
watchlist_json: {{TARGET_REPO_ROOT}}/{{WATCHLIST_FILE}}
|
|
9
|
+
status_md: {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
10
|
+
workspace_rules_md: {{TARGET_REPO_ROOT}}/{{WORKSPACE_RULES_FILE}}
|
|
11
|
+
default_pr_body_file: {{TARGET_REPO_ROOT}}/{{DEFAULT_PR_BODY_FILE}}
|
|
12
|
+
|
|
13
|
+
runtime:
|
|
14
|
+
shell: /bin/bash
|
|
15
|
+
default_timeout_sec: {{ORP_TIMEOUT_SEC}}
|
|
16
|
+
artifacts_root: orp/artifacts
|
|
17
|
+
|
|
18
|
+
packet:
|
|
19
|
+
default_kind: verification
|
|
20
|
+
output_dir: orp/packets
|
|
21
|
+
write_markdown: true
|
|
22
|
+
deterministic_mode: true
|
|
23
|
+
|
|
24
|
+
lifecycle:
|
|
25
|
+
claim_status_map:
|
|
26
|
+
Draft: draft
|
|
27
|
+
In review: ready
|
|
28
|
+
Verified: reviewed
|
|
29
|
+
Blocked: blocked
|
|
30
|
+
Retracted: retracted
|
|
31
|
+
atom_status_map:
|
|
32
|
+
todo: draft
|
|
33
|
+
in_progress: ready
|
|
34
|
+
blocked: blocked
|
|
35
|
+
done: reviewed
|
|
36
|
+
claim_level_values:
|
|
37
|
+
- Exact
|
|
38
|
+
- Verified
|
|
39
|
+
- Heuristic
|
|
40
|
+
- Conjecture
|
|
41
|
+
|
|
42
|
+
gates:
|
|
43
|
+
- id: feedback_record
|
|
44
|
+
description: Record what slipped, why it slipped, and how the workspace should prevent it next time.
|
|
45
|
+
phase: verification
|
|
46
|
+
command: >
|
|
47
|
+
{{FEEDBACK_RECORD_COMMAND}}
|
|
48
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
49
|
+
pass:
|
|
50
|
+
exit_codes: [0]
|
|
51
|
+
stdout_must_contain:
|
|
52
|
+
- {{FEEDBACK_RECORD_PASS_TOKEN}}
|
|
53
|
+
evidence:
|
|
54
|
+
include_stdout: true
|
|
55
|
+
include_stderr: true
|
|
56
|
+
paths:
|
|
57
|
+
- {{TARGET_REPO_ROOT}}/{{WATCHLIST_FILE}}
|
|
58
|
+
- {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
59
|
+
on_fail: mark_blocked
|
|
60
|
+
|
|
61
|
+
- id: guard_validation
|
|
62
|
+
description: Validate the new or updated guard with explicit PASS and FAIL coverage.
|
|
63
|
+
phase: verification
|
|
64
|
+
command: >
|
|
65
|
+
{{GUARD_VALIDATION_COMMAND}}
|
|
66
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
67
|
+
pass:
|
|
68
|
+
exit_codes: [0]
|
|
69
|
+
stdout_must_contain:
|
|
70
|
+
- {{GUARD_VALIDATION_PASS_TOKEN}}
|
|
71
|
+
evidence:
|
|
72
|
+
include_stdout: true
|
|
73
|
+
include_stderr: true
|
|
74
|
+
on_fail: stop
|
|
75
|
+
|
|
76
|
+
- id: docs_sync
|
|
77
|
+
description: Confirm workspace docs and operator notes were updated in the same pass.
|
|
78
|
+
phase: verification
|
|
79
|
+
command: >
|
|
80
|
+
{{DOC_SYNC_COMMAND}}
|
|
81
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
82
|
+
pass:
|
|
83
|
+
exit_codes: [0]
|
|
84
|
+
stdout_must_contain:
|
|
85
|
+
- {{DOC_SYNC_PASS_TOKEN}}
|
|
86
|
+
evidence:
|
|
87
|
+
include_stdout: true
|
|
88
|
+
include_stderr: true
|
|
89
|
+
paths:
|
|
90
|
+
- {{TARGET_REPO_ROOT}}/{{WORKSPACE_RULES_FILE}}
|
|
91
|
+
- {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
92
|
+
on_fail: mark_blocked
|
|
93
|
+
|
|
94
|
+
profiles:
|
|
95
|
+
issue_smashers_feedback_hardening:
|
|
96
|
+
description: Convert maintainer feedback into a reusable issue-smashers guard plus synced docs.
|
|
97
|
+
mode: collaboration
|
|
98
|
+
packet_kind: verification
|
|
99
|
+
gate_ids:
|
|
100
|
+
- feedback_record
|
|
101
|
+
- guard_validation
|
|
102
|
+
- docs_sync
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
version: "1"
|
|
2
|
+
|
|
3
|
+
project:
|
|
4
|
+
name: issue-smashers
|
|
5
|
+
repo_root: .
|
|
6
|
+
canonical_paths:
|
|
7
|
+
workspace_root: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
8
|
+
repos_root: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_REPOS_DIR}}
|
|
9
|
+
worktrees_root: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_WORKTREES_DIR}}
|
|
10
|
+
scratch_root: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_SCRATCH_DIR}}
|
|
11
|
+
archive_root: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ARCHIVE_DIR}}
|
|
12
|
+
watchlist_json: {{TARGET_REPO_ROOT}}/{{WATCHLIST_FILE}}
|
|
13
|
+
status_md: {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
14
|
+
workspace_rules_md: {{TARGET_REPO_ROOT}}/{{WORKSPACE_RULES_FILE}}
|
|
15
|
+
default_pr_body_file: {{TARGET_REPO_ROOT}}/{{DEFAULT_PR_BODY_FILE}}
|
|
16
|
+
|
|
17
|
+
runtime:
|
|
18
|
+
shell: /bin/bash
|
|
19
|
+
default_timeout_sec: {{ORP_TIMEOUT_SEC}}
|
|
20
|
+
artifacts_root: orp/artifacts
|
|
21
|
+
|
|
22
|
+
packet:
|
|
23
|
+
default_kind: pr
|
|
24
|
+
output_dir: orp/packets
|
|
25
|
+
write_markdown: true
|
|
26
|
+
deterministic_mode: true
|
|
27
|
+
|
|
28
|
+
lifecycle:
|
|
29
|
+
claim_status_map:
|
|
30
|
+
Draft: draft
|
|
31
|
+
In review: ready
|
|
32
|
+
Verified: reviewed
|
|
33
|
+
Blocked: blocked
|
|
34
|
+
Retracted: retracted
|
|
35
|
+
atom_status_map:
|
|
36
|
+
todo: draft
|
|
37
|
+
in_progress: ready
|
|
38
|
+
blocked: blocked
|
|
39
|
+
done: reviewed
|
|
40
|
+
claim_level_values:
|
|
41
|
+
- Exact
|
|
42
|
+
- Verified
|
|
43
|
+
- Heuristic
|
|
44
|
+
- Conjecture
|
|
45
|
+
|
|
46
|
+
gates:
|
|
47
|
+
- id: watch_select
|
|
48
|
+
description: Select a target issue lane and record why it belongs in the issue-smashers workspace.
|
|
49
|
+
phase: scope_lock
|
|
50
|
+
command: >
|
|
51
|
+
{{WATCH_SELECT_COMMAND}}
|
|
52
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
53
|
+
pass:
|
|
54
|
+
exit_codes: [0]
|
|
55
|
+
stdout_must_contain:
|
|
56
|
+
- {{WATCH_SELECT_PASS_TOKEN}}
|
|
57
|
+
evidence:
|
|
58
|
+
include_stdout: true
|
|
59
|
+
include_stderr: true
|
|
60
|
+
paths:
|
|
61
|
+
- {{TARGET_REPO_ROOT}}/{{WATCHLIST_FILE}}
|
|
62
|
+
- {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
63
|
+
on_fail: mark_blocked
|
|
64
|
+
|
|
65
|
+
- id: viability_gate
|
|
66
|
+
description: Decide whether work is viable and etiquette-safe before creating noise.
|
|
67
|
+
phase: scope_lock
|
|
68
|
+
command: >
|
|
69
|
+
{{VIABILITY_COMMAND}}
|
|
70
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
71
|
+
pass:
|
|
72
|
+
exit_codes: [0]
|
|
73
|
+
stdout_must_contain:
|
|
74
|
+
- {{VIABILITY_PASS_TOKEN}}
|
|
75
|
+
evidence:
|
|
76
|
+
include_stdout: true
|
|
77
|
+
include_stderr: true
|
|
78
|
+
paths:
|
|
79
|
+
- {{TARGET_REPO_ROOT}}/{{WATCHLIST_FILE}}
|
|
80
|
+
- {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
81
|
+
on_fail: mark_blocked
|
|
82
|
+
|
|
83
|
+
- id: overlap_gate
|
|
84
|
+
description: Confirm overlap is clear or coordination is already complete.
|
|
85
|
+
phase: scope_lock
|
|
86
|
+
command: >
|
|
87
|
+
{{OVERLAP_COMMAND}}
|
|
88
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
89
|
+
pass:
|
|
90
|
+
exit_codes: [0]
|
|
91
|
+
stdout_must_contain:
|
|
92
|
+
- {{OVERLAP_PASS_TOKEN}}
|
|
93
|
+
evidence:
|
|
94
|
+
include_stdout: true
|
|
95
|
+
include_stderr: true
|
|
96
|
+
paths:
|
|
97
|
+
- {{TARGET_REPO_ROOT}}/{{WATCHLIST_FILE}}
|
|
98
|
+
- {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
99
|
+
on_fail: mark_blocked
|
|
100
|
+
|
|
101
|
+
- id: local_gate
|
|
102
|
+
description: Run the host-repo local verification gate before any draft PR update.
|
|
103
|
+
phase: verification
|
|
104
|
+
command: >
|
|
105
|
+
{{LOCAL_GATE_COMMAND}}
|
|
106
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
107
|
+
timeout_sec: {{ORP_TIMEOUT_SEC}}
|
|
108
|
+
pass:
|
|
109
|
+
exit_codes: [0]
|
|
110
|
+
stdout_must_contain:
|
|
111
|
+
- {{LOCAL_GATE_PASS_TOKEN}}
|
|
112
|
+
evidence:
|
|
113
|
+
include_stdout: true
|
|
114
|
+
include_stderr: true
|
|
115
|
+
paths:
|
|
116
|
+
- {{TARGET_REPO_ROOT}}/{{WORKSPACE_RULES_FILE}}
|
|
117
|
+
on_fail: stop
|
|
118
|
+
|
|
119
|
+
- id: ready_to_draft
|
|
120
|
+
description: Freeze the branch or lane as ready to open or update a draft PR on the same HEAD.
|
|
121
|
+
phase: verification
|
|
122
|
+
command: >
|
|
123
|
+
{{READY_TO_DRAFT_COMMAND}}
|
|
124
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
125
|
+
pass:
|
|
126
|
+
exit_codes: [0]
|
|
127
|
+
stdout_must_contain:
|
|
128
|
+
- {{READY_TO_DRAFT_PASS_TOKEN}}
|
|
129
|
+
evidence:
|
|
130
|
+
include_stdout: true
|
|
131
|
+
include_stderr: true
|
|
132
|
+
paths:
|
|
133
|
+
- {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
134
|
+
on_fail: stop
|
|
135
|
+
|
|
136
|
+
- id: pr_body_preflight
|
|
137
|
+
description: Enforce portable, reviewer-friendly public PR text for the current issue-smashers lane.
|
|
138
|
+
phase: verification
|
|
139
|
+
command: >
|
|
140
|
+
{{PR_BODY_PREFLIGHT_COMMAND}}
|
|
141
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
142
|
+
pass:
|
|
143
|
+
exit_codes: [0]
|
|
144
|
+
stdout_must_contain:
|
|
145
|
+
- {{PR_BODY_PASS_TOKEN}}
|
|
146
|
+
evidence:
|
|
147
|
+
include_stdout: true
|
|
148
|
+
include_stderr: true
|
|
149
|
+
paths:
|
|
150
|
+
- {{TARGET_REPO_ROOT}}/{{DEFAULT_PR_BODY_FILE}}
|
|
151
|
+
on_fail: mark_blocked
|
|
152
|
+
|
|
153
|
+
- id: draft_pr_transition
|
|
154
|
+
description: Open or update the draft PR only after the same-head readiness chain is satisfied.
|
|
155
|
+
phase: verification
|
|
156
|
+
command: >
|
|
157
|
+
{{DRAFT_PR_TRANSITION_COMMAND}}
|
|
158
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
159
|
+
pass:
|
|
160
|
+
exit_codes: [0]
|
|
161
|
+
stdout_must_contain:
|
|
162
|
+
- {{DRAFT_PR_TRANSITION_PASS_TOKEN}}
|
|
163
|
+
evidence:
|
|
164
|
+
include_stdout: true
|
|
165
|
+
include_stderr: true
|
|
166
|
+
paths:
|
|
167
|
+
- {{TARGET_REPO_ROOT}}/{{DEFAULT_PR_BODY_FILE}}
|
|
168
|
+
- {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
169
|
+
on_fail: stop
|
|
170
|
+
|
|
171
|
+
- id: draft_ci
|
|
172
|
+
description: Confirm draft CI is green or otherwise acceptable for promotion.
|
|
173
|
+
phase: verification
|
|
174
|
+
command: >
|
|
175
|
+
{{DRAFT_CI_COMMAND}}
|
|
176
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
177
|
+
pass:
|
|
178
|
+
exit_codes: [0]
|
|
179
|
+
stdout_must_contain:
|
|
180
|
+
- {{DRAFT_CI_PASS_TOKEN}}
|
|
181
|
+
evidence:
|
|
182
|
+
include_stdout: true
|
|
183
|
+
include_stderr: true
|
|
184
|
+
paths:
|
|
185
|
+
- {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
186
|
+
on_fail: mark_blocked
|
|
187
|
+
|
|
188
|
+
- id: ready_for_review
|
|
189
|
+
description: Confirm the PR can move from draft to ready-for-review.
|
|
190
|
+
phase: verification
|
|
191
|
+
command: >
|
|
192
|
+
{{READY_FOR_REVIEW_COMMAND}}
|
|
193
|
+
working_dir: {{TARGET_REPO_ROOT}}/{{ISSUE_SMASHERS_ROOT}}
|
|
194
|
+
pass:
|
|
195
|
+
exit_codes: [0]
|
|
196
|
+
stdout_must_contain:
|
|
197
|
+
- {{READY_FOR_REVIEW_PASS_TOKEN}}
|
|
198
|
+
evidence:
|
|
199
|
+
include_stdout: true
|
|
200
|
+
include_stderr: true
|
|
201
|
+
paths:
|
|
202
|
+
- {{TARGET_REPO_ROOT}}/{{STATUS_FILE}}
|
|
203
|
+
on_fail: mark_blocked
|
|
204
|
+
|
|
205
|
+
profiles:
|
|
206
|
+
issue_smashers_watch_select:
|
|
207
|
+
description: Choose a candidate lane and record why it belongs in the workspace.
|
|
208
|
+
mode: collaboration
|
|
209
|
+
packet_kind: pr
|
|
210
|
+
gate_ids:
|
|
211
|
+
- watch_select
|
|
212
|
+
|
|
213
|
+
issue_smashers_pre_open:
|
|
214
|
+
description: Viability and overlap checks before implementation or draft creation.
|
|
215
|
+
mode: collaboration
|
|
216
|
+
packet_kind: pr
|
|
217
|
+
gate_ids:
|
|
218
|
+
- viability_gate
|
|
219
|
+
- overlap_gate
|
|
220
|
+
|
|
221
|
+
issue_smashers_local_readiness:
|
|
222
|
+
description: Local verification, same-head freeze, and PR-body hygiene before draft open/update.
|
|
223
|
+
mode: collaboration
|
|
224
|
+
packet_kind: pr
|
|
225
|
+
gate_ids:
|
|
226
|
+
- local_gate
|
|
227
|
+
- ready_to_draft
|
|
228
|
+
- pr_body_preflight
|
|
229
|
+
|
|
230
|
+
issue_smashers_draft_transition:
|
|
231
|
+
description: Open or update the draft PR once the readiness chain has passed.
|
|
232
|
+
mode: collaboration
|
|
233
|
+
packet_kind: pr
|
|
234
|
+
gate_ids:
|
|
235
|
+
- draft_pr_transition
|
|
236
|
+
|
|
237
|
+
issue_smashers_draft_lifecycle:
|
|
238
|
+
description: Draft CI and ready-for-review checks after a draft PR exists.
|
|
239
|
+
mode: collaboration
|
|
240
|
+
packet_kind: pr
|
|
241
|
+
gate_ids:
|
|
242
|
+
- draft_ci
|
|
243
|
+
- ready_for_review
|
|
244
|
+
|
|
245
|
+
issue_smashers_full_flow:
|
|
246
|
+
description: End-to-end issue-smashers lifecycle from watch/select through ready-for-review.
|
|
247
|
+
mode: collaboration
|
|
248
|
+
packet_kind: pr
|
|
249
|
+
gate_ids:
|
|
250
|
+
- watch_select
|
|
251
|
+
- viability_gate
|
|
252
|
+
- overlap_gate
|
|
253
|
+
- local_gate
|
|
254
|
+
- ready_to_draft
|
|
255
|
+
- pr_body_preflight
|
|
256
|
+
- draft_pr_transition
|
|
257
|
+
- draft_ci
|
|
258
|
+
- ready_for_review
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { spawnSync } = require("child_process");
|
|
4
|
+
|
|
5
|
+
function firstAvailable(candidates) {
|
|
6
|
+
for (const cmd of candidates) {
|
|
7
|
+
const probe = spawnSync(cmd, ["--version"], { encoding: "utf8" });
|
|
8
|
+
if (!probe.error && probe.status === 0) {
|
|
9
|
+
return cmd;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const pythonCandidates = process.platform === "win32" ? ["py", "python", "python3"] : ["python3", "python"];
|
|
16
|
+
const py = firstAvailable(pythonCandidates);
|
|
17
|
+
|
|
18
|
+
if (!py) {
|
|
19
|
+
console.warn("[orp] warning: Python 3 not found on PATH.");
|
|
20
|
+
console.warn("[orp] install Python 3 to use the `orp` CLI binary.");
|
|
21
|
+
process.exit(0);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const yamlCheckArgs = py === "py" ? ["-3", "-c", "import yaml"] : ["-c", "import yaml"];
|
|
25
|
+
const yamlCheck = spawnSync(py, yamlCheckArgs, { encoding: "utf8" });
|
|
26
|
+
|
|
27
|
+
if (yamlCheck.error || yamlCheck.status !== 0) {
|
|
28
|
+
console.warn("[orp] warning: PyYAML not detected in your Python environment.");
|
|
29
|
+
console.warn("[orp] run: python3 -m pip install pyyaml");
|
|
30
|
+
}
|
|
31
|
+
|
package/scripts/orp
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
set -eu
|
|
3
|
+
|
|
4
|
+
SCRIPT_PATH="$0"
|
|
5
|
+
case "$SCRIPT_PATH" in
|
|
6
|
+
*/*) : ;;
|
|
7
|
+
*) SCRIPT_PATH="$(command -v "$SCRIPT_PATH" 2>/dev/null || printf '%s' "$SCRIPT_PATH")" ;;
|
|
8
|
+
esac
|
|
9
|
+
|
|
10
|
+
ROOT_DIR="$(cd "$(dirname "$SCRIPT_PATH")/.." && pwd)"
|
|
11
|
+
exec python3 "$ROOT_DIR/cli/orp.py" "$@"
|