psyclaw 0.28.3 → 0.29.1

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 (38) hide show
  1. package/README.md +8 -5
  2. package/agents/recommended/catalog.json +1 -1
  3. package/dist/src/adapters/pi/extension.js +167 -80
  4. package/dist/src/adapters/pi/extension.js.map +1 -1
  5. package/dist/src/analysis/hooks.js +1 -1
  6. package/dist/src/analysis/hooks.js.map +1 -1
  7. package/dist/src/ars/doctor.d.ts +27 -0
  8. package/dist/src/ars/doctor.js +121 -0
  9. package/dist/src/ars/doctor.js.map +1 -0
  10. package/dist/src/ars/mode-editor.d.ts +14 -7
  11. package/dist/src/ars/mode-editor.js +39 -23
  12. package/dist/src/ars/mode-editor.js.map +1 -1
  13. package/dist/src/ars/profile.d.ts +10 -0
  14. package/dist/src/ars/profile.js +15 -2
  15. package/dist/src/ars/profile.js.map +1 -1
  16. package/dist/src/branding.js +12 -13
  17. package/dist/src/branding.js.map +1 -1
  18. package/dist/src/index.d.ts +4 -0
  19. package/dist/src/index.js +4 -0
  20. package/dist/src/index.js.map +1 -1
  21. package/dist/src/project/bootstrap.d.ts +7 -2
  22. package/dist/src/project/bootstrap.js +14 -13
  23. package/dist/src/project/bootstrap.js.map +1 -1
  24. package/dist/src/project/paths.d.ts +9 -0
  25. package/dist/src/project/paths.js +18 -3
  26. package/dist/src/project/paths.js.map +1 -1
  27. package/dist/src/project/workspace.d.ts +14 -0
  28. package/dist/src/project/workspace.js +82 -0
  29. package/dist/src/project/workspace.js.map +1 -0
  30. package/dist/src/session/modes.d.ts +10 -0
  31. package/dist/src/session/modes.js +52 -0
  32. package/dist/src/session/modes.js.map +1 -0
  33. package/dist/src/verify/checklist.d.ts +20 -0
  34. package/dist/src/verify/checklist.js +71 -0
  35. package/dist/src/verify/checklist.js.map +1 -0
  36. package/package.json +1 -1
  37. package/vendor/ars/pi/wrapper.js +14 -5
  38. package/vendor/ars/pi/wrapper.test.mjs +10 -0
@@ -1,10 +1,15 @@
1
1
  import type { Handoff, ResearchParadigm, ResearchProject } from "../core/contracts.js";
2
2
  export interface BootstrapOptions {
3
3
  root: string;
4
- goal: string;
5
- paradigm: ResearchParadigm;
4
+ /** Optional; defaults to a placeholder so /init can be scaffold-only. */
5
+ goal?: string;
6
+ paradigm?: ResearchParadigm;
6
7
  projectId?: string;
7
8
  now?: string;
8
9
  }
10
+ /**
11
+ * Scaffold a clean shared workspace + minimal project.json.
12
+ * Does not run academic-grill or create a controlled /run.
13
+ */
9
14
  export declare function bootstrapProject(options: BootstrapOptions): Promise<ResearchProject>;
10
15
  export declare function writeHandoff(root: string, input: Omit<Handoff, "schemaVersion">): Promise<Handoff>;
@@ -4,25 +4,28 @@ import { CONTRACT_VERSION } from "../core/contracts.js";
4
4
  import { asHandoff, asProject } from "../core/schemas.js";
5
5
  import { atomicWriteFile } from "./jsonl.js";
6
6
  import { projectPaths, ensureProjectDirectories, assertSafeProjectPath } from "./paths.js";
7
- import { initializeHitlWorkspace } from "./hitl.js";
7
+ import { scaffoldWorkspace } from "./workspace.js";
8
+ import { defaultVerifyChecklist, saveVerifyChecklist } from "../verify/checklist.js";
9
+ /**
10
+ * Scaffold a clean shared workspace + minimal project.json.
11
+ * Does not run academic-grill or create a controlled /run.
12
+ */
8
13
  export async function bootstrapProject(options) {
9
14
  const paths = projectPaths(options.root);
10
15
  const now = options.now ?? new Date().toISOString();
16
+ const goal = (options.goal?.trim() || "未命名研究项目");
17
+ const paradigm = options.paradigm ?? "survey-observational";
11
18
  const project = {
12
19
  id: options.projectId ?? `project_${randomUUID().replaceAll("-", "")}`,
13
20
  root: paths.root,
14
- paradigm: options.paradigm,
15
- goal: options.goal.trim(),
21
+ paradigm,
22
+ goal,
16
23
  policyVersion: CONTRACT_VERSION,
17
24
  createdAt: now,
18
25
  };
19
- if (!project.goal)
20
- throw new Error("Research goal cannot be empty");
21
- // Validate the complete record before creating any project directories. An
22
- // invalid request must not leave behind a misleading partial project.
23
26
  asProject(project);
24
- await ensureProjectDirectories(paths.root);
25
- await initializeHitlWorkspace(paths.root, project.goal);
27
+ await scaffoldWorkspace(paths.root, { label: goal });
28
+ await saveVerifyChecklist(paths.root, defaultVerifyChecklist(now));
26
29
  const projectFile = await assertSafeProjectPath(paths.root, ".psyclaw/project.json");
27
30
  try {
28
31
  await writeFile(projectFile, `${JSON.stringify(project, null, 2)}\n`, { encoding: "utf8", flag: "wx" });
@@ -71,11 +74,9 @@ export async function writeHandoff(root, input) {
71
74
  ...handoff.verificationCommands.map((item) => `- \`${item}\``),
72
75
  "",
73
76
  ].join("\n");
74
- // Validate before touching the filesystem, then replace each artifact via a
75
- // same-directory temporary file so readers never observe partial JSON/MD.
76
77
  await ensureProjectDirectories(paths.root);
77
- await assertSafeProjectPath(paths.root, "notes/handoff.json");
78
- await assertSafeProjectPath(paths.root, "notes/HANDOFF.md");
78
+ await assertSafeProjectPath(paths.root, ".psyclaw/notes/handoff.json");
79
+ await assertSafeProjectPath(paths.root, ".psyclaw/notes/HANDOFF.md");
79
80
  await atomicWriteFile(paths.handoffJson, `${JSON.stringify(handoff, null, 2)}\n`);
80
81
  await atomicWriteFile(paths.handoffMarkdown, markdown);
81
82
  return handoff;
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/project/bootstrap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/project/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -7,25 +7,34 @@ export declare function projectPaths(root: string): {
7
7
  audit: string;
8
8
  versions: string;
9
9
  analysisHooks: string;
10
+ verifyChecklist: string;
10
11
  rules: string;
11
12
  agents: string;
13
+ skills: string;
14
+ systemNotes: string;
12
15
  arsRuns: string;
13
16
  trust: string;
14
17
  runs: string;
15
18
  plans: string;
16
19
  memory: string;
17
20
  manifests: string;
21
+ /** Canonical raw data (immutable). Legacy `.psyclaw/data/raw` remains protected. */
18
22
  raw: string;
23
+ legacyRaw: string;
19
24
  clean: string;
20
25
  analysis: string;
21
26
  analysisScripts: string;
22
27
  analysisConfigs: string;
23
28
  analysisResults: string;
29
+ analysisOutputs: string;
30
+ analysisHandoff: string;
24
31
  literature: string;
25
32
  literaturePdfs: string;
33
+ paper: string;
26
34
  notes: string;
27
35
  outputs: string;
28
36
  logs: string;
37
+ psyclawMd: string;
29
38
  handoffMarkdown: string;
30
39
  handoffJson: string;
31
40
  };
@@ -11,27 +11,36 @@ export function projectPaths(root) {
11
11
  audit: resolve(base, PSYCLAW_DIR, "audit.jsonl"),
12
12
  versions: resolve(base, PSYCLAW_DIR, "versions.jsonl"),
13
13
  analysisHooks: resolve(base, PSYCLAW_DIR, "analysis-hooks.json"),
14
+ verifyChecklist: resolve(base, PSYCLAW_DIR, "verify-checklist.json"),
14
15
  rules: resolve(base, PSYCLAW_DIR, "rules"),
15
16
  agents: resolve(base, PSYCLAW_DIR, "agents"),
17
+ skills: resolve(base, PSYCLAW_DIR, "skills"),
18
+ systemNotes: resolve(base, PSYCLAW_DIR, "notes"),
16
19
  arsRuns: resolve(base, PSYCLAW_DIR, "ars-runs"),
17
20
  trust: resolve(base, PSYCLAW_DIR, "trust.json"),
18
21
  runs: resolve(base, PSYCLAW_DIR, "runs"),
19
22
  plans: resolve(base, PSYCLAW_DIR, "plans"),
20
23
  memory: resolve(base, PSYCLAW_DIR, "memory"),
21
24
  manifests: resolve(base, PSYCLAW_DIR, "manifests"),
22
- raw: resolve(base, PSYCLAW_DIR, "data", "raw"),
25
+ /** Canonical raw data (immutable). Legacy `.psyclaw/data/raw` remains protected. */
26
+ raw: resolve(base, "data", "raw"),
27
+ legacyRaw: resolve(base, PSYCLAW_DIR, "data", "raw"),
23
28
  clean: resolve(base, "data", "clean"),
24
29
  analysis: resolve(base, "analysis"),
25
30
  analysisScripts: resolve(base, "analysis", "scripts"),
26
31
  analysisConfigs: resolve(base, "analysis", "configs"),
27
32
  analysisResults: resolve(base, "analysis", "results"),
33
+ analysisOutputs: resolve(base, "analysis", "outputs"),
34
+ analysisHandoff: resolve(base, "analysis", "HANDOFF.md"),
28
35
  literature: resolve(base, "literature"),
29
36
  literaturePdfs: resolve(base, "literature", "pdfs"),
37
+ paper: resolve(base, "paper"),
30
38
  notes: resolve(base, "notes"),
31
39
  outputs: resolve(base, "outputs"),
32
40
  logs: resolve(base, "logs"),
33
- handoffMarkdown: resolve(base, "notes", "HANDOFF.md"),
34
- handoffJson: resolve(base, "notes", "handoff.json"),
41
+ psyclawMd: resolve(base, "psyclaw.md"),
42
+ handoffMarkdown: resolve(base, PSYCLAW_DIR, "notes", "HANDOFF.md"),
43
+ handoffJson: resolve(base, PSYCLAW_DIR, "notes", "handoff.json"),
35
44
  };
36
45
  }
37
46
  export async function ensureProjectDirectories(root) {
@@ -48,17 +57,23 @@ export async function ensureProjectDirectories(root) {
48
57
  `${PSYCLAW_DIR}/rules`,
49
58
  `${PSYCLAW_DIR}/agents`,
50
59
  `${PSYCLAW_DIR}/agents/custom`,
60
+ `${PSYCLAW_DIR}/skills`,
61
+ `${PSYCLAW_DIR}/notes`,
51
62
  `${PSYCLAW_DIR}/ars-runs`,
52
63
  `${PSYCLAW_DIR}/data`,
53
64
  `${PSYCLAW_DIR}/data/raw`,
54
65
  "data",
66
+ "data/raw",
55
67
  "data/clean",
56
68
  "analysis",
57
69
  "analysis/scripts",
58
70
  "analysis/configs",
59
71
  "analysis/results",
72
+ "analysis/outputs",
60
73
  "literature",
61
74
  "literature/pdfs",
75
+ "paper",
76
+ "paper/archive",
62
77
  "notes",
63
78
  "outputs",
64
79
  "logs",
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/project/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/project/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1D,MAAM,CAAC,MAAM,WAAW,GAAG,UAAmB,CAAC;AAE/C,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO;QACL,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC;QACnD,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,gBAAgB,CAAC;QACtD,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC;QAClD,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC;QAChD,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,gBAAgB,CAAC;QACtD,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,qBAAqB,CAAC;QAChE,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,uBAAuB,CAAC;QACpE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC;QAC1C,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC;QAC5C,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC;QAC5C,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC;QAChD,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC;QAC/C,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC;QAC/C,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC;QACxC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC;QAC1C,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC;QAC5C,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC;QAClD,oFAAoF;QACpF,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;QACjC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC;QACpD,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC;QACnC,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC;QACrD,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC;QACrD,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC;QACrD,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC;QACrD,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC;QACxD,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;QACvC,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC;QACnD,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;QAC7B,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;QAC7B,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;QACjC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;QAC3B,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;QACtC,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC;QAClE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY;IACzD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,QAAQ,CAAC,cAAc,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACrG,MAAM,gBAAgB,GAAG;QACvB,WAAW;QACX,GAAG,WAAW,OAAO;QACrB,GAAG,WAAW,QAAQ;QACtB,GAAG,WAAW,SAAS;QACvB,GAAG,WAAW,YAAY;QAC1B,GAAG,WAAW,QAAQ;QACtB,GAAG,WAAW,SAAS;QACvB,GAAG,WAAW,gBAAgB;QAC9B,GAAG,WAAW,SAAS;QACvB,GAAG,WAAW,QAAQ;QACtB,GAAG,WAAW,WAAW;QACzB,GAAG,WAAW,OAAO;QACrB,GAAG,WAAW,WAAW;QACzB,MAAM;QACN,UAAU;QACV,YAAY;QACZ,UAAU;QACV,kBAAkB;QAClB,kBAAkB;QAClB,kBAAkB;QAClB,kBAAkB;QAClB,YAAY;QACZ,iBAAiB;QACjB,OAAO;QACP,eAAe;QACf,OAAO;QACP,SAAS;QACT,MAAM;KACP,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,cAAc,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;YACrF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YACpE,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY,EAAE,MAAc;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,2EAA2E;IAC3E,0EAA0E;IAC1E,uEAAuE;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,uBAAuB,GAC3B,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QACvB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,uBAAuB,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChD,IACE,aAAa,KAAK,EAAE;QACpB,aAAa,KAAK,IAAI;QACtB,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC;QAC/B,UAAU,CAAC,GAAG,CAAC;QACf,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,EAC7B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IACjD,IACE,YAAY,KAAK,MAAM;QACvB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC;QAChC,YAAY,KAAK,UAAU;QAC3B,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC;QACpC,YAAY,KAAK,mBAAmB;QACpC,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAC7C,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC;QACnC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC/B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,2CAA2C,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,EAAE,CAAC,CAAC;QACxF,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;QAC9D,MAAM,qBAAqB,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChE,IACE,qBAAqB,KAAK,IAAI;YAC9B,qBAAqB,CAAC,UAAU,CAAC,KAAK,CAAC;YACvC,UAAU,CAAC,WAAW,CAAC;YACvB,qBAAqB,CAAC,UAAU,CAAC,GAAG,CAAC,EACrC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,qEAAqE;YACrE,oDAAoD;YACpD,IAAI,QAAQ,GAAG,SAAS,CAAC;YACzB,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,MAAM,gBAAgB,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAClD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;oBAC7D,MAAM,qBAAqB,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBAChE,IACE,qBAAqB,KAAK,IAAI;wBAC9B,qBAAqB,CAAC,UAAU,CAAC,KAAK,CAAC;wBACvC,UAAU,CAAC,WAAW,CAAC;wBACvB,qBAAqB,CAAC,UAAU,CAAC,GAAG,CAAC,EACrC,CAAC;wBACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,EAAE,CAAC,CAAC;oBACnE,CAAC;oBACD,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACvB,IAAK,aAAuC,CAAC,IAAI,KAAK,QAAQ;wBAAE,MAAM,aAAa,CAAC;oBACpF,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBACvC,IAAI,MAAM,KAAK,QAAQ;wBAAE,MAAM,aAAa,CAAC;oBAC7C,QAAQ,GAAG,MAAM,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const PSYCLAW_MD: "psyclaw.md";
2
+ export declare const ANALYSIS_HANDOFF: "analysis/HANDOFF.md";
3
+ export declare function defaultPsyClawMarkdown(projectLabel?: string): string;
4
+ export declare function defaultAnalysisHandoff(): string;
5
+ /**
6
+ * Create the shared clean workspace. Does not run academic-grill or force /run.
7
+ */
8
+ export declare function scaffoldWorkspace(root: string, options?: {
9
+ label?: string;
10
+ }): Promise<{
11
+ root: string;
12
+ psyclawMd: string;
13
+ handoff: string;
14
+ }>;
@@ -0,0 +1,82 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { atomicWriteFile } from "../project/jsonl.js";
4
+ import { assertSafeProjectPath, ensureProjectDirectories, projectPaths } from "../project/paths.js";
5
+ export const PSYCLAW_MD = "psyclaw.md";
6
+ export const ANALYSIS_HANDOFF = "analysis/HANDOFF.md";
7
+ export function defaultPsyClawMarkdown(projectLabel = "未命名研究项目") {
8
+ return [
9
+ `# ${projectLabel}`,
10
+ "",
11
+ "本文件是项目上层约定(PsyClaw 0.29+)。Shift+Tab 在 `chat` → `analysis` → `academic` 间循环。",
12
+ "",
13
+ "## 目录",
14
+ "",
15
+ "- `data/raw/` — 原始数据(只读;指纹仅用于防篡改,不作学术核验)",
16
+ "- `data/clean/` — 可分析派生数据",
17
+ "- `analysis/scripts|configs|results/` — 脚本、规格、结果",
18
+ "- `analysis/HANDOFF.md` — 分析→学术交接",
19
+ "- `literature/` — 文献",
20
+ "- `paper/` — 手稿与导出",
21
+ "- `psyclaw.md` — 本说明(根目录)",
22
+ "- `.psyclaw/` — 账本、agents、skills、系统交接、ars-runs",
23
+ "",
24
+ "## 流水线(软门禁)",
25
+ "",
26
+ "初始化仓库 → 澄清 → 审查 → 形成方案 → 审查 → 分析 → 分析报告 → 审查 → academic/ARS(每阶段审查)。",
27
+ "",
28
+ "第一要务:把结果跑出来。第二:用 AI 语义核查核心字段 + 人用 `/verify` 勾选已核实。不把 SHA256 当学术过关证明。",
29
+ "",
30
+ "## 模式",
31
+ "",
32
+ "| 模式 | 用途 |",
33
+ "| --- | --- |",
34
+ "| chat | 普通对话 |",
35
+ "| analysis | 数据分析与报告 |",
36
+ "| academic | ARS 写作审稿 |",
37
+ "",
38
+ ].join("\n");
39
+ }
40
+ export function defaultAnalysisHandoff() {
41
+ return [
42
+ "# Analysis → Academic handoff",
43
+ "",
44
+ "- Status: draft",
45
+ "- Question / design:",
46
+ "- Primary results paths:",
47
+ "- Key numbers (N, effects):",
48
+ "- Limits / unverified items:",
49
+ "- Ready for academic: no",
50
+ "",
51
+ ].join("\n");
52
+ }
53
+ /**
54
+ * Create the shared clean workspace. Does not run academic-grill or force /run.
55
+ */
56
+ export async function scaffoldWorkspace(root, options) {
57
+ await ensureProjectDirectories(root);
58
+ const paths = projectPaths(root);
59
+ const psyclawMdPath = join(paths.root, PSYCLAW_MD);
60
+ try {
61
+ await readFile(psyclawMdPath, "utf8");
62
+ }
63
+ catch (error) {
64
+ if (error.code !== "ENOENT")
65
+ throw error;
66
+ await writeFile(psyclawMdPath, defaultPsyClawMarkdown(options?.label), "utf8");
67
+ }
68
+ const handoffPath = await assertSafeProjectPath(root, ANALYSIS_HANDOFF);
69
+ try {
70
+ await readFile(handoffPath, "utf8");
71
+ }
72
+ catch (error) {
73
+ if (error.code !== "ENOENT")
74
+ throw error;
75
+ await mkdir(join(root, "analysis"), { recursive: true });
76
+ await atomicWriteFile(handoffPath, defaultAnalysisHandoff());
77
+ }
78
+ // Ensure paper/ exists for manuscripts.
79
+ await mkdir(join(root, "paper"), { recursive: true });
80
+ return { root, psyclawMd: PSYCLAW_MD, handoff: ANALYSIS_HANDOFF };
81
+ }
82
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/project/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpG,MAAM,CAAC,MAAM,UAAU,GAAG,YAAqB,CAAC;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,qBAA8B,CAAC;AAE/D,MAAM,UAAU,sBAAsB,CAAC,YAAY,GAAG,SAAS;IAC7D,OAAO;QACL,KAAK,YAAY,EAAE;QACnB,EAAE;QACF,6EAA6E;QAC7E,EAAE;QACF,OAAO;QACP,EAAE;QACF,0CAA0C;QAC1C,2BAA2B;QAC3B,kDAAkD;QAClD,mCAAmC;QACnC,sBAAsB;QACtB,oBAAoB;QACpB,2BAA2B;QAC3B,gDAAgD;QAChD,EAAE;QACF,aAAa;QACb,EAAE;QACF,qEAAqE;QACrE,EAAE;QACF,sEAAsE;QACtE,EAAE;QACF,OAAO;QACP,EAAE;QACF,aAAa;QACb,eAAe;QACf,iBAAiB;QACjB,wBAAwB;QACxB,yBAAyB;QACzB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,+BAA+B;QAC/B,EAAE;QACF,iBAAiB;QACjB,sBAAsB;QACtB,0BAA0B;QAC1B,6BAA6B;QAC7B,8BAA8B;QAC9B,0BAA0B;QAC1B,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAA4B;IAKhF,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;QACpE,MAAM,SAAS,CAAC,aAAa,EAAE,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;QACpE,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,eAAe,CAAC,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,wCAAwC;IACxC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** PsyClaw session modes cycled by Shift+Tab. */
2
+ export type PsyClawSessionMode = "chat" | "analysis" | "academic";
3
+ export declare const SESSION_MODES: readonly PsyClawSessionMode[];
4
+ /** Footer status label; chat shows nothing. */
5
+ export declare const MODE_STATUS: Record<PsyClawSessionMode, string | undefined>;
6
+ export declare const MODE_BORDER: Record<PsyClawSessionMode, ((text: string) => string) | undefined>;
7
+ export declare function nextSessionMode(current: PsyClawSessionMode): PsyClawSessionMode;
8
+ export declare function parseSessionMode(value: unknown): PsyClawSessionMode | undefined;
9
+ /** Mode-specific guidance appended while that sticky mode is active. */
10
+ export declare function sessionModePrompt(mode: PsyClawSessionMode): string;
@@ -0,0 +1,52 @@
1
+ export const SESSION_MODES = ["chat", "analysis", "academic"];
2
+ /** Footer status label; chat shows nothing. */
3
+ export const MODE_STATUS = {
4
+ chat: undefined,
5
+ analysis: "analysis",
6
+ academic: "academic",
7
+ };
8
+ export const MODE_BORDER = {
9
+ chat: undefined,
10
+ // amber-ish for analysis
11
+ analysis: (text) => `\x1b[38;2;229;192;123m${text}\x1b[39m`,
12
+ // teal for academic (ARS)
13
+ academic: (text) => `\x1b[38;2;46;196;182m${text}\x1b[39m`,
14
+ };
15
+ export function nextSessionMode(current) {
16
+ const index = SESSION_MODES.indexOf(current);
17
+ return SESSION_MODES[(index + 1) % SESSION_MODES.length] ?? "chat";
18
+ }
19
+ export function parseSessionMode(value) {
20
+ if (value === "chat" || value === "analysis" || value === "academic")
21
+ return value;
22
+ return undefined;
23
+ }
24
+ /** Mode-specific guidance appended while that sticky mode is active. */
25
+ export function sessionModePrompt(mode) {
26
+ if (mode === "chat") {
27
+ return [
28
+ "## PsyClaw mode: chat",
29
+ "Plain assistant on the Pi harness. Do not force research workflows, /init, or ARS stages.",
30
+ "If the user wants structured research, suggest Shift+Tab to analysis or academic, or /init to scaffold the project tree.",
31
+ ].join("\n");
32
+ }
33
+ if (mode === "analysis") {
34
+ return [
35
+ "## PsyClaw mode: analysis",
36
+ "Priority: get runnable analysis results first; then reduce hallucination via AI field checks and human verify marks.",
37
+ "Pipeline (soft, not hard-blocking): clarify → review → plan → review → analyze → analysis report → review → hand off to academic.",
38
+ "Write under data/clean, analysis/scripts|configs|results, and analysis/HANDOFF.md. Never overwrite data/raw (or legacy .psyclaw/data/raw).",
39
+ "Delegate real statistics to external MCP/libraries; do not invent numerical results.",
40
+ "For important fields (N, primary effects, table–text consistency), run an AI semantic check and ask the human to mark items verified via /verify. Do not treat file hashes as academic proof.",
41
+ "Do not hard-block ordinary progress for missing verify marks; label unverified claims clearly and continue unless the user stops you.",
42
+ ].join("\n");
43
+ }
44
+ return [
45
+ "## PsyClaw mode: academic",
46
+ "ARS research → write → review → revise pipeline. Prefer psyclaw_ars_multi_agent for Stage 3 seats.",
47
+ "Consume analysis/HANDOFF.md and analysis/results when present; do not recompute statistics in this mode—switch to analysis if numbers are missing.",
48
+ "Manuscripts go to paper/. Per-stage reviews use AI field checks + human /verify marks; soft warnings only unless external publish or raw-data mutation.",
49
+ "Priority: produce the manuscript and review artifacts; second, keep key claims human-verified where it matters.",
50
+ ].join("\n");
51
+ }
52
+ //# sourceMappingURL=modes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modes.js","sourceRoot":"","sources":["../../../src/session/modes.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,aAAa,GAAkC,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAEtG,+CAA+C;AAC/C,MAAM,CAAC,MAAM,WAAW,GAAmD;IACzE,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAuE;IAC7F,IAAI,EAAE,SAAS;IACf,yBAAyB;IACzB,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,yBAAyB,IAAI,UAAU;IACnE,0BAA0B;IAC1B,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,wBAAwB,IAAI,UAAU;CACnE,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAA2B;IACzD,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,aAAa,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACnF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO;YACL,uBAAuB;YACvB,2FAA2F;YAC3F,0HAA0H;SAC3H,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,2BAA2B;YAC3B,sHAAsH;YACtH,mIAAmI;YACnI,4IAA4I;YAC5I,sFAAsF;YACtF,+LAA+L;YAC/L,uIAAuI;SACxI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,OAAO;QACL,2BAA2B;QAC3B,oGAAoG;QACpG,oJAAoJ;QACpJ,yJAAyJ;QACzJ,iHAAiH;KAClH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,20 @@
1
+ export declare const VERIFY_CHECKLIST_SCHEMA: "psyclaw/verify-checklist/v1";
2
+ export declare const VERIFY_CHECKLIST_PATH: ".psyclaw/verify-checklist.json";
3
+ export type VerifyStatus = "unverified" | "verified" | "flagged";
4
+ export interface VerifyItem {
5
+ id: string;
6
+ label: string;
7
+ status: VerifyStatus;
8
+ notes?: string;
9
+ updatedAt?: string;
10
+ }
11
+ export interface VerifyChecklist {
12
+ schemaVersion: typeof VERIFY_CHECKLIST_SCHEMA;
13
+ items: VerifyItem[];
14
+ updatedAt: string;
15
+ }
16
+ export declare function defaultVerifyChecklist(now?: string): VerifyChecklist;
17
+ export declare function loadVerifyChecklist(root: string): Promise<VerifyChecklist>;
18
+ export declare function saveVerifyChecklist(root: string, checklist: VerifyChecklist): Promise<void>;
19
+ export declare function markVerifyItem(root: string, id: string, status: VerifyStatus, notes?: string): Promise<VerifyChecklist>;
20
+ export declare function formatVerifyChecklist(checklist: VerifyChecklist): string;
@@ -0,0 +1,71 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { atomicWriteFile } from "../project/jsonl.js";
3
+ import { assertSafeProjectPath } from "../project/paths.js";
4
+ export const VERIFY_CHECKLIST_SCHEMA = "psyclaw/verify-checklist/v1";
5
+ export const VERIFY_CHECKLIST_PATH = ".psyclaw/verify-checklist.json";
6
+ const DEFAULT_ITEMS = [
7
+ { id: "n", label: "样本量 / N" },
8
+ { id: "primary-effect", label: "主效应 / 主要结果" },
9
+ { id: "table-text", label: "表与正文一致" },
10
+ { id: "method-match", label: "方法与实际分析一致" },
11
+ { id: "key-claim", label: "关键主张有结果支撑" },
12
+ ];
13
+ export function defaultVerifyChecklist(now = new Date().toISOString()) {
14
+ return {
15
+ schemaVersion: VERIFY_CHECKLIST_SCHEMA,
16
+ updatedAt: now,
17
+ items: DEFAULT_ITEMS.map((item) => ({ ...item, status: "unverified" })),
18
+ };
19
+ }
20
+ export async function loadVerifyChecklist(root) {
21
+ const path = await assertSafeProjectPath(root, VERIFY_CHECKLIST_PATH);
22
+ try {
23
+ const parsed = JSON.parse(await readFile(path, "utf8"));
24
+ if (parsed.schemaVersion !== VERIFY_CHECKLIST_SCHEMA || !Array.isArray(parsed.items)) {
25
+ return defaultVerifyChecklist();
26
+ }
27
+ return {
28
+ schemaVersion: VERIFY_CHECKLIST_SCHEMA,
29
+ updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : new Date().toISOString(),
30
+ items: parsed.items.filter((item) => Boolean(item && typeof item.id === "string" && typeof item.label === "string" &&
31
+ (item.status === "unverified" || item.status === "verified" || item.status === "flagged"))),
32
+ };
33
+ }
34
+ catch {
35
+ return defaultVerifyChecklist();
36
+ }
37
+ }
38
+ export async function saveVerifyChecklist(root, checklist) {
39
+ const path = await assertSafeProjectPath(root, VERIFY_CHECKLIST_PATH);
40
+ await atomicWriteFile(path, `${JSON.stringify(checklist, null, 2)}\n`);
41
+ }
42
+ export async function markVerifyItem(root, id, status, notes) {
43
+ const checklist = await loadVerifyChecklist(root);
44
+ const now = new Date().toISOString();
45
+ const existing = checklist.items.find((item) => item.id === id);
46
+ if (existing) {
47
+ existing.status = status;
48
+ existing.updatedAt = now;
49
+ if (notes !== undefined)
50
+ existing.notes = notes;
51
+ }
52
+ else {
53
+ const item = { id, label: id, status, updatedAt: now };
54
+ if (notes !== undefined)
55
+ item.notes = notes;
56
+ checklist.items.push(item);
57
+ }
58
+ checklist.updatedAt = now;
59
+ await saveVerifyChecklist(root, checklist);
60
+ return checklist;
61
+ }
62
+ export function formatVerifyChecklist(checklist) {
63
+ const lines = ["核查清单(AI 语义核查 + 人确认;非 SHA 学术过关)", `更新:${checklist.updatedAt}`];
64
+ for (const item of checklist.items) {
65
+ const mark = item.status === "verified" ? "[x]" : item.status === "flagged" ? "[!]" : "[ ]";
66
+ lines.push(`${mark} ${item.id}: ${item.label}${item.notes ? ` — ${item.notes}` : ""}`);
67
+ }
68
+ lines.push("用法:/verify list | /verify <id> verified|unverified|flagged [备注]");
69
+ return lines.join("\n");
70
+ }
71
+ //# sourceMappingURL=checklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checklist.js","sourceRoot":"","sources":["../../../src/verify/checklist.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "psyclaw",
3
- "version": "0.28.3",
3
+ "version": "0.29.1",
4
4
  "description": "A standalone, evidence-grounded social-science research agent with research contracts, evidence gates, and recoverable workflows",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -173,29 +173,38 @@ export default function (pi) {
173
173
  const python = await probe(pi, "python3", ["--version"]);
174
174
  const pyyaml = await probe(pi, "python3", ["-c", "import yaml; print(f'PyYAML {yaml.__version__}')"]);
175
175
  const pandoc = await probe(pi, "pandoc", ["--version"]);
176
- const tectonic = await probe(pi, "tectonic", ["--version"]);
177
176
  const sandbox = pi.getCommands().some((command) => command.name === "sandbox")
178
177
  ? `detected; allow read access to ${repoRoot} when running outside the checkout`
179
178
  : "not detected";
180
179
  const format = (matches) => matches.length > 0 ? matches.join(", ") : "none; sequential/degraded mode";
180
+ const psyclawOrch = [
181
+ ...uniqueMatches(candidates, /psyclaw_ars_multi_agent|ars multi-agent|parallel-agent/i),
182
+ ...commands.filter((item) => /agents|create-subagent/i.test(item.search)).map((item) => item.label),
183
+ ];
184
+ const orchestrationLine = psyclawOrch.length > 0
185
+ ? psyclawOrch.join(", ")
186
+ : format(orchestration);
181
187
  const report = [
182
188
  "ARS Pi doctor",
183
189
  `Repository: ${repoRoot}`,
184
- `Orchestration: ${format(orchestration)}`,
190
+ `Orchestration: ${orchestrationLine}`,
185
191
  `Web retrieval: ${format(web)}`,
186
192
  `Python: ${python}`,
187
193
  `PyYAML: ${pyyaml}`,
188
194
  `Pandoc: ${pandoc}`,
189
- `Tectonic: ${tectonic}`,
195
+ "PDF engine: not preflighted; install on demand when the user asks to export PDF (psyclaw_ensure_pdf_engine)",
190
196
  `Sandbox: ${sandbox}`,
191
- "Claude hooks: unavailable in Pi; write-scope enforcement remains prompt-level",
197
+ "Hooks: PsyClaw analysis hooks + /run tool_call gates when controlled run is active; Claude Code PreToolUse hooks.json is not loaded by Pi",
192
198
  ].join("\n");
193
199
 
194
200
  pi.sendMessage({ customType: "ars-pi-doctor", content: report, display: true });
195
201
  },
196
202
  });
197
203
 
198
- pi.on("before_agent_start", (event) => {
204
+ pi.on("before_agent_start", (event, ctx) => {
205
+ // Keep in-memory flag aligned with session entries written by PsyClaw Shift+Tab
206
+ // (silent appendEntry) or prior /ars-pi-start|/ars-pi-stop handlers.
207
+ if (ctx?.sessionManager) restoreArsState(ctx);
199
208
  if (!arsActive) return { systemPrompt: hideArsSkills(event.systemPrompt) };
200
209
  return { systemPrompt: `${event.systemPrompt}\n${compatibility}` };
201
210
  });
@@ -199,3 +199,13 @@ test("/ars-pi-start and /ars-pi-stop toggle automatic invocation", async () => {
199
199
  assert.equal(runBeforeAgentStart(harness).includes(location), false);
200
200
  }
201
201
  });
202
+
203
+ test("before_agent_start restores ARS state from session entries (silent Shift+Tab path)", () => {
204
+ const harness = createHarness();
205
+ harness.setBranch([{ type: "custom", customType: "ars-pi-state", data: { active: true } }]);
206
+ const systemPrompt = harness.handlers.get("before_agent_start")(
207
+ { systemPrompt: baseSystemPrompt },
208
+ harness.sessionContext,
209
+ )?.systemPrompt ?? baseSystemPrompt;
210
+ assert.equal(systemPrompt.includes(compatibilityMarker), true);
211
+ });