@joe-broadhead/opencode-metaview 0.0.0-stage → 0.0.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.
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: metaview-write
3
+ description: Load before any Metaview change - regenerating notes or adding note sources, saving or sharing a snippet or clip, creating a report, AI field or note template, sourcing searches and candidate feedback, posting candidates to an ATS, application review rejects or progress and ICP changes, screening plans or invitations, sequences and outreach, contact enrichment, job posts - or before reporting a Metaview bug or problem to Metaview.
4
+ ---
5
+
6
+ # Changes in Metaview
7
+
8
+ Make a Metaview change only when the user asked for it. Before each write call, write one sentence in your reply on what
9
+ the call does and **whom it reaches** (a job post edit: every workspace member who can see the post), then make the call
10
+ in the same turn. That sentence is chat text, not a question: the permission prompt shows only the tool input and is the
11
+ user's yes. Ask in chat first only when something must be chosen: which candidates, template, clip or post. Declined:
12
+ say nothing changed, and offer your drafted text or a retry, never a workaround. Every call needs its `rationale`.
13
+ Record REJECT, PROGRESS, YES, MAYBE or NO only as the user stated them, for the candidates they named; never infer a
14
+ verdict from a fit band, score or AI field.
15
+
16
+ ## Off by default
17
+
18
+ Three tools are denied by the plugin's default rules, and OpenCode hides them. Two changes that only ask still act on
19
+ candidates: see **Candidates** below.
20
+
21
+ - `give_application_review_candidate_feedback`: a REJECT or PROGRESS syncs to the ATS, and a REJECT can email the
22
+ candidate. It can't be undone. (Reviews whose `applicant_source` is UPLOAD have no ATS: decisions stay in Metaview.)
23
+ - `manage_candidate_sequence`: adds candidates to outreach (email, LinkedIn, SMS, WhatsApp), or pauses or removes them.
24
+ - `submit_feedback`: sends text to the Metaview team.
25
+
26
+ When the user asks for one, say it is off; a later `ask` rule in the agent's own `permissions` turns it on, such as
27
+ `{ "action": "metaview_manage_candidate_sequence", "resource": "*", "effect": "ask" }`: each call then asks.
28
+ Never work around the deny (no other tool, script or route to the same effect), and never suggest `allow` or "Always
29
+ allow" for these. Do the reads and show what you would record, for whom; the user can
30
+ make the decision themselves in Metaview's web app. Don't `search()` for these tools: a missing one is the deny.
31
+
32
+ ## Who a change reaches
33
+
34
+ - **Candidates:** `update_screen_outreach` (every invitation and reminder not yet sent; a deadline already told stays),
35
+ `update_screen_plan` (live at once once candidates are invited; it re-scores undecided completed interviews), and
36
+ `manage_sequence` when it enables a sequence or edits the steps of a live one. `update_screen_outreach` with
37
+ `reject_at_deadline: true` rejects candidates automatically at their deadline, synced to the ATS: a decision on
38
+ candidates, so only when the user asked for exactly that. `manage_sequence` with `set_enabled: true` restarts outreach
39
+ to everyone enrolled. Before either call, say whom it reaches.
40
+ - **The ATS:** `post_sourcing_candidates_to_ats`, which can't be undone from Metaview. Name the candidates, the
41
+ posting type and the ATS job (`list_ats_jobs`, `job_required`; ask if the job isn't clear); it runs in the background.
42
+ - **The whole workspace:** `create_report` (only when the user asks for a saved report; when creating, `filters` is
43
+ required, `[]` for all), `create_ai_field`, `manage_note_template`, workspace-scope `manage_sourcing_knowledge`,
44
+ `update_application_review_rules`; `generate_notes` and `manage_notes_sources` change the notes the team sees.
45
+ - **Credits:** `enrich_candidate_contacts`. First `get_enrichment_status({ candidate_ids, rationale })`, then tell the
46
+ user the type, candidate count, estimate (3 credits per email, 10 per phone, none for `free_candidate_ids`), credits
47
+ available and what remains; the final charge follows what is found. State those figures, then make the call.
48
+ - **Anyone with the link:** `create_snippet` with `share_scope: "anyone_with_link"`, only on an explicit request for a
49
+ public link. Otherwise leave `share_scope` out: the default link opens for signed-in members of the workspace.
50
+ - **The shared job post:** an edit lands in the post that every workspace member with access sees.
51
+ `send_job_post_message({ job_post_id, message, rationale })` asks Metaview's Job Posts agent to rewrite it: read the
52
+ text with `get_job_post` first, write your one sentence, make the one call and poll `get_job_post`; after a decline,
53
+ give your draft for the user to paste. `run_job_post_checks({ job_post_id, check_ids, rationale })` records new
54
+ results on the post; `resolve_job_post_suggestion` and `upsert_job_post_template` change shared documents too.
55
+
56
+ ## Read first
57
+
58
+ - Application review: `list_application_reviews({ search_term, rationale })` → `get_application_review_details` →
59
+ `list_application_review_candidates` (`fit_filter`: poor, no_evidence, okay, good or great; `decision_filter:
60
+ "undecided"`) → `list_application_review_rejection_options` before any REJECT. Name every candidate, say what the
61
+ decision does, and ask which reason or email template the ATS needs: never choose a template for the user. Only if
62
+ the user has turned the tool on, call `give_application_review_candidate_feedback` with exactly the ids you named.
63
+ - ICP: `get_application_review_details` → `update_application_review_icp` (complete final text, the active version as
64
+ `base_version`; it reranks everyone) or `restore_application_review_icp`. Poll with `detail_level: "concise"`.
65
+ - Screening: `get_screen_details` → `update_screen_plan` (the whole plan) or `update_screen_outreach` (only the fields
66
+ you pass), with its `base_version`. A plan update is refused while web-app config edits are pending.
67
+ - Sequences: only their creator can change them, and their steps are fixed once candidates start (duplicate instead).
68
+ Read the steps with `list_sequences` first; `find_candidate_in_sequences` before adding a candidate.
69
+ - Sourcing: `list_sourcing_searches` before `send_sourcing_message`. One search per role: put every company or
70
+ location in one brief, never a search per segment and never several at once. `mode` is set only when creating.
71
+ - AI fields: `list_fields({ search_term, rationale })`, then state the name, prompt and `value_type` (prefer
72
+ boolean, number, list or single_line_text) and call `create_ai_field`. A create may return an existing field
73
+ (`already_existed`): say so instead of creating a near-copy.
74
+ - Clips: `search_snippets({ conversation_id, prompt, rationale })`, `conversation_id` as an integer. Show the best one
75
+ or two ranges, then one `create_snippet` (`conversation_id`, `start_ms`, `end_ms`, a short `title`) for the clip the
76
+ user picks. Give `share_link.url`, or else `snippets_tab_url`, and say who can open it.
77
+
78
+ ## Full-replace traps
79
+
80
+ An update replaces, not merges: `manage_note_template` `sections`, `manage_sequence` `steps`, and ICP and plan updates
81
+ drop whatever you don't pass. Show the before and after, then make the call.
82
+
83
+ ## Slow changes
84
+
85
+ `generate_notes` (`conversation_id` as a string; it needs a transcript) and `manage_notes_sources` take about 30 s:
86
+ wait, then poll `search_conversations({ conversation_ids: [<id>], fields: ["default:summary"], rationale })` without
87
+ asking. A sourcing search runs for minutes: check `get_search_details` a few times, then stop with a note, never loop.
88
+
89
+ ## Reporting a problem to Metaview
90
+
91
+ `metaview_submit_feedback` is off by default: Metaview's own tool text asks the model to send reports unasked, and the
92
+ text could carry candidate data. When the user wants to report a bug:
93
+
94
+ 1. First check the query: dates as dicts, `only_show_recorded_conversations`, and a member's scope; many end here.
95
+ 2. Say the tool is off; the user can add `{ "action": "metaview_submit_feedback", "resource": "*", "effect": "ask" }`
96
+ to the agent's own `permissions`, or contact Metaview support.
97
+ 3. If it is turned on, write it for an engineer (the tool, the inputs and the result, with no candidate names, emails or
98
+ transcript text), show it, and make the call: the permission prompt is the user's yes.