@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.
- package/dist/engineering-pa-cli/src/coordinator-hook/config.mjs +2 -2
- package/dist/engineering-pa-cli/src/environment/probes.mjs +1 -1
- package/dist/engineering-pa-cli/src/pa/cli.mjs +28 -0
- package/dist/engineering-pa-cli/src/pa/projects.mjs +7 -0
- package/dist/engineering-pa-cli/src/pa/work-cli.mjs +26 -0
- package/dist/engineering-pa-cli/src/pa/work.mjs +9 -0
- package/dist/engineering-pa-core/docs/autonomy-envelope-tracker.md +22 -22
- package/dist/engineering-pa-core/docs/blueprints/git-identity/blueprint.md +21 -19
- package/dist/engineering-pa-core/docs/blueprints/scheduled-distillation/blueprint.md +2 -2
- package/dist/engineering-pa-core/docs/commands/init.md +1 -1
- package/dist/engineering-pa-core/docs/commands/onboard.md +6 -6
- package/dist/engineering-pa-core/docs/commands/research.md +66 -66
- package/dist/engineering-pa-core/docs/commands/upgrade.md +4 -4
- package/dist/engineering-pa-core/docs/entity-location-map.md +4 -4
- package/dist/engineering-pa-core/docs/lock.md +18 -18
- package/dist/engineering-pa-core/docs/memory-sync.md +1 -1
- package/dist/engineering-pa-core/docs/pa-operating-model.md +87 -87
- package/dist/engineering-pa-core/docs/scheduling.md +1 -1
- package/dist/engineering-pa-core/docs/standards/README.md +2 -2
- package/dist/engineering-pa-core/docs/standards/briefing-contract.md +18 -18
- package/dist/engineering-pa-core/docs/standards/tooling.md +41 -41
- package/dist/engineering-pa-core/docs/tools/distill.md +19 -19
- package/dist/engineering-pa-core/docs/tools/memory-sync.md +14 -14
- package/dist/engineering-pa-core/docs/tools/scheduler.md +15 -15
- package/dist/engineering-pa-core/docs/tools/slice.md +18 -18
- package/dist/engineering-pa-core/docs/upstream-issue-filing.md +6 -6
- package/dist/engineering-pa-core/docs/working-directory.md +3 -3
- package/dist/engineering-pa-core/docs/workspace-operations.md +11 -11
- package/dist/engineering-pa-core/package.json +3 -3
- package/dist/engineering-pa-core/src/distill/health.mjs +16 -6
- package/dist/engineering-pa-core/src/instance-root/find.mjs +14 -3
- package/dist/engineering-pa-core/src/memory-sync/repo.mjs +2 -2
- package/dist/engineering-pa-core/src/scheduler/install.mjs +8 -7
- package/dist/engineering-pa-core/src/scheduler/list.mjs +2 -2
- package/dist/engineering-pa-core/src/scheduler/remove.mjs +65 -11
- package/dist/engineering-pa-core/src/scheduler/verify.mjs +2 -2
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/mirror-folder.mjs +3 -2
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/link.mjs +2 -1
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/sync-statuses.mjs +5 -1
- package/dist/engineering-pa-library-cli/package.json +1 -0
- package/dist/engineering-pa-library-cli/src/pull-clones.mjs +12 -3
- package/dist/engineering-pa-library-tunnel/package.json +3 -0
- package/dist/engineering-pa-library-tunnel/src/config.mjs +2 -2
- package/dist/engineering-pa-migrate-inspect/package.json +4 -1
- package/dist/engineering-pa-migrate-inspect/src/age-key-migrate.mjs +2 -2
- package/dist/engineering-pa-migrate-inspect/src/inspector.mjs +2 -2
- package/dist/engineering-pa-migrate-inspect/src/platforms/macos.mjs +2 -1
- package/dist/engineering-pa-scaffold/src/commands/init-workspace-extension.mjs +8 -0
- package/dist/engineering-pa-workspace/app/project-detail.html +7 -0
- package/dist/engineering-pa-workspace/app/viewer.html +5 -0
- package/dist/engineering-pa-workspace/src/install-daemon.mjs +6 -5
- package/dist/engineering-pa-workspace/src/review/api-handler.mjs +53 -2
- package/dist/engineering-pa-workspace/src/supervisor.mjs +5 -4
- package/docs/onboarding-solo.md +1 -0
- 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 {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
26
|
-
- `li-post-draft
|
|
27
|
-
- `article-draft
|
|
28
|
-
- `code-dispatch
|
|
29
|
-
- `code-inline
|
|
30
|
-
- `git-commit-push
|
|
31
|
-
- `secret-access
|
|
32
|
-
- `contact-outreach
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
99
|
+
### 2026-07-05T14:30:00Z; code-dispatch promoted to fullyApproved
|
|
100
100
|
Operator note: none.
|
|
101
101
|
|
|
102
|
-
### 2026-07-04T09:00:00Z
|
|
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
|
|
109
|
-
- CLAUDE.md.template framing block
|
|
110
|
-
- `packages/core/knowledge/operator-interface/escalation-and-correction.md
|
|
111
|
-
- `packages/cli/src/autonomy
|
|
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
|
|
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
|
|
29
|
+
Create a dedicated key for your PA:
|
|
28
30
|
|
|
29
31
|
```bash
|
|
30
|
-
ssh-keygen -t ed25519 -C "
|
|
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
|
|
35
|
-
- `~/.ssh
|
|
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
|
|
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: "
|
|
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
|
|
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 =
|
|
72
|
-
email =
|
|
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 "
|
|
85
|
-
git config --local user.email "
|
|
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 "
|
|
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
|
|
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
|
|
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
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: First-session onboarding walkthrough
|
|
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
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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
|