@pulsarinteractive/geniustasker 0.1.0-beta.1 → 0.1.0-beta.3

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/docs/CLI.md ADDED
@@ -0,0 +1,395 @@
1
+ # GeniusTasker CLI and MCP reference
2
+
3
+ Connect your own AI tools to your projects: read progress, work on tickets,
4
+ comment, ask questions and keep a useful handoff. Your account and project
5
+ permissions remain the limit. GeniusTasker does not run your agent or bill its
6
+ external model tokens.
7
+
8
+ ## Install and connect
9
+
10
+ Requires Node.js 22.13 or newer. Install the beta:
11
+
12
+ ```sh
13
+ npm install -g @pulsarinteractive/geniustasker@beta
14
+ geniustasker auth login
15
+ geniustasker whoami --json
16
+ geniustasker projects list --json
17
+ ```
18
+
19
+ Login opens your browser. Sign in to GeniusTasker, choose projects, independent memories and
20
+ permissions, then approve the connection. The CLI receives a one-use code with
21
+ PKCE; it never asks for your password. The consent page does not load the app tutorial. Decline there or use Ctrl-C to stop.
22
+ If the browser cannot open, use the link printed in your terminal.
23
+
24
+ **This beta defaults to the development environment.** Your account must be
25
+ admitted to the beta; installing the package does not grant access. Production
26
+ agent access is closed. Use `--environment production` only when that rollout is
27
+ announced. No subscription purchase is performed by the CLI.
28
+
29
+ For a remote machine, use `geniustasker auth login --flow device --no-browser`.
30
+ For Chrome specifically, use `--browser chrome`. `--context work` creates a
31
+ separate local session for an independent terminal; it does not grant extra quota.
32
+ The browser offers the supported permissions, with read-only access selected by
33
+ default. Write permissions require an explicit choice. To narrow the permissions
34
+ offered by the browser, pass `--scope`, for example:
35
+
36
+ ```sh
37
+ geniustasker auth login --context work --scope 'projects:read tasks:read tasks:write comments:write goals:read goals:write'
38
+ ```
39
+
40
+ The browser still requires the human to explicitly grant each permission.
41
+ Revoke a session using `geniustasker auth logout --context work` or Account →
42
+ Agent connections in the app. Do not put tokens in commands or MCP configuration.
43
+
44
+ ## Local MCP
45
+
46
+ Authenticate with `geniustasker auth login --context work` outside the MCP process first. Configure a client capable of
47
+ launching stdio servers with this entry (adjust environment/context as needed):
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "geniustasker": {
53
+ "command": "npx",
54
+ "args": ["-y", "@pulsarinteractive/geniustasker@0.1.0-beta.2", "mcp", "--context", "work"]
55
+ }
56
+ }
57
+ }
58
+ ```
59
+
60
+ No token belongs in that configuration. The server uses the official MCP SDK
61
+ and offers `tasker_identity`, `tasker_capabilities`, `tasker_projects` and
62
+ `tasker_memories`, `tasker_resources`, plus `tasker_prepare_command`, `tasker_execute_command`,
63
+ `tasker_retry_command` and `tasker_inspect_operation`. Profile tools are
64
+ `tasker_profiles`, `tasker_create_profile`, `tasker_restrict_profile` and
65
+ `tasker_select_profile`. `tasker_question_answers` reads human responses.
66
+ `tasker_changes` and `tasker_watch` support resumable changes and bounded waits.
67
+ Only MCP JSON-RPC is written to stdout. This is a local
68
+ stdio integration, not a hosted MCP service or a marketplace-approved plugin.
69
+ The bundled `skills/geniustasker/` folder can be copied into the skill directory
70
+ supported by your chosen agent. Specific clients may use a different config
71
+ format; their integration guides and release validation remain separate work.
72
+
73
+ ## Paging and failures
74
+
75
+ Commands read one bounded page. Continue with `--after` when `nextAfter` is
76
+ non-null, even for an empty filtered project page. Resource continuation also
77
+ requires `--epoch` and `--checkpoint` from the first page. A context change
78
+ requires restarting the read. `omittedIds` means oversized legacy records were
79
+ excluded. Tasks support `--archive active|archived|all`.
80
+
81
+ `--json` gives one versioned result on stdout. Login displays readable progress
82
+ by default; with `--json`, its progress uses versioned envelopes on stderr.
83
+ Error envelopes also use stderr and do not contain credentials. Exit codes: 2 usage, 3 authentication,
84
+ 4 permission, 5 conflict, 6 rate limit, 7 temporary failure, 1 other failure.
85
+ Honor `retryAfterSeconds`; there is no hidden retry loop or subscription upgrade.
86
+
87
+ ### Incremental reads and bounded waits
88
+
89
+ Complete a resource inventory first. Its final page supplies `changeCursor`;
90
+ intermediate pages supply null. Keep this cursor with the same account, scope,
91
+ collection and archive view. For example, with the actual returned cursor:
92
+
93
+ ```sh
94
+ geniustasker changes list --environment development --context work --scope project:ID --collection tasks --cursor CURSOR --json
95
+ geniustasker changes watch --environment development --context work --scope project:ID --collection tasks --cursor CURSOR --wait-seconds 30 --json
96
+ ```
97
+
98
+ Apply all items and removal markers before retaining `nextCursor`. Follow
99
+ `hasMore` even if items is empty. These are current projections of changed IDs,
100
+ not a historical snapshot; duplicate IDs are possible and record revisions can
101
+ be newer than the page checkpoint. Apply newer/equal revisions idempotently and
102
+ never replace a newer cached row with an older one. Omissions remain incomplete
103
+ evidence. On `restart_read`, replace the collection from a fresh inventory.
104
+ Retained-history deletion also demands a full read to protect private audit IDs.
105
+
106
+ Watch returns `reason: changes|timeout`, a page (possibly null on timeout), the
107
+ number of completed polls and a continuation. It waits at most 60 seconds,
108
+ polling no faster than five seconds. Every poll uses the account's normal quota
109
+ and live permissions. Ctrl-C or MCP cancellation interrupts it; errors stop it
110
+ without blind retries. There is no daemon or automatic background agent. A
111
+ Free monthly budget refusal preserves `retryable: false` and its `resetAt` time.
112
+
113
+ ## Account rate limits
114
+
115
+ Identity and capabilities expose the current server `rateLimits`. All CLI/MCP
116
+ contexts and agent profiles on the same account share them. Free allows 30
117
+ requests per 60 seconds, Starter 120, Pro 300; within those totals, write requests
118
+ are limited to 5, 20 and 60 respectively. These native Cloudflare limits are
119
+ approximate and location-local, not billing meters. A command can change several
120
+ entities; the rate unit is a request, not an entity or a physical SQL write.
121
+
122
+ Starter/Pro have no monthly agent credit/write-request cutoff. Free has 5,000
123
+ monthly credits (read request 1, write request 5) and 500 write requests, resetting
124
+ at the next UTC month. Every poll/replay consumes the applicable request limits.
125
+ On a temporary 429, honor `retryAfterSeconds` (currently a conservative 60 seconds)
126
+ before resuming. The CLI reports the error without automatically retrying writes;
127
+ keep the same journaled operation ID, issuedAt and content. Do not switch tokens,
128
+ profiles or contexts to evade the account limit. A write-only throttle leaves
129
+ reads available within their request/Free-credit budget.
130
+
131
+ ## Credential storage and recovery
132
+
133
+ Credentials live in `~/.geniustasker/<context>.json`, outside repositories.
134
+ On POSIX systems the directory is 0700 and files are 0600, with file ownership,
135
+ symlink and hard-link checks. This protects against other OS users; it is not a
136
+ keychain and does not isolate processes running as you. Windows ACL and native
137
+ keychain integration have not been validated in this preview.
138
+
139
+ Refresh is serialized across processes and writes are atomic. An uncertainty
140
+ marker is saved before rotation: after a lost response, run logout then login
141
+ instead of replaying a one-use refresh token. Logout revokes the session family
142
+ on the server before removing credentials; on failure it keeps them for retry.
143
+ The account's Agents page can revoke a session or whole connection at any time.
144
+
145
+ A killed process can leave an empty `<context>.json.lock` directory. Stop every
146
+ CLI/MCP process using that context before removing only that empty lock
147
+ directory. Never remove a live client's lock. Then run logout/login if renewal
148
+ was interrupted. `doctor` exposes no credential values.
149
+
150
+ For an isolated local backend, `--origin http://127.0.0.1:PORT --allow-local`
151
+ explicitly enables loopback HTTP. Hosted credentials are origin-bound and cannot
152
+ be sent there. Redirects on credential-bearing API requests are refused.
153
+
154
+ Protocol references: [OAuth device authorization](https://www.rfc-editor.org/rfc/rfc8628),
155
+ [OAuth token revocation](https://www.rfc-editor.org/rfc/rfc7009),
156
+ [OAuth metadata](https://www.rfc-editor.org/rfc/rfc8414), and the
157
+ [official MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk).
158
+
159
+ ## Prepare, execute and recover writes
160
+
161
+ Request the relevant permissions when connecting, for example:
162
+
163
+ ```sh
164
+ geniustasker auth login --context work --environment development --scope 'projects:read tasks:read tasks:write comments:write goals:read goals:write' --browser chrome
165
+ ```
166
+
167
+ The person chooses the effective grant. A project administrator must also enable
168
+ agent contributions. Discover capabilities and read the project instructions.
169
+ `commands describe --json` describes fields and the draft/request JSON schemas
170
+ from the product contract. It does not grant access or prove server activation.
171
+
172
+ Save a draft in a private JSON file (replace IDs/epoch with current reads):
173
+
174
+ ```json
175
+ {
176
+ "scope": "project:PROJECT_ID",
177
+ "epoch": "EPOCH_FROM_READ",
178
+ "id": "NEW_RECORD_UUID",
179
+ "expectedRevision": null,
180
+ "kind": "task.create",
181
+ "data": { "title": "Prepare the next release" }
182
+ }
183
+ ```
184
+
185
+ Then use the same context/environment for the whole workflow:
186
+
187
+ ```sh
188
+ geniustasker commands prepare --file draft.json --context work --environment development --json
189
+ geniustasker commands retry --operation OPERATION_ID --context work --environment development --json
190
+ geniustasker commands inspect --operation OPERATION_ID --context work --environment development --json
191
+ ```
192
+
193
+ Prepare saves a stable UUID/timestamp and sends nothing. Retry executes that
194
+ saved operation, whether still prepared or uncertain. Alternatively,
195
+ `commands execute --file request.json` accepts a complete request containing
196
+ `operationId` and `issuedAt` and journals it before sending. Never regenerate
197
+ those values to recover a timeout. Execution errors retain the operation ID.
198
+
199
+ The journal lives in `~/.geniustasker/operations/<context>/` with private file
200
+ permissions. It contains project text and receipts, never credentials. It is
201
+ bound to the original connection, profile, session and API environment. A new
202
+ login cannot silently replay an old session's operation. Inspection is local
203
+ evidence, not a live permission check. A confirmed retry is labeled
204
+ `local_receipt`; a newly obtained receipt is labeled `server`.
205
+
206
+ After a revision conflict, reread the affected records and prepare a new edit.
207
+ A pending or lost result requires an identical retry. No write is automatically
208
+ retried. Journal locks serialize different processes. If a process is killed,
209
+ stop all clients before removing that operation's empty `.json.lock` directory.
210
+ Keep its JSON request and retry it; do not erase uncertain operations. Journal
211
+ retention/cleanup automation remains pending. Logout removes credentials but
212
+ retains these records so the outcome can still be inspected.
213
+
214
+ Commands cover tasks, dependencies, archive/restore, ticket creation/planning,
215
+ comments and goals. `ticket.plan` uses the project ID/root revision and per-task
216
+ numeric `expectedVersion`; `ticket.create` requires a UUID record ID. Comments
217
+ use a text string and mentions array. An agent can edit/delete only comments
218
+ authored by its profile. Server receipts expose changed IDs/revisions, not
219
+ record bodies; read them separately if your grant permits it.
220
+
221
+ Local validation includes separate processes sharing one write, immutable retry
222
+ after lost responses, strict inputs, receipt validation and an official MCP
223
+ client communicating through stdio to actual Worker/SQLite domain services.
224
+ Compatibility with each agent host requires its own connection test.
225
+
226
+ ## Agent profiles and terminal identity
227
+
228
+ The initial profile works without configuration. Use independent named contexts
229
+ for independent terminals or accounts; a context shared by two processes is one
230
+ session, so selecting its profile affects both. Profile names are for attribution,
231
+ not extra memberships, API budgets or permission grants.
232
+
233
+ ```sh
234
+ geniustasker profiles list --context work --environment development --json
235
+ geniustasker profiles create --file profile.json --context work --environment development --json
236
+ geniustasker profiles select --profile PROFILE_ID --context work --environment development --json
237
+ geniustasker whoami --context work --environment development --json
238
+ ```
239
+
240
+ `profile.json` contains `id` (one UUID chosen once and retained), `name`, and
241
+ `grant` with `allResources`, `resourceIds`, `permissions`, following `whoami`'s
242
+ grant shape. Use actual project scopes from the API. Creation never switches the
243
+ terminal automatically. The new grant must fit both the current profile and the
244
+ connection. After a lost creation reply, list profiles and reconcile that UUID;
245
+ retrying it cannot allocate a second profile. Do not replace its UUID blindly.
246
+
247
+ `profiles restrict --file restriction.json` changes only the current profile.
248
+ The file must include its `profileId`, current `expectedRevision`, `name`, and
249
+ narrower/equal `grant`. It cannot undo a previous restriction or edit another
250
+ profile. After a lost reply, read `whoami` to see the saved revision and grant
251
+ before preparing another edit. The explicit profile ID prevents a saved draft
252
+ from editing another profile when a process changed the shared context.
253
+
254
+ Selection lists only eligible profiles in the same connection, then checks the
255
+ source and destination revisions while atomically rotating both credentials.
256
+ It never extends the session's absolute lifetime. The previous access token stops
257
+ working, so a request in flight cannot silently become the selected profile.
258
+ A restricted profile cannot switch back to the broader Default profile. Broader
259
+ rights need a human decision in the app or a fresh human-approved connection.
260
+ Saved task-operation journals stay bound to their original profile and cannot be
261
+ adopted by a different one. Reconcile pending work before selecting another.
262
+
263
+ A definite `profile_selection_conflict` or `profile_selection_denied` preserves
264
+ the previous usable credentials; read the profile list again. An unknown rotation
265
+ outcome requires logout/login, just like an unknown refresh. Credentials never
266
+ appear in selection results, CLI output, MCP tool results or package artifacts.
267
+
268
+ ## Ask a human on a ticket
269
+
270
+ Request `questions:write` explicitly when connecting; an existing comments grant
271
+ alone cannot publish a question. Questions reuse the project's vote feature and
272
+ its human access rules. Agent contributions and project votes must both be enabled.
273
+ The contract offers fourteen write commands and thirteen MCP tools in this preview.
274
+
275
+ Prepare `question.create` with a new retained question UUID, current scope epoch,
276
+ null expected revision and this `data` shape (replace IDs and deadline):
277
+
278
+ ```json
279
+ {
280
+ "task": "TICKET_ID",
281
+ "question": "Which checks should I run before the release review?",
282
+ "description": "I have finished the implementation and need your acceptance criteria.",
283
+ "answerKind": "Text",
284
+ "eligibleUsers": ["HUMAN_USER_ID"],
285
+ "closesAt": "2026-10-05T16:00:00Z"
286
+ }
287
+ ```
288
+
289
+ An explicit audience and future deadline are required for agent questions. `Text`
290
+ accepts named answers of up to 2,000 UTF-16 code units and at most 50 recipients.
291
+ `YesNo` provides the two canonical options. `Choices` requires 2–12 distinct
292
+ options, with `selection: "Single"` or `"Multiple"`; choices can be anonymous.
293
+ An agent cannot submit a human ballot. A reply does not expand API permissions
294
+ or grant authority for unrelated external actions.
295
+
296
+ Use the usual prepare/retry journal for creating and closing questions. Read
297
+ `resources list --scope project:ID --collection questions --json` to find their
298
+ current revisions, then:
299
+
300
+ ```sh
301
+ geniustasker questions answers --scope project:ID --question QUESTION_ID --context work --environment development --json
302
+ ```
303
+
304
+ MCP provides `tasker_question_answers`. Follow `nextAfter` with the original
305
+ `epoch` and `checkpoint`; restart after a changed snapshot. Named answers are
306
+ paged ten at a time. Anonymous questions expose no respondents or running totals;
307
+ after closing they expose only totals. A changing private ballot does not alter
308
+ an open anonymous question's public checkpoint.
309
+
310
+ `question.close` takes the question's current revision and empty `data`. A
311
+ profile can close only questions it created. It cannot answer on behalf of its
312
+ owner, impersonate another profile, or use a poll result as new authorization.
313
+
314
+ ## Work updates and handoffs
315
+
316
+ Prepare `task.report` through the normal command journal with the current task
317
+ revision and `tasks:write`. `phase` is `Working`, `NeedsInformation` or
318
+ `NeedsReview`; `summary` is required, `nextSteps` is required for both waiting
319
+ phases, and `evidence` is an array of up to eight `{label, url}` HTTPS links.
320
+ `mentions` is optional. The ticket must be open, unarchived and agent-enabled.
321
+
322
+ The result is one task transition and one attributed, immutable discussion
323
+ receipt. Read `workPhase`/`lastWorkReport` on the task and `workReport` on its
324
+ comment. Completing/reopening a ticket clears its current phase. A report is
325
+ progress information, not approval or proof independently verified by Tasker.
326
+ Correct published reports with a new report; never rewrite an older receipt.
327
+
328
+ ## Ask for approval of one precise action
329
+
330
+ Connect with `approvals:write` explicitly, alongside the read grants needed to
331
+ review the task and its discussion. Discover the commands through capabilities.
332
+ Prepare `approval.request` with a retained request UUID, expectedRevision null and:
333
+
334
+ ```json
335
+ {
336
+ "task": "TASK_ID",
337
+ "taskRevision": "CURRENT_TASK_REVISION",
338
+ "title": "Publish the reviewed preview",
339
+ "summary": "Publish build one to the private preview environment.",
340
+ "actionJson": "{\"build\":\"one\",\"environment\":\"preview\"}",
341
+ "approver": "HUMAN_MEMBER_ID",
342
+ "expiresAt": "A_FUTURE_ISO_TIMESTAMP"
343
+ }
344
+ ```
345
+
346
+ The deadline is one minute to seven days ahead. The approver must be a current
347
+ human member with ticket editing rights; the requesting account needs those
348
+ rights too. Read `comments` for the request's `approval` object and revision.
349
+ The designated human reviews the request in the app. No CLI or MCP command can
350
+ approve on their behalf. A question answer, comment or work report is not an
351
+ approval. Do not store credentials in the action JSON or summary.
352
+
353
+ When Approved, prepare `approval.consume` on that comment with its current
354
+ expectedRevision and data `{ "requestVersion": "ORIGINAL_REQUEST_REVISION",
355
+ "actionJson": "THE_EXACT_REVIEWED_ACTION_JSON" }`. Only its original profile can
356
+ consume; the task and access must still match. Reuse prepare/retry/inspect for
357
+ network uncertainty. A terminal request cannot authorize a second operation.
358
+ `approval.cancel` uses current expectedRevision and `{ "requestVersion": "..." }`
359
+ when the request is no longer needed, including stale or expired requests.
360
+
361
+ Tasker records authorization and never runs the external action. Use the request
362
+ ID as an idempotency key where the external system supports it. After a crash or
363
+ an uncertain external result, inspect that system before acting again. Replaying
364
+ a successful consumption receipt does not authorize repeating its side effect.
365
+
366
+ ## Package boundary
367
+
368
+ Only the CLI/MCP source, its generated public command catalog, bundled agent skill
369
+ and the selected guide/plugin files are distributed. Application source, infrastructure configuration,
370
+ private product documents, test identities and credentials are excluded. No
371
+ installation script runs and no background daemon or telemetry is installed.
372
+ The standalone client and skills are distributed under the MIT license.
373
+ Third-party components retain their original licenses.
374
+
375
+ ## Independent memories
376
+
377
+ A memory is an account resource (`memory:ID`), not a project attachment. The agent
378
+ chooses which project and memory to use independently, within the user's grants.
379
+ Use a small index first, then fetch only the page you need:
380
+
381
+ ```sh
382
+ geniustasker memories list --json
383
+ geniustasker resources list --scope memory:ID --collection pageIndex --json
384
+ geniustasker resources list --scope memory:ID --collection pages --path brand/identity --json
385
+ ```
386
+
387
+ Memory pages contain Markdown blocks with stable IDs, a path, tags and optional
388
+ source provenance. Preserve IDs when editing; do not relabel a proposal as a
389
+ verified fact. `pages --id ID` also reads one page. A targeted read has no change
390
+ cursor; obtain one from a complete collection inventory when watching updates.
391
+ Commands `memory.create/update/delete` and `memory.page.create/update/delete`
392
+ require `memory:write`. For a new space, choose one UUID for its root ID, scope
393
+ suffix and initial epoch, then use the returned epoch/revision for later writes.
394
+ All edits use the same local command journal and optimistic revision checks as
395
+ project commands. Never copy private source files into this npm package.
@@ -0,0 +1,62 @@
1
+ # Connect your agent
2
+
3
+ Choose either direct MCP configuration or the plugin bundle, to avoid registering
4
+ the same server twice. Authenticate once per chosen local context. Permissions
5
+ are selected in the browser and enforced by the service on every request.
6
+
7
+ ## Codex: direct MCP
8
+
9
+ ```sh
10
+ npx -y @pulsarinteractive/geniustasker@0.1.0-beta.3 auth login --context work
11
+ codex mcp add geniustasker -- npx -y @pulsarinteractive/geniustasker@0.1.0-beta.3 mcp --context work
12
+ ```
13
+
14
+ Restart the host as needed, then inspect its MCP list. Ask the agent to read its
15
+ GeniusTasker identity and list available projects. Configure a different context
16
+ when a separate terminal needs an independent session.
17
+
18
+ ## Claude and other stdio hosts
19
+
20
+ Merge the `mcpServers.geniustasker` entry from [the example](../examples/mcp.json)
21
+ into the host's documented configuration. Don't replace unrelated servers.
22
+ No token, API key or password belongs in that configuration. Host-specific paths
23
+ and plugin formats vary; use the host's current documentation.
24
+
25
+ ## Install skills separately
26
+
27
+ Clone this repository into a location you control. For a Codex user-level install,
28
+ copy the `geniustasker` and `geniustasker-memory` folders from `skills/` into
29
+ `~/.agents/skills/`, keeping each `SKILL.md`, references and metadata together.
30
+ For Claude use its supported `.claude/skills/` location. Inspect an existing folder
31
+ before replacing it. Restart the agent and invoke `$geniustasker` or
32
+ `$geniustasker-memory` where the host supports named invocation.
33
+
34
+ Skills guide workflows; the MCP provides executable tools. The CLI remains useful
35
+ without skills, and skills can use the CLI when an MCP host is not configured.
36
+
37
+ ## Portable plugin bundle
38
+
39
+ The root `plugin.json` and `mcp.json` follow Agent Plugins 1.0.0. The bundled MCP
40
+ runs locally over stdio and pins a published npm version. Node and npm must be
41
+ available in the execution environment. Authenticate the `work` context first.
42
+
43
+ The repository also has `.agents/plugins/marketplace.json` for local distribution:
44
+
45
+ ```sh
46
+ codex plugin marketplace add PulsarInteractive/geniustasker-agent-tools
47
+ ```
48
+
49
+ Use the host's Plugins interface to select and enable GeniusTasker. This local
50
+ marketplace is distinct from OpenAI's public directory. Packaging/schema checks
51
+ and SDK transport tests are automated; real host installation is recorded
52
+ separately in the release notes and must not be inferred from those tests.
53
+
54
+ ## Revoke
55
+
56
+ ```sh
57
+ geniustasker auth logout --context work
58
+ ```
59
+
60
+ This revokes the server session before removing its credentials. A failed revoke
61
+ keeps local evidence so it can be retried. Uninstalling a package alone does not
62
+ revoke a remote session.
package/docs/OPENAI.md ADDED
@@ -0,0 +1,37 @@
1
+ # OpenAI integration
2
+
3
+ ## Available in this repository
4
+
5
+ The CLI authenticates through browser consent and exposes a local stdio MCP.
6
+ Two skills and portable plugin/MCP manifests are packaged together. Direct
7
+ Codex MCP configuration is documented in [Integrations](INTEGRATIONS.md).
8
+ Nothing here is an OpenAI directory approval or a hosted remote MCP endpoint.
9
+
10
+ ## Hosted plugin milestone
11
+
12
+ | Work | Acceptance |
13
+ | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
14
+ | HTTPS Streamable HTTP MCP adapter | Real initialize, tools/list and tool calls; reuse existing product commands and quotas |
15
+ | MCP OAuth compatibility | Protected-resource and authorization discovery, audience/resource binding, supported client registration, allowed callbacks, PKCE, expiry and revocation |
16
+ | Host authentication | Real browser consent, resource-limited reads, denied access and reauthentication |
17
+ | Writes | Explicit grants, correctly annotated tools, immutable retries and conflicts; no blanket approval |
18
+ | Optional company-knowledge search | Authorized search/fetch with user-openable citations and bounded results |
19
+ | Plugin review | Accurate install copy, privacy/terms links, domain verification, real test account, honest limitations |
20
+
21
+ The current CLI OAuth flow is a foundation; it is not proof that every hosted
22
+ MCP client's registration and resource-discovery requirements are implemented.
23
+ A hosted manifest requires a deployed and tested MCP server and a registered
24
+ application identifier. Embedded UI is optional.
25
+
26
+ The remotely hosted backend can remain private. A public source repository is a
27
+ client distribution and review surface, not an access grant to user data.
28
+
29
+ ## Official references
30
+
31
+ Checked 30 September 2026:
32
+
33
+ - [MCP in Codex](https://learn.chatgpt.com/docs/extend/mcp?surface=cli)
34
+ - [Plugin packaging](https://developers.openai.com/plugins/build/plugins)
35
+ - [MCP hosting](https://developers.openai.com/plugins/build/mcp-server)
36
+ - [Authentication](https://developers.openai.com/plugins/build/auth)
37
+ - [Connect and test](https://developers.openai.com/plugins/deploy/connect-chatgpt)
@@ -0,0 +1,16 @@
1
+ # Release process
2
+
3
+ 1. Update package, lockfile, MCP server version, plugin version and example pins together.
4
+ 2. Review public contract/skill changes and run `npm ci`, `npm run verify` and `npm audit`.
5
+ 3. Inspect `git diff` and the complete `npm pack --dry-run --json` list. No private repository history or product files may enter this repo.
6
+ 4. Pack and inspect the actual archive. `npm publish <archive> --access public --tag beta` requires the maintainer's npm authentication.
7
+ 5. Confirm registry version/tag/integrity, install using a fresh cache and exercise real MCP through an explicitly authorized beta account. Keep private results outside this repository.
8
+ 6. Tag the corresponding commit and publish accurate release notes. Record host-specific acceptance separately.
9
+
10
+ CI runs tests and package/privacy checks. It never publishes npm or deploys the
11
+ service. Future trusted publishing should use a reviewed OIDC setup rather than
12
+ committing an npm token; it is not configured by this repository.
13
+
14
+ Published npm versions are immutable. Use a new version for package changes.
15
+
16
+ Canonical repository: https://github.com/PulsarInteractive/geniustasker-agent-tools
@@ -0,0 +1,52 @@
1
+ # Testing
2
+
3
+ ## Run the quality checks
4
+
5
+ ```sh
6
+ npm ci
7
+ npm run verify
8
+ ```
9
+
10
+ `verify` runs formatting, ESLint, tests, package inventory, public-file checks and
11
+ plugin/schema validation. CI runs the same command on Linux and macOS with Node
12
+ 22, followed by a dependency vulnerability audit. It has read-only repository
13
+ permissions and no live service credentials.
14
+
15
+ ## Focused checks
16
+
17
+ ```sh
18
+ npm run format:check
19
+ npm run lint
20
+ node --test test/login.test.mjs
21
+ node --test test/process.test.mjs
22
+ npm run check
23
+ npm audit
24
+ ```
25
+
26
+ `npm run format` applies formatting. The generated command catalog and vendored
27
+ schemas are excluded from formatting so their provenance remains stable.
28
+
29
+ ## What the suites cover
30
+
31
+ | Suite | Observable guarantees |
32
+ | --------------- | --------------------------------------------------------------------------------------------------------------- |
33
+ | Login | Consent URL validation, PKCE state/callback handling, denial, cancellation, device-flow deadlines and slow-down |
34
+ | Client/store | Private file checks, origin binding, serialized renewal and uncertain-token recovery |
35
+ | Commands | Immutable requests, concurrent writes, identity binding, uncertain receipts and conflicts |
36
+ | Profiles | Grant validation, narrowed selection, revision conflicts and rotation uncertainty |
37
+ | Changes | Cursor validation, bounded waits, cancellation and no blind retries after quota or permission failures |
38
+ | Process | Real stdio MCP discovery/calls and coordination between separate OS processes |
39
+ | Public boundary | Rejection of excluded files, credentials, symlinks and escaping imports |
40
+
41
+ Tests create and clean up their own temporary directories and loopback servers.
42
+ They do not require browser sign-in or real project data. Use meaningful scenario
43
+ names, assert behavior at public boundaries and include the failure that motivates
44
+ a regression test. Avoid sleeps as synchronization when an explicit signal works.
45
+
46
+ ## What local tests do not establish
47
+
48
+ They do not prove admission to the hosted beta, production availability, browser
49
+ provider compatibility on every device or acceptance by each agent host. Release
50
+ verification separately installs the published archive with a fresh cache,
51
+ compares registry integrity and exercises a deliberately authorized test account.
52
+ Record those checks without publishing account data.
@@ -0,0 +1,3 @@
1
+ [mcp_servers.geniustasker]
2
+ command = "npx"
3
+ args = ["-y", "@pulsarinteractive/geniustasker@0.1.0-beta.3", "mcp", "--context", "work"]
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "geniustasker": {
4
+ "command": "npx",
5
+ "args": ["-y", "@pulsarinteractive/geniustasker@0.1.0-beta.3", "mcp", "--context", "work"]
6
+ }
7
+ }
8
+ }
package/mcp.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
3
+ "mcpServers": {
4
+ "geniustasker": {
5
+ "type": "stdio",
6
+ "command": "npx",
7
+ "args": ["-y", "@pulsarinteractive/geniustasker@0.1.0-beta.3", "mcp", "--context", "work"]
8
+ }
9
+ }
10
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pulsarinteractive/geniustasker",
3
- "version": "0.1.0-beta.1",
3
+ "version": "0.1.0-beta.3",
4
4
  "private": false,
5
5
  "description": "GeniusTasker delegated CLI and local agent tools",
6
6
  "type": "module",
@@ -14,12 +14,27 @@
14
14
  "bin/",
15
15
  "src/",
16
16
  "skills/",
17
- "README.md"
17
+ "docs/",
18
+ "examples/",
19
+ "README.md",
20
+ "CHANGELOG.md",
21
+ "CONTRIBUTING.md",
22
+ "SECURITY.md",
23
+ "plugin.json",
24
+ "mcp.json",
25
+ "LICENSE",
26
+ "THIRD_PARTY_NOTICES.md",
27
+ "LICENSES/"
18
28
  ],
19
29
  "scripts": {
20
30
  "test": "node --test test/*.test.mjs",
21
- "check": "node tools/check-package.mjs",
22
- "prepublishOnly": "npm test && npm run check"
31
+ "check": "node tools/check-package.mjs && node tools/check-public.mjs && node tools/check-plugin.mjs",
32
+ "prepublishOnly": "npm run verify",
33
+ "check:public": "node tools/check-public.mjs",
34
+ "format": "prettier --write .",
35
+ "format:check": "prettier --check .",
36
+ "lint": "eslint .",
37
+ "verify": "npm run format:check && npm run lint && npm test && npm run check"
23
38
  },
24
39
  "dependencies": {
25
40
  "@modelcontextprotocol/server": "2.1.0",
@@ -27,12 +42,32 @@
27
42
  "zod": "4.6.5"
28
43
  },
29
44
  "devDependencies": {
30
- "@modelcontextprotocol/client": "2.1.0"
45
+ "@eslint/js": "10.0.1",
46
+ "@modelcontextprotocol/client": "2.1.0",
47
+ "ajv": "8.20.0",
48
+ "eslint": "10.11.0",
49
+ "globals": "17.12.0",
50
+ "prettier": "3.9.9"
31
51
  },
32
- "license": "UNLICENSED",
52
+ "license": "MIT",
33
53
  "publishConfig": {
34
54
  "access": "public",
35
55
  "tag": "beta",
36
56
  "registry": "https://registry.npmjs.org/"
37
- }
57
+ },
58
+ "repository": {
59
+ "type": "git",
60
+ "url": "https://github.com/PulsarInteractive/geniustasker-agent-tools.git"
61
+ },
62
+ "homepage": "https://github.com/PulsarInteractive/geniustasker-agent-tools#readme",
63
+ "bugs": {
64
+ "url": "https://github.com/PulsarInteractive/geniustasker-agent-tools/issues"
65
+ },
66
+ "keywords": [
67
+ "geniustasker",
68
+ "mcp",
69
+ "cli",
70
+ "agent-skills",
71
+ "codex"
72
+ ]
38
73
  }