@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.
- package/CHANGELOG.md +35 -0
- package/LICENSE +21 -0
- package/README.md +250 -2
- package/assets/icon.svg +1 -0
- package/dist/index.js +1125 -0
- package/dist/tui.js +304 -0
- package/package.json +484 -4
- package/skills/metaview/SKILL.md +98 -0
- package/skills/metaview-candidate-brief/SKILL.md +71 -0
- package/skills/metaview-write/SKILL.md +98 -0
|
@@ -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.
|