@tiangong-ai/cli 0.0.33 → 0.0.34

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/AGENTS.md CHANGED
@@ -15,8 +15,8 @@ checkPaths:
15
15
  - .docpact/config.yaml
16
16
  - docs/agents/**
17
17
  - src/**
18
- lastReviewedAt: 2026-08-11
19
- lastReviewedCommit: 2ce7ad7cd36c1aeba577bc72e4095ed3a81debd6
18
+ lastReviewedAt: 2026-08-12
19
+ lastReviewedCommit: 7d692de934c51178df520ccdaa212acc7dc303f0
20
20
  ---
21
21
 
22
22
  # Tiangong AI CLI Contract
@@ -60,6 +60,7 @@ This repository owns the Tiangong AI command-line interface.
60
60
  Run before delivery:
61
61
 
62
62
  ```bash
63
+ npm run test:clean
63
64
  npm run lint
64
65
  npm run build
65
66
  npm test
@@ -68,6 +69,10 @@ docpact validate-config --root . --strict
68
69
  docpact lint --root . --worktree --mode enforce
69
70
  ```
70
71
 
72
+ For Auto Research changes, `npm run test:clean` is the authoritative TDD gate.
73
+ Write the regression first, observe it fail in that clean container, then make
74
+ it pass there. Host-only results are supplemental.
75
+
71
76
  Use `npm run typecheck` for a faster TypeScript-only check.
72
77
  Use `npm run prepush:gate` when `docpact` is installed and you want the
73
78
  aggregated local quality gate.
package/README.md CHANGED
@@ -12,8 +12,8 @@ checkPaths:
12
12
  - package.json
13
13
  - bin/**
14
14
  - src/**
15
- lastReviewedAt: 2026-08-10
16
- lastReviewedCommit: bef62f8d48c42eaff14fa2bd7eba1be83a46a58b
15
+ lastReviewedAt: 2026-08-12
16
+ lastReviewedCommit: ac34420a63cb02898f8c38b1c1af64f0439e862f
17
17
  ---
18
18
 
19
19
  # Tiangong AI CLI
@@ -235,6 +235,16 @@ the default; global writes, network downloads, live provider checks, synthetic
235
235
  document uploads, and paid agent smokes each require their applicable
236
236
  confirmation.
237
237
 
238
+ If the full orchestrator was selected, accepted apply creates a separate
239
+ project-local `tiangong-auto-research-recovery` Skill after credentials are
240
+ stored and before source checkout. This CLI-generated, plan-bound shim can only
241
+ inspect context/status and execute the exact-version retry returned by setup; it
242
+ cannot perform research, call standalone evidence, or access credentials. A
243
+ checkout or install failure therefore remains discoverable without falling back
244
+ to a global Skill. After the full external orchestrator matches its reviewed
245
+ tree hash, setup verifies the shim byte-for-byte and removes only that generated
246
+ directory. Modified, symlinked, or ambiguous recovery bytes block cleanup.
247
+
238
248
  Production admission requires at least one locked external capability with
239
249
  `brokered-network` and `discoveryScopes: ["public-internet"]`; an input plan or
240
250
  local files alone cannot represent internet coverage. The machine-readable
@@ -259,6 +269,15 @@ regular non-symlink `runtime-lock.json` exact stable CLI version. Setup and
259
269
  release CI reject a missing resolver or any stale exact CLI version in the
260
270
  orchestrator's `SKILL.md` or `references/*.md`.
261
271
 
272
+ `research setup status --json` reports credential persistence separately from
273
+ readiness. It also reports the effective exact-npx CLI package/version/root,
274
+ the selected project orchestrator, any temporary recovery shim, ignored global
275
+ same-name Skills, legacy wrappers that still contain an unmanaged PATH CLI
276
+ fallback, and the real failed source/immutable ref/cache state when checkout is
277
+ retryable. A direct `research search` inside a managed workspace stops before
278
+ network access and returns the same broker-vs-standalone and setup provenance;
279
+ it never converts a stored broker credential into an ambient credential.
280
+
262
281
  The default `internet-research` profile selects Brave Web Search and News
263
282
  Search. `internet-research-with-context` additionally selects the
264
283
  subscription-dependent LLM Context endpoint, while
@@ -2,8 +2,9 @@ import { runEdgeSearch } from "../edge-search.js";
2
2
  import { CliError } from "../errors.js";
3
3
  import { readJsonInput, stringifyJson, write } from "../io.js";
4
4
  import { parseStrictArgs, strictBoolean, strictString } from "../strict-args.js";
5
- import { parseResearchSources, researchSourceConfig, resolveResearchConfig } from "./config.js";
5
+ import { parseResearchSources, researchSourceConfig, resolveResearchConfig, } from "./config.js";
6
6
  import { researchOrchestrationHelp, runResearchOrchestrationCommand } from "./orchestration.js";
7
+ import { inspectResearchContext } from "./workspace/context.js";
7
8
  const RESEARCH_SEARCH_OPTIONS = {
8
9
  help: "boolean",
9
10
  json: "boolean",
@@ -88,6 +89,7 @@ async function runResearchSearchCommand(argv, io) {
88
89
  }
89
90
  const sourceIds = parseResearchSources(strictString(args, "sources"));
90
91
  const config = resolveResearchConfig(args, io.env);
92
+ await assertStandaloneSearchContext(io.env, sourceIds, config);
91
93
  const inputPath = strictString(args, "input");
92
94
  const body = researchRequestBody(args);
93
95
  const result = await runEdgeSearch({
@@ -101,6 +103,61 @@ async function runResearchSearchCommand(argv, io) {
101
103
  writeSearchResult(io, result, strictBoolean(args, "json"));
102
104
  return 0;
103
105
  }
106
+ async function assertStandaloneSearchContext(environment, sourceIds, config) {
107
+ const context = await inspectResearchContext(process.cwd());
108
+ if (context.role !== "setup" && context.role !== "workspace")
109
+ return;
110
+ const setup = context.setup;
111
+ const ready = setup?.status === "ready";
112
+ const blocked = setup?.status === "blocked";
113
+ const setupStatus = context.root
114
+ ? await import("./workspace/setup.js")
115
+ .then(({ inspectResearchSetupStatus }) => inspectResearchSetupStatus(context.root, environment))
116
+ .catch(() => null)
117
+ : null;
118
+ const configuredBrokerIds = setupStatus?.credentialReadiness.configuredIds ?? [];
119
+ const standaloneConfiguredSources = sourceIds.filter((sourceId) => config.sources[sourceId].apiKey.length > 0);
120
+ const standaloneCredential = standaloneConfiguredSources.length === 0
121
+ ? "absent"
122
+ : standaloneConfiguredSources.length === sourceIds.length
123
+ ? "present"
124
+ : "partial";
125
+ throw new CliError(ready
126
+ ? "Direct research search is disabled inside an Auto Research workspace."
127
+ : blocked
128
+ ? "Broker credentials may be stored, but Auto Research setup is blocked; standalone search cannot consume broker credentials."
129
+ : "Auto Research setup is incomplete; standalone search will not bypass it.", {
130
+ code: ready
131
+ ? "AUTO_RESEARCH_BROKER_REQUIRED"
132
+ : blocked
133
+ ? "AUTO_RESEARCH_SETUP_BLOCKED"
134
+ : "AUTO_RESEARCH_SETUP_INCOMPLETE",
135
+ exitCode: 3,
136
+ details: {
137
+ executionMode: "managed-workspace",
138
+ requestedExecutionMode: "standalone",
139
+ recommendedExecutionMode: "managed-workspace",
140
+ credentialScope: "broker",
141
+ brokerCredentialStore: configuredBrokerIds.length > 0 ? "present" : "absent",
142
+ brokerConfiguredCredentialIds: configuredBrokerIds,
143
+ standaloneCredential,
144
+ standaloneConfiguredSources,
145
+ networkAttempted: false,
146
+ workspace: context.root,
147
+ setupStatus: setup?.status ?? "missing",
148
+ failedStep: setup?.blocker?.step ?? setup?.currentStep ?? null,
149
+ setupBlocker: setup?.blocker ?? null,
150
+ effectiveCli: setupStatus?.provenance.effectiveCli ?? setup?.runtime ?? null,
151
+ effectiveSkill: setupStatus?.provenance.selectedOrchestrator ?? null,
152
+ recoveryShims: setupStatus?.provenance.recoveryShims ?? [],
153
+ ambientCli: setupStatus?.provenance.ambientCli ?? null,
154
+ ambientSkillConflicts: setupStatus?.provenance.ambientSkillConflicts ?? [],
155
+ minimumAction: setup?.next?.retryCommand ??
156
+ "Use the project evidence broker through tiangong-auto-research; do not provide ambient credentials.",
157
+ retryCommand: setup?.next?.retryCommand ?? null,
158
+ },
159
+ });
160
+ }
104
161
  function researchRequestBody(args) {
105
162
  const inputPath = strictString(args, "input");
106
163
  if (inputPath) {
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/research/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/research/commands.ts"],"names":[],"mappings":"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"}
@@ -7,3 +7,4 @@ export declare const SETUP_OPERATIONS: readonly ["research.context.inspect", "re
7
7
  export declare const UNMANAGED_OPERATIONS: readonly ["research.context.inspect", "research.capability.catalog", "research.workspace.init", "research.setup.catalog", "research.setup.plan"];
8
8
  export declare const INVALID_OPERATIONS: readonly ["research.context.inspect"];
9
9
  export declare function packageVersion(): string;
10
+ export declare function packageRoot(): string;
@@ -55,12 +55,14 @@ export const UNMANAGED_OPERATIONS = [
55
55
  ];
56
56
  export const INVALID_OPERATIONS = ["research.context.inspect"];
57
57
  export function packageVersion() {
58
- const moduleDirectory = dirname(fileURLToPath(import.meta.url));
59
- const packagePath = resolve(moduleDirectory, "../../../package.json");
58
+ const packagePath = resolve(packageRoot(), "package.json");
60
59
  const value = JSON.parse(readFileSync(packagePath, "utf8"));
61
60
  if (typeof value.version !== "string" || !value.version.trim()) {
62
61
  throw new Error("Package version is unavailable.");
63
62
  }
64
63
  return value.version;
65
64
  }
65
+ export function packageRoot() {
66
+ return resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
67
+ }
66
68
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/research/workspace/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,oBAAoB,CAAC;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAU,CAAC;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAA2B,CAAC;AAEjE,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAC;IACpD,cAAc;IACd,iBAAiB;IACjB,kBAAkB;IAClB,oBAAoB;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,0BAA0B;IAC1B,2BAA2B;IAC3B,6BAA6B;IAC7B,+BAA+B;IAC/B,4BAA4B;IAC5B,4BAA4B;IAC5B,oCAAoC;IACpC,0BAA0B;IAC1B,4BAA4B;IAC5B,uBAAuB;IACvB,4BAA4B;IAC5B,4BAA4B;IAC5B,wBAAwB;IACxB,uBAAuB;IACvB,sBAAsB;IACtB,iBAAiB;IACjB,cAAc;IACd,wBAAwB;IACxB,qBAAqB;IACrB,sBAAsB;IACtB,uBAAuB;IACvB,uBAAuB;IACvB,+BAA+B;IAC/B,sBAAsB;IACtB,uBAAuB;IACvB,wBAAwB;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,0BAA0B;IAC1B,wBAAwB;IACxB,qBAAqB;IACrB,sBAAsB;IACtB,uBAAuB;IACvB,sBAAsB;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,0BAA0B;IAC1B,6BAA6B;IAC7B,yBAAyB;IACzB,wBAAwB;IACxB,qBAAqB;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,0BAA0B,CAAU,CAAC;AAExE,MAAM,UAAU,cAAc;IAC5B,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAA0B,CAAC;IACrF,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/research/workspace/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,oBAAoB,CAAC;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAU,CAAC;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAA2B,CAAC;AAEjE,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAC;IACpD,cAAc;IACd,iBAAiB;IACjB,kBAAkB;IAClB,oBAAoB;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,0BAA0B;IAC1B,2BAA2B;IAC3B,6BAA6B;IAC7B,+BAA+B;IAC/B,4BAA4B;IAC5B,4BAA4B;IAC5B,oCAAoC;IACpC,0BAA0B;IAC1B,4BAA4B;IAC5B,uBAAuB;IACvB,4BAA4B;IAC5B,4BAA4B;IAC5B,wBAAwB;IACxB,uBAAuB;IACvB,sBAAsB;IACtB,iBAAiB;IACjB,cAAc;IACd,wBAAwB;IACxB,qBAAqB;IACrB,sBAAsB;IACtB,uBAAuB;IACvB,uBAAuB;IACvB,+BAA+B;IAC/B,sBAAsB;IACtB,uBAAuB;IACvB,wBAAwB;CAChB,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,0BAA0B;IAC1B,wBAAwB;IACxB,qBAAqB;IACrB,sBAAsB;IACtB,uBAAuB;IACvB,sBAAsB;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,0BAA0B;IAC1B,6BAA6B;IAC7B,yBAAyB;IACzB,wBAAwB;IACxB,qBAAqB;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,0BAA0B,CAAU,CAAC;AAExE,MAAM,UAAU,cAAc;IAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAA0B,CAAC;IACrF,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACtE,CAAC"}
@@ -1,6 +1,7 @@
1
- import { lstat } from "node:fs/promises";
1
+ import { lstat, realpath } from "node:fs/promises";
2
2
  import { dirname, join, parse, resolve } from "node:path";
3
- import { INVALID_OPERATIONS, RESEARCH_CONTROL_DIRECTORY, SETUP_OPERATIONS, UNMANAGED_OPERATIONS, WORKSPACE_OPERATIONS, } from "./constants.js";
3
+ import { INVALID_OPERATIONS, RESEARCH_PACKAGE_NAME, RESEARCH_CONTROL_DIRECTORY, SETUP_OPERATIONS, UNMANAGED_OPERATIONS, WORKSPACE_OPERATIONS, } from "./constants.js";
4
+ import { exactResearchCliCommand, researchSetupApplyCommand, researchSetupRetryCommand, } from "./setup-invocation.js";
4
5
  import { isObject, pathExists, readJsonFile } from "./storage.js";
5
6
  export async function inspectResearchContext(selectedPath) {
6
7
  const canonical = resolve(selectedPath);
@@ -9,15 +10,19 @@ export async function inspectResearchContext(selectedPath) {
9
10
  while (true) {
10
11
  const control = join(cursor, RESEARCH_CONTROL_DIRECTORY);
11
12
  if (await pathExists(control)) {
13
+ const workspaceRoot = await realpath(cursor).catch(() => cursor);
14
+ const workspaceControl = join(workspaceRoot, RESEARCH_CONTROL_DIRECTORY);
15
+ const setup = await inspectManagedSetup(workspaceControl, workspaceRoot);
12
16
  const markerPath = join(control, "workspace.json");
13
17
  if (!(await pathExists(markerPath))) {
14
- if (await isSetupOnlyControlDirectory(control)) {
18
+ if (setup) {
15
19
  return {
16
20
  role: "setup",
17
21
  selectedPath: canonical,
18
22
  root: cursor,
19
23
  allowedOperations: [...SETUP_OPERATIONS],
20
24
  violations: [],
25
+ setup,
21
26
  };
22
27
  }
23
28
  return {
@@ -44,6 +49,7 @@ export async function inspectResearchContext(selectedPath) {
44
49
  root: cursor,
45
50
  allowedOperations: [...WORKSPACE_OPERATIONS],
46
51
  violations: [],
52
+ ...(setup ? { setup } : {}),
47
53
  };
48
54
  }
49
55
  catch (error) {
@@ -63,21 +69,110 @@ export async function inspectResearchContext(selectedPath) {
63
69
  violations: [],
64
70
  };
65
71
  }
66
- async function isSetupOnlyControlDirectory(control) {
72
+ async function inspectManagedSetup(control, root) {
67
73
  const planPath = join(control, "setup-plan.json");
68
74
  if (!(await pathExists(planPath)))
69
- return false;
75
+ return null;
70
76
  try {
71
77
  const plan = await readJsonFile(planPath, "Research setup plan");
72
- return (isObject(plan) &&
73
- plan.schemaVersion === 1 &&
74
- plan.kind === "tiangong-research-setup-plan" &&
75
- typeof plan.planSha256 === "string" &&
76
- /^[0-9a-f]{64}$/.test(plan.planSha256));
78
+ if (!isObject(plan) ||
79
+ plan.schemaVersion !== 1 ||
80
+ plan.kind !== "tiangong-research-setup-plan" ||
81
+ !isObject(plan.cli) ||
82
+ plan.cli.package !== RESEARCH_PACKAGE_NAME ||
83
+ typeof plan.cli.version !== "string" ||
84
+ !/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(plan.cli.version) ||
85
+ typeof plan.planSha256 !== "string" ||
86
+ !/^[0-9a-f]{64}$/.test(plan.planSha256)) {
87
+ return null;
88
+ }
89
+ const state = await readSetupStateSummary(control);
90
+ const runtimeSource = (await hasMatchingRuntimeLock(control, plan.cli.version))
91
+ ? "runtime-lock"
92
+ : "setup-plan";
93
+ const blocker = state.lastError
94
+ ? {
95
+ ...state.lastError,
96
+ retryCommand: researchSetupRetryCommand({
97
+ version: plan.cli.version,
98
+ workspace: root,
99
+ step: state.lastError.step,
100
+ }),
101
+ }
102
+ : null;
103
+ const next = state.status === "ready"
104
+ ? null
105
+ : state.status === "pending"
106
+ ? {
107
+ action: "apply",
108
+ retryCommand: researchSetupApplyCommand({
109
+ version: plan.cli.version,
110
+ planPath,
111
+ }),
112
+ }
113
+ : state.status === "blocked" && blocker
114
+ ? { action: "retry", retryCommand: blocker.retryCommand }
115
+ : state.status === "applying"
116
+ ? {
117
+ action: "inspect",
118
+ retryCommand: exactResearchCliCommand(["research", "setup", "status", "--workspace", root, "--json"], plan.cli.version),
119
+ }
120
+ : {
121
+ action: "doctor",
122
+ retryCommand: exactResearchCliCommand(["research", "setup", "doctor", "--workspace", root, "--json"], plan.cli.version),
123
+ };
124
+ return {
125
+ status: state.status,
126
+ currentStep: state.currentStep,
127
+ blocker,
128
+ runtime: {
129
+ packageName: RESEARCH_PACKAGE_NAME,
130
+ packageVersion: plan.cli.version,
131
+ source: runtimeSource,
132
+ },
133
+ next,
134
+ };
77
135
  }
78
136
  catch {
79
- return false;
137
+ return null;
138
+ }
139
+ }
140
+ async function readSetupStateSummary(control) {
141
+ const statePath = join(control, "setup-state.json");
142
+ if (!(await pathExists(statePath))) {
143
+ return { status: "pending", currentStep: null, lastError: null };
80
144
  }
145
+ const state = await readJsonFile(statePath, "Research setup state");
146
+ if (!isObject(state) ||
147
+ !["pending", "applying", "partially-ready", "ready", "blocked"].includes(String(state.status))) {
148
+ return { status: "pending", currentStep: null, lastError: null };
149
+ }
150
+ const lastError = isSetupBlocker(state.lastError) ? state.lastError : null;
151
+ return {
152
+ status: state.status,
153
+ currentStep: typeof state.currentStep === "string" ? state.currentStep : null,
154
+ lastError,
155
+ };
156
+ }
157
+ async function hasMatchingRuntimeLock(control, version) {
158
+ const path = join(control, "runtime-lock.json");
159
+ const info = await lstat(path).catch(() => undefined);
160
+ if (!info?.isFile() || info.isSymbolicLink())
161
+ return false;
162
+ const lock = await readJsonFile(path, "Research runtime lock").catch(() => null);
163
+ return (isObject(lock) &&
164
+ lock.schemaVersion === 1 &&
165
+ lock.packageName === RESEARCH_PACKAGE_NAME &&
166
+ lock.packageVersion === version);
167
+ }
168
+ function isSetupBlocker(value) {
169
+ return (isObject(value) &&
170
+ typeof value.code === "string" &&
171
+ typeof value.step === "string" &&
172
+ typeof value.reason === "string" &&
173
+ typeof value.minimumAction === "string" &&
174
+ typeof value.retryCommand === "string" &&
175
+ (value.diagnostics === undefined || isObject(value.diagnostics)));
81
176
  }
82
177
  export function isWorkspaceMarker(value) {
83
178
  return (isObject(value) &&
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/research/workspace/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/research/workspace/context.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ export const RESEARCH_SETUP_SELECTION_GUIDANCE = {
15
15
  },
16
16
  };
17
17
  const BRAVE_COMMIT = "3e088af66eb61f1c207c22b2be0278ca8744d1d1";
18
- const TIANGONG_SKILLS_COMMIT = "24f2549968864c43dfb5a7f995a0e4fceb54d565";
18
+ const TIANGONG_SKILLS_COMMIT = "c9470b88f52d35629d3d9fb21ee7713048b44c3b";
19
19
  const ANTHROPIC_SKILLS_COMMIT = "f17010c9bb483898c1d9c9f42dde2b3a98889434";
20
20
  const PPT_MASTER_COMMIT = "4343bd8bfc91e79dfb9680681a378476cc38a280";
21
21
  export const RESEARCH_SETUP_INSTALLER = {
@@ -125,7 +125,7 @@ export const RESEARCH_SETUP_SKILLS = [
125
125
  skillName: "tiangong-auto-research",
126
126
  sourceId: "tiangong-ai-skills",
127
127
  sourceRelativePath: "tiangong-auto-research",
128
- expectedTreeSha256: "8ac005677e7c9ddf97ce1377686c97728ab89fedb1aa4e14fb96363cbc14a4c2",
128
+ expectedTreeSha256: "65c8acc41c8cc83575b433b8099528d72d1a99d4bb1178eb5568273516b9f065",
129
129
  tier: "orchestrator",
130
130
  role: "orchestrator",
131
131
  purpose: "Route ordinary research tasks into the reviewed Tiangong setup, preflight, execution, review, and closure workflow.",
@@ -250,7 +250,7 @@ export const RESEARCH_SETUP_SKILLS = [
250
250
  skillName: "tiangong-kb-sci-search",
251
251
  sourceId: "tiangong-ai-skills",
252
252
  sourceRelativePath: "tiangong-kb-sci-search",
253
- expectedTreeSha256: "1e3fb6c92bf4e98c6d382e06c6e3bcec52bb8c051f630a2ca499bd63042292ce",
253
+ expectedTreeSha256: "7308e5d88e5dbae113da7e401b8ecaf4b8e798bfe52ad10b99d188b2bd408b30",
254
254
  tier: "enhanced",
255
255
  role: "evidence-capability",
256
256
  purpose: "Owner-authorized Tiangong SCI database discovery through a bounded JSON POST broker.",
@@ -271,7 +271,7 @@ export const RESEARCH_SETUP_SKILLS = [
271
271
  skillName: "tiangong-kb-report-search",
272
272
  sourceId: "tiangong-ai-skills",
273
273
  sourceRelativePath: "tiangong-kb-report-search",
274
- expectedTreeSha256: "1cb09d26609511f39c4511cc117eb0f421c867dbe0d36cd0437d7aae38b7b836",
274
+ expectedTreeSha256: "d7f9eba27d965260edbe2760dc28352514d87d660b7a9f20bd6f44035f68f600",
275
275
  tier: "enhanced",
276
276
  role: "evidence-capability",
277
277
  purpose: "Owner-authorized Tiangong report database discovery through a bounded JSON POST broker.",
@@ -292,7 +292,7 @@ export const RESEARCH_SETUP_SKILLS = [
292
292
  skillName: "tiangong-kb-patent-search",
293
293
  sourceId: "tiangong-ai-skills",
294
294
  sourceRelativePath: "tiangong-kb-patent-search",
295
- expectedTreeSha256: "7ea45cebf2c74c5f5b665a17abd1a439235b89beff97657235996aa2db58f770",
295
+ expectedTreeSha256: "3dfabe32d50709f728595e7f482da4f42a7f149cc7cfb239e9ae98de93bcbcd6",
296
296
  tier: "enhanced",
297
297
  role: "evidence-capability",
298
298
  purpose: "Owner-authorized Tiangong patent database discovery through a bounded JSON POST broker.",
@@ -0,0 +1,11 @@
1
+ export declare function exactResearchCliCommand(args: readonly string[], version?: string): string;
2
+ export declare function pinResearchCliCommand(command: string, version?: string): string;
3
+ export declare function researchSetupApplyCommand(input: {
4
+ version: string;
5
+ planPath: string;
6
+ }): string;
7
+ export declare function researchSetupRetryCommand(input: {
8
+ version: string;
9
+ workspace: string;
10
+ step: string;
11
+ }): string;
@@ -0,0 +1,34 @@
1
+ import { RESEARCH_PACKAGE_NAME, packageVersion } from "./constants.js";
2
+ const SAFE_SHELL_WORD = /^[A-Za-z0-9_@%+=:,./-]+$/;
3
+ export function exactResearchCliCommand(args, version = packageVersion()) {
4
+ return [
5
+ "npx",
6
+ "--yes",
7
+ "--package",
8
+ `${RESEARCH_PACKAGE_NAME}@${version}`,
9
+ "--",
10
+ "tiangong-ai",
11
+ ...args,
12
+ ]
13
+ .map(shellWord)
14
+ .join(" ");
15
+ }
16
+ export function pinResearchCliCommand(command, version = packageVersion()) {
17
+ const trimmed = command.trim();
18
+ if (!trimmed.startsWith("tiangong-ai ") && trimmed !== "tiangong-ai")
19
+ return trimmed;
20
+ const prefix = exactResearchCliCommand([], version);
21
+ return trimmed === "tiangong-ai" ? prefix : `${prefix} ${trimmed.slice("tiangong-ai ".length)}`;
22
+ }
23
+ export function researchSetupApplyCommand(input) {
24
+ return exactResearchCliCommand(["research", "setup", "apply", "--plan", input.planPath, "--json"], input.version);
25
+ }
26
+ export function researchSetupRetryCommand(input) {
27
+ return exactResearchCliCommand(["research", "setup", "retry", "--step", input.step, "--workspace", input.workspace, "--json"], input.version);
28
+ }
29
+ function shellWord(value) {
30
+ if (SAFE_SHELL_WORD.test(value))
31
+ return value;
32
+ return `'${value.replaceAll("'", `'\"'\"'`)}'`;
33
+ }
34
+ //# sourceMappingURL=setup-invocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-invocation.js","sourceRoot":"","sources":["../../../src/research/workspace/setup-invocation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CACrC,IAAuB,EACvB,UAAkB,cAAc,EAAE;IAElC,OAAO;QACL,KAAK;QACL,OAAO;QACP,WAAW;QACX,GAAG,qBAAqB,IAAI,OAAO,EAAE;QACrC,IAAI;QACJ,aAAa;QACb,GAAG,IAAI;KACR;SACE,GAAG,CAAC,SAAS,CAAC;SACd,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,UAAkB,cAAc,EAAE;IACvF,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,OAAO,KAAK,aAAa;QAAE,OAAO,OAAO,CAAC;IACrF,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,OAAO,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAA4C;IACpF,OAAO,uBAAuB,CAC5B,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAClE,KAAK,CAAC,OAAO,CACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAIzC;IACC,OAAO,uBAAuB,CAC5B,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,EAC9F,KAAK,CAAC,OAAO,CACd,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC;AACjD,CAAC"}
@@ -97,6 +97,7 @@ export interface ResearchSetupState {
97
97
  reason: string;
98
98
  minimumAction: string;
99
99
  retryCommand: string;
100
+ diagnostics?: Record<string, unknown>;
100
101
  } | null;
101
102
  }
102
103
  export interface ResearchSetupPlanInput {
@@ -209,14 +210,58 @@ export declare function inspectResearchSetupStatus(workspace: string, environmen
209
210
  observedTreeSha256: string | null;
210
211
  detail: string;
211
212
  }[];
213
+ credentialReadiness: {
214
+ valuesEmitted: false;
215
+ configuredIds: string[];
216
+ missingRequiredIds: string[];
217
+ scopes: Array<"adapter" | "broker">;
218
+ };
219
+ provenance: {
220
+ effectiveCli: {
221
+ packageName: "@tiangong-ai/cli";
222
+ packageVersion: string;
223
+ packageRoot: string;
224
+ invocationMode: "exact-npx";
225
+ commandPrefix: string;
226
+ };
227
+ ambientCli: {
228
+ path: string;
229
+ ignoredByExactInvocation: true;
230
+ } | null;
231
+ ambientSkillConflicts: {
232
+ skillId: string;
233
+ skillName: string;
234
+ agent: ResearchSetupAgent;
235
+ path: string;
236
+ status: "blocked" | "drifted" | "matching";
237
+ observedTreeSha256: string | null;
238
+ expectedTreeSha256: string;
239
+ unmanagedPathCliFallback: boolean;
240
+ ignoredByProjectScope: true;
241
+ }[];
242
+ recoveryShims: {
243
+ agent: ResearchSetupAgent;
244
+ path: string;
245
+ status: "blocked" | "drifted" | "installed";
246
+ planSha256: string | null;
247
+ cliVersion: string | null;
248
+ recoveryOnly: true;
249
+ }[];
250
+ selectedOrchestrator: {
251
+ skillId: "tiangong.auto-research";
252
+ scope: ResearchSetupScope;
253
+ preferredPath: string | null;
254
+ installations: {
255
+ agent: ResearchSetupAgent;
256
+ path: string;
257
+ status: "blocked" | "drifted" | "missing" | "installed";
258
+ observedTreeSha256: string | null;
259
+ }[];
260
+ } | null;
261
+ };
212
262
  report: unknown;
213
263
  next: {
214
- code: string;
215
- step: string;
216
- reason: string;
217
- minimumAction: string;
218
- retryCommand: string;
219
- } | {
264
+ action: "apply" | "retry" | "doctor" | "inspect";
220
265
  minimumAction: string;
221
266
  retryCommand: string;
222
267
  } | null;