@starlein/paperclip-plugin-company-wizard 0.4.1 → 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 +23 -0
- package/README.md +1 -1
- package/dist/manifest.js +1 -1
- package/dist/manifest.js.map +1 -1
- package/dist/worker.js +64 -16
- package/dist/worker.js.map +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,29 @@ 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
|
+
|
|
23
|
+
---
|
|
24
|
+
## [0.4.2] - 2026-06-15
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- **Existing-company provisioning no longer fails while creating governance records.** Board Operations and Hiring Plan are now created as unassigned `todo` issues because Paperclip rejects unassigned `in_progress` issues.
|
|
29
|
+
|
|
7
30
|
---
|
|
8
31
|
## [0.4.1] - 2026-06-15
|
|
9
32
|
|
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.
|
|
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.
|
|
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>",
|
package/dist/manifest.js.map
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
|
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: {
|
|
@@ -10939,7 +10957,7 @@ var __dirname = path2.dirname(fileURLToPath2(import.meta.url));
|
|
|
10939
10957
|
var DEFAULT_TEMPLATES_REPO_URL = "https://github.com/starlein/paperclip-plugin-company-wizard/tree/main/templates";
|
|
10940
10958
|
var BUNDLED_TEMPLATES_DIR = path2.resolve(__dirname, "..", "templates");
|
|
10941
10959
|
var PLUGIN_PACKAGE_NAME = "@starlein/paperclip-plugin-company-wizard";
|
|
10942
|
-
var CURRENT_PLUGIN_VERSION = "0.4.
|
|
10960
|
+
var CURRENT_PLUGIN_VERSION = "0.4.2";
|
|
10943
10961
|
var NPM_LATEST_URL = "https://registry.npmjs.org/@starlein%2Fpaperclip-plugin-company-wizard/latest";
|
|
10944
10962
|
function copyDirSync(src, dest) {
|
|
10945
10963
|
fs2.mkdirSync(dest, { recursive: true });
|
|
@@ -11266,23 +11284,36 @@ function buildHiringPlanBody({
|
|
|
11266
11284
|
|
|
11267
11285
|
Generated by Company Wizard on ${today}.
|
|
11268
11286
|
|
|
11269
|
-
##
|
|
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
|
-
|
|
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({
|
|
@@ -11628,7 +11659,10 @@ var plugin = definePlugin({
|
|
|
11628
11659
|
const createdBoardOperationsIssue = await client.createIssue(companyId, {
|
|
11629
11660
|
title: "Board Operations",
|
|
11630
11661
|
description: "Standing issue for board decision log and operations tracking.",
|
|
11631
|
-
|
|
11662
|
+
// These governance records are created before the CEO is guaranteed to exist.
|
|
11663
|
+
// Paperclip requires an assignee for in_progress issues, so keep them unassigned
|
|
11664
|
+
// and actionable later rather than failing existing-company provisioning.
|
|
11665
|
+
status: "todo",
|
|
11632
11666
|
priority: "medium"
|
|
11633
11667
|
});
|
|
11634
11668
|
boardOperationsIssue = createdBoardOperationsIssue;
|
|
@@ -11651,7 +11685,7 @@ var plugin = definePlugin({
|
|
|
11651
11685
|
const createdHiringPlanIssue = await client.createIssue(companyId, {
|
|
11652
11686
|
title: "Hiring Plan",
|
|
11653
11687
|
description: "Develop and execute the governed team hiring plan.",
|
|
11654
|
-
status: "
|
|
11688
|
+
status: "todo",
|
|
11655
11689
|
priority: "high"
|
|
11656
11690
|
});
|
|
11657
11691
|
hiringPlanIssue = createdHiringPlanIssue;
|
|
@@ -11771,6 +11805,20 @@ var plugin = definePlugin({
|
|
|
11771
11805
|
fallbackEntryContent: ceoPromptTemplate,
|
|
11772
11806
|
log
|
|
11773
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
|
+
}
|
|
11774
11822
|
const teamRoles = [...assembleResult.allRoles ?? []].filter(
|
|
11775
11823
|
(r) => r && r !== "ceo"
|
|
11776
11824
|
);
|
|
@@ -11796,7 +11844,7 @@ var plugin = definePlugin({
|
|
|
11796
11844
|
...roleDescription ? { description: roleDescription } : {}
|
|
11797
11845
|
};
|
|
11798
11846
|
const roleRuntimeConfig = buildWorkerAgentRuntimeConfig();
|
|
11799
|
-
const roleAdapterConfig =
|
|
11847
|
+
const roleAdapterConfig = buildWorkerAdapterConfig({
|
|
11800
11848
|
userCeoAdapter,
|
|
11801
11849
|
companyDir,
|
|
11802
11850
|
roleAdapterOverrides: assembleResult.roleAdapterOverrides?.get(roleName) ?? {}
|