@stravica-ai/digital-operator-pa 0.1.54 → 0.1.55

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.
Files changed (55) hide show
  1. package/dist/engineering-pa-cli/src/coordinator-hook/config.mjs +2 -2
  2. package/dist/engineering-pa-cli/src/environment/probes.mjs +1 -1
  3. package/dist/engineering-pa-cli/src/pa/cli.mjs +28 -0
  4. package/dist/engineering-pa-cli/src/pa/projects.mjs +7 -0
  5. package/dist/engineering-pa-cli/src/pa/work-cli.mjs +26 -0
  6. package/dist/engineering-pa-cli/src/pa/work.mjs +9 -0
  7. package/dist/engineering-pa-core/docs/autonomy-envelope-tracker.md +22 -22
  8. package/dist/engineering-pa-core/docs/blueprints/git-identity/blueprint.md +21 -19
  9. package/dist/engineering-pa-core/docs/blueprints/scheduled-distillation/blueprint.md +2 -2
  10. package/dist/engineering-pa-core/docs/commands/init.md +1 -1
  11. package/dist/engineering-pa-core/docs/commands/onboard.md +6 -6
  12. package/dist/engineering-pa-core/docs/commands/research.md +66 -66
  13. package/dist/engineering-pa-core/docs/commands/upgrade.md +4 -4
  14. package/dist/engineering-pa-core/docs/entity-location-map.md +4 -4
  15. package/dist/engineering-pa-core/docs/lock.md +18 -18
  16. package/dist/engineering-pa-core/docs/memory-sync.md +1 -1
  17. package/dist/engineering-pa-core/docs/pa-operating-model.md +87 -87
  18. package/dist/engineering-pa-core/docs/scheduling.md +1 -1
  19. package/dist/engineering-pa-core/docs/standards/README.md +2 -2
  20. package/dist/engineering-pa-core/docs/standards/briefing-contract.md +18 -18
  21. package/dist/engineering-pa-core/docs/standards/tooling.md +41 -41
  22. package/dist/engineering-pa-core/docs/tools/distill.md +19 -19
  23. package/dist/engineering-pa-core/docs/tools/memory-sync.md +14 -14
  24. package/dist/engineering-pa-core/docs/tools/scheduler.md +15 -15
  25. package/dist/engineering-pa-core/docs/tools/slice.md +18 -18
  26. package/dist/engineering-pa-core/docs/upstream-issue-filing.md +6 -6
  27. package/dist/engineering-pa-core/docs/working-directory.md +3 -3
  28. package/dist/engineering-pa-core/docs/workspace-operations.md +11 -11
  29. package/dist/engineering-pa-core/package.json +3 -3
  30. package/dist/engineering-pa-core/src/distill/health.mjs +16 -6
  31. package/dist/engineering-pa-core/src/instance-root/find.mjs +14 -3
  32. package/dist/engineering-pa-core/src/memory-sync/repo.mjs +2 -2
  33. package/dist/engineering-pa-core/src/scheduler/install.mjs +8 -7
  34. package/dist/engineering-pa-core/src/scheduler/list.mjs +2 -2
  35. package/dist/engineering-pa-core/src/scheduler/remove.mjs +65 -11
  36. package/dist/engineering-pa-core/src/scheduler/verify.mjs +2 -2
  37. package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/mirror-folder.mjs +3 -2
  38. package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/link.mjs +2 -1
  39. package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/sync-statuses.mjs +5 -1
  40. package/dist/engineering-pa-library-cli/package.json +1 -0
  41. package/dist/engineering-pa-library-cli/src/pull-clones.mjs +12 -3
  42. package/dist/engineering-pa-library-tunnel/package.json +3 -0
  43. package/dist/engineering-pa-library-tunnel/src/config.mjs +2 -2
  44. package/dist/engineering-pa-migrate-inspect/package.json +4 -1
  45. package/dist/engineering-pa-migrate-inspect/src/age-key-migrate.mjs +2 -2
  46. package/dist/engineering-pa-migrate-inspect/src/inspector.mjs +2 -2
  47. package/dist/engineering-pa-migrate-inspect/src/platforms/macos.mjs +2 -1
  48. package/dist/engineering-pa-scaffold/src/commands/init-workspace-extension.mjs +8 -0
  49. package/dist/engineering-pa-workspace/app/project-detail.html +7 -0
  50. package/dist/engineering-pa-workspace/app/viewer.html +5 -0
  51. package/dist/engineering-pa-workspace/src/install-daemon.mjs +6 -5
  52. package/dist/engineering-pa-workspace/src/review/api-handler.mjs +53 -2
  53. package/dist/engineering-pa-workspace/src/supervisor.mjs +5 -4
  54. package/docs/onboarding-solo.md +1 -0
  55. package/package.json +5 -4
@@ -20,7 +20,7 @@
20
20
  import { readFile } from 'node:fs/promises';
21
21
  import { dirname, join, resolve } from 'node:path';
22
22
  import { fileURLToPath } from 'node:url';
23
- import { homedir } from 'node:os';
23
+ import { resolveHome } from '../../../engineering-pa-core/src/home/resolve.mjs';
24
24
 
25
25
  const __dirname = dirname(fileURLToPath(import.meta.url));
26
26
  const CORE_CONFIG_PATH = resolve(__dirname, '..', '..', 'config', 'coordinator-allowlist.json');
@@ -98,7 +98,7 @@ export function mergeOverlay(config, overlay, warnings = []) {
98
98
  * lives at `.claude/coordinator-overlay.json` under that directory.
99
99
  */
100
100
  export function overlayPaths({ repoRoot, cwd, env = process.env }) {
101
- const home = env.HOME || homedir();
101
+ const home = resolveHome({ env });
102
102
  const workspaceBase = repoRoot || cwd;
103
103
  return {
104
104
  home: home ? join(home, '.claude', 'coordinator-overlay.json') : null,
@@ -6,7 +6,7 @@
6
6
  import { execFile } from 'node:child_process';
7
7
  import { existsSync, readdirSync, statSync, readFileSync } from 'node:fs';
8
8
  import { promisify } from 'node:util';
9
- import { arch, platform, release, homedir } from 'node:os';
9
+ import { arch, platform, release } from 'node:os';
10
10
  import { basename, join, resolve, dirname } from 'node:path';
11
11
  import { resolve4 } from 'node:dns/promises';
12
12
  import { fileURLToPath } from 'node:url';
@@ -67,6 +67,34 @@ export async function main(argv) {
67
67
  return 0;
68
68
  }
69
69
 
70
+ // 0.1.55 item 4 (w-2026-09-21-dave-004): `pa --version` / `pa -v`
71
+ // prints the installed package version. Before this landing there
72
+ // was no way to ask an installed CLI which version it was, so the
73
+ // 0.1.54 sweep had to `cat node_modules/.../package.json` by hand.
74
+ if (argv[0] === '--version' || argv[0] === '-v') {
75
+ const { readFile } = await import('node:fs/promises');
76
+ const { fileURLToPath } = await import('node:url');
77
+ const { dirname: dn, join: jn } = await import('node:path');
78
+ try {
79
+ // packages/cli/src/pa/cli.mjs -> ../../..(three-up)/package.json
80
+ // works in-repo. The installed tarball layout resolves the
81
+ // package.json via the exports map added in this same release.
82
+ let pkgJson;
83
+ try {
84
+ pkgJson = await import('@stravica-ai/digital-operator-pa/package.json', { with: { type: 'json' } });
85
+ } catch {
86
+ const here = dn(fileURLToPath(import.meta.url));
87
+ const local = jn(here, '..', '..', '..', 'engineering-pa', 'package.json');
88
+ pkgJson = { default: JSON.parse(await readFile(local, 'utf8')) };
89
+ }
90
+ process.stdout.write((pkgJson.default?.version || 'unknown') + '\n');
91
+ return 0;
92
+ } catch (e) {
93
+ process.stderr.write(`[pa] failed to resolve version: ${e?.message || e}\n`);
94
+ return 1;
95
+ }
96
+ }
97
+
70
98
  const verb = argv[0];
71
99
  const rest = argv.slice(1);
72
100
 
@@ -17,6 +17,7 @@ import { writeFile } from 'node:fs/promises';
17
17
  import { join } from 'node:path';
18
18
 
19
19
  import { getRepoRoot } from './repo-root.mjs';
20
+ import { findRepoRootSync } from '../../../engineering-pa-core/src/instance-root/find.mjs';
20
21
  import { readJson, writeJson, ensureDir, listSubdirs, today } from './io.mjs';
21
22
  import { addDoc, removeDocByPath, setDocStatus, DEFAULT_GROUP, VALID_DOC_STATUSES } from './doc-groups.mjs';
22
23
  import { normaliseDocPath } from './doc-path.mjs';
@@ -111,6 +112,12 @@ export async function createProject(opts) {
111
112
  validateCategory(opts.category);
112
113
  validatePriority(opts.priority);
113
114
 
115
+ // 0.1.55 F1: refuse a project create from outside any operator instance
116
+ // with the strict findRepoRootSync error (exit 2, message naming the
117
+ // start directory and the markers walked). Keeps the failure shape
118
+ // aligned with pa work create and the scaffold write paths.
119
+ findRepoRootSync({ strict: true });
120
+
114
121
  const repoRoot = await getRepoRoot();
115
122
  const projDir = join(repoRoot, 'projects', opts.id);
116
123
  const projectJsonPath = join(projDir, 'project.json');
@@ -126,8 +126,34 @@ async function readPreferencesPaName() {
126
126
  }
127
127
  }
128
128
 
129
+ // 0.1.55 item 4 (w-2026-09-21-dave-004): refuse unknown flags loudly.
130
+ // The pre-0.1.55 parser silently dropped anything not consumed downstream,
131
+ // so a typo like `--status` (only valid on `work status`) or an assumed
132
+ // `--description` (there is no such flag; the field is `summary`) went
133
+ // unnoticed and the created record was missing the value the operator
134
+ // meant to set. Recorded as an incident in w-2026-09-21-dave-002's
135
+ // summary.
136
+ const CREATE_ALLOWED_FLAGS = new Set([
137
+ 'project',
138
+ 'title',
139
+ 'category',
140
+ 'priority',
141
+ 'summary',
142
+ 'owner',
143
+ 'assignee',
144
+ 'author',
145
+ ]);
146
+
129
147
  async function doCreate(args) {
130
148
  const { flags } = parseFlags(args);
149
+ const unknown = Object.keys(flags).filter((k) => !CREATE_ALLOWED_FLAGS.has(k));
150
+ if (unknown.length > 0) {
151
+ const list = unknown.map((k) => `--${k}`).join(', ');
152
+ const known = Array.from(CREATE_ALLOWED_FLAGS).map((k) => `--${k}`).sort().join(', ');
153
+ process.stderr.write(`[pa work create] unknown flag(s): ${list}\n`);
154
+ process.stderr.write(` accepted flags: ${known}\n`);
155
+ return 1;
156
+ }
131
157
  const priority = flags.priority != null && flags.priority !== true
132
158
  ? Number(flags.priority)
133
159
  : null;
@@ -25,6 +25,7 @@ import {
25
25
  maxNForAuthorOnDate,
26
26
  } from '../../../engineering-pa-core/src/workItemId/index.mjs';
27
27
 
28
+ import { findRepoRootSync } from '../../../engineering-pa-core/src/instance-root/find.mjs';
28
29
  import { getRepoRoot } from './repo-root.mjs';
29
30
  import {
30
31
  readJson,
@@ -128,6 +129,14 @@ export async function createWork(opts) {
128
129
  validateCategory(opts.category);
129
130
  validatePriority(opts.priority);
130
131
 
132
+ // 0.1.55 F1: refuse a mint from outside any operator instance BEFORE the
133
+ // author-token check. Pre-fix the flow bailed with the author-token error
134
+ // (exit 1), which read as a config problem in the caller's terminal; the
135
+ // real cause is that the cwd carries none of the instance markers. Strict
136
+ // findRepoRootSync throws with exit 2 and names both the start directory
137
+ // and the markers walked, matching the sibling rule in projects.mjs.
138
+ findRepoRootSync({ strict: true });
139
+
131
140
  let author;
132
141
  try {
133
142
  author = resolveAuthorToken({
@@ -12,34 +12,34 @@ The envelope is the durable record of what the operator has approved the PA to d
12
12
 
13
13
  | State | Meaning | PA behaviour |
14
14
  |---|---|---|
15
- | `fullyApproved` | Operator has said "just do this class of task; don't ask." | Act. Don't ask. If the reflex is to check, resist — the envelope is telling you not to. |
15
+ | `fullyApproved` | Operator has said "just do this class of task; don't ask." | Act. Don't ask. If the reflex is to check, resist; the envelope is telling you not to. |
16
16
  | `checkBeforeCommitting` | Operator wants sign-off on the durable action but not on the drafting. | Draft, get sign-off before commit / push / publish / ship. Read-only exploration is fine without asking. |
17
17
  | `needsFullSupervision` | Operator hasn't approved this class yet, or has explicitly demoted it. | Do not act. Escalate every step. |
18
18
 
19
- The envelope's authority is above the PA's own inclination. If the envelope says a category is `needsFullSupervision` but the PA thinks the operator would be fine with autonomous action, the PA does NOT act — the operator can promote the category via `pa autonomy set` when they're ready.
19
+ The envelope's authority is above the PA's own inclination. If the envelope says a category is `needsFullSupervision` but the PA thinks the operator would be fine with autonomous action, the PA does NOT act; the operator can promote the category via `pa autonomy set` when they're ready.
20
20
 
21
21
  ## Task-type taxonomy
22
22
 
23
- **Core does not enforce a specific task-type taxonomy** — every operator's surface types are different. An example taxonomy the operator might seed with:
23
+ **Core does not enforce a specific task-type taxonomy**; every operator's surface types are different. An example taxonomy the operator might seed with:
24
24
 
25
- - `li-comment-draft` — drafting a LinkedIn comment reply.
26
- - `li-post-draft` — drafting a full LinkedIn post.
27
- - `article-draft` — drafting a long-form article.
28
- - `code-dispatch` — dispatching a code implementer.
29
- - `code-inline` — writing code in the main thread.
30
- - `git-commit-push` — committing and pushing.
31
- - `secret-access` — reading operator secrets from the vault.
32
- - `contact-outreach` — reaching out to a contact on the operator's behalf.
25
+ - `li-comment-draft`; drafting a LinkedIn comment reply.
26
+ - `li-post-draft`; drafting a full LinkedIn post.
27
+ - `article-draft`; drafting a long-form article.
28
+ - `code-dispatch`; dispatching a code implementer.
29
+ - `code-inline`; writing code in the main thread.
30
+ - `git-commit-push`; committing and pushing.
31
+ - `secret-access`; reading operator secrets from the vault.
32
+ - `contact-outreach`; reaching out to a contact on the operator's behalf.
33
33
 
34
34
  The operator seeds their own taxonomy per their surface types. The schema (`packages/core/schema/autonomy-envelope.schema.json`) enforces field shape but not the specific set of `taskTypes.id` values.
35
35
 
36
36
  ## CLI
37
37
 
38
- `pa autonomy` — four subcommands.
38
+ `pa autonomy`; four subcommands.
39
39
 
40
40
  | Subcommand | Purpose |
41
41
  |---|---|
42
- | `pa autonomy init <agent>` | Create an empty envelope for a new agent. Idempotent — errors if envelope already exists. |
42
+ | `pa autonomy init <agent>` | Create an empty envelope for a new agent. Idempotent; errors if envelope already exists. |
43
43
  | `pa autonomy get <agent> [<task-type>]` | Print current state. Task-type optional (prints full table if omitted). |
44
44
  | `pa autonomy set <agent> <task-type> <state> [--note <text>]` | Update state. Adds timestamped history entry to the body. Validates state against the enum. |
45
45
  | `pa autonomy list [<agent>]` | List envelopes across all agents (or one), with staleness signals (envelope untouched for >30 days → warning). |
@@ -60,7 +60,7 @@ The `pa autonomy get <agent> --format json` output is stable JSON that a boot-co
60
60
 
61
61
  ## Difference from the three-zone role envelope standard
62
62
 
63
- **Related but separate.** The three-zone ROLE envelope is a standard for how ROLES calibrate autonomy across their whole surface — informational, decision-support, decision-authority. That's a property of the role definition.
63
+ **Related but separate.** The three-zone ROLE envelope is a standard for how ROLES calibrate autonomy across their whole surface; informational, decision-support, decision-authority. That's a property of the role definition.
64
64
 
65
65
  This tracker is a PER-AGENT, PER-TASK-TYPE record that the operator sets and demotes/promotes dynamically. Different granularity, different lifecycle. Both patterns coexist.
66
66
 
@@ -85,27 +85,27 @@ taskTypes:
85
85
  stateSince: 2026-07-05T14:30:00Z
86
86
  ---
87
87
 
88
- # Autonomy envelope — dave
88
+ # Autonomy envelope; dave
89
89
 
90
90
  ## Current state
91
91
 
92
92
  | Task type | State | Since | Note |
93
93
  |---|---|---|---|
94
94
  | LinkedIn comment draft | checkBeforeCommitting | 2026-07-04 | Voice restarts are cheap mid-draft. |
95
- | Code implementation dispatch | fullyApproved | 2026-07-05 | — |
95
+ | Code implementation dispatch | fullyApproved | 2026-07-05 |; |
96
96
 
97
97
  ## History
98
98
 
99
- ### 2026-07-05T14:30:00Z — code-dispatch promoted to fullyApproved
99
+ ### 2026-07-05T14:30:00Z; code-dispatch promoted to fullyApproved
100
100
  Operator note: none.
101
101
 
102
- ### 2026-07-04T09:00:00Z — li-comment-draft demoted to checkBeforeCommitting
102
+ ### 2026-07-04T09:00:00Z; li-comment-draft demoted to checkBeforeCommitting
103
103
  Operator note: Voice restarts are cheap mid-draft; post-publication corrections are expensive.
104
104
  ```
105
105
 
106
106
  ## Related
107
107
 
108
- - `packages/core/schema/autonomy-envelope.schema.json` — canonical schema.
109
- - CLAUDE.md.template framing block — the operator-facing pointer.
110
- - `packages/core/knowledge/operator-interface/escalation-and-correction.md` — how the envelope interacts with escalation.
111
- - `packages/cli/src/autonomy/` — CLI implementation.
108
+ - `packages/core/schema/autonomy-envelope.schema.json`; canonical schema.
109
+ - CLAUDE.md.template framing block; the operator-facing pointer.
110
+ - `packages/core/knowledge/operator-interface/escalation-and-correction.md`; how the envelope interacts with escalation.
111
+ - `packages/cli/src/autonomy/`; CLI implementation.
@@ -1,6 +1,6 @@
1
1
  # Git Identity
2
2
 
3
- Give your PA its own dedicated git identity with a separate SSH key and commit author. This creates a clear audit trail -- you can always tell which commits were made by you and which by your PA.
3
+ Give your PA its own dedicated git identity with a separate SSH key and commit author. This creates a clear audit trail: you can always tell which commits were made by you and which by your PA.
4
4
 
5
5
 
6
6
  ## What it does
@@ -22,29 +22,31 @@ Sets up:
22
22
 
23
23
  ## Steps
24
24
 
25
+ Substitute your PA's name for `<paName>` throughout (the example below uses the placeholder to keep the copy generic across estates).
26
+
25
27
  ### 1. Generate an SSH keypair
26
28
 
27
- Create a dedicated key for your PA. Replace `dave` with your PA's name:
29
+ Create a dedicated key for your PA:
28
30
 
29
31
  ```bash
30
- ssh-keygen -t ed25519 -C "dave-pa@yourdomain.com" -f ~/.ssh/dave_pa_ed25519 -N ""
32
+ ssh-keygen -t ed25519 -C "<paName>-pa@yourdomain.com" -f ~/.ssh/<paName>_pa_ed25519 -N ""
31
33
  ```
32
34
 
33
35
  This creates:
34
- - `~/.ssh/dave_pa_ed25519` (private key)
35
- - `~/.ssh/dave_pa_ed25519.pub` (public key)
36
+ - `~/.ssh/<paName>_pa_ed25519` (private key)
37
+ - `~/.ssh/<paName>_pa_ed25519.pub` (public key)
36
38
 
37
39
  ### 2. Add the public key to GitHub
38
40
 
39
41
  Copy the public key:
40
42
 
41
43
  ```bash
42
- cat ~/.ssh/dave_pa_ed25519.pub
44
+ cat ~/.ssh/<paName>_pa_ed25519.pub
43
45
  ```
44
46
 
45
47
  Then add it to GitHub:
46
48
  - Go to GitHub Settings > SSH and GPG keys > New SSH key
47
- - Title: "Dave PA" (or your PA's name)
49
+ - Title: "<paName> PA" (or whatever you call your PA)
48
50
  - Key type: Authentication key
49
51
  - Paste the public key
50
52
 
@@ -58,7 +60,7 @@ Add a host alias to `~/.ssh/config`:
58
60
  Host github-pa
59
61
  HostName github.com
60
62
  User git
61
- IdentityFile ~/.ssh/dave_pa_ed25519
63
+ IdentityFile ~/.ssh/<paName>_pa_ed25519
62
64
  IdentitiesOnly yes
63
65
  ```
64
66
 
@@ -68,8 +70,8 @@ Set up the PA's git identity in your repo. Create or edit `.gitconfig` in your r
68
70
 
69
71
  ```ini
70
72
  [user]
71
- name = Dave (PA)
72
- email = dave-pa@yourdomain.com
73
+ name = <paName> (PA)
74
+ email = <paName>-pa@yourdomain.com
73
75
  ```
74
76
 
75
77
  Then tell git to use this config for this repo:
@@ -81,8 +83,8 @@ git config --local include.path ../.gitconfig
81
83
  Alternatively, set it directly:
82
84
 
83
85
  ```bash
84
- git config --local user.name "Dave (PA)"
85
- git config --local user.email "dave-pa@yourdomain.com"
86
+ git config --local user.name "<paName> (PA)"
87
+ git config --local user.email "<paName>-pa@yourdomain.com"
86
88
  ```
87
89
 
88
90
  ### 5. Update remote URL (optional)
@@ -102,15 +104,15 @@ ssh -T github-pa
102
104
  # Should output: Hi yourusername! You've successfully authenticated...
103
105
 
104
106
  git log --oneline -1
105
- # Commits should show "Dave (PA)" as author
107
+ # Commits should show "<paName> (PA)" as author
106
108
  ```
107
109
 
108
110
 
109
111
  ## Security notes
110
112
 
111
- - The PA's SSH key should have the minimum required access -- prefer deploy keys over personal access
112
- - Never share the private key or commit it to the repository
113
- - Store the private key path in your secrets vault for reference
114
- - If the PA only needs to push to specific repos, use per-repo deploy keys instead of a global SSH key
115
- - Consider enabling signed commits for the PA identity for additional verification
116
- - Periodically rotate the SSH key, especially if the PA operates on shared infrastructure
113
+ - The PA's SSH key should have the minimum required access. Prefer deploy keys over personal access.
114
+ - Never share the private key or commit it to the repository.
115
+ - Store the private key path in your secrets vault for reference.
116
+ - If the PA only needs to push to specific repos, use per-repo deploy keys instead of a global SSH key.
117
+ - Consider enabling signed commits for the PA identity for additional verification.
118
+ - Periodically rotate the SSH key, especially if the PA operates on shared infrastructure.
@@ -43,8 +43,8 @@ On macOS/launchd, the installer auto-injects `PATH` (captured from the
43
43
  install-time shell), `HOME`, and `DAVE_ROOT` into the generated plist,
44
44
  so Homebrew-installed tools (`node`, `claude`, `git`) work out of the
45
45
  box. Any key you list under `environment` overrides the auto-injected
46
- default. On cron/systemd/schtasks, only the keys you declare are set —
47
- no auto-defaults — because those backends do not have launchd's
46
+ default. On cron/systemd/schtasks, only the keys you declare are set;
47
+ no auto-defaults; because those backends do not have launchd's
48
48
  minimal-environment footgun. Values support `${DAVE_ROOT}`, `${HOME}`,
49
49
  and `${USER}` substitution at install time.
50
50
 
@@ -32,7 +32,7 @@ Capture as:
32
32
  "hostname": "<hostname output>",
33
33
  "os": "<uname -s output>",
34
34
  "arch": "<uname -m output>",
35
- "daveRoot": "<resolved project root — absolute path>"
35
+ "daveRoot": "<resolved project root; absolute path>"
36
36
  }
37
37
  ```
38
38
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: First-session onboarding walkthrough — verifies the install, offers optional setup (Atlassian, workspace, alias, profile intake), and marks each step complete.
2
+ description: First-session onboarding walkthrough; verifies the install, offers optional setup (Atlassian, workspace, alias, profile intake), and marks each step complete.
3
3
  when_to_use: >-
4
4
  Run on the operator's first session in a fresh scaffolded PA instance. Also
5
5
  re-runnable any time later: every step is idempotent and reads the current
@@ -10,7 +10,7 @@ argument-hint: (no arguments)
10
10
  context: inline
11
11
  ---
12
12
 
13
- # /onboard — first-session walkthrough
13
+ # /onboard; first-session walkthrough
14
14
 
15
15
  You are running the onboarding walkthrough for a freshly scaffolded PA instance.
16
16
  The scaffold has already run `pnpm install` and `pa status` at scaffold time, so
@@ -50,7 +50,7 @@ secrets need (see `packages/core/src/vault/tool-needs.mjs`), and set to
50
50
  `notNeeded` when the tool-needs cross-reference is empty. Both `done`
51
51
  and `notNeeded` pass the completion gate.
52
52
 
53
- If the file is missing, the scaffold did not seed it — flag that and stop.
53
+ If the file is missing, the scaffold did not seed it; flag that and stop.
54
54
 
55
55
  If `completedAt` is set, tell the operator onboarding is already complete and
56
56
  offer to re-run a specific step by name. Do not walk the whole flow again.
@@ -73,12 +73,12 @@ to upgrade before continuing.
73
73
  Run `pnpm exec pa status` and capture the installed package version. Compare
74
74
  against `npm view @stravica-ai/digital-operator-pa version`. On a match, mark
75
75
  done and move on. On a mismatch, print both versions and the recovery line
76
- (`pnpm install` inside the instance) — do not attempt the fix yourself.
76
+ (`pnpm install` inside the instance); do not attempt the fix yourself.
77
77
 
78
78
  ### 3. profileIntake
79
79
 
80
80
  Ask the operator four questions in one turn. Question 4 is optional
81
- and explicitly skippable — a first-day operator often has no strong
81
+ and explicitly skippable; a first-day operator often has no strong
82
82
  answer and a forced answer here becomes a stale steering signal for
83
83
  the whole life of the instance. "Skip" is the safe default when the
84
84
  operator hesitates.
@@ -238,7 +238,7 @@ Otherwise, name the keys the enabled tools declare and route the
238
238
  operator to a purpose-built secret-handling surface. Two ship in every
239
239
  install and both keep values off the conversation:
240
240
 
241
- - The workspace **Secrets** page — nav id `secrets`, at
241
+ - The workspace **Secrets** page; nav id `secrets`, at
242
242
  `<workspace>/secrets.html`.
243
243
  - The `secrets` CLI in the operator's own terminal, using the stdin
244
244
  form: `pnpm exec secrets set <KEY> -`. The value is typed at the