@starlein/paperclip-plugin-company-wizard 0.4.2 → 0.4.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/CHANGELOG.md CHANGED
@@ -4,6 +4,22 @@ All notable changes to the Company Wizard plugin are documented here.
4
4
 
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ---
8
+ ## [0.4.3] - 2026-06-16
9
+
10
+ ### Fixed
11
+
12
+ - **Worker agents are no longer provisioned with `high` thinking.** Non-CEO agents were built with `buildCeoAdapterConfig`, which defaulted `thinkingLevel`/`modelReasoningEffort` to the CEO default (`high`) for every role — expensive and unnecessary for routine work. A new `buildWorkerAdapterConfig` (with `DEFAULT_WORKER_THINKING_LEVEL = 'medium'`) builds worker adapter config: workers default to `medium`, do not inherit a user-configured CEO thinking level, and a role can still raise its level via its `role.meta.json` adapter override. The CEO is unchanged (`high`).
13
+ - **Board Operations and Hiring Plan issues are no longer orphaned.** They are created before the CEO exists, so they could not be assigned at creation time. `start-provision` now assigns both governance issues to the CEO right after the CEO agent is available (best-effort), so they are actionable instead of unassigned.
14
+
15
+ ### Changed
16
+
17
+ - **The Hiring Plan issue is now a review checkpoint, not a re-hiring task.** `buildHiringPlanBody` was rewritten to state explicitly that the initial team was already submitted as governed `/agent-hires` (pending approval where the board requires it, never auto-approved) and to give the CEO concrete tasks: review each provisioned agent against the `paperclip-create-agent` draft-review checklist, approve/reject the pending hires, and only hire for genuine remaining gaps. This makes the `disableBoardApprovalOnNewCompanies` setting meaningful: left `false`, the wizard's hires land as pending approvals the CEO works through this issue.
18
+
19
+ ### Added
20
+
21
+ - `scripts/patch-active-company.mjs` — idempotent maintenance script that patches an already-provisioned company in place to the current defaults: sets worker agents to `medium` thinking and assigns the Board Operations / Hiring Plan issues to the CEO. Supports `--dry-run` and `--thinking=<level>`.
22
+
7
23
  ---
8
24
  ## [0.4.2] - 2026-06-15
9
25
 
package/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  ---
17
17
 
18
- > **Fork:** This is a community-maintained fork of [yesterday-AI/paperclip-plugin-company-wizard](https://github.com/yesterday-AI/paperclip-plugin-company-wizard), updated for the current Paperclip API (`>=2026.529.0`) with substantial bug fixes. End-to-end company setup is governed through current Paperclip workflows as of v0.4.2.
18
+ > **Fork:** This is a community-maintained fork of [yesterday-AI/paperclip-plugin-company-wizard](https://github.com/yesterday-AI/paperclip-plugin-company-wizard), updated for the current Paperclip API (`>=2026.529.0`) with substantial bug fixes. End-to-end company setup is governed through current Paperclip workflows as of v0.4.3.
19
19
 
20
20
  <details>
21
21
  <summary><strong>What changed vs. upstream</strong></summary>
package/dist/manifest.js CHANGED
@@ -2,7 +2,7 @@
2
2
  var manifest = {
3
3
  id: "starlein.paperclip-plugin-company-wizard",
4
4
  apiVersion: 1,
5
- version: "0.4.2",
5
+ version: "0.4.3",
6
6
  displayName: "Company Wizard",
7
7
  description: "AI-powered wizard to bootstrap agent companies from composable templates",
8
8
  author: "Sascha Pietrowski <sp@speednetwork.de>",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/manifest.ts"],
4
- "sourcesContent": ["import type { PaperclipPluginManifestV1 } from '@paperclipai/plugin-sdk';\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: 'starlein.paperclip-plugin-company-wizard',\n apiVersion: 1,\n version: '0.4.2',\n displayName: 'Company Wizard',\n description: 'AI-powered wizard to bootstrap agent companies from composable templates',\n author: 'Sascha Pietrowski <sp@speednetwork.de>',\n categories: ['workspace', 'ui'],\n capabilities: [\n 'companies.read',\n 'issues.create',\n 'issues.read',\n 'issues.update',\n 'goals.create',\n 'goals.read',\n 'agents.read',\n 'projects.read',\n 'plugin.state.read',\n 'plugin.state.write',\n 'secrets.read-ref',\n 'events.subscribe',\n 'ui.page.register',\n 'ui.sidebar.register',\n ],\n instanceConfigSchema: {\n type: 'object',\n properties: {\n companiesDir: {\n type: 'string',\n description:\n 'Directory where assembled company workspaces are written. Defaults to ~/.paperclip/instances/default/companies. Override for Docker setups (e.g. /paperclip/instances/default/companies).',\n },\n templatesPath: {\n type: 'string',\n description:\n 'Path to the templates directory. Defaults to ~/.paperclip/plugin-templates (auto-downloaded from templatesRepoUrl if missing). Override for Docker setups (e.g. /paperclip/plugin-templates).',\n },\n templatesRepoUrl: {\n type: 'string',\n default: 'https://github.com/starlein/paperclip-plugin-company-wizard/tree/main/templates',\n description:\n 'GitHub tree URL to pull templates from when the templates directory does not exist.',\n },\n anthropicApiKey: {\n type: 'string',\n description:\n 'Anthropic API key for the AI wizard (e.g. sk-ant-...). Required to use the AI-powered company setup path.',\n },\n paperclipUrl: {\n type: 'string',\n description:\n 'Paperclip instance URL. Defaults to http://localhost:3100 or the PAPERCLIP_PUBLIC_URL env var.',\n },\n paperclipEmail: {\n type: 'string',\n description: 'Board login email (for authenticated instances).',\n },\n paperclipPassword: {\n type: 'string',\n description: 'Board login password (for authenticated instances).',\n },\n disableBoardApprovalOnNewCompanies: {\n type: 'boolean',\n default: false,\n description:\n 'Optional. If true, the wizard will PATCH new companies to set requireBoardApprovalForNewAgents=false during provisioning. Leave false to preserve approval-gated hiring policies.',\n },\n },\n },\n entrypoints: {\n worker: './dist/worker.js',\n ui: './dist/ui',\n },\n ui: {\n slots: [\n {\n type: 'page',\n id: 'company-wizard',\n displayName: 'Company Wizard',\n exportName: 'WizardPage',\n routePath: 'company-creator',\n },\n {\n type: 'sidebar',\n id: 'company-wizard-link',\n displayName: 'Create Company',\n exportName: 'SidebarLink',\n },\n ],\n },\n};\n\nexport default manifest;\n"],
4
+ "sourcesContent": ["import type { PaperclipPluginManifestV1 } from '@paperclipai/plugin-sdk';\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: 'starlein.paperclip-plugin-company-wizard',\n apiVersion: 1,\n version: '0.4.3',\n displayName: 'Company Wizard',\n description: 'AI-powered wizard to bootstrap agent companies from composable templates',\n author: 'Sascha Pietrowski <sp@speednetwork.de>',\n categories: ['workspace', 'ui'],\n capabilities: [\n 'companies.read',\n 'issues.create',\n 'issues.read',\n 'issues.update',\n 'goals.create',\n 'goals.read',\n 'agents.read',\n 'projects.read',\n 'plugin.state.read',\n 'plugin.state.write',\n 'secrets.read-ref',\n 'events.subscribe',\n 'ui.page.register',\n 'ui.sidebar.register',\n ],\n instanceConfigSchema: {\n type: 'object',\n properties: {\n companiesDir: {\n type: 'string',\n description:\n 'Directory where assembled company workspaces are written. Defaults to ~/.paperclip/instances/default/companies. Override for Docker setups (e.g. /paperclip/instances/default/companies).',\n },\n templatesPath: {\n type: 'string',\n description:\n 'Path to the templates directory. Defaults to ~/.paperclip/plugin-templates (auto-downloaded from templatesRepoUrl if missing). Override for Docker setups (e.g. /paperclip/plugin-templates).',\n },\n templatesRepoUrl: {\n type: 'string',\n default: 'https://github.com/starlein/paperclip-plugin-company-wizard/tree/main/templates',\n description:\n 'GitHub tree URL to pull templates from when the templates directory does not exist.',\n },\n anthropicApiKey: {\n type: 'string',\n description:\n 'Anthropic API key for the AI wizard (e.g. sk-ant-...). Required to use the AI-powered company setup path.',\n },\n paperclipUrl: {\n type: 'string',\n description:\n 'Paperclip instance URL. Defaults to http://localhost:3100 or the PAPERCLIP_PUBLIC_URL env var.',\n },\n paperclipEmail: {\n type: 'string',\n description: 'Board login email (for authenticated instances).',\n },\n paperclipPassword: {\n type: 'string',\n description: 'Board login password (for authenticated instances).',\n },\n disableBoardApprovalOnNewCompanies: {\n type: 'boolean',\n default: false,\n description:\n 'Optional. If true, the wizard will PATCH new companies to set requireBoardApprovalForNewAgents=false during provisioning. Leave false to preserve approval-gated hiring policies.',\n },\n },\n },\n entrypoints: {\n worker: './dist/worker.js',\n ui: './dist/ui',\n },\n ui: {\n slots: [\n {\n type: 'page',\n id: 'company-wizard',\n displayName: 'Company Wizard',\n exportName: 'WizardPage',\n routePath: 'company-creator',\n },\n {\n type: 'sidebar',\n id: 'company-wizard-link',\n displayName: 'Create Company',\n exportName: 'SidebarLink',\n },\n ],\n },\n};\n\nexport default manifest;\n"],
5
5
  "mappings": ";AAEA,IAAM,WAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,YAAY,CAAC,aAAa,IAAI;AAAA,EAC9B,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,YAAY;AAAA,MACV,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,kBAAkB;AAAA,QAChB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aACE;AAAA,MACJ;AAAA,MACA,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,oCAAoC;AAAA,QAClC,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,QAAQ;AAAA,IACR,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,mBAAQ;",
6
6
  "names": []
7
7
  }
package/dist/worker.js CHANGED
@@ -9282,6 +9282,7 @@ import { join } from "node:path";
9282
9282
  var DEFAULT_CEO_ADAPTER_TYPE = "codex_local";
9283
9283
  var DEFAULT_CEO_MODEL = "gpt-5.5";
9284
9284
  var DEFAULT_CEO_THINKING_LEVEL = "high";
9285
+ var DEFAULT_WORKER_THINKING_LEVEL = "medium";
9285
9286
  var DEFAULT_CEO_MAX_CONCURRENT_RUNS = 1;
9286
9287
  var DEFAULT_CEO_HEARTBEAT_INTERVAL_SEC = 3600;
9287
9288
  var DEFAULT_CLAUDE_CEO_MODEL = "claude-opus-4-6";
@@ -9291,10 +9292,12 @@ function asTrimmedString(value) {
9291
9292
  function normalizeCeoAdapterType(userCeoAdapter = {}) {
9292
9293
  return asTrimmedString(userCeoAdapter.type) || DEFAULT_CEO_ADAPTER_TYPE;
9293
9294
  }
9294
- function buildCeoAdapterConfig({
9295
+ function buildAdapterConfig({
9295
9296
  userCeoAdapter = {},
9296
9297
  companyDir,
9297
- roleAdapterOverrides = {}
9298
+ roleAdapterOverrides = {},
9299
+ defaultThinkingLevel = DEFAULT_CEO_THINKING_LEVEL,
9300
+ inheritUserThinking = true
9298
9301
  } = {}) {
9299
9302
  const adapterType = normalizeCeoAdapterType(userCeoAdapter);
9300
9303
  const userCwd = asTrimmedString(userCeoAdapter.cwd);
@@ -9302,7 +9305,8 @@ function buildCeoAdapterConfig({
9302
9305
  const overrideModel = asTrimmedString(roleAdapterOverrides.model);
9303
9306
  const defaultModel = adapterType === "claude_local" ? DEFAULT_CLAUDE_CEO_MODEL : DEFAULT_CEO_MODEL;
9304
9307
  const model = userModel || overrideModel || defaultModel;
9305
- const thinkingLevel = asTrimmedString(userCeoAdapter.thinkingLevel) || asTrimmedString(userCeoAdapter.modelReasoningEffort) || asTrimmedString(userCeoAdapter.reasoningEffort) || asTrimmedString(roleAdapterOverrides.thinkingLevel) || asTrimmedString(roleAdapterOverrides.modelReasoningEffort) || asTrimmedString(roleAdapterOverrides.reasoningEffort) || DEFAULT_CEO_THINKING_LEVEL;
9308
+ const userThinking = inheritUserThinking ? asTrimmedString(userCeoAdapter.thinkingLevel) || asTrimmedString(userCeoAdapter.modelReasoningEffort) || asTrimmedString(userCeoAdapter.reasoningEffort) : "";
9309
+ const thinkingLevel = userThinking || asTrimmedString(roleAdapterOverrides.thinkingLevel) || asTrimmedString(roleAdapterOverrides.modelReasoningEffort) || asTrimmedString(roleAdapterOverrides.reasoningEffort) || defaultThinkingLevel;
9306
9310
  const adapterConfig = {
9307
9311
  ...roleAdapterOverrides,
9308
9312
  cwd: userCwd || companyDir,
@@ -9319,6 +9323,20 @@ function buildCeoAdapterConfig({
9319
9323
  }
9320
9324
  return adapterConfig;
9321
9325
  }
9326
+ function buildCeoAdapterConfig(opts = {}) {
9327
+ return buildAdapterConfig({
9328
+ ...opts,
9329
+ defaultThinkingLevel: DEFAULT_CEO_THINKING_LEVEL,
9330
+ inheritUserThinking: true
9331
+ });
9332
+ }
9333
+ function buildWorkerAdapterConfig(opts = {}) {
9334
+ return buildAdapterConfig({
9335
+ ...opts,
9336
+ defaultThinkingLevel: DEFAULT_WORKER_THINKING_LEVEL,
9337
+ inheritUserThinking: false
9338
+ });
9339
+ }
9322
9340
  function buildCeoAgentRuntimeConfig() {
9323
9341
  return {
9324
9342
  heartbeat: {
@@ -11266,23 +11284,36 @@ function buildHiringPlanBody({
11266
11284
 
11267
11285
  Generated by Company Wizard on ${today}.
11268
11286
 
11269
- ## Instruction Source
11287
+ ## Status: initial team already provisioned
11288
+
11289
+ Company Wizard has already submitted the initial team below as **governed hires**
11290
+ via \`/agent-hires\` (each with a full instruction bundle assembled from curated role
11291
+ templates). Where the board requires approval, those hires are pending your approval \u2014
11292
+ they were **not** auto-approved.
11293
+
11294
+ **This issue is your review checkpoint \u2014 not a re-hiring task.** Do not create the
11295
+ roles below again.
11296
+
11297
+ ## Your tasks
11270
11298
 
11271
- Company Wizard uses curated role templates from its template library. When proposing additional hires after bootstrap, follow the Paperclip \`paperclip-create-agent\` workflow: choose an exact, adjacent, or generic template; run the draft-review checklist; submit via \`/agent-hires\`; link this issue as \`sourceIssueId\`; and wait for board approval when required.
11299
+ 1. **Review each provisioned agent against the draft-review checklist** (Paperclip
11300
+ \`paperclip-create-agent\` \u2192 \`references/draft-review-checklist.md\`): instruction
11301
+ quality, correct adapter/model/thinking level, escalation/reportsTo path, and
11302
+ desiredSkills justification. Note any corrections in the decision log.
11303
+ 2. **Approve or reject** the pending hires accordingly.
11304
+ 3. **Only hire for genuine gaps.** If a capability is missing after the first
11305
+ roadmap/backlog pass, follow the \`paperclip-create-agent\` workflow: pick an exact,
11306
+ adjacent, or generic template, run the draft-review checklist, submit via
11307
+ \`/agent-hires\` with a concrete AGENTS.md draft + adapter config + desiredSkills
11308
+ justification, and set \`sourceIssueId\` to this issue.
11272
11309
 
11273
- ## Initial Roles
11310
+ ## Initial Roles (already provisioned)
11274
11311
 
11275
11312
  ${roles.map((role) => `- ${formatRoleName(role)}`).join("\n")}
11276
11313
 
11277
11314
  ## Selected Modules
11278
11315
 
11279
11316
  ${moduleNames.length > 0 ? moduleNames.map((mod) => `- ${mod}`).join("\n") : "- none"}
11280
-
11281
- ## Follow-up Review
11282
-
11283
- - Reassess capacity after the first roadmap/backlog pass.
11284
- - Do not hire for capabilities already covered by existing roles.
11285
- - If a gap remains, submit a governed hire request with a concrete AGENTS.md draft, adapter config, desiredSkills justification, and sourceIssueId pointing to this hiring plan issue.
11286
11317
  `;
11287
11318
  }
11288
11319
  var plugin = definePlugin({
@@ -11774,6 +11805,20 @@ var plugin = definePlugin({
11774
11805
  fallbackEntryContent: ceoPromptTemplate,
11775
11806
  log
11776
11807
  });
11808
+ for (const govIssue of [
11809
+ { issue: boardOperationsIssue, label: "Board Operations" },
11810
+ { issue: hiringPlanIssue, label: "Hiring Plan" }
11811
+ ]) {
11812
+ if (!govIssue.issue?.id) continue;
11813
+ try {
11814
+ await client.updateIssue(govIssue.issue.id, { assigneeAgentId: ceoAgentId });
11815
+ log(`\u2713 Assigned ${govIssue.label} issue to CEO`);
11816
+ } catch (assignErr) {
11817
+ log(
11818
+ `\u26A0 Could not assign ${govIssue.label} issue to CEO: ${assignErr instanceof Error ? assignErr.message : String(assignErr)}`
11819
+ );
11820
+ }
11821
+ }
11777
11822
  const teamRoles = [...assembleResult.allRoles ?? []].filter(
11778
11823
  (r) => r && r !== "ceo"
11779
11824
  );
@@ -11799,7 +11844,7 @@ var plugin = definePlugin({
11799
11844
  ...roleDescription ? { description: roleDescription } : {}
11800
11845
  };
11801
11846
  const roleRuntimeConfig = buildWorkerAgentRuntimeConfig();
11802
- const roleAdapterConfig = buildCeoAdapterConfig({
11847
+ const roleAdapterConfig = buildWorkerAdapterConfig({
11803
11848
  userCeoAdapter,
11804
11849
  companyDir,
11805
11850
  roleAdapterOverrides: assembleResult.roleAdapterOverrides?.get(roleName) ?? {}