@microsoft/agentrc 2.0.1-0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../node_modules/vscode-jsonrpc/lib/common/is.js","../node_modules/vscode-jsonrpc/lib/common/messages.js","../node_modules/vscode-jsonrpc/lib/common/linkedMap.js","../node_modules/vscode-jsonrpc/lib/common/disposable.js","../node_modules/vscode-jsonrpc/lib/common/ral.js","../node_modules/vscode-jsonrpc/lib/common/events.js","../node_modules/vscode-jsonrpc/lib/common/cancellation.js","../node_modules/vscode-jsonrpc/lib/common/sharedArrayCancellation.js","../node_modules/vscode-jsonrpc/lib/common/semaphore.js","../node_modules/vscode-jsonrpc/lib/common/messageReader.js","../node_modules/vscode-jsonrpc/lib/common/messageWriter.js","../node_modules/vscode-jsonrpc/lib/common/messageBuffer.js","../node_modules/vscode-jsonrpc/lib/common/connection.js","../node_modules/vscode-jsonrpc/lib/common/api.js","../node_modules/vscode-jsonrpc/lib/node/ril.js","../node_modules/vscode-jsonrpc/lib/node/main.js","../node_modules/vscode-jsonrpc/node.js","../node_modules/@github/copilot-sdk/dist/generated/rpc.js","../node_modules/@github/copilot-sdk/dist/sdkProtocolVersion.js","../node_modules/@github/copilot-sdk/dist/session.js","../node_modules/@github/copilot-sdk/dist/client.js","../node_modules/@github/copilot-sdk/dist/types.js","../node_modules/@github/copilot-sdk/dist/index.js","../src/cli.ts","../packages/core/src/config.ts","../src/commands/analyze.ts","../packages/core/src/services/analyzer.ts","../packages/core/src/utils/fs.ts","../packages/core/src/utils/logger.ts","../packages/core/src/utils/output.ts","../src/commands/batch.tsx","../packages/core/src/services/azureDevops.ts","../packages/core/src/services/batch.ts","../packages/core/src/utils/pr.ts","../packages/core/src/services/git.ts","../packages/core/src/services/github.ts","../packages/core/src/services/instructions.ts","../packages/core/src/services/copilot.ts","../packages/core/src/services/copilotSdk.ts","../packages/core/src/services/readiness.ts","../packages/core/src/services/policy.ts","../packages/core/src/services/policy/types.ts","../packages/core/src/services/policy/engine.ts","../packages/core/src/services/policy/compiler.ts","../packages/core/src/services/policy/loader.ts","../packages/core/src/utils/repo.ts","../src/ui/BatchTui.tsx","../src/ui/AnimatedBanner.tsx","../src/ui/BatchTuiAzure.tsx","../src/commands/batchReadiness.tsx","../src/ui/BatchReadinessTui.tsx","../packages/core/src/services/visualReport.ts","../src/commands/eval.ts","../packages/core/src/services/evalScaffold.ts","../packages/core/src/services/evaluator.ts","../src/commands/generate.ts","../packages/core/src/services/generator.ts","../src/commands/instructions.ts","../src/commands/init.ts","../src/commands/pr.ts","../src/commands/readiness.ts","../src/commands/tui.tsx","../src/ui/tui.tsx","../src/index.ts"],"sourcesContent":["\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringArray = exports.array = exports.func = exports.error = exports.number = exports.string = exports.boolean = void 0;\nfunction boolean(value) {\n return value === true || value === false;\n}\nexports.boolean = boolean;\nfunction string(value) {\n return typeof value === 'string' || value instanceof String;\n}\nexports.string = string;\nfunction number(value) {\n return typeof value === 'number' || value instanceof Number;\n}\nexports.number = number;\nfunction error(value) {\n return value instanceof Error;\n}\nexports.error = error;\nfunction func(value) {\n return typeof value === 'function';\n}\nexports.func = func;\nfunction array(value) {\n return Array.isArray(value);\n}\nexports.array = array;\nfunction stringArray(value) {\n return array(value) && value.every(elem => string(elem));\n}\nexports.stringArray = stringArray;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Message = exports.NotificationType9 = exports.NotificationType8 = exports.NotificationType7 = exports.NotificationType6 = exports.NotificationType5 = exports.NotificationType4 = exports.NotificationType3 = exports.NotificationType2 = exports.NotificationType1 = exports.NotificationType0 = exports.NotificationType = exports.RequestType9 = exports.RequestType8 = exports.RequestType7 = exports.RequestType6 = exports.RequestType5 = exports.RequestType4 = exports.RequestType3 = exports.RequestType2 = exports.RequestType1 = exports.RequestType = exports.RequestType0 = exports.AbstractMessageSignature = exports.ParameterStructures = exports.ResponseError = exports.ErrorCodes = void 0;\nconst is = require(\"./is\");\n/**\n * Predefined error codes.\n */\nvar ErrorCodes;\n(function (ErrorCodes) {\n // Defined by JSON RPC\n ErrorCodes.ParseError = -32700;\n ErrorCodes.InvalidRequest = -32600;\n ErrorCodes.MethodNotFound = -32601;\n ErrorCodes.InvalidParams = -32602;\n ErrorCodes.InternalError = -32603;\n /**\n * This is the start range of JSON RPC reserved error codes.\n * It doesn't denote a real error code. No application error codes should\n * be defined between the start and end range. For backwards\n * compatibility the `ServerNotInitialized` and the `UnknownErrorCode`\n * are left in the range.\n *\n * @since 3.16.0\n */\n ErrorCodes.jsonrpcReservedErrorRangeStart = -32099;\n /** @deprecated use jsonrpcReservedErrorRangeStart */\n ErrorCodes.serverErrorStart = -32099;\n /**\n * An error occurred when write a message to the transport layer.\n */\n ErrorCodes.MessageWriteError = -32099;\n /**\n * An error occurred when reading a message from the transport layer.\n */\n ErrorCodes.MessageReadError = -32098;\n /**\n * The connection got disposed or lost and all pending responses got\n * rejected.\n */\n ErrorCodes.PendingResponseRejected = -32097;\n /**\n * The connection is inactive and a use of it failed.\n */\n ErrorCodes.ConnectionInactive = -32096;\n /**\n * Error code indicating that a server received a notification or\n * request before the server has received the `initialize` request.\n */\n ErrorCodes.ServerNotInitialized = -32002;\n ErrorCodes.UnknownErrorCode = -32001;\n /**\n * This is the end range of JSON RPC reserved error codes.\n * It doesn't denote a real error code.\n *\n * @since 3.16.0\n */\n ErrorCodes.jsonrpcReservedErrorRangeEnd = -32000;\n /** @deprecated use jsonrpcReservedErrorRangeEnd */\n ErrorCodes.serverErrorEnd = -32000;\n})(ErrorCodes || (exports.ErrorCodes = ErrorCodes = {}));\n/**\n * An error object return in a response in case a request\n * has failed.\n */\nclass ResponseError extends Error {\n constructor(code, message, data) {\n super(message);\n this.code = is.number(code) ? code : ErrorCodes.UnknownErrorCode;\n this.data = data;\n Object.setPrototypeOf(this, ResponseError.prototype);\n }\n toJson() {\n const result = {\n code: this.code,\n message: this.message\n };\n if (this.data !== undefined) {\n result.data = this.data;\n }\n return result;\n }\n}\nexports.ResponseError = ResponseError;\nclass ParameterStructures {\n constructor(kind) {\n this.kind = kind;\n }\n static is(value) {\n return value === ParameterStructures.auto || value === ParameterStructures.byName || value === ParameterStructures.byPosition;\n }\n toString() {\n return this.kind;\n }\n}\nexports.ParameterStructures = ParameterStructures;\n/**\n * The parameter structure is automatically inferred on the number of parameters\n * and the parameter type in case of a single param.\n */\nParameterStructures.auto = new ParameterStructures('auto');\n/**\n * Forces `byPosition` parameter structure. This is useful if you have a single\n * parameter which has a literal type.\n */\nParameterStructures.byPosition = new ParameterStructures('byPosition');\n/**\n * Forces `byName` parameter structure. This is only useful when having a single\n * parameter. The library will report errors if used with a different number of\n * parameters.\n */\nParameterStructures.byName = new ParameterStructures('byName');\n/**\n * An abstract implementation of a MessageType.\n */\nclass AbstractMessageSignature {\n constructor(method, numberOfParams) {\n this.method = method;\n this.numberOfParams = numberOfParams;\n }\n get parameterStructures() {\n return ParameterStructures.auto;\n }\n}\nexports.AbstractMessageSignature = AbstractMessageSignature;\n/**\n * Classes to type request response pairs\n */\nclass RequestType0 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 0);\n }\n}\nexports.RequestType0 = RequestType0;\nclass RequestType extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.RequestType = RequestType;\nclass RequestType1 extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.RequestType1 = RequestType1;\nclass RequestType2 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 2);\n }\n}\nexports.RequestType2 = RequestType2;\nclass RequestType3 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 3);\n }\n}\nexports.RequestType3 = RequestType3;\nclass RequestType4 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 4);\n }\n}\nexports.RequestType4 = RequestType4;\nclass RequestType5 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 5);\n }\n}\nexports.RequestType5 = RequestType5;\nclass RequestType6 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 6);\n }\n}\nexports.RequestType6 = RequestType6;\nclass RequestType7 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 7);\n }\n}\nexports.RequestType7 = RequestType7;\nclass RequestType8 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 8);\n }\n}\nexports.RequestType8 = RequestType8;\nclass RequestType9 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 9);\n }\n}\nexports.RequestType9 = RequestType9;\nclass NotificationType extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.NotificationType = NotificationType;\nclass NotificationType0 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 0);\n }\n}\nexports.NotificationType0 = NotificationType0;\nclass NotificationType1 extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.NotificationType1 = NotificationType1;\nclass NotificationType2 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 2);\n }\n}\nexports.NotificationType2 = NotificationType2;\nclass NotificationType3 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 3);\n }\n}\nexports.NotificationType3 = NotificationType3;\nclass NotificationType4 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 4);\n }\n}\nexports.NotificationType4 = NotificationType4;\nclass NotificationType5 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 5);\n }\n}\nexports.NotificationType5 = NotificationType5;\nclass NotificationType6 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 6);\n }\n}\nexports.NotificationType6 = NotificationType6;\nclass NotificationType7 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 7);\n }\n}\nexports.NotificationType7 = NotificationType7;\nclass NotificationType8 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 8);\n }\n}\nexports.NotificationType8 = NotificationType8;\nclass NotificationType9 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 9);\n }\n}\nexports.NotificationType9 = NotificationType9;\nvar Message;\n(function (Message) {\n /**\n * Tests if the given message is a request message\n */\n function isRequest(message) {\n const candidate = message;\n return candidate && is.string(candidate.method) && (is.string(candidate.id) || is.number(candidate.id));\n }\n Message.isRequest = isRequest;\n /**\n * Tests if the given message is a notification message\n */\n function isNotification(message) {\n const candidate = message;\n return candidate && is.string(candidate.method) && message.id === void 0;\n }\n Message.isNotification = isNotification;\n /**\n * Tests if the given message is a response message\n */\n function isResponse(message) {\n const candidate = message;\n return candidate && (candidate.result !== void 0 || !!candidate.error) && (is.string(candidate.id) || is.number(candidate.id) || candidate.id === null);\n }\n Message.isResponse = isResponse;\n})(Message || (exports.Message = Message = {}));\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nvar _a;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LRUCache = exports.LinkedMap = exports.Touch = void 0;\nvar Touch;\n(function (Touch) {\n Touch.None = 0;\n Touch.First = 1;\n Touch.AsOld = Touch.First;\n Touch.Last = 2;\n Touch.AsNew = Touch.Last;\n})(Touch || (exports.Touch = Touch = {}));\nclass LinkedMap {\n constructor() {\n this[_a] = 'LinkedMap';\n this._map = new Map();\n this._head = undefined;\n this._tail = undefined;\n this._size = 0;\n this._state = 0;\n }\n clear() {\n this._map.clear();\n this._head = undefined;\n this._tail = undefined;\n this._size = 0;\n this._state++;\n }\n isEmpty() {\n return !this._head && !this._tail;\n }\n get size() {\n return this._size;\n }\n get first() {\n return this._head?.value;\n }\n get last() {\n return this._tail?.value;\n }\n has(key) {\n return this._map.has(key);\n }\n get(key, touch = Touch.None) {\n const item = this._map.get(key);\n if (!item) {\n return undefined;\n }\n if (touch !== Touch.None) {\n this.touch(item, touch);\n }\n return item.value;\n }\n set(key, value, touch = Touch.None) {\n let item = this._map.get(key);\n if (item) {\n item.value = value;\n if (touch !== Touch.None) {\n this.touch(item, touch);\n }\n }\n else {\n item = { key, value, next: undefined, previous: undefined };\n switch (touch) {\n case Touch.None:\n this.addItemLast(item);\n break;\n case Touch.First:\n this.addItemFirst(item);\n break;\n case Touch.Last:\n this.addItemLast(item);\n break;\n default:\n this.addItemLast(item);\n break;\n }\n this._map.set(key, item);\n this._size++;\n }\n return this;\n }\n delete(key) {\n return !!this.remove(key);\n }\n remove(key) {\n const item = this._map.get(key);\n if (!item) {\n return undefined;\n }\n this._map.delete(key);\n this.removeItem(item);\n this._size--;\n return item.value;\n }\n shift() {\n if (!this._head && !this._tail) {\n return undefined;\n }\n if (!this._head || !this._tail) {\n throw new Error('Invalid list');\n }\n const item = this._head;\n this._map.delete(item.key);\n this.removeItem(item);\n this._size--;\n return item.value;\n }\n forEach(callbackfn, thisArg) {\n const state = this._state;\n let current = this._head;\n while (current) {\n if (thisArg) {\n callbackfn.bind(thisArg)(current.value, current.key, this);\n }\n else {\n callbackfn(current.value, current.key, this);\n }\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n current = current.next;\n }\n }\n keys() {\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]: () => {\n return iterator;\n },\n next: () => {\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: current.key, done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n values() {\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]: () => {\n return iterator;\n },\n next: () => {\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: current.value, done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n entries() {\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]: () => {\n return iterator;\n },\n next: () => {\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: [current.key, current.value], done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n [(_a = Symbol.toStringTag, Symbol.iterator)]() {\n return this.entries();\n }\n trimOld(newSize) {\n if (newSize >= this.size) {\n return;\n }\n if (newSize === 0) {\n this.clear();\n return;\n }\n let current = this._head;\n let currentSize = this.size;\n while (current && currentSize > newSize) {\n this._map.delete(current.key);\n current = current.next;\n currentSize--;\n }\n this._head = current;\n this._size = currentSize;\n if (current) {\n current.previous = undefined;\n }\n this._state++;\n }\n addItemFirst(item) {\n // First time Insert\n if (!this._head && !this._tail) {\n this._tail = item;\n }\n else if (!this._head) {\n throw new Error('Invalid list');\n }\n else {\n item.next = this._head;\n this._head.previous = item;\n }\n this._head = item;\n this._state++;\n }\n addItemLast(item) {\n // First time Insert\n if (!this._head && !this._tail) {\n this._head = item;\n }\n else if (!this._tail) {\n throw new Error('Invalid list');\n }\n else {\n item.previous = this._tail;\n this._tail.next = item;\n }\n this._tail = item;\n this._state++;\n }\n removeItem(item) {\n if (item === this._head && item === this._tail) {\n this._head = undefined;\n this._tail = undefined;\n }\n else if (item === this._head) {\n // This can only happened if size === 1 which is handle\n // by the case above.\n if (!item.next) {\n throw new Error('Invalid list');\n }\n item.next.previous = undefined;\n this._head = item.next;\n }\n else if (item === this._tail) {\n // This can only happened if size === 1 which is handle\n // by the case above.\n if (!item.previous) {\n throw new Error('Invalid list');\n }\n item.previous.next = undefined;\n this._tail = item.previous;\n }\n else {\n const next = item.next;\n const previous = item.previous;\n if (!next || !previous) {\n throw new Error('Invalid list');\n }\n next.previous = previous;\n previous.next = next;\n }\n item.next = undefined;\n item.previous = undefined;\n this._state++;\n }\n touch(item, touch) {\n if (!this._head || !this._tail) {\n throw new Error('Invalid list');\n }\n if ((touch !== Touch.First && touch !== Touch.Last)) {\n return;\n }\n if (touch === Touch.First) {\n if (item === this._head) {\n return;\n }\n const next = item.next;\n const previous = item.previous;\n // Unlink the item\n if (item === this._tail) {\n // previous must be defined since item was not head but is tail\n // So there are more than on item in the map\n previous.next = undefined;\n this._tail = previous;\n }\n else {\n // Both next and previous are not undefined since item was neither head nor tail.\n next.previous = previous;\n previous.next = next;\n }\n // Insert the node at head\n item.previous = undefined;\n item.next = this._head;\n this._head.previous = item;\n this._head = item;\n this._state++;\n }\n else if (touch === Touch.Last) {\n if (item === this._tail) {\n return;\n }\n const next = item.next;\n const previous = item.previous;\n // Unlink the item.\n if (item === this._head) {\n // next must be defined since item was not tail but is head\n // So there are more than on item in the map\n next.previous = undefined;\n this._head = next;\n }\n else {\n // Both next and previous are not undefined since item was neither head nor tail.\n next.previous = previous;\n previous.next = next;\n }\n item.next = undefined;\n item.previous = this._tail;\n this._tail.next = item;\n this._tail = item;\n this._state++;\n }\n }\n toJSON() {\n const data = [];\n this.forEach((value, key) => {\n data.push([key, value]);\n });\n return data;\n }\n fromJSON(data) {\n this.clear();\n for (const [key, value] of data) {\n this.set(key, value);\n }\n }\n}\nexports.LinkedMap = LinkedMap;\nclass LRUCache extends LinkedMap {\n constructor(limit, ratio = 1) {\n super();\n this._limit = limit;\n this._ratio = Math.min(Math.max(0, ratio), 1);\n }\n get limit() {\n return this._limit;\n }\n set limit(limit) {\n this._limit = limit;\n this.checkTrim();\n }\n get ratio() {\n return this._ratio;\n }\n set ratio(ratio) {\n this._ratio = Math.min(Math.max(0, ratio), 1);\n this.checkTrim();\n }\n get(key, touch = Touch.AsNew) {\n return super.get(key, touch);\n }\n peek(key) {\n return super.get(key, Touch.None);\n }\n set(key, value) {\n super.set(key, value, Touch.Last);\n this.checkTrim();\n return this;\n }\n checkTrim() {\n if (this.size > this._limit) {\n this.trimOld(Math.round(this._limit * this._ratio));\n }\n }\n}\nexports.LRUCache = LRUCache;\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Disposable = void 0;\nvar Disposable;\n(function (Disposable) {\n function create(func) {\n return {\n dispose: func\n };\n }\n Disposable.create = create;\n})(Disposable || (exports.Disposable = Disposable = {}));\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nlet _ral;\nfunction RAL() {\n if (_ral === undefined) {\n throw new Error(`No runtime abstraction layer installed`);\n }\n return _ral;\n}\n(function (RAL) {\n function install(ral) {\n if (ral === undefined) {\n throw new Error(`No runtime abstraction layer provided`);\n }\n _ral = ral;\n }\n RAL.install = install;\n})(RAL || (RAL = {}));\nexports.default = RAL;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Emitter = exports.Event = void 0;\nconst ral_1 = require(\"./ral\");\nvar Event;\n(function (Event) {\n const _disposable = { dispose() { } };\n Event.None = function () { return _disposable; };\n})(Event || (exports.Event = Event = {}));\nclass CallbackList {\n add(callback, context = null, bucket) {\n if (!this._callbacks) {\n this._callbacks = [];\n this._contexts = [];\n }\n this._callbacks.push(callback);\n this._contexts.push(context);\n if (Array.isArray(bucket)) {\n bucket.push({ dispose: () => this.remove(callback, context) });\n }\n }\n remove(callback, context = null) {\n if (!this._callbacks) {\n return;\n }\n let foundCallbackWithDifferentContext = false;\n for (let i = 0, len = this._callbacks.length; i < len; i++) {\n if (this._callbacks[i] === callback) {\n if (this._contexts[i] === context) {\n // callback & context match => remove it\n this._callbacks.splice(i, 1);\n this._contexts.splice(i, 1);\n return;\n }\n else {\n foundCallbackWithDifferentContext = true;\n }\n }\n }\n if (foundCallbackWithDifferentContext) {\n throw new Error('When adding a listener with a context, you should remove it with the same context');\n }\n }\n invoke(...args) {\n if (!this._callbacks) {\n return [];\n }\n const ret = [], callbacks = this._callbacks.slice(0), contexts = this._contexts.slice(0);\n for (let i = 0, len = callbacks.length; i < len; i++) {\n try {\n ret.push(callbacks[i].apply(contexts[i], args));\n }\n catch (e) {\n // eslint-disable-next-line no-console\n (0, ral_1.default)().console.error(e);\n }\n }\n return ret;\n }\n isEmpty() {\n return !this._callbacks || this._callbacks.length === 0;\n }\n dispose() {\n this._callbacks = undefined;\n this._contexts = undefined;\n }\n}\nclass Emitter {\n constructor(_options) {\n this._options = _options;\n }\n /**\n * For the public to allow to subscribe\n * to events from this Emitter\n */\n get event() {\n if (!this._event) {\n this._event = (listener, thisArgs, disposables) => {\n if (!this._callbacks) {\n this._callbacks = new CallbackList();\n }\n if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {\n this._options.onFirstListenerAdd(this);\n }\n this._callbacks.add(listener, thisArgs);\n const result = {\n dispose: () => {\n if (!this._callbacks) {\n // disposable is disposed after emitter is disposed.\n return;\n }\n this._callbacks.remove(listener, thisArgs);\n result.dispose = Emitter._noop;\n if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {\n this._options.onLastListenerRemove(this);\n }\n }\n };\n if (Array.isArray(disposables)) {\n disposables.push(result);\n }\n return result;\n };\n }\n return this._event;\n }\n /**\n * To be kept private to fire an event to\n * subscribers\n */\n fire(event) {\n if (this._callbacks) {\n this._callbacks.invoke.call(this._callbacks, event);\n }\n }\n dispose() {\n if (this._callbacks) {\n this._callbacks.dispose();\n this._callbacks = undefined;\n }\n }\n}\nexports.Emitter = Emitter;\nEmitter._noop = function () { };\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancellationTokenSource = exports.CancellationToken = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst events_1 = require(\"./events\");\nvar CancellationToken;\n(function (CancellationToken) {\n CancellationToken.None = Object.freeze({\n isCancellationRequested: false,\n onCancellationRequested: events_1.Event.None\n });\n CancellationToken.Cancelled = Object.freeze({\n isCancellationRequested: true,\n onCancellationRequested: events_1.Event.None\n });\n function is(value) {\n const candidate = value;\n return candidate && (candidate === CancellationToken.None\n || candidate === CancellationToken.Cancelled\n || (Is.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested));\n }\n CancellationToken.is = is;\n})(CancellationToken || (exports.CancellationToken = CancellationToken = {}));\nconst shortcutEvent = Object.freeze(function (callback, context) {\n const handle = (0, ral_1.default)().timer.setTimeout(callback.bind(context), 0);\n return { dispose() { handle.dispose(); } };\n});\nclass MutableToken {\n constructor() {\n this._isCancelled = false;\n }\n cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire(undefined);\n this.dispose();\n }\n }\n }\n get isCancellationRequested() {\n return this._isCancelled;\n }\n get onCancellationRequested() {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new events_1.Emitter();\n }\n return this._emitter.event;\n }\n dispose() {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = undefined;\n }\n }\n}\nclass CancellationTokenSource {\n get token() {\n if (!this._token) {\n // be lazy and create the token only when\n // actually needed\n this._token = new MutableToken();\n }\n return this._token;\n }\n cancel() {\n if (!this._token) {\n // save an object by returning the default\n // cancelled token when cancellation happens\n // before someone asks for the token\n this._token = CancellationToken.Cancelled;\n }\n else {\n this._token.cancel();\n }\n }\n dispose() {\n if (!this._token) {\n // ensure to initialize with an empty token if we had none\n this._token = CancellationToken.None;\n }\n else if (this._token instanceof MutableToken) {\n // actually dispose\n this._token.dispose();\n }\n }\n}\nexports.CancellationTokenSource = CancellationTokenSource;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SharedArrayReceiverStrategy = exports.SharedArraySenderStrategy = void 0;\nconst cancellation_1 = require(\"./cancellation\");\nvar CancellationState;\n(function (CancellationState) {\n CancellationState.Continue = 0;\n CancellationState.Cancelled = 1;\n})(CancellationState || (CancellationState = {}));\nclass SharedArraySenderStrategy {\n constructor() {\n this.buffers = new Map();\n }\n enableCancellation(request) {\n if (request.id === null) {\n return;\n }\n const buffer = new SharedArrayBuffer(4);\n const data = new Int32Array(buffer, 0, 1);\n data[0] = CancellationState.Continue;\n this.buffers.set(request.id, buffer);\n request.$cancellationData = buffer;\n }\n async sendCancellation(_conn, id) {\n const buffer = this.buffers.get(id);\n if (buffer === undefined) {\n return;\n }\n const data = new Int32Array(buffer, 0, 1);\n Atomics.store(data, 0, CancellationState.Cancelled);\n }\n cleanup(id) {\n this.buffers.delete(id);\n }\n dispose() {\n this.buffers.clear();\n }\n}\nexports.SharedArraySenderStrategy = SharedArraySenderStrategy;\nclass SharedArrayBufferCancellationToken {\n constructor(buffer) {\n this.data = new Int32Array(buffer, 0, 1);\n }\n get isCancellationRequested() {\n return Atomics.load(this.data, 0) === CancellationState.Cancelled;\n }\n get onCancellationRequested() {\n throw new Error(`Cancellation over SharedArrayBuffer doesn't support cancellation events`);\n }\n}\nclass SharedArrayBufferCancellationTokenSource {\n constructor(buffer) {\n this.token = new SharedArrayBufferCancellationToken(buffer);\n }\n cancel() {\n }\n dispose() {\n }\n}\nclass SharedArrayReceiverStrategy {\n constructor() {\n this.kind = 'request';\n }\n createCancellationTokenSource(request) {\n const buffer = request.$cancellationData;\n if (buffer === undefined) {\n return new cancellation_1.CancellationTokenSource();\n }\n return new SharedArrayBufferCancellationTokenSource(buffer);\n }\n}\nexports.SharedArrayReceiverStrategy = SharedArrayReceiverStrategy;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Semaphore = void 0;\nconst ral_1 = require(\"./ral\");\nclass Semaphore {\n constructor(capacity = 1) {\n if (capacity <= 0) {\n throw new Error('Capacity must be greater than 0');\n }\n this._capacity = capacity;\n this._active = 0;\n this._waiting = [];\n }\n lock(thunk) {\n return new Promise((resolve, reject) => {\n this._waiting.push({ thunk, resolve, reject });\n this.runNext();\n });\n }\n get active() {\n return this._active;\n }\n runNext() {\n if (this._waiting.length === 0 || this._active === this._capacity) {\n return;\n }\n (0, ral_1.default)().timer.setImmediate(() => this.doRunNext());\n }\n doRunNext() {\n if (this._waiting.length === 0 || this._active === this._capacity) {\n return;\n }\n const next = this._waiting.shift();\n this._active++;\n if (this._active > this._capacity) {\n throw new Error(`To many thunks active`);\n }\n try {\n const result = next.thunk();\n if (result instanceof Promise) {\n result.then((value) => {\n this._active--;\n next.resolve(value);\n this.runNext();\n }, (err) => {\n this._active--;\n next.reject(err);\n this.runNext();\n });\n }\n else {\n this._active--;\n next.resolve(result);\n this.runNext();\n }\n }\n catch (err) {\n this._active--;\n next.reject(err);\n this.runNext();\n }\n }\n}\nexports.Semaphore = Semaphore;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ReadableStreamMessageReader = exports.AbstractMessageReader = exports.MessageReader = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst events_1 = require(\"./events\");\nconst semaphore_1 = require(\"./semaphore\");\nvar MessageReader;\n(function (MessageReader) {\n function is(value) {\n let candidate = value;\n return candidate && Is.func(candidate.listen) && Is.func(candidate.dispose) &&\n Is.func(candidate.onError) && Is.func(candidate.onClose) && Is.func(candidate.onPartialMessage);\n }\n MessageReader.is = is;\n})(MessageReader || (exports.MessageReader = MessageReader = {}));\nclass AbstractMessageReader {\n constructor() {\n this.errorEmitter = new events_1.Emitter();\n this.closeEmitter = new events_1.Emitter();\n this.partialMessageEmitter = new events_1.Emitter();\n }\n dispose() {\n this.errorEmitter.dispose();\n this.closeEmitter.dispose();\n }\n get onError() {\n return this.errorEmitter.event;\n }\n fireError(error) {\n this.errorEmitter.fire(this.asError(error));\n }\n get onClose() {\n return this.closeEmitter.event;\n }\n fireClose() {\n this.closeEmitter.fire(undefined);\n }\n get onPartialMessage() {\n return this.partialMessageEmitter.event;\n }\n firePartialMessage(info) {\n this.partialMessageEmitter.fire(info);\n }\n asError(error) {\n if (error instanceof Error) {\n return error;\n }\n else {\n return new Error(`Reader received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);\n }\n }\n}\nexports.AbstractMessageReader = AbstractMessageReader;\nvar ResolvedMessageReaderOptions;\n(function (ResolvedMessageReaderOptions) {\n function fromOptions(options) {\n let charset;\n let result;\n let contentDecoder;\n const contentDecoders = new Map();\n let contentTypeDecoder;\n const contentTypeDecoders = new Map();\n if (options === undefined || typeof options === 'string') {\n charset = options ?? 'utf-8';\n }\n else {\n charset = options.charset ?? 'utf-8';\n if (options.contentDecoder !== undefined) {\n contentDecoder = options.contentDecoder;\n contentDecoders.set(contentDecoder.name, contentDecoder);\n }\n if (options.contentDecoders !== undefined) {\n for (const decoder of options.contentDecoders) {\n contentDecoders.set(decoder.name, decoder);\n }\n }\n if (options.contentTypeDecoder !== undefined) {\n contentTypeDecoder = options.contentTypeDecoder;\n contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);\n }\n if (options.contentTypeDecoders !== undefined) {\n for (const decoder of options.contentTypeDecoders) {\n contentTypeDecoders.set(decoder.name, decoder);\n }\n }\n }\n if (contentTypeDecoder === undefined) {\n contentTypeDecoder = (0, ral_1.default)().applicationJson.decoder;\n contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);\n }\n return { charset, contentDecoder, contentDecoders, contentTypeDecoder, contentTypeDecoders };\n }\n ResolvedMessageReaderOptions.fromOptions = fromOptions;\n})(ResolvedMessageReaderOptions || (ResolvedMessageReaderOptions = {}));\nclass ReadableStreamMessageReader extends AbstractMessageReader {\n constructor(readable, options) {\n super();\n this.readable = readable;\n this.options = ResolvedMessageReaderOptions.fromOptions(options);\n this.buffer = (0, ral_1.default)().messageBuffer.create(this.options.charset);\n this._partialMessageTimeout = 10000;\n this.nextMessageLength = -1;\n this.messageToken = 0;\n this.readSemaphore = new semaphore_1.Semaphore(1);\n }\n set partialMessageTimeout(timeout) {\n this._partialMessageTimeout = timeout;\n }\n get partialMessageTimeout() {\n return this._partialMessageTimeout;\n }\n listen(callback) {\n this.nextMessageLength = -1;\n this.messageToken = 0;\n this.partialMessageTimer = undefined;\n this.callback = callback;\n const result = this.readable.onData((data) => {\n this.onData(data);\n });\n this.readable.onError((error) => this.fireError(error));\n this.readable.onClose(() => this.fireClose());\n return result;\n }\n onData(data) {\n try {\n this.buffer.append(data);\n while (true) {\n if (this.nextMessageLength === -1) {\n const headers = this.buffer.tryReadHeaders(true);\n if (!headers) {\n return;\n }\n const contentLength = headers.get('content-length');\n if (!contentLength) {\n this.fireError(new Error(`Header must provide a Content-Length property.\\n${JSON.stringify(Object.fromEntries(headers))}`));\n return;\n }\n const length = parseInt(contentLength);\n if (isNaN(length)) {\n this.fireError(new Error(`Content-Length value must be a number. Got ${contentLength}`));\n return;\n }\n this.nextMessageLength = length;\n }\n const body = this.buffer.tryReadBody(this.nextMessageLength);\n if (body === undefined) {\n /** We haven't received the full message yet. */\n this.setPartialMessageTimer();\n return;\n }\n this.clearPartialMessageTimer();\n this.nextMessageLength = -1;\n // Make sure that we convert one received message after the\n // other. Otherwise it could happen that a decoding of a second\n // smaller message finished before the decoding of a first larger\n // message and then we would deliver the second message first.\n this.readSemaphore.lock(async () => {\n const bytes = this.options.contentDecoder !== undefined\n ? await this.options.contentDecoder.decode(body)\n : body;\n const message = await this.options.contentTypeDecoder.decode(bytes, this.options);\n this.callback(message);\n }).catch((error) => {\n this.fireError(error);\n });\n }\n }\n catch (error) {\n this.fireError(error);\n }\n }\n clearPartialMessageTimer() {\n if (this.partialMessageTimer) {\n this.partialMessageTimer.dispose();\n this.partialMessageTimer = undefined;\n }\n }\n setPartialMessageTimer() {\n this.clearPartialMessageTimer();\n if (this._partialMessageTimeout <= 0) {\n return;\n }\n this.partialMessageTimer = (0, ral_1.default)().timer.setTimeout((token, timeout) => {\n this.partialMessageTimer = undefined;\n if (token === this.messageToken) {\n this.firePartialMessage({ messageToken: token, waitingTime: timeout });\n this.setPartialMessageTimer();\n }\n }, this._partialMessageTimeout, this.messageToken, this._partialMessageTimeout);\n }\n}\nexports.ReadableStreamMessageReader = ReadableStreamMessageReader;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WriteableStreamMessageWriter = exports.AbstractMessageWriter = exports.MessageWriter = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst semaphore_1 = require(\"./semaphore\");\nconst events_1 = require(\"./events\");\nconst ContentLength = 'Content-Length: ';\nconst CRLF = '\\r\\n';\nvar MessageWriter;\n(function (MessageWriter) {\n function is(value) {\n let candidate = value;\n return candidate && Is.func(candidate.dispose) && Is.func(candidate.onClose) &&\n Is.func(candidate.onError) && Is.func(candidate.write);\n }\n MessageWriter.is = is;\n})(MessageWriter || (exports.MessageWriter = MessageWriter = {}));\nclass AbstractMessageWriter {\n constructor() {\n this.errorEmitter = new events_1.Emitter();\n this.closeEmitter = new events_1.Emitter();\n }\n dispose() {\n this.errorEmitter.dispose();\n this.closeEmitter.dispose();\n }\n get onError() {\n return this.errorEmitter.event;\n }\n fireError(error, message, count) {\n this.errorEmitter.fire([this.asError(error), message, count]);\n }\n get onClose() {\n return this.closeEmitter.event;\n }\n fireClose() {\n this.closeEmitter.fire(undefined);\n }\n asError(error) {\n if (error instanceof Error) {\n return error;\n }\n else {\n return new Error(`Writer received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);\n }\n }\n}\nexports.AbstractMessageWriter = AbstractMessageWriter;\nvar ResolvedMessageWriterOptions;\n(function (ResolvedMessageWriterOptions) {\n function fromOptions(options) {\n if (options === undefined || typeof options === 'string') {\n return { charset: options ?? 'utf-8', contentTypeEncoder: (0, ral_1.default)().applicationJson.encoder };\n }\n else {\n return { charset: options.charset ?? 'utf-8', contentEncoder: options.contentEncoder, contentTypeEncoder: options.contentTypeEncoder ?? (0, ral_1.default)().applicationJson.encoder };\n }\n }\n ResolvedMessageWriterOptions.fromOptions = fromOptions;\n})(ResolvedMessageWriterOptions || (ResolvedMessageWriterOptions = {}));\nclass WriteableStreamMessageWriter extends AbstractMessageWriter {\n constructor(writable, options) {\n super();\n this.writable = writable;\n this.options = ResolvedMessageWriterOptions.fromOptions(options);\n this.errorCount = 0;\n this.writeSemaphore = new semaphore_1.Semaphore(1);\n this.writable.onError((error) => this.fireError(error));\n this.writable.onClose(() => this.fireClose());\n }\n async write(msg) {\n return this.writeSemaphore.lock(async () => {\n const payload = this.options.contentTypeEncoder.encode(msg, this.options).then((buffer) => {\n if (this.options.contentEncoder !== undefined) {\n return this.options.contentEncoder.encode(buffer);\n }\n else {\n return buffer;\n }\n });\n return payload.then((buffer) => {\n const headers = [];\n headers.push(ContentLength, buffer.byteLength.toString(), CRLF);\n headers.push(CRLF);\n return this.doWrite(msg, headers, buffer);\n }, (error) => {\n this.fireError(error);\n throw error;\n });\n });\n }\n async doWrite(msg, headers, data) {\n try {\n await this.writable.write(headers.join(''), 'ascii');\n return this.writable.write(data);\n }\n catch (error) {\n this.handleError(error, msg);\n return Promise.reject(error);\n }\n }\n handleError(error, msg) {\n this.errorCount++;\n this.fireError(error, msg, this.errorCount);\n }\n end() {\n this.writable.end();\n }\n}\nexports.WriteableStreamMessageWriter = WriteableStreamMessageWriter;\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AbstractMessageBuffer = void 0;\nconst CR = 13;\nconst LF = 10;\nconst CRLF = '\\r\\n';\nclass AbstractMessageBuffer {\n constructor(encoding = 'utf-8') {\n this._encoding = encoding;\n this._chunks = [];\n this._totalLength = 0;\n }\n get encoding() {\n return this._encoding;\n }\n append(chunk) {\n const toAppend = typeof chunk === 'string' ? this.fromString(chunk, this._encoding) : chunk;\n this._chunks.push(toAppend);\n this._totalLength += toAppend.byteLength;\n }\n tryReadHeaders(lowerCaseKeys = false) {\n if (this._chunks.length === 0) {\n return undefined;\n }\n let state = 0;\n let chunkIndex = 0;\n let offset = 0;\n let chunkBytesRead = 0;\n row: while (chunkIndex < this._chunks.length) {\n const chunk = this._chunks[chunkIndex];\n offset = 0;\n column: while (offset < chunk.length) {\n const value = chunk[offset];\n switch (value) {\n case CR:\n switch (state) {\n case 0:\n state = 1;\n break;\n case 2:\n state = 3;\n break;\n default:\n state = 0;\n }\n break;\n case LF:\n switch (state) {\n case 1:\n state = 2;\n break;\n case 3:\n state = 4;\n offset++;\n break row;\n default:\n state = 0;\n }\n break;\n default:\n state = 0;\n }\n offset++;\n }\n chunkBytesRead += chunk.byteLength;\n chunkIndex++;\n }\n if (state !== 4) {\n return undefined;\n }\n // The buffer contains the two CRLF at the end. So we will\n // have two empty lines after the split at the end as well.\n const buffer = this._read(chunkBytesRead + offset);\n const result = new Map();\n const headers = this.toString(buffer, 'ascii').split(CRLF);\n if (headers.length < 2) {\n return result;\n }\n for (let i = 0; i < headers.length - 2; i++) {\n const header = headers[i];\n const index = header.indexOf(':');\n if (index === -1) {\n throw new Error(`Message header must separate key and value using ':'\\n${header}`);\n }\n const key = header.substr(0, index);\n const value = header.substr(index + 1).trim();\n result.set(lowerCaseKeys ? key.toLowerCase() : key, value);\n }\n return result;\n }\n tryReadBody(length) {\n if (this._totalLength < length) {\n return undefined;\n }\n return this._read(length);\n }\n get numberOfBytes() {\n return this._totalLength;\n }\n _read(byteCount) {\n if (byteCount === 0) {\n return this.emptyBuffer();\n }\n if (byteCount > this._totalLength) {\n throw new Error(`Cannot read so many bytes!`);\n }\n if (this._chunks[0].byteLength === byteCount) {\n // super fast path, precisely first chunk must be returned\n const chunk = this._chunks[0];\n this._chunks.shift();\n this._totalLength -= byteCount;\n return this.asNative(chunk);\n }\n if (this._chunks[0].byteLength > byteCount) {\n // fast path, the reading is entirely within the first chunk\n const chunk = this._chunks[0];\n const result = this.asNative(chunk, byteCount);\n this._chunks[0] = chunk.slice(byteCount);\n this._totalLength -= byteCount;\n return result;\n }\n const result = this.allocNative(byteCount);\n let resultOffset = 0;\n let chunkIndex = 0;\n while (byteCount > 0) {\n const chunk = this._chunks[chunkIndex];\n if (chunk.byteLength > byteCount) {\n // this chunk will survive\n const chunkPart = chunk.slice(0, byteCount);\n result.set(chunkPart, resultOffset);\n resultOffset += byteCount;\n this._chunks[chunkIndex] = chunk.slice(byteCount);\n this._totalLength -= byteCount;\n byteCount -= byteCount;\n }\n else {\n // this chunk will be entirely read\n result.set(chunk, resultOffset);\n resultOffset += chunk.byteLength;\n this._chunks.shift();\n this._totalLength -= chunk.byteLength;\n byteCount -= chunk.byteLength;\n }\n }\n return result;\n }\n}\nexports.AbstractMessageBuffer = AbstractMessageBuffer;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createMessageConnection = exports.ConnectionOptions = exports.MessageStrategy = exports.CancellationStrategy = exports.CancellationSenderStrategy = exports.CancellationReceiverStrategy = exports.RequestCancellationReceiverStrategy = exports.IdCancellationReceiverStrategy = exports.ConnectionStrategy = exports.ConnectionError = exports.ConnectionErrors = exports.LogTraceNotification = exports.SetTraceNotification = exports.TraceFormat = exports.TraceValues = exports.Trace = exports.NullLogger = exports.ProgressType = exports.ProgressToken = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst messages_1 = require(\"./messages\");\nconst linkedMap_1 = require(\"./linkedMap\");\nconst events_1 = require(\"./events\");\nconst cancellation_1 = require(\"./cancellation\");\nvar CancelNotification;\n(function (CancelNotification) {\n CancelNotification.type = new messages_1.NotificationType('$/cancelRequest');\n})(CancelNotification || (CancelNotification = {}));\nvar ProgressToken;\n(function (ProgressToken) {\n function is(value) {\n return typeof value === 'string' || typeof value === 'number';\n }\n ProgressToken.is = is;\n})(ProgressToken || (exports.ProgressToken = ProgressToken = {}));\nvar ProgressNotification;\n(function (ProgressNotification) {\n ProgressNotification.type = new messages_1.NotificationType('$/progress');\n})(ProgressNotification || (ProgressNotification = {}));\nclass ProgressType {\n constructor() {\n }\n}\nexports.ProgressType = ProgressType;\nvar StarRequestHandler;\n(function (StarRequestHandler) {\n function is(value) {\n return Is.func(value);\n }\n StarRequestHandler.is = is;\n})(StarRequestHandler || (StarRequestHandler = {}));\nexports.NullLogger = Object.freeze({\n error: () => { },\n warn: () => { },\n info: () => { },\n log: () => { }\n});\nvar Trace;\n(function (Trace) {\n Trace[Trace[\"Off\"] = 0] = \"Off\";\n Trace[Trace[\"Messages\"] = 1] = \"Messages\";\n Trace[Trace[\"Compact\"] = 2] = \"Compact\";\n Trace[Trace[\"Verbose\"] = 3] = \"Verbose\";\n})(Trace || (exports.Trace = Trace = {}));\nvar TraceValues;\n(function (TraceValues) {\n /**\n * Turn tracing off.\n */\n TraceValues.Off = 'off';\n /**\n * Trace messages only.\n */\n TraceValues.Messages = 'messages';\n /**\n * Compact message tracing.\n */\n TraceValues.Compact = 'compact';\n /**\n * Verbose message tracing.\n */\n TraceValues.Verbose = 'verbose';\n})(TraceValues || (exports.TraceValues = TraceValues = {}));\n(function (Trace) {\n function fromString(value) {\n if (!Is.string(value)) {\n return Trace.Off;\n }\n value = value.toLowerCase();\n switch (value) {\n case 'off':\n return Trace.Off;\n case 'messages':\n return Trace.Messages;\n case 'compact':\n return Trace.Compact;\n case 'verbose':\n return Trace.Verbose;\n default:\n return Trace.Off;\n }\n }\n Trace.fromString = fromString;\n function toString(value) {\n switch (value) {\n case Trace.Off:\n return 'off';\n case Trace.Messages:\n return 'messages';\n case Trace.Compact:\n return 'compact';\n case Trace.Verbose:\n return 'verbose';\n default:\n return 'off';\n }\n }\n Trace.toString = toString;\n})(Trace || (exports.Trace = Trace = {}));\nvar TraceFormat;\n(function (TraceFormat) {\n TraceFormat[\"Text\"] = \"text\";\n TraceFormat[\"JSON\"] = \"json\";\n})(TraceFormat || (exports.TraceFormat = TraceFormat = {}));\n(function (TraceFormat) {\n function fromString(value) {\n if (!Is.string(value)) {\n return TraceFormat.Text;\n }\n value = value.toLowerCase();\n if (value === 'json') {\n return TraceFormat.JSON;\n }\n else {\n return TraceFormat.Text;\n }\n }\n TraceFormat.fromString = fromString;\n})(TraceFormat || (exports.TraceFormat = TraceFormat = {}));\nvar SetTraceNotification;\n(function (SetTraceNotification) {\n SetTraceNotification.type = new messages_1.NotificationType('$/setTrace');\n})(SetTraceNotification || (exports.SetTraceNotification = SetTraceNotification = {}));\nvar LogTraceNotification;\n(function (LogTraceNotification) {\n LogTraceNotification.type = new messages_1.NotificationType('$/logTrace');\n})(LogTraceNotification || (exports.LogTraceNotification = LogTraceNotification = {}));\nvar ConnectionErrors;\n(function (ConnectionErrors) {\n /**\n * The connection is closed.\n */\n ConnectionErrors[ConnectionErrors[\"Closed\"] = 1] = \"Closed\";\n /**\n * The connection got disposed.\n */\n ConnectionErrors[ConnectionErrors[\"Disposed\"] = 2] = \"Disposed\";\n /**\n * The connection is already in listening mode.\n */\n ConnectionErrors[ConnectionErrors[\"AlreadyListening\"] = 3] = \"AlreadyListening\";\n})(ConnectionErrors || (exports.ConnectionErrors = ConnectionErrors = {}));\nclass ConnectionError extends Error {\n constructor(code, message) {\n super(message);\n this.code = code;\n Object.setPrototypeOf(this, ConnectionError.prototype);\n }\n}\nexports.ConnectionError = ConnectionError;\nvar ConnectionStrategy;\n(function (ConnectionStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.cancelUndispatched);\n }\n ConnectionStrategy.is = is;\n})(ConnectionStrategy || (exports.ConnectionStrategy = ConnectionStrategy = {}));\nvar IdCancellationReceiverStrategy;\n(function (IdCancellationReceiverStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && (candidate.kind === undefined || candidate.kind === 'id') && Is.func(candidate.createCancellationTokenSource) && (candidate.dispose === undefined || Is.func(candidate.dispose));\n }\n IdCancellationReceiverStrategy.is = is;\n})(IdCancellationReceiverStrategy || (exports.IdCancellationReceiverStrategy = IdCancellationReceiverStrategy = {}));\nvar RequestCancellationReceiverStrategy;\n(function (RequestCancellationReceiverStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && candidate.kind === 'request' && Is.func(candidate.createCancellationTokenSource) && (candidate.dispose === undefined || Is.func(candidate.dispose));\n }\n RequestCancellationReceiverStrategy.is = is;\n})(RequestCancellationReceiverStrategy || (exports.RequestCancellationReceiverStrategy = RequestCancellationReceiverStrategy = {}));\nvar CancellationReceiverStrategy;\n(function (CancellationReceiverStrategy) {\n CancellationReceiverStrategy.Message = Object.freeze({\n createCancellationTokenSource(_) {\n return new cancellation_1.CancellationTokenSource();\n }\n });\n function is(value) {\n return IdCancellationReceiverStrategy.is(value) || RequestCancellationReceiverStrategy.is(value);\n }\n CancellationReceiverStrategy.is = is;\n})(CancellationReceiverStrategy || (exports.CancellationReceiverStrategy = CancellationReceiverStrategy = {}));\nvar CancellationSenderStrategy;\n(function (CancellationSenderStrategy) {\n CancellationSenderStrategy.Message = Object.freeze({\n sendCancellation(conn, id) {\n return conn.sendNotification(CancelNotification.type, { id });\n },\n cleanup(_) { }\n });\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.sendCancellation) && Is.func(candidate.cleanup);\n }\n CancellationSenderStrategy.is = is;\n})(CancellationSenderStrategy || (exports.CancellationSenderStrategy = CancellationSenderStrategy = {}));\nvar CancellationStrategy;\n(function (CancellationStrategy) {\n CancellationStrategy.Message = Object.freeze({\n receiver: CancellationReceiverStrategy.Message,\n sender: CancellationSenderStrategy.Message\n });\n function is(value) {\n const candidate = value;\n return candidate && CancellationReceiverStrategy.is(candidate.receiver) && CancellationSenderStrategy.is(candidate.sender);\n }\n CancellationStrategy.is = is;\n})(CancellationStrategy || (exports.CancellationStrategy = CancellationStrategy = {}));\nvar MessageStrategy;\n(function (MessageStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.handleMessage);\n }\n MessageStrategy.is = is;\n})(MessageStrategy || (exports.MessageStrategy = MessageStrategy = {}));\nvar ConnectionOptions;\n(function (ConnectionOptions) {\n function is(value) {\n const candidate = value;\n return candidate && (CancellationStrategy.is(candidate.cancellationStrategy) || ConnectionStrategy.is(candidate.connectionStrategy) || MessageStrategy.is(candidate.messageStrategy));\n }\n ConnectionOptions.is = is;\n})(ConnectionOptions || (exports.ConnectionOptions = ConnectionOptions = {}));\nvar ConnectionState;\n(function (ConnectionState) {\n ConnectionState[ConnectionState[\"New\"] = 1] = \"New\";\n ConnectionState[ConnectionState[\"Listening\"] = 2] = \"Listening\";\n ConnectionState[ConnectionState[\"Closed\"] = 3] = \"Closed\";\n ConnectionState[ConnectionState[\"Disposed\"] = 4] = \"Disposed\";\n})(ConnectionState || (ConnectionState = {}));\nfunction createMessageConnection(messageReader, messageWriter, _logger, options) {\n const logger = _logger !== undefined ? _logger : exports.NullLogger;\n let sequenceNumber = 0;\n let notificationSequenceNumber = 0;\n let unknownResponseSequenceNumber = 0;\n const version = '2.0';\n let starRequestHandler = undefined;\n const requestHandlers = new Map();\n let starNotificationHandler = undefined;\n const notificationHandlers = new Map();\n const progressHandlers = new Map();\n let timer;\n let messageQueue = new linkedMap_1.LinkedMap();\n let responsePromises = new Map();\n let knownCanceledRequests = new Set();\n let requestTokens = new Map();\n let trace = Trace.Off;\n let traceFormat = TraceFormat.Text;\n let tracer;\n let state = ConnectionState.New;\n const errorEmitter = new events_1.Emitter();\n const closeEmitter = new events_1.Emitter();\n const unhandledNotificationEmitter = new events_1.Emitter();\n const unhandledProgressEmitter = new events_1.Emitter();\n const disposeEmitter = new events_1.Emitter();\n const cancellationStrategy = (options && options.cancellationStrategy) ? options.cancellationStrategy : CancellationStrategy.Message;\n function createRequestQueueKey(id) {\n if (id === null) {\n throw new Error(`Can't send requests with id null since the response can't be correlated.`);\n }\n return 'req-' + id.toString();\n }\n function createResponseQueueKey(id) {\n if (id === null) {\n return 'res-unknown-' + (++unknownResponseSequenceNumber).toString();\n }\n else {\n return 'res-' + id.toString();\n }\n }\n function createNotificationQueueKey() {\n return 'not-' + (++notificationSequenceNumber).toString();\n }\n function addMessageToQueue(queue, message) {\n if (messages_1.Message.isRequest(message)) {\n queue.set(createRequestQueueKey(message.id), message);\n }\n else if (messages_1.Message.isResponse(message)) {\n queue.set(createResponseQueueKey(message.id), message);\n }\n else {\n queue.set(createNotificationQueueKey(), message);\n }\n }\n function cancelUndispatched(_message) {\n return undefined;\n }\n function isListening() {\n return state === ConnectionState.Listening;\n }\n function isClosed() {\n return state === ConnectionState.Closed;\n }\n function isDisposed() {\n return state === ConnectionState.Disposed;\n }\n function closeHandler() {\n if (state === ConnectionState.New || state === ConnectionState.Listening) {\n state = ConnectionState.Closed;\n closeEmitter.fire(undefined);\n }\n // If the connection is disposed don't sent close events.\n }\n function readErrorHandler(error) {\n errorEmitter.fire([error, undefined, undefined]);\n }\n function writeErrorHandler(data) {\n errorEmitter.fire(data);\n }\n messageReader.onClose(closeHandler);\n messageReader.onError(readErrorHandler);\n messageWriter.onClose(closeHandler);\n messageWriter.onError(writeErrorHandler);\n function triggerMessageQueue() {\n if (timer || messageQueue.size === 0) {\n return;\n }\n timer = (0, ral_1.default)().timer.setImmediate(() => {\n timer = undefined;\n processMessageQueue();\n });\n }\n function handleMessage(message) {\n if (messages_1.Message.isRequest(message)) {\n handleRequest(message);\n }\n else if (messages_1.Message.isNotification(message)) {\n handleNotification(message);\n }\n else if (messages_1.Message.isResponse(message)) {\n handleResponse(message);\n }\n else {\n handleInvalidMessage(message);\n }\n }\n function processMessageQueue() {\n if (messageQueue.size === 0) {\n return;\n }\n const message = messageQueue.shift();\n try {\n const messageStrategy = options?.messageStrategy;\n if (MessageStrategy.is(messageStrategy)) {\n messageStrategy.handleMessage(message, handleMessage);\n }\n else {\n handleMessage(message);\n }\n }\n finally {\n triggerMessageQueue();\n }\n }\n const callback = (message) => {\n try {\n // We have received a cancellation message. Check if the message is still in the queue\n // and cancel it if allowed to do so.\n if (messages_1.Message.isNotification(message) && message.method === CancelNotification.type.method) {\n const cancelId = message.params.id;\n const key = createRequestQueueKey(cancelId);\n const toCancel = messageQueue.get(key);\n if (messages_1.Message.isRequest(toCancel)) {\n const strategy = options?.connectionStrategy;\n const response = (strategy && strategy.cancelUndispatched) ? strategy.cancelUndispatched(toCancel, cancelUndispatched) : cancelUndispatched(toCancel);\n if (response && (response.error !== undefined || response.result !== undefined)) {\n messageQueue.delete(key);\n requestTokens.delete(cancelId);\n response.id = toCancel.id;\n traceSendingResponse(response, message.method, Date.now());\n messageWriter.write(response).catch(() => logger.error(`Sending response for canceled message failed.`));\n return;\n }\n }\n const cancellationToken = requestTokens.get(cancelId);\n // The request is already running. Cancel the token\n if (cancellationToken !== undefined) {\n cancellationToken.cancel();\n traceReceivedNotification(message);\n return;\n }\n else {\n // Remember the cancel but still queue the message to\n // clean up state in process message.\n knownCanceledRequests.add(cancelId);\n }\n }\n addMessageToQueue(messageQueue, message);\n }\n finally {\n triggerMessageQueue();\n }\n };\n function handleRequest(requestMessage) {\n if (isDisposed()) {\n // we return here silently since we fired an event when the\n // connection got disposed.\n return;\n }\n function reply(resultOrError, method, startTime) {\n const message = {\n jsonrpc: version,\n id: requestMessage.id\n };\n if (resultOrError instanceof messages_1.ResponseError) {\n message.error = resultOrError.toJson();\n }\n else {\n message.result = resultOrError === undefined ? null : resultOrError;\n }\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));\n }\n function replyError(error, method, startTime) {\n const message = {\n jsonrpc: version,\n id: requestMessage.id,\n error: error.toJson()\n };\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));\n }\n function replySuccess(result, method, startTime) {\n // The JSON RPC defines that a response must either have a result or an error\n // So we can't treat undefined as a valid response result.\n if (result === undefined) {\n result = null;\n }\n const message = {\n jsonrpc: version,\n id: requestMessage.id,\n result: result\n };\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message).catch(() => logger.error(`Sending response failed.`));\n }\n traceReceivedRequest(requestMessage);\n const element = requestHandlers.get(requestMessage.method);\n let type;\n let requestHandler;\n if (element) {\n type = element.type;\n requestHandler = element.handler;\n }\n const startTime = Date.now();\n if (requestHandler || starRequestHandler) {\n const tokenKey = requestMessage.id ?? String(Date.now()); //\n const cancellationSource = IdCancellationReceiverStrategy.is(cancellationStrategy.receiver)\n ? cancellationStrategy.receiver.createCancellationTokenSource(tokenKey)\n : cancellationStrategy.receiver.createCancellationTokenSource(requestMessage);\n if (requestMessage.id !== null && knownCanceledRequests.has(requestMessage.id)) {\n cancellationSource.cancel();\n }\n if (requestMessage.id !== null) {\n requestTokens.set(tokenKey, cancellationSource);\n }\n try {\n let handlerResult;\n if (requestHandler) {\n if (requestMessage.params === undefined) {\n if (type !== undefined && type.numberOfParams !== 0) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines ${type.numberOfParams} params but received none.`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(cancellationSource.token);\n }\n else if (Array.isArray(requestMessage.params)) {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byName) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by name but received parameters by position`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(...requestMessage.params, cancellationSource.token);\n }\n else {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byPosition) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by position but received parameters by name`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(requestMessage.params, cancellationSource.token);\n }\n }\n else if (starRequestHandler) {\n handlerResult = starRequestHandler(requestMessage.method, requestMessage.params, cancellationSource.token);\n }\n const promise = handlerResult;\n if (!handlerResult) {\n requestTokens.delete(tokenKey);\n replySuccess(handlerResult, requestMessage.method, startTime);\n }\n else if (promise.then) {\n promise.then((resultOrError) => {\n requestTokens.delete(tokenKey);\n reply(resultOrError, requestMessage.method, startTime);\n }, error => {\n requestTokens.delete(tokenKey);\n if (error instanceof messages_1.ResponseError) {\n replyError(error, requestMessage.method, startTime);\n }\n else if (error && Is.string(error.message)) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);\n }\n });\n }\n else {\n requestTokens.delete(tokenKey);\n reply(handlerResult, requestMessage.method, startTime);\n }\n }\n catch (error) {\n requestTokens.delete(tokenKey);\n if (error instanceof messages_1.ResponseError) {\n reply(error, requestMessage.method, startTime);\n }\n else if (error && Is.string(error.message)) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);\n }\n }\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`), requestMessage.method, startTime);\n }\n }\n function handleResponse(responseMessage) {\n if (isDisposed()) {\n // See handle request.\n return;\n }\n if (responseMessage.id === null) {\n if (responseMessage.error) {\n logger.error(`Received response message without id: Error is: \\n${JSON.stringify(responseMessage.error, undefined, 4)}`);\n }\n else {\n logger.error(`Received response message without id. No further error information provided.`);\n }\n }\n else {\n const key = responseMessage.id;\n const responsePromise = responsePromises.get(key);\n traceReceivedResponse(responseMessage, responsePromise);\n if (responsePromise !== undefined) {\n responsePromises.delete(key);\n try {\n if (responseMessage.error) {\n const error = responseMessage.error;\n responsePromise.reject(new messages_1.ResponseError(error.code, error.message, error.data));\n }\n else if (responseMessage.result !== undefined) {\n responsePromise.resolve(responseMessage.result);\n }\n else {\n throw new Error('Should never happen.');\n }\n }\n catch (error) {\n if (error.message) {\n logger.error(`Response handler '${responsePromise.method}' failed with message: ${error.message}`);\n }\n else {\n logger.error(`Response handler '${responsePromise.method}' failed unexpectedly.`);\n }\n }\n }\n }\n }\n function handleNotification(message) {\n if (isDisposed()) {\n // See handle request.\n return;\n }\n let type = undefined;\n let notificationHandler;\n if (message.method === CancelNotification.type.method) {\n const cancelId = message.params.id;\n knownCanceledRequests.delete(cancelId);\n traceReceivedNotification(message);\n return;\n }\n else {\n const element = notificationHandlers.get(message.method);\n if (element) {\n notificationHandler = element.handler;\n type = element.type;\n }\n }\n if (notificationHandler || starNotificationHandler) {\n try {\n traceReceivedNotification(message);\n if (notificationHandler) {\n if (message.params === undefined) {\n if (type !== undefined) {\n if (type.numberOfParams !== 0 && type.parameterStructures !== messages_1.ParameterStructures.byName) {\n logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but received none.`);\n }\n }\n notificationHandler();\n }\n else if (Array.isArray(message.params)) {\n // There are JSON-RPC libraries that send progress message as positional params although\n // specified as named. So convert them if this is the case.\n const params = message.params;\n if (message.method === ProgressNotification.type.method && params.length === 2 && ProgressToken.is(params[0])) {\n notificationHandler({ token: params[0], value: params[1] });\n }\n else {\n if (type !== undefined) {\n if (type.parameterStructures === messages_1.ParameterStructures.byName) {\n logger.error(`Notification ${message.method} defines parameters by name but received parameters by position`);\n }\n if (type.numberOfParams !== message.params.length) {\n logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but received ${params.length} arguments`);\n }\n }\n notificationHandler(...params);\n }\n }\n else {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byPosition) {\n logger.error(`Notification ${message.method} defines parameters by position but received parameters by name`);\n }\n notificationHandler(message.params);\n }\n }\n else if (starNotificationHandler) {\n starNotificationHandler(message.method, message.params);\n }\n }\n catch (error) {\n if (error.message) {\n logger.error(`Notification handler '${message.method}' failed with message: ${error.message}`);\n }\n else {\n logger.error(`Notification handler '${message.method}' failed unexpectedly.`);\n }\n }\n }\n else {\n unhandledNotificationEmitter.fire(message);\n }\n }\n function handleInvalidMessage(message) {\n if (!message) {\n logger.error('Received empty message.');\n return;\n }\n logger.error(`Received message which is neither a response nor a notification message:\\n${JSON.stringify(message, null, 4)}`);\n // Test whether we find an id to reject the promise\n const responseMessage = message;\n if (Is.string(responseMessage.id) || Is.number(responseMessage.id)) {\n const key = responseMessage.id;\n const responseHandler = responsePromises.get(key);\n if (responseHandler) {\n responseHandler.reject(new Error('The received response has neither a result nor an error property.'));\n }\n }\n }\n function stringifyTrace(params) {\n if (params === undefined || params === null) {\n return undefined;\n }\n switch (trace) {\n case Trace.Verbose:\n return JSON.stringify(params, null, 4);\n case Trace.Compact:\n return JSON.stringify(params);\n default:\n return undefined;\n }\n }\n function traceSendingRequest(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if ((trace === Trace.Verbose || trace === Trace.Compact) && message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n tracer.log(`Sending request '${message.method} - (${message.id})'.`, data);\n }\n else {\n logLSPMessage('send-request', message);\n }\n }\n function traceSendingNotification(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n else {\n data = 'No parameters provided.\\n\\n';\n }\n }\n tracer.log(`Sending notification '${message.method}'.`, data);\n }\n else {\n logLSPMessage('send-notification', message);\n }\n }\n function traceSendingResponse(message, method, startTime) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.error && message.error.data) {\n data = `Error data: ${stringifyTrace(message.error.data)}\\n\\n`;\n }\n else {\n if (message.result) {\n data = `Result: ${stringifyTrace(message.result)}\\n\\n`;\n }\n else if (message.error === undefined) {\n data = 'No result returned.\\n\\n';\n }\n }\n }\n tracer.log(`Sending response '${method} - (${message.id})'. Processing request took ${Date.now() - startTime}ms`, data);\n }\n else {\n logLSPMessage('send-response', message);\n }\n }\n function traceReceivedRequest(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if ((trace === Trace.Verbose || trace === Trace.Compact) && message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n tracer.log(`Received request '${message.method} - (${message.id})'.`, data);\n }\n else {\n logLSPMessage('receive-request', message);\n }\n }\n function traceReceivedNotification(message) {\n if (trace === Trace.Off || !tracer || message.method === LogTraceNotification.type.method) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.params) {\n data = `Params: ${stringifyTrace(message.params)}\\n\\n`;\n }\n else {\n data = 'No parameters provided.\\n\\n';\n }\n }\n tracer.log(`Received notification '${message.method}'.`, data);\n }\n else {\n logLSPMessage('receive-notification', message);\n }\n }\n function traceReceivedResponse(message, responsePromise) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose || trace === Trace.Compact) {\n if (message.error && message.error.data) {\n data = `Error data: ${stringifyTrace(message.error.data)}\\n\\n`;\n }\n else {\n if (message.result) {\n data = `Result: ${stringifyTrace(message.result)}\\n\\n`;\n }\n else if (message.error === undefined) {\n data = 'No result returned.\\n\\n';\n }\n }\n }\n if (responsePromise) {\n const error = message.error ? ` Request failed: ${message.error.message} (${message.error.code}).` : '';\n tracer.log(`Received response '${responsePromise.method} - (${message.id})' in ${Date.now() - responsePromise.timerStart}ms.${error}`, data);\n }\n else {\n tracer.log(`Received response ${message.id} without active response promise.`, data);\n }\n }\n else {\n logLSPMessage('receive-response', message);\n }\n }\n function logLSPMessage(type, message) {\n if (!tracer || trace === Trace.Off) {\n return;\n }\n const lspMessage = {\n isLSPMessage: true,\n type,\n message,\n timestamp: Date.now()\n };\n tracer.log(lspMessage);\n }\n function throwIfClosedOrDisposed() {\n if (isClosed()) {\n throw new ConnectionError(ConnectionErrors.Closed, 'Connection is closed.');\n }\n if (isDisposed()) {\n throw new ConnectionError(ConnectionErrors.Disposed, 'Connection is disposed.');\n }\n }\n function throwIfListening() {\n if (isListening()) {\n throw new ConnectionError(ConnectionErrors.AlreadyListening, 'Connection is already listening');\n }\n }\n function throwIfNotListening() {\n if (!isListening()) {\n throw new Error('Call listen() first.');\n }\n }\n function undefinedToNull(param) {\n if (param === undefined) {\n return null;\n }\n else {\n return param;\n }\n }\n function nullToUndefined(param) {\n if (param === null) {\n return undefined;\n }\n else {\n return param;\n }\n }\n function isNamedParam(param) {\n return param !== undefined && param !== null && !Array.isArray(param) && typeof param === 'object';\n }\n function computeSingleParam(parameterStructures, param) {\n switch (parameterStructures) {\n case messages_1.ParameterStructures.auto:\n if (isNamedParam(param)) {\n return nullToUndefined(param);\n }\n else {\n return [undefinedToNull(param)];\n }\n case messages_1.ParameterStructures.byName:\n if (!isNamedParam(param)) {\n throw new Error(`Received parameters by name but param is not an object literal.`);\n }\n return nullToUndefined(param);\n case messages_1.ParameterStructures.byPosition:\n return [undefinedToNull(param)];\n default:\n throw new Error(`Unknown parameter structure ${parameterStructures.toString()}`);\n }\n }\n function computeMessageParams(type, params) {\n let result;\n const numberOfParams = type.numberOfParams;\n switch (numberOfParams) {\n case 0:\n result = undefined;\n break;\n case 1:\n result = computeSingleParam(type.parameterStructures, params[0]);\n break;\n default:\n result = [];\n for (let i = 0; i < params.length && i < numberOfParams; i++) {\n result.push(undefinedToNull(params[i]));\n }\n if (params.length < numberOfParams) {\n for (let i = params.length; i < numberOfParams; i++) {\n result.push(null);\n }\n }\n break;\n }\n return result;\n }\n const connection = {\n sendNotification: (type, ...args) => {\n throwIfClosedOrDisposed();\n let method;\n let messageParams;\n if (Is.string(type)) {\n method = type;\n const first = args[0];\n let paramStart = 0;\n let parameterStructures = messages_1.ParameterStructures.auto;\n if (messages_1.ParameterStructures.is(first)) {\n paramStart = 1;\n parameterStructures = first;\n }\n let paramEnd = args.length;\n const numberOfParams = paramEnd - paramStart;\n switch (numberOfParams) {\n case 0:\n messageParams = undefined;\n break;\n case 1:\n messageParams = computeSingleParam(parameterStructures, args[paramStart]);\n break;\n default:\n if (parameterStructures === messages_1.ParameterStructures.byName) {\n throw new Error(`Received ${numberOfParams} parameters for 'by Name' notification parameter structure.`);\n }\n messageParams = args.slice(paramStart, paramEnd).map(value => undefinedToNull(value));\n break;\n }\n }\n else {\n const params = args;\n method = type.method;\n messageParams = computeMessageParams(type, params);\n }\n const notificationMessage = {\n jsonrpc: version,\n method: method,\n params: messageParams\n };\n traceSendingNotification(notificationMessage);\n return messageWriter.write(notificationMessage).catch((error) => {\n logger.error(`Sending notification failed.`);\n throw error;\n });\n },\n onNotification: (type, handler) => {\n throwIfClosedOrDisposed();\n let method;\n if (Is.func(type)) {\n starNotificationHandler = type;\n }\n else if (handler) {\n if (Is.string(type)) {\n method = type;\n notificationHandlers.set(type, { type: undefined, handler });\n }\n else {\n method = type.method;\n notificationHandlers.set(type.method, { type, handler });\n }\n }\n return {\n dispose: () => {\n if (method !== undefined) {\n notificationHandlers.delete(method);\n }\n else {\n starNotificationHandler = undefined;\n }\n }\n };\n },\n onProgress: (_type, token, handler) => {\n if (progressHandlers.has(token)) {\n throw new Error(`Progress handler for token ${token} already registered`);\n }\n progressHandlers.set(token, handler);\n return {\n dispose: () => {\n progressHandlers.delete(token);\n }\n };\n },\n sendProgress: (_type, token, value) => {\n // This should not await but simple return to ensure that we don't have another\n // async scheduling. Otherwise one send could overtake another send.\n return connection.sendNotification(ProgressNotification.type, { token, value });\n },\n onUnhandledProgress: unhandledProgressEmitter.event,\n sendRequest: (type, ...args) => {\n throwIfClosedOrDisposed();\n throwIfNotListening();\n let method;\n let messageParams;\n let token = undefined;\n if (Is.string(type)) {\n method = type;\n const first = args[0];\n const last = args[args.length - 1];\n let paramStart = 0;\n let parameterStructures = messages_1.ParameterStructures.auto;\n if (messages_1.ParameterStructures.is(first)) {\n paramStart = 1;\n parameterStructures = first;\n }\n let paramEnd = args.length;\n if (cancellation_1.CancellationToken.is(last)) {\n paramEnd = paramEnd - 1;\n token = last;\n }\n const numberOfParams = paramEnd - paramStart;\n switch (numberOfParams) {\n case 0:\n messageParams = undefined;\n break;\n case 1:\n messageParams = computeSingleParam(parameterStructures, args[paramStart]);\n break;\n default:\n if (parameterStructures === messages_1.ParameterStructures.byName) {\n throw new Error(`Received ${numberOfParams} parameters for 'by Name' request parameter structure.`);\n }\n messageParams = args.slice(paramStart, paramEnd).map(value => undefinedToNull(value));\n break;\n }\n }\n else {\n const params = args;\n method = type.method;\n messageParams = computeMessageParams(type, params);\n const numberOfParams = type.numberOfParams;\n token = cancellation_1.CancellationToken.is(params[numberOfParams]) ? params[numberOfParams] : undefined;\n }\n const id = sequenceNumber++;\n let disposable;\n if (token) {\n disposable = token.onCancellationRequested(() => {\n const p = cancellationStrategy.sender.sendCancellation(connection, id);\n if (p === undefined) {\n logger.log(`Received no promise from cancellation strategy when cancelling id ${id}`);\n return Promise.resolve();\n }\n else {\n return p.catch(() => {\n logger.log(`Sending cancellation messages for id ${id} failed`);\n });\n }\n });\n }\n const requestMessage = {\n jsonrpc: version,\n id: id,\n method: method,\n params: messageParams\n };\n traceSendingRequest(requestMessage);\n if (typeof cancellationStrategy.sender.enableCancellation === 'function') {\n cancellationStrategy.sender.enableCancellation(requestMessage);\n }\n return new Promise(async (resolve, reject) => {\n const resolveWithCleanup = (r) => {\n resolve(r);\n cancellationStrategy.sender.cleanup(id);\n disposable?.dispose();\n };\n const rejectWithCleanup = (r) => {\n reject(r);\n cancellationStrategy.sender.cleanup(id);\n disposable?.dispose();\n };\n const responsePromise = { method: method, timerStart: Date.now(), resolve: resolveWithCleanup, reject: rejectWithCleanup };\n try {\n responsePromises.set(id, responsePromise);\n await messageWriter.write(requestMessage);\n }\n catch (error) {\n // Writing the message failed. So we need to delete it from the response promises and\n // reject it.\n responsePromises.delete(id);\n responsePromise.reject(new messages_1.ResponseError(messages_1.ErrorCodes.MessageWriteError, error.message ? error.message : 'Unknown reason'));\n logger.error(`Sending request failed.`);\n throw error;\n }\n });\n },\n onRequest: (type, handler) => {\n throwIfClosedOrDisposed();\n let method = null;\n if (StarRequestHandler.is(type)) {\n method = undefined;\n starRequestHandler = type;\n }\n else if (Is.string(type)) {\n method = null;\n if (handler !== undefined) {\n method = type;\n requestHandlers.set(type, { handler: handler, type: undefined });\n }\n }\n else {\n if (handler !== undefined) {\n method = type.method;\n requestHandlers.set(type.method, { type, handler });\n }\n }\n return {\n dispose: () => {\n if (method === null) {\n return;\n }\n if (method !== undefined) {\n requestHandlers.delete(method);\n }\n else {\n starRequestHandler = undefined;\n }\n }\n };\n },\n hasPendingResponse: () => {\n return responsePromises.size > 0;\n },\n trace: async (_value, _tracer, sendNotificationOrTraceOptions) => {\n let _sendNotification = false;\n let _traceFormat = TraceFormat.Text;\n if (sendNotificationOrTraceOptions !== undefined) {\n if (Is.boolean(sendNotificationOrTraceOptions)) {\n _sendNotification = sendNotificationOrTraceOptions;\n }\n else {\n _sendNotification = sendNotificationOrTraceOptions.sendNotification || false;\n _traceFormat = sendNotificationOrTraceOptions.traceFormat || TraceFormat.Text;\n }\n }\n trace = _value;\n traceFormat = _traceFormat;\n if (trace === Trace.Off) {\n tracer = undefined;\n }\n else {\n tracer = _tracer;\n }\n if (_sendNotification && !isClosed() && !isDisposed()) {\n await connection.sendNotification(SetTraceNotification.type, { value: Trace.toString(_value) });\n }\n },\n onError: errorEmitter.event,\n onClose: closeEmitter.event,\n onUnhandledNotification: unhandledNotificationEmitter.event,\n onDispose: disposeEmitter.event,\n end: () => {\n messageWriter.end();\n },\n dispose: () => {\n if (isDisposed()) {\n return;\n }\n state = ConnectionState.Disposed;\n disposeEmitter.fire(undefined);\n const error = new messages_1.ResponseError(messages_1.ErrorCodes.PendingResponseRejected, 'Pending response rejected since connection got disposed');\n for (const promise of responsePromises.values()) {\n promise.reject(error);\n }\n responsePromises = new Map();\n requestTokens = new Map();\n knownCanceledRequests = new Set();\n messageQueue = new linkedMap_1.LinkedMap();\n // Test for backwards compatibility\n if (Is.func(messageWriter.dispose)) {\n messageWriter.dispose();\n }\n if (Is.func(messageReader.dispose)) {\n messageReader.dispose();\n }\n },\n listen: () => {\n throwIfClosedOrDisposed();\n throwIfListening();\n state = ConnectionState.Listening;\n messageReader.listen(callback);\n },\n inspect: () => {\n // eslint-disable-next-line no-console\n (0, ral_1.default)().console.log('inspect');\n }\n };\n connection.onNotification(LogTraceNotification.type, (params) => {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n const verbose = trace === Trace.Verbose || trace === Trace.Compact;\n tracer.log(params.message, verbose ? params.verbose : undefined);\n });\n connection.onNotification(ProgressNotification.type, (params) => {\n const handler = progressHandlers.get(params.token);\n if (handler) {\n handler(params.value);\n }\n else {\n unhandledProgressEmitter.fire(params);\n }\n });\n return connection;\n}\nexports.createMessageConnection = createMessageConnection;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n/// <reference path=\"../../typings/thenable.d.ts\" />\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ProgressType = exports.ProgressToken = exports.createMessageConnection = exports.NullLogger = exports.ConnectionOptions = exports.ConnectionStrategy = exports.AbstractMessageBuffer = exports.WriteableStreamMessageWriter = exports.AbstractMessageWriter = exports.MessageWriter = exports.ReadableStreamMessageReader = exports.AbstractMessageReader = exports.MessageReader = exports.SharedArrayReceiverStrategy = exports.SharedArraySenderStrategy = exports.CancellationToken = exports.CancellationTokenSource = exports.Emitter = exports.Event = exports.Disposable = exports.LRUCache = exports.Touch = exports.LinkedMap = exports.ParameterStructures = exports.NotificationType9 = exports.NotificationType8 = exports.NotificationType7 = exports.NotificationType6 = exports.NotificationType5 = exports.NotificationType4 = exports.NotificationType3 = exports.NotificationType2 = exports.NotificationType1 = exports.NotificationType0 = exports.NotificationType = exports.ErrorCodes = exports.ResponseError = exports.RequestType9 = exports.RequestType8 = exports.RequestType7 = exports.RequestType6 = exports.RequestType5 = exports.RequestType4 = exports.RequestType3 = exports.RequestType2 = exports.RequestType1 = exports.RequestType0 = exports.RequestType = exports.Message = exports.RAL = void 0;\nexports.MessageStrategy = exports.CancellationStrategy = exports.CancellationSenderStrategy = exports.CancellationReceiverStrategy = exports.ConnectionError = exports.ConnectionErrors = exports.LogTraceNotification = exports.SetTraceNotification = exports.TraceFormat = exports.TraceValues = exports.Trace = void 0;\nconst messages_1 = require(\"./messages\");\nObject.defineProperty(exports, \"Message\", { enumerable: true, get: function () { return messages_1.Message; } });\nObject.defineProperty(exports, \"RequestType\", { enumerable: true, get: function () { return messages_1.RequestType; } });\nObject.defineProperty(exports, \"RequestType0\", { enumerable: true, get: function () { return messages_1.RequestType0; } });\nObject.defineProperty(exports, \"RequestType1\", { enumerable: true, get: function () { return messages_1.RequestType1; } });\nObject.defineProperty(exports, \"RequestType2\", { enumerable: true, get: function () { return messages_1.RequestType2; } });\nObject.defineProperty(exports, \"RequestType3\", { enumerable: true, get: function () { return messages_1.RequestType3; } });\nObject.defineProperty(exports, \"RequestType4\", { enumerable: true, get: function () { return messages_1.RequestType4; } });\nObject.defineProperty(exports, \"RequestType5\", { enumerable: true, get: function () { return messages_1.RequestType5; } });\nObject.defineProperty(exports, \"RequestType6\", { enumerable: true, get: function () { return messages_1.RequestType6; } });\nObject.defineProperty(exports, \"RequestType7\", { enumerable: true, get: function () { return messages_1.RequestType7; } });\nObject.defineProperty(exports, \"RequestType8\", { enumerable: true, get: function () { return messages_1.RequestType8; } });\nObject.defineProperty(exports, \"RequestType9\", { enumerable: true, get: function () { return messages_1.RequestType9; } });\nObject.defineProperty(exports, \"ResponseError\", { enumerable: true, get: function () { return messages_1.ResponseError; } });\nObject.defineProperty(exports, \"ErrorCodes\", { enumerable: true, get: function () { return messages_1.ErrorCodes; } });\nObject.defineProperty(exports, \"NotificationType\", { enumerable: true, get: function () { return messages_1.NotificationType; } });\nObject.defineProperty(exports, \"NotificationType0\", { enumerable: true, get: function () { return messages_1.NotificationType0; } });\nObject.defineProperty(exports, \"NotificationType1\", { enumerable: true, get: function () { return messages_1.NotificationType1; } });\nObject.defineProperty(exports, \"NotificationType2\", { enumerable: true, get: function () { return messages_1.NotificationType2; } });\nObject.defineProperty(exports, \"NotificationType3\", { enumerable: true, get: function () { return messages_1.NotificationType3; } });\nObject.defineProperty(exports, \"NotificationType4\", { enumerable: true, get: function () { return messages_1.NotificationType4; } });\nObject.defineProperty(exports, \"NotificationType5\", { enumerable: true, get: function () { return messages_1.NotificationType5; } });\nObject.defineProperty(exports, \"NotificationType6\", { enumerable: true, get: function () { return messages_1.NotificationType6; } });\nObject.defineProperty(exports, \"NotificationType7\", { enumerable: true, get: function () { return messages_1.NotificationType7; } });\nObject.defineProperty(exports, \"NotificationType8\", { enumerable: true, get: function () { return messages_1.NotificationType8; } });\nObject.defineProperty(exports, \"NotificationType9\", { enumerable: true, get: function () { return messages_1.NotificationType9; } });\nObject.defineProperty(exports, \"ParameterStructures\", { enumerable: true, get: function () { return messages_1.ParameterStructures; } });\nconst linkedMap_1 = require(\"./linkedMap\");\nObject.defineProperty(exports, \"LinkedMap\", { enumerable: true, get: function () { return linkedMap_1.LinkedMap; } });\nObject.defineProperty(exports, \"LRUCache\", { enumerable: true, get: function () { return linkedMap_1.LRUCache; } });\nObject.defineProperty(exports, \"Touch\", { enumerable: true, get: function () { return linkedMap_1.Touch; } });\nconst disposable_1 = require(\"./disposable\");\nObject.defineProperty(exports, \"Disposable\", { enumerable: true, get: function () { return disposable_1.Disposable; } });\nconst events_1 = require(\"./events\");\nObject.defineProperty(exports, \"Event\", { enumerable: true, get: function () { return events_1.Event; } });\nObject.defineProperty(exports, \"Emitter\", { enumerable: true, get: function () { return events_1.Emitter; } });\nconst cancellation_1 = require(\"./cancellation\");\nObject.defineProperty(exports, \"CancellationTokenSource\", { enumerable: true, get: function () { return cancellation_1.CancellationTokenSource; } });\nObject.defineProperty(exports, \"CancellationToken\", { enumerable: true, get: function () { return cancellation_1.CancellationToken; } });\nconst sharedArrayCancellation_1 = require(\"./sharedArrayCancellation\");\nObject.defineProperty(exports, \"SharedArraySenderStrategy\", { enumerable: true, get: function () { return sharedArrayCancellation_1.SharedArraySenderStrategy; } });\nObject.defineProperty(exports, \"SharedArrayReceiverStrategy\", { enumerable: true, get: function () { return sharedArrayCancellation_1.SharedArrayReceiverStrategy; } });\nconst messageReader_1 = require(\"./messageReader\");\nObject.defineProperty(exports, \"MessageReader\", { enumerable: true, get: function () { return messageReader_1.MessageReader; } });\nObject.defineProperty(exports, \"AbstractMessageReader\", { enumerable: true, get: function () { return messageReader_1.AbstractMessageReader; } });\nObject.defineProperty(exports, \"ReadableStreamMessageReader\", { enumerable: true, get: function () { return messageReader_1.ReadableStreamMessageReader; } });\nconst messageWriter_1 = require(\"./messageWriter\");\nObject.defineProperty(exports, \"MessageWriter\", { enumerable: true, get: function () { return messageWriter_1.MessageWriter; } });\nObject.defineProperty(exports, \"AbstractMessageWriter\", { enumerable: true, get: function () { return messageWriter_1.AbstractMessageWriter; } });\nObject.defineProperty(exports, \"WriteableStreamMessageWriter\", { enumerable: true, get: function () { return messageWriter_1.WriteableStreamMessageWriter; } });\nconst messageBuffer_1 = require(\"./messageBuffer\");\nObject.defineProperty(exports, \"AbstractMessageBuffer\", { enumerable: true, get: function () { return messageBuffer_1.AbstractMessageBuffer; } });\nconst connection_1 = require(\"./connection\");\nObject.defineProperty(exports, \"ConnectionStrategy\", { enumerable: true, get: function () { return connection_1.ConnectionStrategy; } });\nObject.defineProperty(exports, \"ConnectionOptions\", { enumerable: true, get: function () { return connection_1.ConnectionOptions; } });\nObject.defineProperty(exports, \"NullLogger\", { enumerable: true, get: function () { return connection_1.NullLogger; } });\nObject.defineProperty(exports, \"createMessageConnection\", { enumerable: true, get: function () { return connection_1.createMessageConnection; } });\nObject.defineProperty(exports, \"ProgressToken\", { enumerable: true, get: function () { return connection_1.ProgressToken; } });\nObject.defineProperty(exports, \"ProgressType\", { enumerable: true, get: function () { return connection_1.ProgressType; } });\nObject.defineProperty(exports, \"Trace\", { enumerable: true, get: function () { return connection_1.Trace; } });\nObject.defineProperty(exports, \"TraceValues\", { enumerable: true, get: function () { return connection_1.TraceValues; } });\nObject.defineProperty(exports, \"TraceFormat\", { enumerable: true, get: function () { return connection_1.TraceFormat; } });\nObject.defineProperty(exports, \"SetTraceNotification\", { enumerable: true, get: function () { return connection_1.SetTraceNotification; } });\nObject.defineProperty(exports, \"LogTraceNotification\", { enumerable: true, get: function () { return connection_1.LogTraceNotification; } });\nObject.defineProperty(exports, \"ConnectionErrors\", { enumerable: true, get: function () { return connection_1.ConnectionErrors; } });\nObject.defineProperty(exports, \"ConnectionError\", { enumerable: true, get: function () { return connection_1.ConnectionError; } });\nObject.defineProperty(exports, \"CancellationReceiverStrategy\", { enumerable: true, get: function () { return connection_1.CancellationReceiverStrategy; } });\nObject.defineProperty(exports, \"CancellationSenderStrategy\", { enumerable: true, get: function () { return connection_1.CancellationSenderStrategy; } });\nObject.defineProperty(exports, \"CancellationStrategy\", { enumerable: true, get: function () { return connection_1.CancellationStrategy; } });\nObject.defineProperty(exports, \"MessageStrategy\", { enumerable: true, get: function () { return connection_1.MessageStrategy; } });\nconst ral_1 = require(\"./ral\");\nexports.RAL = ral_1.default;\n","\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst util_1 = require(\"util\");\nconst api_1 = require(\"../common/api\");\nclass MessageBuffer extends api_1.AbstractMessageBuffer {\n constructor(encoding = 'utf-8') {\n super(encoding);\n }\n emptyBuffer() {\n return MessageBuffer.emptyBuffer;\n }\n fromString(value, encoding) {\n return Buffer.from(value, encoding);\n }\n toString(value, encoding) {\n if (value instanceof Buffer) {\n return value.toString(encoding);\n }\n else {\n return new util_1.TextDecoder(encoding).decode(value);\n }\n }\n asNative(buffer, length) {\n if (length === undefined) {\n return buffer instanceof Buffer ? buffer : Buffer.from(buffer);\n }\n else {\n return buffer instanceof Buffer ? buffer.slice(0, length) : Buffer.from(buffer, 0, length);\n }\n }\n allocNative(length) {\n return Buffer.allocUnsafe(length);\n }\n}\nMessageBuffer.emptyBuffer = Buffer.allocUnsafe(0);\nclass ReadableStreamWrapper {\n constructor(stream) {\n this.stream = stream;\n }\n onClose(listener) {\n this.stream.on('close', listener);\n return api_1.Disposable.create(() => this.stream.off('close', listener));\n }\n onError(listener) {\n this.stream.on('error', listener);\n return api_1.Disposable.create(() => this.stream.off('error', listener));\n }\n onEnd(listener) {\n this.stream.on('end', listener);\n return api_1.Disposable.create(() => this.stream.off('end', listener));\n }\n onData(listener) {\n this.stream.on('data', listener);\n return api_1.Disposable.create(() => this.stream.off('data', listener));\n }\n}\nclass WritableStreamWrapper {\n constructor(stream) {\n this.stream = stream;\n }\n onClose(listener) {\n this.stream.on('close', listener);\n return api_1.Disposable.create(() => this.stream.off('close', listener));\n }\n onError(listener) {\n this.stream.on('error', listener);\n return api_1.Disposable.create(() => this.stream.off('error', listener));\n }\n onEnd(listener) {\n this.stream.on('end', listener);\n return api_1.Disposable.create(() => this.stream.off('end', listener));\n }\n write(data, encoding) {\n return new Promise((resolve, reject) => {\n const callback = (error) => {\n if (error === undefined || error === null) {\n resolve();\n }\n else {\n reject(error);\n }\n };\n if (typeof data === 'string') {\n this.stream.write(data, encoding, callback);\n }\n else {\n this.stream.write(data, callback);\n }\n });\n }\n end() {\n this.stream.end();\n }\n}\nconst _ril = Object.freeze({\n messageBuffer: Object.freeze({\n create: (encoding) => new MessageBuffer(encoding)\n }),\n applicationJson: Object.freeze({\n encoder: Object.freeze({\n name: 'application/json',\n encode: (msg, options) => {\n try {\n return Promise.resolve(Buffer.from(JSON.stringify(msg, undefined, 0), options.charset));\n }\n catch (err) {\n return Promise.reject(err);\n }\n }\n }),\n decoder: Object.freeze({\n name: 'application/json',\n decode: (buffer, options) => {\n try {\n if (buffer instanceof Buffer) {\n return Promise.resolve(JSON.parse(buffer.toString(options.charset)));\n }\n else {\n return Promise.resolve(JSON.parse(new util_1.TextDecoder(options.charset).decode(buffer)));\n }\n }\n catch (err) {\n return Promise.reject(err);\n }\n }\n })\n }),\n stream: Object.freeze({\n asReadableStream: (stream) => new ReadableStreamWrapper(stream),\n asWritableStream: (stream) => new WritableStreamWrapper(stream)\n }),\n console: console,\n timer: Object.freeze({\n setTimeout(callback, ms, ...args) {\n const handle = setTimeout(callback, ms, ...args);\n return { dispose: () => clearTimeout(handle) };\n },\n setImmediate(callback, ...args) {\n const handle = setImmediate(callback, ...args);\n return { dispose: () => clearImmediate(handle) };\n },\n setInterval(callback, ms, ...args) {\n const handle = setInterval(callback, ms, ...args);\n return { dispose: () => clearInterval(handle) };\n }\n })\n});\nfunction RIL() {\n return _ril;\n}\n(function (RIL) {\n function install() {\n api_1.RAL.install(_ril);\n }\n RIL.install = install;\n})(RIL || (RIL = {}));\nexports.default = RIL;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createMessageConnection = exports.createServerSocketTransport = exports.createClientSocketTransport = exports.createServerPipeTransport = exports.createClientPipeTransport = exports.generateRandomPipeName = exports.StreamMessageWriter = exports.StreamMessageReader = exports.SocketMessageWriter = exports.SocketMessageReader = exports.PortMessageWriter = exports.PortMessageReader = exports.IPCMessageWriter = exports.IPCMessageReader = void 0;\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ----------------------------------------------------------------------------------------- */\nconst ril_1 = require(\"./ril\");\n// Install the node runtime abstract.\nril_1.default.install();\nconst path = require(\"path\");\nconst os = require(\"os\");\nconst crypto_1 = require(\"crypto\");\nconst net_1 = require(\"net\");\nconst api_1 = require(\"../common/api\");\n__exportStar(require(\"../common/api\"), exports);\nclass IPCMessageReader extends api_1.AbstractMessageReader {\n constructor(process) {\n super();\n this.process = process;\n let eventEmitter = this.process;\n eventEmitter.on('error', (error) => this.fireError(error));\n eventEmitter.on('close', () => this.fireClose());\n }\n listen(callback) {\n this.process.on('message', callback);\n return api_1.Disposable.create(() => this.process.off('message', callback));\n }\n}\nexports.IPCMessageReader = IPCMessageReader;\nclass IPCMessageWriter extends api_1.AbstractMessageWriter {\n constructor(process) {\n super();\n this.process = process;\n this.errorCount = 0;\n const eventEmitter = this.process;\n eventEmitter.on('error', (error) => this.fireError(error));\n eventEmitter.on('close', () => this.fireClose);\n }\n write(msg) {\n try {\n if (typeof this.process.send === 'function') {\n this.process.send(msg, undefined, undefined, (error) => {\n if (error) {\n this.errorCount++;\n this.handleError(error, msg);\n }\n else {\n this.errorCount = 0;\n }\n });\n }\n return Promise.resolve();\n }\n catch (error) {\n this.handleError(error, msg);\n return Promise.reject(error);\n }\n }\n handleError(error, msg) {\n this.errorCount++;\n this.fireError(error, msg, this.errorCount);\n }\n end() {\n }\n}\nexports.IPCMessageWriter = IPCMessageWriter;\nclass PortMessageReader extends api_1.AbstractMessageReader {\n constructor(port) {\n super();\n this.onData = new api_1.Emitter;\n port.on('close', () => this.fireClose);\n port.on('error', (error) => this.fireError(error));\n port.on('message', (message) => {\n this.onData.fire(message);\n });\n }\n listen(callback) {\n return this.onData.event(callback);\n }\n}\nexports.PortMessageReader = PortMessageReader;\nclass PortMessageWriter extends api_1.AbstractMessageWriter {\n constructor(port) {\n super();\n this.port = port;\n this.errorCount = 0;\n port.on('close', () => this.fireClose());\n port.on('error', (error) => this.fireError(error));\n }\n write(msg) {\n try {\n this.port.postMessage(msg);\n return Promise.resolve();\n }\n catch (error) {\n this.handleError(error, msg);\n return Promise.reject(error);\n }\n }\n handleError(error, msg) {\n this.errorCount++;\n this.fireError(error, msg, this.errorCount);\n }\n end() {\n }\n}\nexports.PortMessageWriter = PortMessageWriter;\nclass SocketMessageReader extends api_1.ReadableStreamMessageReader {\n constructor(socket, encoding = 'utf-8') {\n super((0, ril_1.default)().stream.asReadableStream(socket), encoding);\n }\n}\nexports.SocketMessageReader = SocketMessageReader;\nclass SocketMessageWriter extends api_1.WriteableStreamMessageWriter {\n constructor(socket, options) {\n super((0, ril_1.default)().stream.asWritableStream(socket), options);\n this.socket = socket;\n }\n dispose() {\n super.dispose();\n this.socket.destroy();\n }\n}\nexports.SocketMessageWriter = SocketMessageWriter;\nclass StreamMessageReader extends api_1.ReadableStreamMessageReader {\n constructor(readable, encoding) {\n super((0, ril_1.default)().stream.asReadableStream(readable), encoding);\n }\n}\nexports.StreamMessageReader = StreamMessageReader;\nclass StreamMessageWriter extends api_1.WriteableStreamMessageWriter {\n constructor(writable, options) {\n super((0, ril_1.default)().stream.asWritableStream(writable), options);\n }\n}\nexports.StreamMessageWriter = StreamMessageWriter;\nconst XDG_RUNTIME_DIR = process.env['XDG_RUNTIME_DIR'];\nconst safeIpcPathLengths = new Map([\n ['linux', 107],\n ['darwin', 103]\n]);\nfunction generateRandomPipeName() {\n const randomSuffix = (0, crypto_1.randomBytes)(21).toString('hex');\n if (process.platform === 'win32') {\n return `\\\\\\\\.\\\\pipe\\\\vscode-jsonrpc-${randomSuffix}-sock`;\n }\n let result;\n if (XDG_RUNTIME_DIR) {\n result = path.join(XDG_RUNTIME_DIR, `vscode-ipc-${randomSuffix}.sock`);\n }\n else {\n result = path.join(os.tmpdir(), `vscode-${randomSuffix}.sock`);\n }\n const limit = safeIpcPathLengths.get(process.platform);\n if (limit !== undefined && result.length > limit) {\n (0, ril_1.default)().console.warn(`WARNING: IPC handle \"${result}\" is longer than ${limit} characters.`);\n }\n return result;\n}\nexports.generateRandomPipeName = generateRandomPipeName;\nfunction createClientPipeTransport(pipeName, encoding = 'utf-8') {\n let connectResolve;\n const connected = new Promise((resolve, _reject) => {\n connectResolve = resolve;\n });\n return new Promise((resolve, reject) => {\n let server = (0, net_1.createServer)((socket) => {\n server.close();\n connectResolve([\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ]);\n });\n server.on('error', reject);\n server.listen(pipeName, () => {\n server.removeListener('error', reject);\n resolve({\n onConnected: () => { return connected; }\n });\n });\n });\n}\nexports.createClientPipeTransport = createClientPipeTransport;\nfunction createServerPipeTransport(pipeName, encoding = 'utf-8') {\n const socket = (0, net_1.createConnection)(pipeName);\n return [\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ];\n}\nexports.createServerPipeTransport = createServerPipeTransport;\nfunction createClientSocketTransport(port, encoding = 'utf-8') {\n let connectResolve;\n const connected = new Promise((resolve, _reject) => {\n connectResolve = resolve;\n });\n return new Promise((resolve, reject) => {\n const server = (0, net_1.createServer)((socket) => {\n server.close();\n connectResolve([\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ]);\n });\n server.on('error', reject);\n server.listen(port, '127.0.0.1', () => {\n server.removeListener('error', reject);\n resolve({\n onConnected: () => { return connected; }\n });\n });\n });\n}\nexports.createClientSocketTransport = createClientSocketTransport;\nfunction createServerSocketTransport(port, encoding = 'utf-8') {\n const socket = (0, net_1.createConnection)(port, '127.0.0.1');\n return [\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ];\n}\nexports.createServerSocketTransport = createServerSocketTransport;\nfunction isReadableStream(value) {\n const candidate = value;\n return candidate.read !== undefined && candidate.addListener !== undefined;\n}\nfunction isWritableStream(value) {\n const candidate = value;\n return candidate.write !== undefined && candidate.addListener !== undefined;\n}\nfunction createMessageConnection(input, output, logger, options) {\n if (!logger) {\n logger = api_1.NullLogger;\n }\n const reader = isReadableStream(input) ? new StreamMessageReader(input) : input;\n const writer = isWritableStream(output) ? new StreamMessageWriter(output) : output;\n if (api_1.ConnectionStrategy.is(options)) {\n options = { connectionStrategy: options };\n }\n return (0, api_1.createMessageConnection)(reader, writer, logger, options);\n}\nexports.createMessageConnection = createMessageConnection;\n","/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ----------------------------------------------------------------------------------------- */\n'use strict';\n\nmodule.exports = require('./lib/node/main');","function createServerRpc(connection) {\n return {\n ping: async (params) => connection.sendRequest(\"ping\", params),\n models: {\n list: async () => connection.sendRequest(\"models.list\", {})\n },\n tools: {\n list: async (params) => connection.sendRequest(\"tools.list\", params)\n },\n account: {\n getQuota: async () => connection.sendRequest(\"account.getQuota\", {})\n }\n };\n}\nfunction createSessionRpc(connection, sessionId) {\n return {\n model: {\n getCurrent: async () => connection.sendRequest(\"session.model.getCurrent\", { sessionId }),\n switchTo: async (params) => connection.sendRequest(\"session.model.switchTo\", { sessionId, ...params })\n },\n mode: {\n get: async () => connection.sendRequest(\"session.mode.get\", { sessionId }),\n set: async (params) => connection.sendRequest(\"session.mode.set\", { sessionId, ...params })\n },\n plan: {\n read: async () => connection.sendRequest(\"session.plan.read\", { sessionId }),\n update: async (params) => connection.sendRequest(\"session.plan.update\", { sessionId, ...params }),\n delete: async () => connection.sendRequest(\"session.plan.delete\", { sessionId })\n },\n workspace: {\n listFiles: async () => connection.sendRequest(\"session.workspace.listFiles\", { sessionId }),\n readFile: async (params) => connection.sendRequest(\"session.workspace.readFile\", { sessionId, ...params }),\n createFile: async (params) => connection.sendRequest(\"session.workspace.createFile\", { sessionId, ...params })\n },\n fleet: {\n start: async (params) => connection.sendRequest(\"session.fleet.start\", { sessionId, ...params })\n },\n agent: {\n list: async () => connection.sendRequest(\"session.agent.list\", { sessionId }),\n getCurrent: async () => connection.sendRequest(\"session.agent.getCurrent\", { sessionId }),\n select: async (params) => connection.sendRequest(\"session.agent.select\", { sessionId, ...params }),\n deselect: async () => connection.sendRequest(\"session.agent.deselect\", { sessionId })\n },\n compaction: {\n compact: async () => connection.sendRequest(\"session.compaction.compact\", { sessionId })\n },\n tools: {\n handlePendingToolCall: async (params) => connection.sendRequest(\"session.tools.handlePendingToolCall\", { sessionId, ...params })\n },\n permissions: {\n handlePendingPermissionRequest: async (params) => connection.sendRequest(\"session.permissions.handlePendingPermissionRequest\", { sessionId, ...params })\n }\n };\n}\nexport {\n createServerRpc,\n createSessionRpc\n};\n","const SDK_PROTOCOL_VERSION = 3;\nfunction getSdkProtocolVersion() {\n return SDK_PROTOCOL_VERSION;\n}\nexport {\n SDK_PROTOCOL_VERSION,\n getSdkProtocolVersion\n};\n","import { ConnectionError, ResponseError } from \"vscode-jsonrpc/node\";\nimport { createSessionRpc } from \"./generated/rpc.js\";\nclass CopilotSession {\n /**\n * Creates a new CopilotSession instance.\n *\n * @param sessionId - The unique identifier for this session\n * @param connection - The JSON-RPC message connection to the Copilot CLI\n * @param workspacePath - Path to the session workspace directory (when infinite sessions enabled)\n * @internal This constructor is internal. Use {@link CopilotClient.createSession} to create sessions.\n */\n constructor(sessionId, connection, _workspacePath) {\n this.sessionId = sessionId;\n this.connection = connection;\n this._workspacePath = _workspacePath;\n }\n eventHandlers = /* @__PURE__ */ new Set();\n typedEventHandlers = /* @__PURE__ */ new Map();\n toolHandlers = /* @__PURE__ */ new Map();\n permissionHandler;\n userInputHandler;\n hooks;\n _rpc = null;\n /**\n * Typed session-scoped RPC methods.\n */\n get rpc() {\n if (!this._rpc) {\n this._rpc = createSessionRpc(this.connection, this.sessionId);\n }\n return this._rpc;\n }\n /**\n * Path to the session workspace directory when infinite sessions are enabled.\n * Contains checkpoints/, plan.md, and files/ subdirectories.\n * Undefined if infinite sessions are disabled.\n */\n get workspacePath() {\n return this._workspacePath;\n }\n /**\n * Sends a message to this session and waits for the response.\n *\n * The message is processed asynchronously. Subscribe to events via {@link on}\n * to receive streaming responses and other session events.\n *\n * @param options - The message options including the prompt and optional attachments\n * @returns A promise that resolves with the message ID of the response\n * @throws Error if the session has been disconnected or the connection fails\n *\n * @example\n * ```typescript\n * const messageId = await session.send({\n * prompt: \"Explain this code\",\n * attachments: [{ type: \"file\", path: \"./src/index.ts\" }]\n * });\n * ```\n */\n async send(options) {\n const response = await this.connection.sendRequest(\"session.send\", {\n sessionId: this.sessionId,\n prompt: options.prompt,\n attachments: options.attachments,\n mode: options.mode\n });\n return response.messageId;\n }\n /**\n * Sends a message to this session and waits until the session becomes idle.\n *\n * This is a convenience method that combines {@link send} with waiting for\n * the `session.idle` event. Use this when you want to block until the\n * assistant has finished processing the message.\n *\n * Events are still delivered to handlers registered via {@link on} while waiting.\n *\n * @param options - The message options including the prompt and optional attachments\n * @param timeout - Timeout in milliseconds (default: 60000). Controls how long to wait; does not abort in-flight agent work.\n * @returns A promise that resolves with the final assistant message when the session becomes idle,\n * or undefined if no assistant message was received\n * @throws Error if the timeout is reached before the session becomes idle\n * @throws Error if the session has been disconnected or the connection fails\n *\n * @example\n * ```typescript\n * // Send and wait for completion with default 60s timeout\n * const response = await session.sendAndWait({ prompt: \"What is 2+2?\" });\n * console.log(response?.data.content); // \"4\"\n * ```\n */\n async sendAndWait(options, timeout) {\n const effectiveTimeout = timeout ?? 6e4;\n let resolveIdle;\n let rejectWithError;\n const idlePromise = new Promise((resolve, reject) => {\n resolveIdle = resolve;\n rejectWithError = reject;\n });\n let lastAssistantMessage;\n const unsubscribe = this.on((event) => {\n if (event.type === \"assistant.message\") {\n lastAssistantMessage = event;\n } else if (event.type === \"session.idle\") {\n resolveIdle();\n } else if (event.type === \"session.error\") {\n const error = new Error(event.data.message);\n error.stack = event.data.stack;\n rejectWithError(error);\n }\n });\n let timeoutId;\n try {\n await this.send(options);\n const timeoutPromise = new Promise((_, reject) => {\n timeoutId = setTimeout(\n () => reject(\n new Error(\n `Timeout after ${effectiveTimeout}ms waiting for session.idle`\n )\n ),\n effectiveTimeout\n );\n });\n await Promise.race([idlePromise, timeoutPromise]);\n return lastAssistantMessage;\n } finally {\n if (timeoutId !== void 0) {\n clearTimeout(timeoutId);\n }\n unsubscribe();\n }\n }\n on(eventTypeOrHandler, handler) {\n if (typeof eventTypeOrHandler === \"string\" && handler) {\n const eventType = eventTypeOrHandler;\n if (!this.typedEventHandlers.has(eventType)) {\n this.typedEventHandlers.set(eventType, /* @__PURE__ */ new Set());\n }\n const storedHandler = handler;\n this.typedEventHandlers.get(eventType).add(storedHandler);\n return () => {\n const handlers = this.typedEventHandlers.get(eventType);\n if (handlers) {\n handlers.delete(storedHandler);\n }\n };\n }\n const wildcardHandler = eventTypeOrHandler;\n this.eventHandlers.add(wildcardHandler);\n return () => {\n this.eventHandlers.delete(wildcardHandler);\n };\n }\n /**\n * Dispatches an event to all registered handlers.\n * Also handles broadcast request events internally (external tool calls, permissions).\n *\n * @param event - The session event to dispatch\n * @internal This method is for internal use by the SDK.\n */\n _dispatchEvent(event) {\n this._handleBroadcastEvent(event);\n const typedHandlers = this.typedEventHandlers.get(event.type);\n if (typedHandlers) {\n for (const handler of typedHandlers) {\n try {\n handler(event);\n } catch (_error) {\n }\n }\n }\n for (const handler of this.eventHandlers) {\n try {\n handler(event);\n } catch (_error) {\n }\n }\n }\n /**\n * Handles broadcast request events by executing local handlers and responding via RPC.\n * Handlers are dispatched as fire-and-forget — rejections propagate as unhandled promise\n * rejections, consistent with standard EventEmitter / event handler semantics.\n * @internal\n */\n _handleBroadcastEvent(event) {\n if (event.type === \"external_tool.requested\") {\n const { requestId, toolName } = event.data;\n const args = event.data.arguments;\n const toolCallId = event.data.toolCallId;\n const handler = this.toolHandlers.get(toolName);\n if (handler) {\n void this._executeToolAndRespond(requestId, toolName, toolCallId, args, handler);\n }\n } else if (event.type === \"permission.requested\") {\n const { requestId, permissionRequest } = event.data;\n if (this.permissionHandler) {\n void this._executePermissionAndRespond(requestId, permissionRequest);\n }\n }\n }\n /**\n * Executes a tool handler and sends the result back via RPC.\n * @internal\n */\n async _executeToolAndRespond(requestId, toolName, toolCallId, args, handler) {\n try {\n const rawResult = await handler(args, {\n sessionId: this.sessionId,\n toolCallId,\n toolName,\n arguments: args\n });\n let result;\n if (rawResult == null) {\n result = \"\";\n } else if (typeof rawResult === \"string\") {\n result = rawResult;\n } else {\n result = JSON.stringify(rawResult);\n }\n await this.rpc.tools.handlePendingToolCall({ requestId, result });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n try {\n await this.rpc.tools.handlePendingToolCall({ requestId, error: message });\n } catch (rpcError) {\n if (!(rpcError instanceof ConnectionError || rpcError instanceof ResponseError)) {\n throw rpcError;\n }\n }\n }\n }\n /**\n * Executes a permission handler and sends the result back via RPC.\n * @internal\n */\n async _executePermissionAndRespond(requestId, permissionRequest) {\n try {\n const result = await this.permissionHandler(permissionRequest, {\n sessionId: this.sessionId\n });\n await this.rpc.permissions.handlePendingPermissionRequest({ requestId, result });\n } catch (_error) {\n try {\n await this.rpc.permissions.handlePendingPermissionRequest({\n requestId,\n result: {\n kind: \"denied-no-approval-rule-and-could-not-request-from-user\"\n }\n });\n } catch (rpcError) {\n if (!(rpcError instanceof ConnectionError || rpcError instanceof ResponseError)) {\n throw rpcError;\n }\n }\n }\n }\n /**\n * Registers custom tool handlers for this session.\n *\n * Tools allow the assistant to execute custom functions. When the assistant\n * invokes a tool, the corresponding handler is called with the tool arguments.\n *\n * @param tools - An array of tool definitions with their handlers, or undefined to clear all tools\n * @internal This method is typically called internally when creating a session with tools.\n */\n registerTools(tools) {\n this.toolHandlers.clear();\n if (!tools) {\n return;\n }\n for (const tool of tools) {\n this.toolHandlers.set(tool.name, tool.handler);\n }\n }\n /**\n * Retrieves a registered tool handler by name.\n *\n * @param name - The name of the tool to retrieve\n * @returns The tool handler if found, or undefined\n * @internal This method is for internal use by the SDK.\n */\n getToolHandler(name) {\n return this.toolHandlers.get(name);\n }\n /**\n * Registers a handler for permission requests.\n *\n * When the assistant needs permission to perform certain actions (e.g., file operations),\n * this handler is called to approve or deny the request.\n *\n * @param handler - The permission handler function, or undefined to remove the handler\n * @internal This method is typically called internally when creating a session.\n */\n registerPermissionHandler(handler) {\n this.permissionHandler = handler;\n }\n /**\n * Registers a user input handler for ask_user requests.\n *\n * When the agent needs input from the user (via ask_user tool),\n * this handler is called to provide the response.\n *\n * @param handler - The user input handler function, or undefined to remove the handler\n * @internal This method is typically called internally when creating a session.\n */\n registerUserInputHandler(handler) {\n this.userInputHandler = handler;\n }\n /**\n * Registers hook handlers for session lifecycle events.\n *\n * Hooks allow custom logic to be executed at various points during\n * the session lifecycle (before/after tool use, session start/end, etc.).\n *\n * @param hooks - The hook handlers object, or undefined to remove all hooks\n * @internal This method is typically called internally when creating a session.\n */\n registerHooks(hooks) {\n this.hooks = hooks;\n }\n /**\n * Handles a permission request in the v2 protocol format (synchronous RPC).\n * Used as a back-compat adapter when connected to a v2 server.\n *\n * @param request - The permission request data from the CLI\n * @returns A promise that resolves with the permission decision\n * @internal This method is for internal use by the SDK.\n */\n async _handlePermissionRequestV2(request) {\n if (!this.permissionHandler) {\n return { kind: \"denied-no-approval-rule-and-could-not-request-from-user\" };\n }\n try {\n const result = await this.permissionHandler(request, {\n sessionId: this.sessionId\n });\n return result;\n } catch (_error) {\n return { kind: \"denied-no-approval-rule-and-could-not-request-from-user\" };\n }\n }\n /**\n * Handles a user input request from the Copilot CLI.\n *\n * @param request - The user input request data from the CLI\n * @returns A promise that resolves with the user's response\n * @internal This method is for internal use by the SDK.\n */\n async _handleUserInputRequest(request) {\n if (!this.userInputHandler) {\n throw new Error(\"User input requested but no handler registered\");\n }\n try {\n const result = await this.userInputHandler(request, {\n sessionId: this.sessionId\n });\n return result;\n } catch (error) {\n throw error;\n }\n }\n /**\n * Handles a hooks invocation from the Copilot CLI.\n *\n * @param hookType - The type of hook being invoked\n * @param input - The input data for the hook\n * @returns A promise that resolves with the hook output, or undefined\n * @internal This method is for internal use by the SDK.\n */\n async _handleHooksInvoke(hookType, input) {\n if (!this.hooks) {\n return void 0;\n }\n const handlerMap = {\n preToolUse: this.hooks.onPreToolUse,\n postToolUse: this.hooks.onPostToolUse,\n userPromptSubmitted: this.hooks.onUserPromptSubmitted,\n sessionStart: this.hooks.onSessionStart,\n sessionEnd: this.hooks.onSessionEnd,\n errorOccurred: this.hooks.onErrorOccurred\n };\n const handler = handlerMap[hookType];\n if (!handler) {\n return void 0;\n }\n try {\n const result = await handler(input, { sessionId: this.sessionId });\n return result;\n } catch (_error) {\n return void 0;\n }\n }\n /**\n * Retrieves all events and messages from this session's history.\n *\n * This returns the complete conversation history including user messages,\n * assistant responses, tool executions, and other session events.\n *\n * @returns A promise that resolves with an array of all session events\n * @throws Error if the session has been disconnected or the connection fails\n *\n * @example\n * ```typescript\n * const events = await session.getMessages();\n * for (const event of events) {\n * if (event.type === \"assistant.message\") {\n * console.log(\"Assistant:\", event.data.content);\n * }\n * }\n * ```\n */\n async getMessages() {\n const response = await this.connection.sendRequest(\"session.getMessages\", {\n sessionId: this.sessionId\n });\n return response.events;\n }\n /**\n * Disconnects this session and releases all in-memory resources (event handlers,\n * tool handlers, permission handlers).\n *\n * Session state on disk (conversation history, planning state, artifacts) is\n * preserved, so the conversation can be resumed later by calling\n * {@link CopilotClient.resumeSession} with the session ID. To permanently\n * remove all session data including files on disk, use\n * {@link CopilotClient.deleteSession} instead.\n *\n * After calling this method, the session object can no longer be used.\n *\n * @returns A promise that resolves when the session is disconnected\n * @throws Error if the connection fails\n *\n * @example\n * ```typescript\n * // Clean up when done — session can still be resumed later\n * await session.disconnect();\n * ```\n */\n async disconnect() {\n await this.connection.sendRequest(\"session.destroy\", {\n sessionId: this.sessionId\n });\n this.eventHandlers.clear();\n this.typedEventHandlers.clear();\n this.toolHandlers.clear();\n this.permissionHandler = void 0;\n }\n /**\n * @deprecated Use {@link disconnect} instead. This method will be removed in a future release.\n *\n * Disconnects this session and releases all in-memory resources.\n * Session data on disk is preserved for later resumption.\n *\n * @returns A promise that resolves when the session is disconnected\n * @throws Error if the connection fails\n */\n async destroy() {\n return this.disconnect();\n }\n /** Enables `await using session = ...` syntax for automatic cleanup. */\n async [Symbol.asyncDispose]() {\n return this.disconnect();\n }\n /**\n * Aborts the currently processing message in this session.\n *\n * Use this to cancel a long-running request. The session remains valid\n * and can continue to be used for new messages.\n *\n * @returns A promise that resolves when the abort request is acknowledged\n * @throws Error if the session has been disconnected or the connection fails\n *\n * @example\n * ```typescript\n * // Start a long-running request\n * const messagePromise = session.send({ prompt: \"Write a very long story...\" });\n *\n * // Abort after 5 seconds\n * setTimeout(async () => {\n * await session.abort();\n * }, 5000);\n * ```\n */\n async abort() {\n await this.connection.sendRequest(\"session.abort\", {\n sessionId: this.sessionId\n });\n }\n /**\n * Change the model for this session.\n * The new model takes effect for the next message. Conversation history is preserved.\n *\n * @param model - Model ID to switch to\n *\n * @example\n * ```typescript\n * await session.setModel(\"gpt-4.1\");\n * ```\n */\n async setModel(model) {\n await this.rpc.model.switchTo({ modelId: model });\n }\n}\nexport {\n CopilotSession\n};\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { Socket } from \"node:net\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n createMessageConnection,\n StreamMessageReader,\n StreamMessageWriter\n} from \"vscode-jsonrpc/node.js\";\nimport { createServerRpc } from \"./generated/rpc.js\";\nimport { getSdkProtocolVersion } from \"./sdkProtocolVersion.js\";\nimport { CopilotSession } from \"./session.js\";\nconst MIN_PROTOCOL_VERSION = 2;\nfunction isZodSchema(value) {\n return value != null && typeof value === \"object\" && \"toJSONSchema\" in value && typeof value.toJSONSchema === \"function\";\n}\nfunction toJsonSchema(parameters) {\n if (!parameters) return void 0;\n if (isZodSchema(parameters)) {\n return parameters.toJSONSchema();\n }\n return parameters;\n}\nfunction getNodeExecPath() {\n if (process.versions.bun) {\n return \"node\";\n }\n return process.execPath;\n}\nfunction getBundledCliPath() {\n return \"bundled-cli-unavailable\";\n}\nclass CopilotClient {\n cliProcess = null;\n connection = null;\n socket = null;\n actualPort = null;\n actualHost = \"localhost\";\n state = \"disconnected\";\n sessions = /* @__PURE__ */ new Map();\n stderrBuffer = \"\";\n // Captures CLI stderr for error messages\n options;\n isExternalServer = false;\n forceStopping = false;\n modelsCache = null;\n modelsCacheLock = Promise.resolve();\n sessionLifecycleHandlers = /* @__PURE__ */ new Set();\n typedLifecycleHandlers = /* @__PURE__ */ new Map();\n _rpc = null;\n processExitPromise = null;\n // Rejects when CLI process exits\n negotiatedProtocolVersion = null;\n /**\n * Typed server-scoped RPC methods.\n * @throws Error if the client is not connected\n */\n get rpc() {\n if (!this.connection) {\n throw new Error(\"Client is not connected. Call start() first.\");\n }\n if (!this._rpc) {\n this._rpc = createServerRpc(this.connection);\n }\n return this._rpc;\n }\n /**\n * Creates a new CopilotClient instance.\n *\n * @param options - Configuration options for the client\n * @throws Error if mutually exclusive options are provided (e.g., cliUrl with useStdio or cliPath)\n *\n * @example\n * ```typescript\n * // Default options - spawns CLI server using stdio\n * const client = new CopilotClient();\n *\n * // Connect to an existing server\n * const client = new CopilotClient({ cliUrl: \"localhost:3000\" });\n *\n * // Custom CLI path with specific log level\n * const client = new CopilotClient({\n * cliPath: \"/usr/local/bin/copilot\",\n * logLevel: \"debug\"\n * });\n * ```\n */\n constructor(options = {}) {\n if (options.cliUrl && (options.useStdio === true || options.cliPath)) {\n throw new Error(\"cliUrl is mutually exclusive with useStdio and cliPath\");\n }\n if (options.isChildProcess && (options.cliUrl || options.useStdio === false)) {\n throw new Error(\n \"isChildProcess must be used in conjunction with useStdio and not with cliUrl\"\n );\n }\n if (options.cliUrl && (options.githubToken || options.useLoggedInUser !== void 0)) {\n throw new Error(\n \"githubToken and useLoggedInUser cannot be used with cliUrl (external server manages its own auth)\"\n );\n }\n if (options.cliUrl) {\n const { host, port } = this.parseCliUrl(options.cliUrl);\n this.actualHost = host;\n this.actualPort = port;\n this.isExternalServer = true;\n }\n if (options.isChildProcess) {\n this.isExternalServer = true;\n }\n this.options = {\n cliPath: options.cliPath || getBundledCliPath(),\n cliArgs: options.cliArgs ?? [],\n cwd: options.cwd ?? process.cwd(),\n port: options.port || 0,\n useStdio: options.cliUrl ? false : options.useStdio ?? true,\n // Default to stdio unless cliUrl is provided\n isChildProcess: options.isChildProcess ?? false,\n cliUrl: options.cliUrl,\n logLevel: options.logLevel || \"debug\",\n autoStart: options.autoStart ?? true,\n autoRestart: options.autoRestart ?? true,\n env: options.env ?? process.env,\n githubToken: options.githubToken,\n // Default useLoggedInUser to false when githubToken is provided, otherwise true\n useLoggedInUser: options.useLoggedInUser ?? (options.githubToken ? false : true)\n };\n }\n /**\n * Parse CLI URL into host and port\n * Supports formats: \"host:port\", \"http://host:port\", \"https://host:port\", or just \"port\"\n */\n parseCliUrl(url) {\n let cleanUrl = url.replace(/^https?:\\/\\//, \"\");\n if (/^\\d+$/.test(cleanUrl)) {\n return { host: \"localhost\", port: parseInt(cleanUrl, 10) };\n }\n const parts = cleanUrl.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\n `Invalid cliUrl format: ${url}. Expected \"host:port\", \"http://host:port\", or \"port\"`\n );\n }\n const host = parts[0] || \"localhost\";\n const port = parseInt(parts[1], 10);\n if (isNaN(port) || port <= 0 || port > 65535) {\n throw new Error(`Invalid port in cliUrl: ${url}`);\n }\n return { host, port };\n }\n /**\n * Starts the CLI server and establishes a connection.\n *\n * If connecting to an external server (via cliUrl), only establishes the connection.\n * Otherwise, spawns the CLI server process and then connects.\n *\n * This method is called automatically when creating a session if `autoStart` is true (default).\n *\n * @returns A promise that resolves when the connection is established\n * @throws Error if the server fails to start or the connection fails\n *\n * @example\n * ```typescript\n * const client = new CopilotClient({ autoStart: false });\n * await client.start();\n * // Now ready to create sessions\n * ```\n */\n async start() {\n if (this.state === \"connected\") {\n return;\n }\n this.state = \"connecting\";\n try {\n if (!this.isExternalServer) {\n await this.startCLIServer();\n }\n await this.connectToServer();\n await this.verifyProtocolVersion();\n this.state = \"connected\";\n } catch (error) {\n this.state = \"error\";\n throw error;\n }\n }\n /**\n * Stops the CLI server and closes all active sessions.\n *\n * This method performs graceful cleanup:\n * 1. Closes all active sessions (releases in-memory resources)\n * 2. Closes the JSON-RPC connection\n * 3. Terminates the CLI server process (if spawned by this client)\n *\n * Note: session data on disk is preserved, so sessions can be resumed later.\n * To permanently remove session data before stopping, call\n * {@link deleteSession} for each session first.\n *\n * @returns A promise that resolves with an array of errors encountered during cleanup.\n * An empty array indicates all cleanup succeeded.\n *\n * @example\n * ```typescript\n * const errors = await client.stop();\n * if (errors.length > 0) {\n * console.error(\"Cleanup errors:\", errors);\n * }\n * ```\n */\n async stop() {\n const errors = [];\n for (const session of this.sessions.values()) {\n const sessionId = session.sessionId;\n let lastError = null;\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n await session.disconnect();\n lastError = null;\n break;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (attempt < 3) {\n const delay = 100 * Math.pow(2, attempt - 1);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n if (lastError) {\n errors.push(\n new Error(\n `Failed to disconnect session ${sessionId} after 3 attempts: ${lastError.message}`\n )\n );\n }\n }\n this.sessions.clear();\n if (this.connection) {\n try {\n this.connection.dispose();\n } catch (error) {\n errors.push(\n new Error(\n `Failed to dispose connection: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n this.connection = null;\n this._rpc = null;\n }\n this.modelsCache = null;\n if (this.socket) {\n try {\n this.socket.end();\n } catch (error) {\n errors.push(\n new Error(\n `Failed to close socket: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n this.socket = null;\n }\n if (this.cliProcess && !this.isExternalServer) {\n try {\n this.cliProcess.kill();\n } catch (error) {\n errors.push(\n new Error(\n `Failed to kill CLI process: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n this.cliProcess = null;\n }\n this.state = \"disconnected\";\n this.actualPort = null;\n this.stderrBuffer = \"\";\n this.processExitPromise = null;\n return errors;\n }\n /**\n * Forcefully stops the CLI server without graceful cleanup.\n *\n * Use this when {@link stop} fails or takes too long. This method:\n * - Clears all sessions immediately without destroying them\n * - Force closes the connection\n * - Sends SIGKILL to the CLI process (if spawned by this client)\n *\n * @returns A promise that resolves when the force stop is complete\n *\n * @example\n * ```typescript\n * // If normal stop hangs, force stop\n * const stopPromise = client.stop();\n * const timeout = new Promise((_, reject) =>\n * setTimeout(() => reject(new Error(\"Timeout\")), 5000)\n * );\n *\n * try {\n * await Promise.race([stopPromise, timeout]);\n * } catch {\n * await client.forceStop();\n * }\n * ```\n */\n async forceStop() {\n this.forceStopping = true;\n this.sessions.clear();\n if (this.connection) {\n try {\n this.connection.dispose();\n } catch {\n }\n this.connection = null;\n this._rpc = null;\n }\n this.modelsCache = null;\n if (this.socket) {\n try {\n this.socket.destroy();\n } catch {\n }\n this.socket = null;\n }\n if (this.cliProcess && !this.isExternalServer) {\n try {\n this.cliProcess.kill(\"SIGKILL\");\n } catch {\n }\n this.cliProcess = null;\n }\n this.state = \"disconnected\";\n this.actualPort = null;\n this.stderrBuffer = \"\";\n this.processExitPromise = null;\n }\n /**\n * Creates a new conversation session with the Copilot CLI.\n *\n * Sessions maintain conversation state, handle events, and manage tool execution.\n * If the client is not connected and `autoStart` is enabled, this will automatically\n * start the connection.\n *\n * @param config - Optional configuration for the session\n * @returns A promise that resolves with the created session\n * @throws Error if the client is not connected and autoStart is disabled\n *\n * @example\n * ```typescript\n * // Basic session\n * const session = await client.createSession({ onPermissionRequest: approveAll });\n *\n * // Session with model and tools\n * const session = await client.createSession({\n * onPermissionRequest: approveAll,\n * model: \"gpt-4\",\n * tools: [{\n * name: \"get_weather\",\n * description: \"Get weather for a location\",\n * parameters: { type: \"object\", properties: { location: { type: \"string\" } } },\n * handler: async (args) => ({ temperature: 72 })\n * }]\n * });\n * ```\n */\n async createSession(config) {\n if (!config?.onPermissionRequest) {\n throw new Error(\n \"An onPermissionRequest handler is required when creating a session. For example, to allow all permissions, use { onPermissionRequest: approveAll }.\"\n );\n }\n if (!this.connection) {\n if (this.options.autoStart) {\n await this.start();\n } else {\n throw new Error(\"Client not connected. Call start() first.\");\n }\n }\n const response = await this.connection.sendRequest(\"session.create\", {\n model: config.model,\n sessionId: config.sessionId,\n clientName: config.clientName,\n reasoningEffort: config.reasoningEffort,\n tools: config.tools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: toJsonSchema(tool.parameters),\n overridesBuiltInTool: tool.overridesBuiltInTool\n })),\n systemMessage: config.systemMessage,\n availableTools: config.availableTools,\n excludedTools: config.excludedTools,\n provider: config.provider,\n requestPermission: true,\n requestUserInput: !!config.onUserInputRequest,\n hooks: !!(config.hooks && Object.values(config.hooks).some(Boolean)),\n workingDirectory: config.workingDirectory,\n streaming: config.streaming,\n mcpServers: config.mcpServers,\n envValueMode: \"direct\",\n customAgents: config.customAgents,\n configDir: config.configDir,\n skillDirectories: config.skillDirectories,\n disabledSkills: config.disabledSkills,\n infiniteSessions: config.infiniteSessions\n });\n const { sessionId, workspacePath } = response;\n const session = new CopilotSession(sessionId, this.connection, workspacePath);\n session.registerTools(config.tools);\n session.registerPermissionHandler(config.onPermissionRequest);\n if (config.onUserInputRequest) {\n session.registerUserInputHandler(config.onUserInputRequest);\n }\n if (config.hooks) {\n session.registerHooks(config.hooks);\n }\n this.sessions.set(sessionId, session);\n return session;\n }\n /**\n * Resumes an existing conversation session by its ID.\n *\n * This allows you to continue a previous conversation, maintaining all\n * conversation history. The session must have been previously created\n * and not deleted.\n *\n * @param sessionId - The ID of the session to resume\n * @param config - Optional configuration for the resumed session\n * @returns A promise that resolves with the resumed session\n * @throws Error if the session does not exist or the client is not connected\n *\n * @example\n * ```typescript\n * // Resume a previous session\n * const session = await client.resumeSession(\"session-123\", { onPermissionRequest: approveAll });\n *\n * // Resume with new tools\n * const session = await client.resumeSession(\"session-123\", {\n * onPermissionRequest: approveAll,\n * tools: [myNewTool]\n * });\n * ```\n */\n async resumeSession(sessionId, config) {\n if (!config?.onPermissionRequest) {\n throw new Error(\n \"An onPermissionRequest handler is required when resuming a session. For example, to allow all permissions, use { onPermissionRequest: approveAll }.\"\n );\n }\n if (!this.connection) {\n if (this.options.autoStart) {\n await this.start();\n } else {\n throw new Error(\"Client not connected. Call start() first.\");\n }\n }\n const response = await this.connection.sendRequest(\"session.resume\", {\n sessionId,\n clientName: config.clientName,\n model: config.model,\n reasoningEffort: config.reasoningEffort,\n systemMessage: config.systemMessage,\n availableTools: config.availableTools,\n excludedTools: config.excludedTools,\n tools: config.tools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: toJsonSchema(tool.parameters),\n overridesBuiltInTool: tool.overridesBuiltInTool\n })),\n provider: config.provider,\n requestPermission: true,\n requestUserInput: !!config.onUserInputRequest,\n hooks: !!(config.hooks && Object.values(config.hooks).some(Boolean)),\n workingDirectory: config.workingDirectory,\n configDir: config.configDir,\n streaming: config.streaming,\n mcpServers: config.mcpServers,\n envValueMode: \"direct\",\n customAgents: config.customAgents,\n skillDirectories: config.skillDirectories,\n disabledSkills: config.disabledSkills,\n infiniteSessions: config.infiniteSessions,\n disableResume: config.disableResume\n });\n const { sessionId: resumedSessionId, workspacePath } = response;\n const session = new CopilotSession(resumedSessionId, this.connection, workspacePath);\n session.registerTools(config.tools);\n session.registerPermissionHandler(config.onPermissionRequest);\n if (config.onUserInputRequest) {\n session.registerUserInputHandler(config.onUserInputRequest);\n }\n if (config.hooks) {\n session.registerHooks(config.hooks);\n }\n this.sessions.set(resumedSessionId, session);\n return session;\n }\n /**\n * Gets the current connection state of the client.\n *\n * @returns The current connection state: \"disconnected\", \"connecting\", \"connected\", or \"error\"\n *\n * @example\n * ```typescript\n * if (client.getState() === \"connected\") {\n * const session = await client.createSession({ onPermissionRequest: approveAll });\n * }\n * ```\n */\n getState() {\n return this.state;\n }\n /**\n * Sends a ping request to the server to verify connectivity.\n *\n * @param message - Optional message to include in the ping\n * @returns A promise that resolves with the ping response containing the message and timestamp\n * @throws Error if the client is not connected\n *\n * @example\n * ```typescript\n * const response = await client.ping(\"health check\");\n * console.log(`Server responded at ${new Date(response.timestamp)}`);\n * ```\n */\n async ping(message) {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const result = await this.connection.sendRequest(\"ping\", { message });\n return result;\n }\n /**\n * Get CLI status including version and protocol information\n */\n async getStatus() {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const result = await this.connection.sendRequest(\"status.get\", {});\n return result;\n }\n /**\n * Get current authentication status\n */\n async getAuthStatus() {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const result = await this.connection.sendRequest(\"auth.getStatus\", {});\n return result;\n }\n /**\n * List available models with their metadata.\n *\n * Results are cached after the first successful call to avoid rate limiting.\n * The cache is cleared when the client disconnects.\n *\n * @throws Error if not authenticated\n */\n async listModels() {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n await this.modelsCacheLock;\n let resolveLock;\n this.modelsCacheLock = new Promise((resolve) => {\n resolveLock = resolve;\n });\n try {\n if (this.modelsCache !== null) {\n return [...this.modelsCache];\n }\n const result = await this.connection.sendRequest(\"models.list\", {});\n const response = result;\n const models = response.models;\n this.modelsCache = models;\n return [...models];\n } finally {\n resolveLock();\n }\n }\n /**\n * Verify that the server's protocol version is within the supported range\n * and store the negotiated version.\n */\n async verifyProtocolVersion() {\n const maxVersion = getSdkProtocolVersion();\n let pingResult;\n if (this.processExitPromise) {\n pingResult = await Promise.race([this.ping(), this.processExitPromise]);\n } else {\n pingResult = await this.ping();\n }\n const serverVersion = pingResult.protocolVersion;\n if (serverVersion === void 0) {\n throw new Error(\n `SDK protocol version mismatch: SDK supports versions ${MIN_PROTOCOL_VERSION}-${maxVersion}, but server does not report a protocol version. Please update your server to ensure compatibility.`\n );\n }\n if (serverVersion < MIN_PROTOCOL_VERSION || serverVersion > maxVersion) {\n throw new Error(\n `SDK protocol version mismatch: SDK supports versions ${MIN_PROTOCOL_VERSION}-${maxVersion}, but server reports version ${serverVersion}. Please update your SDK or server to ensure compatibility.`\n );\n }\n this.negotiatedProtocolVersion = serverVersion;\n }\n /**\n * Gets the ID of the most recently updated session.\n *\n * This is useful for resuming the last conversation when the session ID\n * was not stored.\n *\n * @returns A promise that resolves with the session ID, or undefined if no sessions exist\n * @throws Error if the client is not connected\n *\n * @example\n * ```typescript\n * const lastId = await client.getLastSessionId();\n * if (lastId) {\n * const session = await client.resumeSession(lastId, { onPermissionRequest: approveAll });\n * }\n * ```\n */\n async getLastSessionId() {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const response = await this.connection.sendRequest(\"session.getLastId\", {});\n return response.sessionId;\n }\n /**\n * Permanently deletes a session and all its data from disk, including\n * conversation history, planning state, and artifacts.\n *\n * Unlike {@link CopilotSession.disconnect}, which only releases in-memory\n * resources and preserves session data for later resumption, this method\n * is irreversible. The session cannot be resumed after deletion.\n *\n * @param sessionId - The ID of the session to delete\n * @returns A promise that resolves when the session is deleted\n * @throws Error if the session does not exist or deletion fails\n *\n * @example\n * ```typescript\n * await client.deleteSession(\"session-123\");\n * ```\n */\n async deleteSession(sessionId) {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const response = await this.connection.sendRequest(\"session.delete\", {\n sessionId\n });\n const { success, error } = response;\n if (!success) {\n throw new Error(`Failed to delete session ${sessionId}: ${error || \"Unknown error\"}`);\n }\n this.sessions.delete(sessionId);\n }\n /**\n * List all available sessions.\n *\n * @param filter - Optional filter to limit returned sessions by context fields\n *\n * @example\n * // List all sessions\n * const sessions = await client.listSessions();\n *\n * @example\n * // List sessions for a specific repository\n * const sessions = await client.listSessions({ repository: \"owner/repo\" });\n */\n async listSessions(filter) {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const response = await this.connection.sendRequest(\"session.list\", { filter });\n const { sessions } = response;\n return sessions.map((s) => ({\n sessionId: s.sessionId,\n startTime: new Date(s.startTime),\n modifiedTime: new Date(s.modifiedTime),\n summary: s.summary,\n isRemote: s.isRemote,\n context: s.context\n }));\n }\n /**\n * Gets the foreground session ID in TUI+server mode.\n *\n * This returns the ID of the session currently displayed in the TUI.\n * Only available when connecting to a server running in TUI+server mode (--ui-server).\n *\n * @returns A promise that resolves with the foreground session ID, or undefined if none\n * @throws Error if the client is not connected\n *\n * @example\n * ```typescript\n * const sessionId = await client.getForegroundSessionId();\n * if (sessionId) {\n * console.log(`TUI is displaying session: ${sessionId}`);\n * }\n * ```\n */\n async getForegroundSessionId() {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const response = await this.connection.sendRequest(\"session.getForeground\", {});\n return response.sessionId;\n }\n /**\n * Sets the foreground session in TUI+server mode.\n *\n * This requests the TUI to switch to displaying the specified session.\n * Only available when connecting to a server running in TUI+server mode (--ui-server).\n *\n * @param sessionId - The ID of the session to display in the TUI\n * @returns A promise that resolves when the session is switched\n * @throws Error if the client is not connected or if the operation fails\n *\n * @example\n * ```typescript\n * // Switch the TUI to display a specific session\n * await client.setForegroundSessionId(\"session-123\");\n * ```\n */\n async setForegroundSessionId(sessionId) {\n if (!this.connection) {\n throw new Error(\"Client not connected\");\n }\n const response = await this.connection.sendRequest(\"session.setForeground\", { sessionId });\n const result = response;\n if (!result.success) {\n throw new Error(result.error || \"Failed to set foreground session\");\n }\n }\n on(eventTypeOrHandler, handler) {\n if (typeof eventTypeOrHandler === \"string\" && handler) {\n const eventType = eventTypeOrHandler;\n if (!this.typedLifecycleHandlers.has(eventType)) {\n this.typedLifecycleHandlers.set(eventType, /* @__PURE__ */ new Set());\n }\n const storedHandler = handler;\n this.typedLifecycleHandlers.get(eventType).add(storedHandler);\n return () => {\n const handlers = this.typedLifecycleHandlers.get(eventType);\n if (handlers) {\n handlers.delete(storedHandler);\n }\n };\n }\n const wildcardHandler = eventTypeOrHandler;\n this.sessionLifecycleHandlers.add(wildcardHandler);\n return () => {\n this.sessionLifecycleHandlers.delete(wildcardHandler);\n };\n }\n /**\n * Start the CLI server process\n */\n async startCLIServer() {\n return new Promise((resolve, reject) => {\n this.stderrBuffer = \"\";\n const args = [\n ...this.options.cliArgs,\n \"--headless\",\n \"--no-auto-update\",\n \"--log-level\",\n this.options.logLevel\n ];\n if (this.options.useStdio) {\n args.push(\"--stdio\");\n } else if (this.options.port > 0) {\n args.push(\"--port\", this.options.port.toString());\n }\n if (this.options.githubToken) {\n args.push(\"--auth-token-env\", \"COPILOT_SDK_AUTH_TOKEN\");\n }\n if (!this.options.useLoggedInUser) {\n args.push(\"--no-auto-login\");\n }\n const envWithoutNodeDebug = { ...this.options.env };\n delete envWithoutNodeDebug.NODE_DEBUG;\n if (this.options.githubToken) {\n envWithoutNodeDebug.COPILOT_SDK_AUTH_TOKEN = this.options.githubToken;\n }\n if (!existsSync(this.options.cliPath)) {\n throw new Error(\n `Copilot CLI not found at ${this.options.cliPath}. Ensure @github/copilot is installed.`\n );\n }\n const stdioConfig = this.options.useStdio ? [\"pipe\", \"pipe\", \"pipe\"] : [\"ignore\", \"pipe\", \"pipe\"];\n const isJsFile = this.options.cliPath.endsWith(\".js\");\n if (isJsFile) {\n this.cliProcess = spawn(getNodeExecPath(), [this.options.cliPath, ...args], {\n stdio: stdioConfig,\n cwd: this.options.cwd,\n env: envWithoutNodeDebug,\n windowsHide: true\n });\n } else {\n this.cliProcess = spawn(this.options.cliPath, args, {\n stdio: stdioConfig,\n cwd: this.options.cwd,\n env: envWithoutNodeDebug,\n windowsHide: true\n });\n }\n let stdout = \"\";\n let resolved = false;\n if (this.options.useStdio) {\n resolved = true;\n resolve();\n } else {\n this.cliProcess.stdout?.on(\"data\", (data) => {\n stdout += data.toString();\n const match = stdout.match(/listening on port (\\d+)/i);\n if (match && !resolved) {\n this.actualPort = parseInt(match[1], 10);\n resolved = true;\n resolve();\n }\n });\n }\n this.cliProcess.stderr?.on(\"data\", (data) => {\n this.stderrBuffer += data.toString();\n const lines = data.toString().split(\"\\n\");\n for (const line of lines) {\n if (line.trim()) {\n process.stderr.write(`[CLI subprocess] ${line}\n`);\n }\n }\n });\n this.cliProcess.on(\"error\", (error) => {\n if (!resolved) {\n resolved = true;\n const stderrOutput = this.stderrBuffer.trim();\n if (stderrOutput) {\n reject(\n new Error(\n `Failed to start CLI server: ${error.message}\nstderr: ${stderrOutput}`\n )\n );\n } else {\n reject(new Error(`Failed to start CLI server: ${error.message}`));\n }\n }\n });\n this.processExitPromise = new Promise((_, rejectProcessExit) => {\n this.cliProcess.on(\"exit\", (code) => {\n setTimeout(() => {\n const stderrOutput = this.stderrBuffer.trim();\n if (stderrOutput) {\n rejectProcessExit(\n new Error(\n `CLI server exited with code ${code}\nstderr: ${stderrOutput}`\n )\n );\n } else {\n rejectProcessExit(\n new Error(`CLI server exited unexpectedly with code ${code}`)\n );\n }\n }, 50);\n });\n });\n this.processExitPromise.catch(() => {\n });\n this.cliProcess.on(\"exit\", (code) => {\n if (!resolved) {\n resolved = true;\n const stderrOutput = this.stderrBuffer.trim();\n if (stderrOutput) {\n reject(\n new Error(\n `CLI server exited with code ${code}\nstderr: ${stderrOutput}`\n )\n );\n } else {\n reject(new Error(`CLI server exited with code ${code}`));\n }\n } else if (this.options.autoRestart && this.state === \"connected\") {\n void this.reconnect();\n }\n });\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n reject(new Error(\"Timeout waiting for CLI server to start\"));\n }\n }, 1e4);\n });\n }\n /**\n * Connect to the CLI server (via socket or stdio)\n */\n async connectToServer() {\n if (this.options.isChildProcess) {\n return this.connectToParentProcessViaStdio();\n } else if (this.options.useStdio) {\n return this.connectToChildProcessViaStdio();\n } else {\n return this.connectViaTcp();\n }\n }\n /**\n * Connect to child via stdio pipes\n */\n async connectToChildProcessViaStdio() {\n if (!this.cliProcess) {\n throw new Error(\"CLI process not started\");\n }\n this.cliProcess.stdin?.on(\"error\", (err) => {\n if (!this.forceStopping) {\n throw err;\n }\n });\n this.connection = createMessageConnection(\n new StreamMessageReader(this.cliProcess.stdout),\n new StreamMessageWriter(this.cliProcess.stdin)\n );\n this.attachConnectionHandlers();\n this.connection.listen();\n }\n /**\n * Connect to parent via stdio pipes\n */\n async connectToParentProcessViaStdio() {\n if (this.cliProcess) {\n throw new Error(\"CLI child process was unexpectedly started in parent process mode\");\n }\n this.connection = createMessageConnection(\n new StreamMessageReader(process.stdin),\n new StreamMessageWriter(process.stdout)\n );\n this.attachConnectionHandlers();\n this.connection.listen();\n }\n /**\n * Connect to the CLI server via TCP socket\n */\n async connectViaTcp() {\n if (!this.actualPort) {\n throw new Error(\"Server port not available\");\n }\n return new Promise((resolve, reject) => {\n this.socket = new Socket();\n this.socket.connect(this.actualPort, this.actualHost, () => {\n this.connection = createMessageConnection(\n new StreamMessageReader(this.socket),\n new StreamMessageWriter(this.socket)\n );\n this.attachConnectionHandlers();\n this.connection.listen();\n resolve();\n });\n this.socket.on(\"error\", (error) => {\n reject(new Error(`Failed to connect to CLI server: ${error.message}`));\n });\n });\n }\n attachConnectionHandlers() {\n if (!this.connection) {\n return;\n }\n this.connection.onNotification(\"session.event\", (notification) => {\n this.handleSessionEventNotification(notification);\n });\n this.connection.onNotification(\"session.lifecycle\", (notification) => {\n this.handleSessionLifecycleNotification(notification);\n });\n this.connection.onRequest(\n \"tool.call\",\n async (params) => await this.handleToolCallRequestV2(params)\n );\n this.connection.onRequest(\n \"permission.request\",\n async (params) => await this.handlePermissionRequestV2(params)\n );\n this.connection.onRequest(\n \"userInput.request\",\n async (params) => await this.handleUserInputRequest(params)\n );\n this.connection.onRequest(\n \"hooks.invoke\",\n async (params) => await this.handleHooksInvoke(params)\n );\n this.connection.onClose(() => {\n if (this.state === \"connected\" && this.options.autoRestart) {\n void this.reconnect();\n }\n });\n this.connection.onError((_error) => {\n });\n }\n handleSessionEventNotification(notification) {\n if (typeof notification !== \"object\" || !notification || !(\"sessionId\" in notification) || typeof notification.sessionId !== \"string\" || !(\"event\" in notification)) {\n return;\n }\n const session = this.sessions.get(notification.sessionId);\n if (session) {\n session._dispatchEvent(notification.event);\n }\n }\n handleSessionLifecycleNotification(notification) {\n if (typeof notification !== \"object\" || !notification || !(\"type\" in notification) || typeof notification.type !== \"string\" || !(\"sessionId\" in notification) || typeof notification.sessionId !== \"string\") {\n return;\n }\n const event = notification;\n const typedHandlers = this.typedLifecycleHandlers.get(event.type);\n if (typedHandlers) {\n for (const handler of typedHandlers) {\n try {\n handler(event);\n } catch {\n }\n }\n }\n for (const handler of this.sessionLifecycleHandlers) {\n try {\n handler(event);\n } catch {\n }\n }\n }\n async handleUserInputRequest(params) {\n if (!params || typeof params.sessionId !== \"string\" || typeof params.question !== \"string\") {\n throw new Error(\"Invalid user input request payload\");\n }\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n throw new Error(`Session not found: ${params.sessionId}`);\n }\n const result = await session._handleUserInputRequest({\n question: params.question,\n choices: params.choices,\n allowFreeform: params.allowFreeform\n });\n return result;\n }\n async handleHooksInvoke(params) {\n if (!params || typeof params.sessionId !== \"string\" || typeof params.hookType !== \"string\") {\n throw new Error(\"Invalid hooks invoke payload\");\n }\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n throw new Error(`Session not found: ${params.sessionId}`);\n }\n const output = await session._handleHooksInvoke(params.hookType, params.input);\n return { output };\n }\n // ========================================================================\n // Protocol v2 backward-compatibility adapters\n // ========================================================================\n /**\n * Handles a v2-style tool.call RPC request from the server.\n * Looks up the session and tool handler, executes it, and returns the result\n * in the v2 response format.\n */\n async handleToolCallRequestV2(params) {\n if (!params || typeof params.sessionId !== \"string\" || typeof params.toolCallId !== \"string\" || typeof params.toolName !== \"string\") {\n throw new Error(\"Invalid tool call payload\");\n }\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n throw new Error(`Unknown session ${params.sessionId}`);\n }\n const handler = session.getToolHandler(params.toolName);\n if (!handler) {\n return {\n result: {\n textResultForLlm: `Tool '${params.toolName}' is not supported by this client instance.`,\n resultType: \"failure\",\n error: `tool '${params.toolName}' not supported`,\n toolTelemetry: {}\n }\n };\n }\n try {\n const invocation = {\n sessionId: params.sessionId,\n toolCallId: params.toolCallId,\n toolName: params.toolName,\n arguments: params.arguments\n };\n const result = await handler(params.arguments, invocation);\n return { result: this.normalizeToolResultV2(result) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n result: {\n textResultForLlm: \"Invoking this tool produced an error. Detailed information is not available.\",\n resultType: \"failure\",\n error: message,\n toolTelemetry: {}\n }\n };\n }\n }\n /**\n * Handles a v2-style permission.request RPC request from the server.\n */\n async handlePermissionRequestV2(params) {\n if (!params || typeof params.sessionId !== \"string\" || !params.permissionRequest) {\n throw new Error(\"Invalid permission request payload\");\n }\n const session = this.sessions.get(params.sessionId);\n if (!session) {\n throw new Error(`Session not found: ${params.sessionId}`);\n }\n try {\n const result = await session._handlePermissionRequestV2(params.permissionRequest);\n return { result };\n } catch (_error) {\n return {\n result: {\n kind: \"denied-no-approval-rule-and-could-not-request-from-user\"\n }\n };\n }\n }\n normalizeToolResultV2(result) {\n if (result === void 0 || result === null) {\n return {\n textResultForLlm: \"Tool returned no result\",\n resultType: \"failure\",\n error: \"tool returned no result\",\n toolTelemetry: {}\n };\n }\n if (this.isToolResultObject(result)) {\n return result;\n }\n const textResult = typeof result === \"string\" ? result : JSON.stringify(result);\n return {\n textResultForLlm: textResult,\n resultType: \"success\",\n toolTelemetry: {}\n };\n }\n isToolResultObject(value) {\n return typeof value === \"object\" && value !== null && \"textResultForLlm\" in value && typeof value.textResultForLlm === \"string\" && \"resultType\" in value;\n }\n /**\n * Attempt to reconnect to the server\n */\n async reconnect() {\n this.state = \"disconnected\";\n try {\n await this.stop();\n await this.start();\n } catch (_error) {\n }\n }\n}\nexport {\n CopilotClient\n};\n","function defineTool(name, config) {\n return { name, ...config };\n}\nconst approveAll = () => ({ kind: \"approved\" });\nexport {\n approveAll,\n defineTool\n};\n","import { CopilotClient } from \"./client.js\";\nimport { CopilotSession } from \"./session.js\";\nimport { defineTool, approveAll } from \"./types.js\";\nexport {\n CopilotClient,\n CopilotSession,\n approveAll,\n defineTool\n};\n","import { createRequire } from \"node:module\";\n\nimport { DEFAULT_MODEL, DEFAULT_JUDGE_MODEL } from \"@agentrc/core/config\";\nimport { Argument, Command } from \"commander\";\n\nimport { analyzeCommand } from \"./commands/analyze\";\nimport { batchCommand } from \"./commands/batch\";\nimport { batchReadinessCommand } from \"./commands/batchReadiness\";\nimport { evalCommand } from \"./commands/eval\";\nimport { generateCommand } from \"./commands/generate\";\nimport { initCommand } from \"./commands/init\";\nimport { instructionsCommand } from \"./commands/instructions\";\nimport { prCommand } from \"./commands/pr\";\nimport { readinessCommand } from \"./commands/readiness\";\nimport { tuiCommand } from \"./commands/tui\";\n\nconst _require = createRequire(import.meta.url);\nexport const CLI_VERSION = (_require(\"../package.json\") as { version: string }).version;\n\n/**\n * Merge program-level --json/--quiet into each command's local options\n * so every action handler receives a unified options object.\n */\nexport function withGlobalOpts<TArgs extends unknown[], TOptions extends Record<string, unknown>>(\n fn: (...args: [...TArgs, TOptions]) => Promise<void>\n): (...raw: unknown[]) => Promise<void> {\n return async (...raw: unknown[]) => {\n const cmd = raw[raw.length - 1] as Command;\n const localOpts = raw[raw.length - 2] as TOptions;\n const globalOpts = cmd.optsWithGlobals();\n const merged = {\n ...localOpts,\n json: globalOpts.json,\n quiet: globalOpts.quiet,\n accessible: globalOpts.accessible ?? false\n } as TOptions;\n raw[raw.length - 2] = merged;\n raw.pop(); // remove Command\n await (fn as (...args: unknown[]) => Promise<void>)(...raw);\n };\n}\n\nexport function runCli(argv: string[]): void {\n const program = new Command();\n\n program\n .name(\"agentrc\")\n .description(\"Set up repositories for AI-assisted development\")\n .version(CLI_VERSION)\n .option(\"--json\", \"Output machine-readable JSON to stdout\")\n .option(\"--quiet\", \"Suppress stderr progress output\")\n .option(\"--accessible\", \"Enable screen reader friendly output\");\n\n program\n .command(\"init\")\n .description(\"Interactive repo setup — analyze, generate instructions and configs\")\n .argument(\"[path]\", \"Path to a local repository\")\n .option(\"--github\", \"Use a GitHub repository\")\n .option(\"--provider <provider>\", \"Repo provider (github|azure)\")\n .option(\"--yes\", \"Accept defaults (generates instructions, MCP, and VS Code configs)\")\n .option(\"--force\", \"Overwrite existing files\")\n .option(\"--model <name>\", \"Model for instructions generation\", DEFAULT_MODEL)\n .action(withGlobalOpts(initCommand));\n\n program\n .command(\"analyze\")\n .description(\"Detect languages, frameworks, monorepo structure, and areas\")\n .argument(\"[path]\", \"Path to a local repository\")\n .option(\"--output <path>\", \"Write report to file (.json or .md)\")\n .option(\"--force\", \"Overwrite existing output file\")\n .action(withGlobalOpts(analyzeCommand));\n\n program\n .command(\"generate\")\n .description(\"Generate instructions, agents, MCP, or VS Code configs\")\n .addArgument(\n new Argument(\"<type>\", \"Config type to generate\").choices([\n \"instructions\",\n \"agents\",\n \"mcp\",\n \"vscode\"\n ])\n )\n .argument(\"[path]\", \"Path to a local repository\")\n .option(\"--force\", \"Overwrite existing files\")\n .option(\"--per-app\", \"Generate per-app in monorepos\")\n .option(\"--model <name>\", \"Model for instructions generation\", DEFAULT_MODEL)\n .option(\"--strategy <mode>\", \"Instruction strategy (flat or nested)\")\n .action(withGlobalOpts(generateCommand));\n\n program\n .command(\"pr\")\n .description(\"Create a PR with generated configs on GitHub or Azure DevOps\")\n .argument(\"[repo]\", \"Repo identifier (github: owner/name, azure: org/project/repo)\")\n .option(\"--branch <name>\", \"Branch name\")\n .option(\"--provider <provider>\", \"Repo provider (github|azure)\")\n .option(\"--model <name>\", \"Model for instructions generation\", DEFAULT_MODEL)\n .action(withGlobalOpts(prCommand));\n\n program\n .command(\"eval\")\n .description(\"Compare AI responses with and without instructions\")\n .argument(\"[path]\", \"Path to eval config JSON\")\n .option(\"--repo <path>\", \"Repository path\", process.cwd())\n .option(\"--model <name>\", \"Model for responses\", DEFAULT_MODEL)\n .option(\"--judge-model <name>\", \"Model for judging\", DEFAULT_JUDGE_MODEL)\n .option(\"--list-models\", \"List Copilot CLI models and exit\")\n .option(\"--output <path>\", \"Write results JSON to file\")\n .option(\"--init\", \"Create a starter agentrc.eval.json file\")\n .option(\"--count <number>\", \"Number of eval cases to generate (with --init)\")\n .option(\"--fail-level <number>\", \"Exit with error if pass rate (%) falls below threshold\")\n .action(withGlobalOpts(evalCommand));\n\n program\n .command(\"tui\")\n .description(\"Interactive terminal UI for generation, evaluation, and batch workflows\")\n .option(\"--repo <path>\", \"Repository path\", process.cwd())\n .option(\"--no-animation\", \"Skip the animated banner intro\")\n .action(withGlobalOpts(tuiCommand));\n\n program\n .command(\"instructions\")\n .description(\"Generate root and per-area AI instruction files\")\n .option(\"--repo <path>\", \"Repository path\", process.cwd())\n .option(\"--output <path>\", \"Output path for copilot instructions\")\n .option(\"--model <name>\", \"Model for instructions generation\", DEFAULT_MODEL)\n .option(\"--force\", \"Overwrite existing area instruction files\")\n .option(\"--areas\", \"Also generate file-based instructions for detected areas\")\n .option(\"--areas-only\", \"Generate only file-based area instructions (skip root)\")\n .option(\"--area <name>\", \"Generate file-based instructions for a specific area\")\n .option(\"--strategy <mode>\", \"Instruction strategy (flat or nested)\")\n .option(\"--claude-md\", \"Generate CLAUDE.md files alongside AGENTS.md (nested strategy)\")\n .action(withGlobalOpts(instructionsCommand));\n\n program\n .command(\"readiness\")\n .description(\"AI readiness assessment across 9 maturity pillars\")\n .argument(\"[path]\", \"Path to a local repository\")\n .option(\"--output <path>\", \"Write report to file (.json, .md, or .html)\")\n .option(\"--force\", \"Overwrite existing output file\")\n .option(\"--visual\", \"Generate visual HTML report\")\n .option(\"--per-area\", \"Show per-area readiness breakdown\")\n .option(\"--policy <sources>\", \"Policy sources (comma-separated: paths, npm packages)\")\n .option(\"--fail-level <number>\", \"Exit with error if readiness level is below threshold (1–5)\")\n .action(withGlobalOpts(readinessCommand));\n\n program\n .command(\"batch\")\n .description(\"Batch process multiple repos across orgs\")\n .argument(\"[repos...]\", \"Repos in owner/name form (GitHub) or org/project/repo (Azure)\")\n .option(\"--output <path>\", \"Write results JSON to file\")\n .option(\"--provider <provider>\", \"Repo provider (github|azure)\", \"github\")\n .option(\"--model <name>\", \"Model for instructions generation\", DEFAULT_MODEL)\n .option(\"--branch <name>\", \"Branch name for PRs\")\n .action(withGlobalOpts(batchCommand));\n\n program\n .command(\"batch-readiness\")\n .description(\"Generate batch AI readiness report for multiple repos\")\n .option(\"--output <path>\", \"Write HTML report to file\")\n .option(\"--policy <sources>\", \"Policy sources (comma-separated: paths, npm packages)\")\n .action(withGlobalOpts(batchReadinessCommand));\n\n program.parse(argv);\n}\n","export const DEFAULT_MODEL = \"claude-sonnet-4.6\";\nexport const DEFAULT_JUDGE_MODEL = \"claude-sonnet-4.6\";\n","import path from \"path\";\n\nimport type { RepoAnalysis } from \"@agentrc/core/services/analyzer\";\nimport { analyzeRepo } from \"@agentrc/core/services/analyzer\";\nimport { safeWriteFile } from \"@agentrc/core/utils/fs\";\nimport { prettyPrintSummary } from \"@agentrc/core/utils/logger\";\nimport type { CommandResult } from \"@agentrc/core/utils/output\";\nimport { outputResult, outputError, shouldLog } from \"@agentrc/core/utils/output\";\nimport chalk from \"chalk\";\n\ntype AnalyzeOptions = {\n json?: boolean;\n quiet?: boolean;\n output?: string;\n force?: boolean;\n};\n\nexport async function analyzeCommand(\n repoPathArg: string | undefined,\n options: AnalyzeOptions\n): Promise<void> {\n const repoPath = path.resolve(repoPathArg ?? process.cwd());\n\n try {\n const analysis = await analyzeRepo(repoPath);\n\n // Write to file when --output is specified\n if (options.output) {\n const outputPath = path.resolve(options.output);\n const ext = path.extname(outputPath).toLowerCase();\n if (ext !== \".json\" && ext !== \".md\") {\n outputError(\n `Unsupported output format: ${ext || \"(no extension)\"}. Use .json or .md`,\n Boolean(options.json)\n );\n return;\n }\n const content =\n ext === \".md\" ? formatAnalysisMarkdown(analysis) : JSON.stringify(analysis, null, 2);\n\n const { wrote, reason } = await safeWriteFile(outputPath, content, Boolean(options.force));\n if (!wrote) {\n const why = reason === \"symlink\" ? \"path is a symlink\" : \"file exists (use --force)\";\n outputError(`Skipped ${outputPath}: ${why}`, Boolean(options.json));\n return;\n }\n if (options.json) {\n const result: CommandResult<typeof analysis> = {\n ok: true,\n status: \"success\",\n data: analysis\n };\n outputResult(result, true);\n return;\n }\n if (shouldLog(options)) {\n process.stderr.write(chalk.green(`✓ Report saved: ${outputPath}`) + \"\\n\");\n }\n return;\n }\n\n if (options.json) {\n const result: CommandResult<typeof analysis> = {\n ok: true,\n status: \"success\",\n data: analysis\n };\n outputResult(result, true);\n } else if (shouldLog(options)) {\n prettyPrintSummary(analysis);\n }\n } catch (error) {\n outputError(error instanceof Error ? error.message : String(error), Boolean(options.json));\n }\n}\n\nexport function formatAnalysisMarkdown(analysis: RepoAnalysis): string {\n const lines: string[] = [];\n const repoName = path.basename(analysis.path);\n\n lines.push(`# Repository Analysis: ${repoName}`);\n lines.push(\"\");\n lines.push(\"## Overview\");\n lines.push(\"\");\n lines.push(`| Property | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Path | \\`${analysis.path}\\` |`);\n lines.push(`| Git repository | ${analysis.isGitRepo ? \"Yes\" : \"No\"} |`);\n lines.push(`| Languages | ${analysis.languages.join(\", \") || \"Unknown\"} |`);\n lines.push(`| Frameworks | ${analysis.frameworks.join(\", \") || \"None detected\"} |`);\n lines.push(`| Package manager | ${analysis.packageManager ?? \"Unknown\"} |`);\n if (analysis.isMonorepo) {\n lines.push(\n `| Monorepo | ${analysis.workspaceType ?? \"yes\"} (${analysis.apps?.length ?? 0} apps) |`\n );\n }\n\n if (analysis.apps && analysis.apps.length > 0) {\n lines.push(\"\");\n lines.push(\"## Applications\");\n lines.push(\"\");\n lines.push(\"| Name | Ecosystem | TypeScript | Path |\");\n lines.push(\"| --- | --- | --- | --- |\");\n for (const app of analysis.apps) {\n const rel = path.relative(analysis.path, app.path).replace(/\\\\/gu, \"/\") || \".\";\n lines.push(\n `| ${app.name} | ${app.ecosystem ?? \"—\"} | ${app.hasTsConfig ? \"Yes\" : \"No\"} | \\`${rel}\\` |`\n );\n }\n }\n\n if (analysis.areas && analysis.areas.length > 0) {\n lines.push(\"\");\n lines.push(\"## Areas\");\n lines.push(\"\");\n lines.push(\"| Name | Source | Pattern |\");\n lines.push(\"| --- | --- | --- |\");\n for (const area of analysis.areas) {\n const pattern = Array.isArray(area.applyTo) ? area.applyTo.join(\", \") : area.applyTo;\n lines.push(`| ${area.name} | ${area.source} | \\`${pattern}\\` |`);\n }\n }\n\n lines.push(\"\");\n lines.push(`---`);\n lines.push(`*Generated by [AgentRC](https://github.com/microsoft/agentrc)*`);\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport fg from \"fast-glob\";\n\nimport { fileExists, safeReadDir, readJson } from \"../utils/fs\";\n\nexport type RepoApp = {\n name: string;\n path: string;\n ecosystem?: \"node\" | \"rust\" | \"go\" | \"dotnet\" | \"java\" | \"python\" | \"ruby\" | \"php\";\n manifestPath?: string;\n packageJsonPath: string;\n scripts: Record<string, string>;\n hasTsConfig: boolean;\n};\n\nexport type Area = {\n name: string;\n description?: string;\n applyTo: string | string[];\n path?: string;\n ecosystem?: RepoApp[\"ecosystem\"];\n source: \"auto\" | \"config\";\n scripts?: Record<string, string>;\n hasTsConfig?: boolean;\n parentArea?: string;\n workingDirectory?: string;\n};\n\nexport type RepoAnalysis = {\n path: string;\n isGitRepo: boolean;\n languages: string[];\n frameworks: string[];\n packageManager?: string;\n isMonorepo?: boolean;\n workspaceType?:\n | \"npm\"\n | \"pnpm\"\n | \"yarn\"\n | \"cargo\"\n | \"go\"\n | \"dotnet\"\n | \"gradle\"\n | \"maven\"\n | \"bazel\"\n | \"nx\"\n | \"pants\"\n | \"turborepo\";\n workspacePatterns?: string[];\n apps?: RepoApp[];\n areas?: Area[];\n};\n\nconst PACKAGE_MANAGERS: Array<{ file: string; name: string }> = [\n { file: \"pnpm-lock.yaml\", name: \"pnpm\" },\n { file: \"yarn.lock\", name: \"yarn\" },\n { file: \"package-lock.json\", name: \"npm\" },\n { file: \"bun.lockb\", name: \"bun\" }\n];\n\nexport async function analyzeRepo(repoPath: string): Promise<RepoAnalysis> {\n const files = await safeReadDir(repoPath);\n let isGit = false;\n try {\n await fs.access(path.join(repoPath, \".git\"));\n isGit = true;\n } catch {\n // not a git repo\n }\n const analysis: RepoAnalysis = {\n path: repoPath,\n isGitRepo: isGit,\n languages: [],\n frameworks: []\n };\n\n const hasPackageJson = files.includes(\"package.json\");\n const hasTsConfig = files.includes(\"tsconfig.json\");\n const hasPyProject = files.includes(\"pyproject.toml\");\n const hasRequirements = files.includes(\"requirements.txt\");\n const hasGoMod = files.includes(\"go.mod\");\n const hasCargo = files.includes(\"Cargo.toml\");\n const hasCsproj = files.some(\n (f) => f.endsWith(\".csproj\") || f.endsWith(\".sln\") || f.endsWith(\".slnx\")\n );\n const hasPomXml = files.includes(\"pom.xml\");\n const hasBuildGradle = files.includes(\"build.gradle\") || files.includes(\"build.gradle.kts\");\n const hasGemfile = files.includes(\"Gemfile\");\n const hasComposerJson = files.includes(\"composer.json\");\n const hasCMakeLists = files.includes(\"CMakeLists.txt\");\n const hasMakefile = files.includes(\"Makefile\") || files.includes(\"GNUmakefile\");\n const hasMesonBuild = files.includes(\"meson.build\");\n const hasConfigure = files.includes(\"configure\") || files.includes(\"configure.ac\");\n const hasMozBuild = files.includes(\"moz.build\");\n\n if (hasPackageJson) analysis.languages.push(\"JavaScript\");\n if (hasTsConfig) analysis.languages.push(\"TypeScript\");\n if (hasPyProject || hasRequirements) analysis.languages.push(\"Python\");\n if (hasGoMod) analysis.languages.push(\"Go\");\n if (hasCargo) analysis.languages.push(\"Rust\");\n if (hasCsproj) analysis.languages.push(\"C#\");\n if (hasPomXml || hasBuildGradle) analysis.languages.push(\"Java\");\n if (hasGemfile) analysis.languages.push(\"Ruby\");\n if (hasComposerJson) analysis.languages.push(\"PHP\");\n if (hasCMakeLists || hasMesonBuild || hasConfigure || hasMozBuild) analysis.languages.push(\"C++\");\n if (hasMakefile && !analysis.languages.length) analysis.languages.push(\"C\");\n\n analysis.packageManager = await detectPackageManager(repoPath, files);\n\n let rootPackageJson: Record<string, unknown> | undefined;\n\n if (hasPackageJson) {\n rootPackageJson = await readJson(path.join(repoPath, \"package.json\"));\n const deps = Object.keys({\n ...(rootPackageJson?.dependencies ?? {}),\n ...(rootPackageJson?.devDependencies ?? {})\n });\n analysis.frameworks.push(...detectFrameworks(deps, files));\n }\n\n const workspace = await detectWorkspace(repoPath, files, rootPackageJson);\n if (workspace) {\n analysis.workspaceType = workspace.type;\n analysis.workspacePatterns = workspace.patterns;\n }\n\n let apps = await resolveWorkspaceApps(repoPath, workspace?.patterns ?? [], rootPackageJson);\n\n // If JS workspace didn't find multiple apps, try non-JS monorepo detection\n if (apps.length <= 1) {\n const nonJs = await detectNonJsMonorepo(repoPath, files);\n if (nonJs.apps.length > 1) {\n apps = nonJs.apps;\n if (nonJs.type) analysis.workspaceType = nonJs.type;\n if (nonJs.patterns) analysis.workspacePatterns = nonJs.patterns;\n }\n }\n\n if (workspace && files.includes(\"turbo.json\") && apps.length > 1) {\n analysis.workspaceType = \"turborepo\";\n }\n\n if (files.includes(\"nx.json\") && apps.length > 1 && analysis.workspaceType !== \"turborepo\") {\n analysis.workspaceType = \"nx\";\n }\n\n analysis.apps = apps;\n analysis.isMonorepo = apps.length > 1;\n\n analysis.languages = unique(analysis.languages);\n analysis.frameworks = unique(analysis.frameworks);\n\n // Detect areas from apps and folder heuristics\n analysis.areas = await detectAreas(repoPath, analysis);\n\n return analysis;\n}\n\nasync function detectPackageManager(\n _repoPath: string,\n files: string[]\n): Promise<string | undefined> {\n for (const manager of PACKAGE_MANAGERS) {\n if (files.includes(manager.file)) return manager.name;\n }\n\n if (files.includes(\"package.json\")) return \"npm\";\n if (files.includes(\"pyproject.toml\")) return \"pip\";\n if (files.includes(\"Cargo.toml\")) return \"cargo\";\n if (files.includes(\"go.mod\")) return \"go\";\n if (files.includes(\"pom.xml\")) return \"maven\";\n if (files.includes(\"build.gradle\") || files.includes(\"build.gradle.kts\")) return \"gradle\";\n if (files.includes(\"Gemfile\")) return \"bundler\";\n if (files.includes(\"composer.json\")) return \"composer\";\n if (files.some((f) => f.endsWith(\".sln\") || f.endsWith(\".slnx\"))) return \"nuget\";\n if (\n files.includes(\"MODULE.bazel\") ||\n files.includes(\"WORKSPACE\") ||\n files.includes(\"WORKSPACE.bazel\")\n )\n return \"bazel\";\n if (files.includes(\"pants.toml\")) return \"pants\";\n if (files.includes(\"nx.json\")) return \"nx\";\n return undefined;\n}\n\nfunction detectFrameworks(deps: string[], files: string[]): string[] {\n const frameworks: string[] = [];\n const hasFile = (file: string): boolean => files.includes(file);\n\n if (deps.includes(\"next\") || hasFile(\"next.config.js\") || hasFile(\"next.config.mjs\"))\n frameworks.push(\"Next.js\");\n if (deps.includes(\"react\") || deps.includes(\"react-dom\")) frameworks.push(\"React\");\n if (deps.includes(\"vue\") || hasFile(\"vue.config.js\")) frameworks.push(\"Vue\");\n if (deps.includes(\"@angular/core\") || hasFile(\"angular.json\")) frameworks.push(\"Angular\");\n if (deps.includes(\"svelte\") || hasFile(\"svelte.config.js\")) frameworks.push(\"Svelte\");\n if (deps.includes(\"express\")) frameworks.push(\"Express\");\n if (deps.includes(\"@nestjs/core\")) frameworks.push(\"NestJS\");\n if (deps.includes(\"fastify\")) frameworks.push(\"Fastify\");\n\n return frameworks;\n}\n\nasync function safeReadFile(filePath: string): Promise<string | undefined> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\nasync function isScannableDirectory(repoPath: string, candidatePath: string): Promise<boolean> {\n try {\n const stat = await fs.lstat(candidatePath);\n if (stat.isSymbolicLink() || !stat.isDirectory()) return false;\n\n const resolvedRoot = await fs.realpath(repoPath).catch(() => path.resolve(repoPath));\n const resolvedCandidate = await fs\n .realpath(candidatePath)\n .catch(() => path.resolve(candidatePath));\n\n return (\n resolvedCandidate === resolvedRoot || resolvedCandidate.startsWith(resolvedRoot + path.sep)\n );\n } catch {\n return false;\n }\n}\n\ntype WorkspaceConfig = {\n type: \"npm\" | \"pnpm\" | \"yarn\";\n patterns: string[];\n};\n\nasync function detectWorkspace(\n repoPath: string,\n files: string[],\n packageJson?: Record<string, unknown>\n): Promise<WorkspaceConfig | undefined> {\n if (files.includes(\"pnpm-workspace.yaml\")) {\n const patterns = await readPnpmWorkspace(path.join(repoPath, \"pnpm-workspace.yaml\"));\n if (patterns.length) return { type: \"pnpm\", patterns };\n }\n\n const workspaces = packageJson?.workspaces;\n if (Array.isArray(workspaces)) {\n return { type: files.includes(\"yarn.lock\") ? \"yarn\" : \"npm\", patterns: workspaces.map(String) };\n }\n\n if (workspaces && typeof workspaces === \"object\") {\n const packages = (workspaces as { packages?: unknown }).packages;\n if (Array.isArray(packages)) {\n return { type: files.includes(\"yarn.lock\") ? \"yarn\" : \"npm\", patterns: packages.map(String) };\n }\n }\n\n return undefined;\n}\n\nasync function readPnpmWorkspace(filePath: string): Promise<string[]> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n const lines = raw.split(/\\r?\\n/u);\n const patterns: string[] = [];\n let inPackages = false;\n for (const line of lines) {\n // Skip comment-only lines\n if (/^\\s*#/u.test(line)) continue;\n if (!inPackages && /^\\s*packages\\s*:/u.test(line)) {\n // Handle inline array: packages: [\"apps/*\", \"libs/*\"]\n const inline = line.match(/packages\\s*:\\s*\\[([^\\]]+)\\]/u);\n if (inline) {\n const items = inline[1].split(\",\").map((s) => s.trim().replace(/^['\"]|['\"]$/gu, \"\"));\n return items.filter(Boolean);\n }\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const match = line.match(/^\\s*-\\s*(.+)$/u);\n if (match?.[1]) {\n // Strip trailing comments and quotes\n const value = match[1]\n .split(\"#\")[0]\n .trim()\n .replace(/^['\"]|['\"]$/gu, \"\");\n if (value) patterns.push(value);\n continue;\n }\n // Non-indented, non-empty line means a new top-level key\n if (/^\\S/u.test(line) && line.trim()) break;\n }\n }\n return patterns;\n } catch {\n return [];\n }\n}\n\nasync function resolveWorkspaceApps(\n repoPath: string,\n patterns: string[],\n rootPackageJson?: Record<string, unknown>\n): Promise<RepoApp[]> {\n const workspacePatterns = patterns\n .map((pattern) => pattern.replace(/\\\\/gu, \"/\"))\n .map((pattern) =>\n pattern.endsWith(\"package.json\") ? pattern : path.posix.join(pattern, \"package.json\")\n );\n\n const packageJsonPaths = workspacePatterns.length\n ? (\n await fg(workspacePatterns, { cwd: repoPath, absolute: true, onlyFiles: true, dot: false })\n ).map((p) => path.normalize(p))\n : [];\n\n if (!packageJsonPaths.length && rootPackageJson) {\n const rootPath = path.join(repoPath, \"package.json\");\n return [await buildRepoApp(repoPath, rootPath, rootPackageJson)];\n }\n\n const apps = await Promise.all(\n packageJsonPaths.map(async (pkgPath) => {\n const pkg = await readJson(pkgPath);\n return buildRepoApp(path.dirname(pkgPath), pkgPath, pkg);\n })\n );\n\n return apps.filter(Boolean) as RepoApp[];\n}\n\nasync function buildRepoApp(\n appPath: string,\n packageJsonPath: string,\n packageJson?: Record<string, unknown>\n): Promise<RepoApp> {\n const scripts = (packageJson?.scripts ?? {}) as Record<string, string>;\n const name = typeof packageJson?.name === \"string\" ? packageJson.name : path.basename(appPath);\n const hasTsConfig = await fileExists(path.join(appPath, \"tsconfig.json\"));\n\n return {\n name,\n path: appPath,\n ecosystem: \"node\",\n manifestPath: packageJsonPath,\n packageJsonPath,\n scripts,\n hasTsConfig\n };\n}\n\nfunction buildNonJsApp(\n name: string,\n appPath: string,\n ecosystem: RepoApp[\"ecosystem\"],\n manifestPath: string\n): RepoApp {\n return {\n name,\n path: appPath,\n ecosystem,\n manifestPath,\n packageJsonPath: \"\",\n scripts: {},\n hasTsConfig: false\n };\n}\n\n// ─── Non-JS monorepo detection ───\n\ntype NonJsMonorepoResult = {\n type?: RepoAnalysis[\"workspaceType\"];\n patterns?: string[];\n apps: RepoApp[];\n};\n\nasync function detectNonJsMonorepo(\n repoPath: string,\n files: string[]\n): Promise<NonJsMonorepoResult> {\n const cargoApps = await detectCargoWorkspace(repoPath);\n if (cargoApps.length > 1) return { type: \"cargo\", apps: cargoApps };\n\n const goApps = await detectGoWorkspace(repoPath);\n if (goApps.length > 1) return { type: \"go\", apps: goApps };\n\n const dotnetApps = await detectDotnetSolution(repoPath, files);\n if (dotnetApps.length > 1) return { type: \"dotnet\", apps: dotnetApps };\n\n const gradleApps = await detectGradleMultiProject(repoPath, files);\n if (gradleApps.length > 1) return { type: \"gradle\", apps: gradleApps };\n\n const mavenApps = await detectMavenMultiModule(repoPath);\n if (mavenApps.length > 1) return { type: \"maven\", apps: mavenApps };\n\n const bazelApps = await detectBazelWorkspace(repoPath, files);\n if (bazelApps.length > 1) return { type: \"bazel\", apps: bazelApps };\n\n const nxApps = await detectNxWorkspace(repoPath, files);\n if (nxApps.length > 1) return { type: \"nx\", apps: nxApps };\n\n const pantsApps = await detectPantsWorkspace(repoPath, files);\n if (pantsApps.length > 1) return { type: \"pants\", apps: pantsApps };\n\n return { apps: [] };\n}\n\nasync function detectCargoWorkspace(repoPath: string): Promise<RepoApp[]> {\n const content = await safeReadFile(path.join(repoPath, \"Cargo.toml\"));\n if (!content) return [];\n\n // Extract [workspace] section up to the next section header\n const workspaceSection = content.match(/\\[workspace\\]([\\s\\S]*?)(?:\\n\\[|$)/u);\n if (!workspaceSection) return [];\n\n const membersMatch = workspaceSection[1].match(/members\\s*=\\s*\\[([\\s\\S]*?)\\]/u);\n if (!membersMatch) return [];\n\n const patterns = [...membersMatch[1].matchAll(/\"([^\"]+)\"/gu)].map((m) => m[1]);\n if (!patterns.length) return [];\n\n const tomlPaths = (\n await fg(\n patterns.map((p) => path.posix.join(p, \"Cargo.toml\")),\n { cwd: repoPath, absolute: true, onlyFiles: true }\n )\n ).map((p) => path.normalize(p));\n\n return Promise.all(\n tomlPaths.map(async (tomlPath) => {\n const dir = path.dirname(tomlPath);\n const toml = await safeReadFile(tomlPath);\n const nameMatch = toml?.match(/^\\s*name\\s*=\\s*\"([^\"]+)\"/mu);\n return buildNonJsApp(nameMatch?.[1] ?? path.basename(dir), dir, \"rust\", tomlPath);\n })\n );\n}\n\nasync function detectGoWorkspace(repoPath: string): Promise<RepoApp[]> {\n const content = await safeReadFile(path.join(repoPath, \"go.work\"));\n if (!content) return [];\n\n const modules: string[] = [];\n\n // Block form: use ( ./cmd/server \\n ./pkg/lib )\n const blockMatch = content.match(/use\\s*\\(([\\s\\S]*?)\\)/u);\n if (blockMatch) {\n for (const line of blockMatch[1].split(/\\r?\\n/u)) {\n const trimmed = line.replace(/\\/\\/.*$/u, \"\").trim();\n if (trimmed) modules.push(trimmed);\n }\n }\n\n // Single-line form: use ./cmd/server\n for (const match of content.matchAll(/^use\\s+(\\S+)\\s*$/gmu)) {\n modules.push(match[1]);\n }\n\n const apps: RepoApp[] = [];\n for (const mod of modules) {\n const modPath = path.resolve(repoPath, mod);\n const goModPath = path.join(modPath, \"go.mod\");\n if (!(await fileExists(goModPath))) continue;\n\n const goMod = await safeReadFile(goModPath);\n const nameMatch = goMod?.match(/^module\\s+(\\S+)/mu);\n const shortName = nameMatch?.[1]?.split(\"/\").pop() ?? path.basename(modPath);\n apps.push(buildNonJsApp(shortName, modPath, \"go\", goModPath));\n }\n\n return apps;\n}\n\nasync function detectDotnetSolution(repoPath: string, files: string[]): Promise<RepoApp[]> {\n // Prefer .slnx (newer XML format) over .sln (legacy text format)\n const slnxFile = files.find((f) => f.endsWith(\".slnx\"));\n if (slnxFile) {\n return detectSlnxProjects(repoPath, slnxFile);\n }\n\n const slnFile = files.find((f) => f.endsWith(\".sln\"));\n if (!slnFile) return [];\n\n const content = await safeReadFile(path.join(repoPath, slnFile));\n if (!content) return [];\n\n // Match: Project(\"{guid}\") = \"Name\", \"path\\to\\Project.csproj\", \"{guid}\"\n const projectRegex = /Project\\(\"[^\"]*\"\\)\\s*=\\s*\"([^\"]+)\",\\s*\"([^\"]+\\.(?:cs|fs|vb)proj)\"/giu;\n const apps: RepoApp[] = [];\n\n for (const match of content.matchAll(projectRegex)) {\n const name = match[1];\n const projRelPath = match[2].replace(/\\\\/gu, \"/\");\n const projPath = path.resolve(repoPath, projRelPath);\n const appDir = path.dirname(projPath);\n\n if (await fileExists(projPath)) {\n apps.push(buildNonJsApp(name, appDir, \"dotnet\", projPath));\n }\n }\n\n return apps;\n}\n\nasync function detectSlnxProjects(repoPath: string, slnxFile: string): Promise<RepoApp[]> {\n const content = await safeReadFile(path.join(repoPath, slnxFile));\n if (!content) return [];\n\n // Match: <Project Path=\"path/to/Project.csproj\" /> (with optional extra attributes)\n const projectRegex = /<Project\\s[^>]*Path=\"([^\"]+\\.(?:cs|fs|vb)proj)\"[^>]*\\/>/giu;\n const apps: RepoApp[] = [];\n\n for (const match of content.matchAll(projectRegex)) {\n const projRelPath = match[1].replace(/\\\\/gu, \"/\");\n const projPath = path.resolve(repoPath, projRelPath);\n const appDir = path.dirname(projPath);\n const name = path.basename(appDir);\n\n if (await fileExists(projPath)) {\n apps.push(buildNonJsApp(name, appDir, \"dotnet\", projPath));\n }\n }\n\n return apps;\n}\n\nasync function detectGradleMultiProject(repoPath: string, files: string[]): Promise<RepoApp[]> {\n const settingsFile = files.includes(\"settings.gradle.kts\")\n ? \"settings.gradle.kts\"\n : files.includes(\"settings.gradle\")\n ? \"settings.gradle\"\n : null;\n if (!settingsFile) return [];\n\n const content = await safeReadFile(path.join(repoPath, settingsFile));\n if (!content) return [];\n\n // Extract all Gradle project references (':app', ':lib:core') from the file\n const projectNames: string[] = [];\n for (const match of content.matchAll(/['\"](:(?:[\\w.-]+:)*[\\w.-]+)['\"]/gu)) {\n projectNames.push(match[1].replace(/^:/u, \"\").replace(/:/gu, \"/\"));\n }\n\n const uniqueProjects = [...new Set(projectNames)];\n const apps: RepoApp[] = [];\n\n for (const project of uniqueProjects) {\n const projectDir = path.resolve(repoPath, project);\n const ktsPath = path.join(projectDir, \"build.gradle.kts\");\n const groovyPath = path.join(projectDir, \"build.gradle\");\n\n const buildFile = (await fileExists(ktsPath))\n ? ktsPath\n : (await fileExists(groovyPath))\n ? groovyPath\n : null;\n\n if (buildFile) {\n apps.push(buildNonJsApp(path.basename(project), projectDir, \"java\", buildFile));\n }\n }\n\n return apps;\n}\n\nasync function detectMavenMultiModule(repoPath: string): Promise<RepoApp[]> {\n const content = await safeReadFile(path.join(repoPath, \"pom.xml\"));\n if (!content) return [];\n\n const apps: RepoApp[] = [];\n for (const match of content.matchAll(/<module>([^<]+)<\\/module>/gu)) {\n const modName = match[1].trim();\n const modDir = path.resolve(repoPath, modName);\n const pomPath = path.join(modDir, \"pom.xml\");\n\n if (await fileExists(pomPath)) {\n apps.push(buildNonJsApp(path.basename(modName), modDir, \"java\", pomPath));\n }\n }\n\n return apps;\n}\n\nasync function detectBazelWorkspace(repoPath: string, files: string[]): Promise<RepoApp[]> {\n const hasBazel =\n files.includes(\"MODULE.bazel\") ||\n files.includes(\"WORKSPACE\") ||\n files.includes(\"WORKSPACE.bazel\");\n if (!hasBazel) return [];\n\n // Scan first-level directories for BUILD / BUILD.bazel files\n const entries = await safeReadDir(repoPath);\n const apps: RepoApp[] = [];\n\n for (const entry of entries) {\n if (entry.startsWith(\".\")) continue;\n const fullPath = path.join(repoPath, entry);\n if (!(await isScannableDirectory(repoPath, fullPath))) continue;\n const children = await safeReadDir(fullPath);\n const buildFile = children.includes(\"BUILD\")\n ? \"BUILD\"\n : children.includes(\"BUILD.bazel\")\n ? \"BUILD.bazel\"\n : undefined;\n if (!buildFile) continue;\n\n apps.push(buildNonJsApp(entry, fullPath, undefined, path.join(fullPath, buildFile)));\n }\n\n return apps;\n}\n\nasync function detectNxWorkspace(repoPath: string, files: string[]): Promise<RepoApp[]> {\n if (!files.includes(\"nx.json\")) return [];\n\n // Find project.json files (depth-limited via glob pattern)\n const projectJsonPaths = (\n await fg([\"*/project.json\", \"*/*/project.json\", \"*/*/*/project.json\"], {\n cwd: repoPath,\n absolute: true,\n onlyFiles: true,\n dot: false,\n followSymbolicLinks: false,\n ignore: [\"**/.git/**\", \"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/out/**\"]\n })\n ).map((p) => path.normalize(p));\n\n const apps: RepoApp[] = [];\n for (const projPath of projectJsonPaths) {\n const projDir = path.dirname(projPath);\n const projJson = await readJson(projPath);\n const name = typeof projJson?.name === \"string\" ? projJson.name : path.basename(projDir);\n // Detect ecosystem from sibling files\n const children = await safeReadDir(projDir);\n const ecosystem: RepoApp[\"ecosystem\"] = children.includes(\"package.json\")\n ? \"node\"\n : children.includes(\"Cargo.toml\")\n ? \"rust\"\n : children.includes(\"go.mod\")\n ? \"go\"\n : children.includes(\"pyproject.toml\")\n ? \"python\"\n : undefined;\n apps.push({\n name,\n path: projDir,\n ecosystem,\n manifestPath: projPath,\n packageJsonPath: children.includes(\"package.json\") ? path.join(projDir, \"package.json\") : \"\",\n scripts: {},\n hasTsConfig: children.includes(\"tsconfig.json\")\n });\n }\n\n return apps;\n}\n\nasync function detectPantsWorkspace(repoPath: string, files: string[]): Promise<RepoApp[]> {\n if (!files.includes(\"pants.toml\")) return [];\n\n // Scan first-level directories for BUILD files\n const entries = await safeReadDir(repoPath);\n const apps: RepoApp[] = [];\n\n for (const entry of entries) {\n if (entry.startsWith(\".\")) continue;\n const fullPath = path.join(repoPath, entry);\n if (!(await isScannableDirectory(repoPath, fullPath))) continue;\n const children = await safeReadDir(fullPath);\n const buildFile = children.includes(\"BUILD\")\n ? \"BUILD\"\n : children.includes(\"BUILD.pants\")\n ? \"BUILD.pants\"\n : undefined;\n if (!buildFile) continue;\n\n // Infer ecosystem from sibling files\n const ecosystem: RepoApp[\"ecosystem\"] = children.includes(\"pyproject.toml\")\n ? \"python\"\n : children.includes(\"go.mod\")\n ? \"go\"\n : children.includes(\"Cargo.toml\")\n ? \"rust\"\n : undefined;\n apps.push(buildNonJsApp(entry, fullPath, ecosystem, path.join(fullPath, buildFile)));\n }\n\n return apps;\n}\n\nfunction unique<T>(items: T[]): T[] {\n return Array.from(new Set(items));\n}\n\n// ─── Area detection ───\n\nconst AREA_HEURISTIC_DIRS = [\n \"frontend\",\n \"backend\",\n \"api\",\n \"web\",\n \"mobile\",\n \"app\",\n \"server\",\n \"client\",\n \"infra\",\n \"infrastructure\",\n \"shared\",\n \"common\",\n \"lib\",\n \"libs\",\n \"packages\",\n \"services\",\n \"docs\",\n \"scripts\",\n \"tools\",\n \"cli\",\n \"sdk\",\n \"core\",\n \"admin\",\n \"portal\",\n \"dashboard\",\n \"worker\",\n \"functions\",\n // Browser / engine components\n \"browser\",\n \"devtools\",\n \"toolkit\",\n \"dom\",\n \"layout\",\n \"media\",\n \"security\",\n \"testing\",\n \"extensions\",\n \"modules\",\n \"editor\",\n \"remote\",\n \"storage\"\n];\n\n// Directories to skip in fallback area detection\nconst FALLBACK_SKIP_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \".hg\",\n \".svn\",\n \"target\",\n \"build\",\n \"dist\",\n \"out\",\n \"output\",\n \".output\",\n \".next\",\n \"vendor\",\n \"third_party\",\n \"other-licenses\",\n \"coverage\",\n \"__pycache__\",\n \".cache\",\n \".vscode\",\n \".idea\",\n \".github\",\n \".gitlab\",\n \".circleci\",\n \"supply-chain\",\n \"gradle\",\n \".cargo\"\n]);\n\nconst MIN_FALLBACK_CHILDREN = 3;\nconst MIN_AREAS_FOR_FALLBACK = 3;\nconst MIN_TOPLEVEL_DIRS_FOR_FALLBACK = 10;\n\nconst MANIFEST_FILES = [\n \"package.json\",\n \"pyproject.toml\",\n \"requirements.txt\",\n \"go.mod\",\n \"Cargo.toml\",\n \"pom.xml\",\n \"build.gradle\",\n \"build.gradle.kts\",\n \"Gemfile\",\n \"composer.json\",\n \"setup.py\",\n \"setup.cfg\",\n \"CMakeLists.txt\",\n \"meson.build\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"moz.build\"\n];\n\nconst CODE_EXTENSIONS = [\n \".ts\",\n \".js\",\n \".py\",\n \".go\",\n \".rs\",\n \".java\",\n \".cs\",\n \".rb\",\n \".php\",\n \".c\",\n \".cc\",\n \".cpp\",\n \".h\",\n \".hpp\",\n \".swift\",\n \".kt\",\n \".scala\"\n];\n\nfunction areasFromApps(repoPath: string, apps: RepoApp[]): Area[] {\n return apps.map((app) => {\n const rel = path.relative(repoPath, app.path).replace(/\\\\/gu, \"/\");\n return {\n name: app.name,\n applyTo: `${rel}/**`,\n path: app.path,\n ecosystem: app.ecosystem,\n source: \"auto\" as const,\n scripts: Object.keys(app.scripts).length > 0 ? app.scripts : undefined,\n hasTsConfig: app.hasTsConfig || undefined\n };\n });\n}\n\nasync function areasFromHeuristics(repoPath: string): Promise<Area[]> {\n const entries = await safeReadDir(repoPath);\n const areas: Area[] = [];\n\n for (const entry of entries) {\n const lower = entry.toLowerCase();\n if (!AREA_HEURISTIC_DIRS.includes(lower)) continue;\n\n const fullPath = path.join(repoPath, entry);\n if (!(await isScannableDirectory(repoPath, fullPath))) continue;\n\n // Check if the directory has meaningful content (manifest or code files)\n const children = await safeReadDir(fullPath);\n const hasManifest = children.some((c) => MANIFEST_FILES.includes(c));\n const hasCode = children.some((c) => CODE_EXTENSIONS.some((ext) => c.endsWith(ext)));\n const hasSrcDir = children.includes(\"src\");\n\n if (!hasManifest && !hasCode && !hasSrcDir) continue;\n\n // Read scripts from manifest if present\n let scripts: Record<string, string> | undefined;\n let hasTsConfig: boolean | undefined;\n if (children.includes(\"package.json\")) {\n const pkg = await readJson(path.join(fullPath, \"package.json\"));\n const pkgScripts = (pkg?.scripts ?? {}) as Record<string, string>;\n if (Object.keys(pkgScripts).length > 0) scripts = pkgScripts;\n }\n if (children.includes(\"tsconfig.json\")) {\n hasTsConfig = true;\n }\n\n areas.push({\n name: entry,\n applyTo: `${entry}/**`,\n path: fullPath,\n source: \"auto\",\n scripts,\n hasTsConfig\n });\n }\n\n return areas;\n}\n\n/**\n * Fallback area detection for large repos (e.g., Firefox, Chromium) where\n * neither workspace managers nor the heuristic directory list provide good coverage.\n * Scans first-level directories that contain code or manifests and meet a\n * small minimum-size threshold to reduce noise.\n */\nasync function areasFromFallback(repoPath: string, existingAreas: Area[]): Promise<Area[]> {\n const existingNames = new Set(existingAreas.map((a) => a.name.toLowerCase()));\n const entries = await safeReadDir(repoPath);\n const areas: Area[] = [];\n\n for (const entry of entries) {\n if (entry.startsWith(\".\")) continue;\n if (FALLBACK_SKIP_DIRS.has(entry.toLowerCase())) continue;\n if (existingNames.has(entry.toLowerCase())) continue;\n\n const fullPath = path.join(repoPath, entry);\n if (!(await isScannableDirectory(repoPath, fullPath))) continue;\n\n const children = await safeReadDir(fullPath);\n if (children.length < MIN_FALLBACK_CHILDREN) continue;\n\n const hasManifest = children.some((c) => MANIFEST_FILES.includes(c));\n const hasCode = children.some((c) => CODE_EXTENSIONS.some((ext) => c.endsWith(ext)));\n const hasSrcDir = children.includes(\"src\");\n\n if (!hasManifest && !hasCode && !hasSrcDir) continue;\n\n areas.push({\n name: entry,\n applyTo: `${entry}/**`,\n path: fullPath,\n source: \"auto\"\n });\n }\n\n return areas;\n}\n\nconst GLOB_CHARS = /[*?[\\\\]/u;\n\nfunction longestNonGlobPrefix(pattern: string): string | undefined {\n const segments = pattern.split(\"/\").filter((s) => s !== \".\");\n const prefixSegments: string[] = [];\n for (const segment of segments) {\n if (GLOB_CHARS.test(segment)) break;\n prefixSegments.push(segment);\n }\n return prefixSegments.length > 0 ? prefixSegments.join(\"/\") : undefined;\n}\n\nasync function resolveConfigArea(\n repoPath: string,\n resolvedRoot: string,\n ca: AgentrcConfigArea\n): Promise<Area | undefined> {\n const patterns = Array.isArray(ca.applyTo) ? ca.applyTo : [ca.applyTo];\n const nonGlobPrefix = longestNonGlobPrefix(patterns[0]);\n const basePath = nonGlobPrefix ? path.join(repoPath, nonGlobPrefix) : repoPath;\n\n const resolved = path.resolve(basePath);\n if (resolved !== resolvedRoot && !resolved.startsWith(resolvedRoot + path.sep)) return undefined;\n\n let scripts: Record<string, string> | undefined;\n let hasTsConfig: boolean | undefined;\n try {\n const children = await safeReadDir(basePath);\n if (children.includes(\"package.json\")) {\n const pkg = await readJson(path.join(basePath, \"package.json\"));\n const pkgScripts = (pkg?.scripts ?? {}) as Record<string, string>;\n if (Object.keys(pkgScripts).length > 0) scripts = pkgScripts;\n }\n if (children.includes(\"tsconfig.json\")) hasTsConfig = true;\n } catch {\n // Directory may not exist yet for config areas\n }\n\n return {\n name: ca.name,\n description: ca.description,\n applyTo: ca.applyTo,\n path: basePath,\n source: \"config\" as const,\n scripts,\n hasTsConfig,\n parentArea: ca.parentArea\n };\n}\n\nasync function detectAreas(repoPath: string, analysis: RepoAnalysis): Promise<Area[]> {\n let autoAreas: Area[];\n\n if (analysis.isMonorepo && analysis.apps && analysis.apps.length > 1) {\n const appAreas = areasFromApps(repoPath, analysis.apps);\n // Also run heuristics to catch non-app directories (docs, infra, etc.)\n const heuristicAreas = await areasFromHeuristics(repoPath);\n // Merge: app areas take precedence by name\n const byName = new Map(heuristicAreas.map((a) => [a.name.toLowerCase(), a]));\n for (const a of appAreas) {\n byName.set(a.name.toLowerCase(), a);\n }\n autoAreas = Array.from(byName.values());\n } else {\n autoAreas = await areasFromHeuristics(repoPath);\n }\n\n // Smart fallback: if few areas detected but repo has many top-level dirs,\n // scan all first-level directories for code content\n const topLevelEntries = await safeReadDir(repoPath);\n const topLevelDirCount = (\n await Promise.all(\n topLevelEntries\n .filter((e) => !e.startsWith(\".\"))\n .map(async (e) => isScannableDirectory(repoPath, path.join(repoPath, e)))\n )\n ).filter(Boolean).length;\n\n if (\n autoAreas.length < MIN_AREAS_FOR_FALLBACK &&\n topLevelDirCount > MIN_TOPLEVEL_DIRS_FOR_FALLBACK\n ) {\n const fallbackAreas = await areasFromFallback(repoPath, autoAreas);\n const byName = new Map(autoAreas.map((a) => [a.name.toLowerCase(), a]));\n for (const a of fallbackAreas) {\n if (!byName.has(a.name.toLowerCase())) {\n byName.set(a.name.toLowerCase(), a);\n }\n }\n autoAreas = Array.from(byName.values());\n }\n\n // Merge with config areas (flat + workspace)\n const config = await loadAgentrcConfig(repoPath);\n if (!config?.areas?.length && !config?.workspaces?.length) return autoAreas;\n\n const resolvedRoot = path.resolve(repoPath);\n const configAreas: Area[] = [];\n\n // Process flat config areas\n for (const ca of config.areas ?? []) {\n const area = await resolveConfigArea(repoPath, resolvedRoot, ca);\n if (area) configAreas.push(area);\n }\n\n // Process workspace areas — flatten into namespaced Area entries\n for (const ws of config.workspaces ?? []) {\n const wsAbsPath = path.resolve(repoPath, ws.path);\n if (!wsAbsPath.startsWith(resolvedRoot + path.sep) && wsAbsPath !== resolvedRoot) continue;\n\n for (const ca of ws.areas) {\n // Resolve applyTo patterns relative to the workspace path\n const rawPatterns = Array.isArray(ca.applyTo) ? ca.applyTo : [ca.applyTo];\n const repoRelativePatterns = rawPatterns.map((p) => `${ws.path}/${p}`);\n const repoRelativeApplyTo =\n repoRelativePatterns.length === 1 ? repoRelativePatterns[0] : repoRelativePatterns;\n\n const namespacedArea: AgentrcConfigArea = {\n ...ca,\n name: `${ws.name}/${ca.name}`,\n applyTo: repoRelativeApplyTo,\n parentArea: ca.parentArea ? `${ws.name}/${ca.parentArea}` : undefined\n };\n const area = await resolveConfigArea(repoPath, resolvedRoot, namespacedArea);\n if (area) {\n area.workingDirectory = ws.path;\n configAreas.push(area);\n }\n }\n }\n\n // Config areas override auto-detected by name (case-insensitive)\n const autoByName = new Map(autoAreas.map((a) => [a.name.toLowerCase(), a]));\n for (const ca of configAreas) {\n autoByName.set(ca.name.toLowerCase(), ca);\n }\n\n return Array.from(autoByName.values());\n}\n\n// ─── Workspace detection ───\n\nconst WORKSPACE_SCAN_MAX_DEPTH = 3;\nconst WORKSPACE_SKIP_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \".hg\",\n \"target\",\n \"build\",\n \"dist\",\n \"out\",\n \"vendor\",\n \"coverage\",\n \"__pycache__\",\n \".cache\"\n]);\n\n/**\n * Detect workspaces by scanning for `.vscode` folders (indicating directories\n * that developers open as VS Code workspaces) and by grouping auto-detected\n * areas that share a common parent directory.\n */\nexport async function detectWorkspaces(\n repoPath: string,\n areas: Area[]\n): Promise<AgentrcConfigWorkspace[]> {\n const resolvedRoot = path.resolve(repoPath);\n const workspaces = new Map<string, AgentrcConfigWorkspace>();\n\n // Strategy 1: Scan for .vscode folders as workspace markers\n const vscodeDirs = await findVSCodeDirs(repoPath, repoPath, WORKSPACE_SCAN_MAX_DEPTH);\n for (const vsDir of vscodeDirs) {\n // The workspace is the parent of the .vscode folder\n const wsAbs = path.dirname(vsDir);\n const wsRel = path.relative(repoPath, wsAbs).replace(/\\\\/gu, \"/\");\n if (!wsRel || wsRel === \".\") continue; // skip repo root\n\n const wsResolved = path.resolve(wsAbs);\n if (!wsResolved.startsWith(resolvedRoot + path.sep)) continue;\n\n // Find areas that fall within this workspace\n const wsAreas = areasWithinDir(wsRel, areas);\n if (wsAreas.length === 0) {\n // Run heuristic detection scoped to this workspace directory\n const scopedAreas = await areasFromHeuristics(wsAbs);\n if (scopedAreas.length === 0) continue;\n const configAreas = scopedAreas.map((a) => ({\n name: a.name,\n applyTo: Array.isArray(a.applyTo) ? a.applyTo : a.applyTo,\n description: a.description\n }));\n workspaces.set(wsRel, { name: path.basename(wsRel), path: wsRel, areas: configAreas });\n } else {\n const configAreas = wsAreas.map((a) => toWorkspaceRelativeArea(wsRel, a));\n workspaces.set(wsRel, { name: path.basename(wsRel), path: wsRel, areas: configAreas });\n }\n }\n\n // Strategy 2: Group areas by common parent directory (2+ siblings → workspace)\n const parentGroups = new Map<string, Area[]>();\n for (const area of areas) {\n if (!area.path) continue;\n const rel = path.relative(repoPath, area.path).replace(/\\\\/gu, \"/\");\n const segments = rel.split(\"/\");\n if (segments.length < 2) continue; // top-level dir — not a nested workspace\n\n const parentRel = segments.slice(0, -1).join(\"/\");\n if (workspaces.has(parentRel)) continue; // already found via .vscode\n\n if (!parentGroups.has(parentRel)) parentGroups.set(parentRel, []);\n parentGroups.get(parentRel)!.push(area);\n }\n\n for (const [parentRel, grouped] of parentGroups) {\n if (grouped.length < 2) continue;\n\n const parentAbs = path.resolve(repoPath, parentRel);\n const parentResolved = path.resolve(parentAbs);\n if (!parentResolved.startsWith(resolvedRoot + path.sep)) continue;\n\n const configAreas = grouped.map((a) => toWorkspaceRelativeArea(parentRel, a));\n workspaces.set(parentRel, {\n name: path.basename(parentRel),\n path: parentRel,\n areas: configAreas\n });\n }\n\n return Array.from(workspaces.values());\n}\n\nasync function findVSCodeDirs(\n repoPath: string,\n dir: string,\n maxDepth: number,\n depth = 0\n): Promise<string[]> {\n if (depth >= maxDepth) return [];\n const results: string[] = [];\n let entries: string[];\n try {\n entries = await safeReadDir(dir);\n } catch {\n return [];\n }\n\n for (const entry of entries) {\n if (entry === \".vscode\") {\n results.push(path.join(dir, entry));\n continue;\n }\n if (entry.startsWith(\".\") || WORKSPACE_SKIP_DIRS.has(entry)) continue;\n const fullPath = path.join(dir, entry);\n if (await isScannableDirectory(repoPath, fullPath)) {\n results.push(...(await findVSCodeDirs(repoPath, fullPath, maxDepth, depth + 1)));\n }\n }\n\n return results;\n}\n\nfunction areasWithinDir(wsRel: string, areas: Area[]): Area[] {\n const prefix = wsRel + \"/\";\n return areas.filter((a) => {\n const patterns = Array.isArray(a.applyTo) ? a.applyTo : [a.applyTo];\n return patterns.some((p) => p.startsWith(prefix));\n });\n}\n\nfunction toWorkspaceRelativeArea(wsRel: string, area: Area): AgentrcConfigArea {\n const prefix = wsRel + \"/\";\n const patterns = Array.isArray(area.applyTo) ? area.applyTo : [area.applyTo];\n const relPatterns = patterns.map((p) => (p.startsWith(prefix) ? p.slice(prefix.length) : p));\n return {\n name: area.name,\n applyTo: relPatterns.length === 1 ? relPatterns[0] : relPatterns,\n description: area.description\n };\n}\n\n// ─── AgentRC config ───\n\nexport type InstructionStrategy = \"flat\" | \"nested\";\n\nexport type AgentrcConfigArea = {\n name: string;\n applyTo: string | string[];\n description?: string;\n parentArea?: string;\n};\n\nexport type AgentrcConfigWorkspace = {\n name: string;\n path: string;\n areas: AgentrcConfigArea[];\n};\n\nexport type AgentrcConfig = {\n areas?: AgentrcConfigArea[];\n workspaces?: AgentrcConfigWorkspace[];\n policies?: string[];\n strategy?: InstructionStrategy;\n detailDir?: string;\n claudeMd?: boolean;\n};\n\nfunction parseConfigAreas(raw: unknown): AgentrcConfigArea[] {\n if (!Array.isArray(raw)) return [];\n const areas: AgentrcConfigArea[] = [];\n for (const entry of raw) {\n if (\n typeof entry !== \"object\" ||\n entry === null ||\n typeof (entry as Record<string, unknown>).name !== \"string\" ||\n (entry as Record<string, unknown>).applyTo === undefined\n )\n continue;\n const e = entry as Record<string, unknown>;\n if (!(e.name as string).trim()) continue;\n const rawApplyTo = e.applyTo;\n let applyTo: string | string[];\n if (typeof rawApplyTo === \"string\") {\n applyTo = rawApplyTo;\n } else if (Array.isArray(rawApplyTo) && rawApplyTo.every((v) => typeof v === \"string\")) {\n applyTo = rawApplyTo as string[];\n } else {\n continue;\n }\n if (\n (typeof applyTo === \"string\" && !applyTo.trim()) ||\n (Array.isArray(applyTo) && applyTo.length === 0)\n )\n continue;\n const allPatterns = Array.isArray(applyTo) ? applyTo : [applyTo];\n if (allPatterns.some((p) => p.split(\"/\").includes(\"..\"))) continue;\n areas.push({\n name: e.name as string,\n applyTo,\n description: typeof e.description === \"string\" ? e.description : undefined,\n parentArea: typeof e.parentArea === \"string\" ? e.parentArea : undefined\n });\n }\n return areas;\n}\n\nexport async function loadAgentrcConfig(repoPath: string): Promise<AgentrcConfig | undefined> {\n // Try repo root first, then .github/\n const candidates = [\n path.join(repoPath, \"agentrc.config.json\"),\n path.join(repoPath, \".github\", \"agentrc.config.json\")\n ];\n\n for (const candidate of candidates) {\n const json = await readJson(candidate);\n if (!json) continue;\n\n // Validate shape\n if (json.areas !== undefined && !Array.isArray(json.areas)) {\n return undefined;\n }\n const areas = parseConfigAreas(json.areas);\n\n // Parse policies array\n let policies: string[] | undefined;\n if (Array.isArray(json.policies)) {\n policies = json.policies.filter((p): p is string => typeof p === \"string\" && p.trim() !== \"\");\n }\n\n // Parse strategy\n let strategy: InstructionStrategy | undefined;\n if (typeof json.strategy === \"string\") {\n const s = json.strategy as string;\n if (s === \"flat\" || s === \"nested\") {\n strategy = s;\n }\n }\n\n // Parse detailDir with safety validation\n let detailDir: string | undefined;\n if (typeof json.detailDir === \"string\") {\n // Normalize separators so validation works on both Windows and POSIX\n const dir = (json.detailDir as string).trim().replace(/\\\\+/gu, \"/\");\n const blocklist = new Set([\".git\", \"node_modules\", \".github\", \"dist\", \"build\"]);\n // Must be a single path segment — no slashes, no traversal, not in blocklist\n if (\n dir &&\n !path.isAbsolute(dir) &&\n !dir.includes(\"/\") &&\n !dir.includes(\"..\") &&\n !blocklist.has(dir)\n ) {\n detailDir = dir;\n }\n }\n\n // Parse claudeMd\n const claudeMd = json.claudeMd === true ? true : undefined;\n\n // Parse workspaces array\n const workspaces: AgentrcConfigWorkspace[] = [];\n if (Array.isArray(json.workspaces)) {\n for (const ws of json.workspaces) {\n if (typeof ws !== \"object\" || ws === null) continue;\n const w = ws as Record<string, unknown>;\n if (typeof w.name !== \"string\" || !(w.name as string).trim()) continue;\n if (typeof w.path !== \"string\" || !(w.path as string).trim()) continue;\n\n const wsPath = (w.path as string).trim().replace(/\\\\+/gu, \"/\").replace(/\\/+$/u, \"\");\n if (!wsPath) continue;\n // Must be relative, no traversal, no absolute path, no root\n if (path.isAbsolute(wsPath) || wsPath === \".\" || wsPath.split(\"/\").includes(\"..\")) continue;\n\n const wsAreas = parseConfigAreas(w.areas);\n if (wsAreas.length === 0) continue;\n\n workspaces.push({\n name: (w.name as string).trim(),\n path: wsPath,\n areas: wsAreas\n });\n }\n }\n\n // Validate parentArea references — flat areas against flat names, workspace areas within their workspace\n const flatNames = new Set(areas.map((a) => a.name.toLowerCase()));\n for (const area of areas) {\n if (area.parentArea && !flatNames.has(area.parentArea.toLowerCase())) {\n area.parentArea = undefined;\n }\n }\n for (const ws of workspaces) {\n const wsAreaNames = new Set(ws.areas.map((a) => a.name.toLowerCase()));\n for (const area of ws.areas) {\n if (area.parentArea && !wsAreaNames.has(area.parentArea.toLowerCase())) {\n area.parentArea = undefined;\n }\n }\n }\n\n return {\n areas,\n workspaces: workspaces.length ? workspaces : undefined,\n policies: policies?.length ? policies : undefined,\n strategy,\n detailDir,\n claudeMd\n };\n }\n\n return undefined;\n}\n\nexport function sanitizeAreaName(name: string): string {\n const sanitized = name\n .toLowerCase()\n .replace(/[^a-z0-9-]/gu, \"-\")\n .replace(/-+/gu, \"-\")\n .replace(/^-|-$/gu, \"\");\n return sanitized || \"unnamed\";\n}\n","import { constants as fsConstants } from \"fs\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.mkdir(dirPath, { recursive: true });\n}\n\nexport type WriteResult = { wrote: boolean; reason?: \"symlink\" | \"exists\" };\n\nexport async function safeWriteFile(\n filePath: string,\n content: string,\n force: boolean\n): Promise<WriteResult> {\n const resolved = path.resolve(filePath);\n const noFollowFlag = process.platform === \"win32\" ? 0 : fsConstants.O_NOFOLLOW;\n\n if (await hasSymlinkAncestor(resolved)) {\n return { wrote: false, reason: \"symlink\" };\n }\n\n await fs.mkdir(path.dirname(resolved), { recursive: true });\n if (await hasSymlinkAncestor(resolved)) {\n return { wrote: false, reason: \"symlink\" };\n }\n\n if (process.platform === \"win32\") {\n try {\n const stat = await fs.lstat(resolved);\n if (stat.isSymbolicLink()) {\n return { wrote: false, reason: \"symlink\" };\n }\n if (!force) {\n return { wrote: false, reason: \"exists\" };\n }\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n if (process.platform === \"win32\" && force) {\n return replaceFileWindows(resolved, content);\n }\n\n const flags = force\n ? fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_TRUNC | noFollowFlag\n : fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | noFollowFlag;\n\n try {\n const handle = await fs.open(resolved, flags, 0o666);\n try {\n await handle.writeFile(content, \"utf8\");\n } finally {\n await handle.close();\n }\n return { wrote: true };\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"EEXIST\") {\n try {\n const stat = await fs.lstat(resolved);\n if (stat.isSymbolicLink()) {\n return { wrote: false, reason: \"symlink\" };\n }\n } catch {\n // Ignore stat errors and fall through to generic exists handling\n }\n return { wrote: false, reason: \"exists\" };\n }\n if (code === \"ELOOP\") {\n return { wrote: false, reason: \"symlink\" };\n }\n throw error;\n }\n}\n\nasync function replaceFileWindows(targetPath: string, content: string): Promise<WriteResult> {\n const parentDir = path.dirname(targetPath);\n const tempPath = path.join(\n parentDir,\n `.agentrc-tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`\n );\n const backupPath = path.join(\n parentDir,\n `.agentrc-backup-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`\n );\n\n const tempHandle = await fs.open(\n tempPath,\n fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL,\n 0o666\n );\n try {\n await tempHandle.writeFile(content, \"utf8\");\n } finally {\n await tempHandle.close();\n }\n\n let movedOriginal = false;\n let placedReplacement = false;\n let restoredOriginal = false;\n let restoreFailed = false;\n try {\n try {\n const stat = await fs.lstat(targetPath);\n if (stat.isSymbolicLink()) {\n await fs.rm(tempPath, { force: true });\n return { wrote: false, reason: \"symlink\" };\n }\n if (stat.isDirectory()) {\n await fs.rm(tempPath, { force: true });\n return { wrote: false, reason: \"exists\" };\n }\n await fs.rename(targetPath, backupPath);\n movedOriginal = true;\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n throw error;\n }\n }\n\n await fs.rename(tempPath, targetPath);\n placedReplacement = true;\n return { wrote: true };\n } catch (error) {\n await fs.rm(tempPath, { force: true });\n\n if (movedOriginal) {\n try {\n await fs.rename(backupPath, targetPath);\n restoredOriginal = true;\n } catch {\n restoreFailed = true;\n }\n }\n\n if (restoreFailed) {\n throw new Error(\n `Failed to restore original file after replacement failure; backup retained at ${backupPath}`\n );\n }\n\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"EEXIST\") {\n try {\n const stat = await fs.lstat(targetPath);\n if (stat.isSymbolicLink()) {\n return { wrote: false, reason: \"symlink\" };\n }\n } catch {\n // Ignore lstat errors and fall through\n }\n return { wrote: false, reason: \"exists\" };\n }\n\n throw error;\n } finally {\n if (movedOriginal && (placedReplacement || restoredOriginal)) {\n await fs.rm(backupPath, { force: true });\n }\n }\n}\n\nasync function hasSymlinkAncestor(filePath: string): Promise<boolean> {\n const parentDir = path.dirname(filePath);\n const closestExistingAncestor = await findClosestExistingAncestor(parentDir);\n const closestAncestorStat = await fs.lstat(closestExistingAncestor);\n if (closestAncestorStat.isSymbolicLink()) {\n return true;\n }\n\n const realClosestAncestor = await fs.realpath(closestExistingAncestor);\n if (\n realClosestAncestor !== closestExistingAncestor &&\n !isAllowedSystemAlias(closestExistingAncestor, realClosestAncestor)\n ) {\n // On Windows, 8.3 short filenames (e.g. RUNNER~1 → runneradmin) cause\n // realpath to differ without any symlinks. Walk each ancestor component\n // to check for actual symlinks before concluding.\n if (process.platform === \"win32\") {\n const parsed = path.parse(closestExistingAncestor);\n const relative = path.relative(parsed.root, closestExistingAncestor);\n const components = relative.split(path.sep).filter(Boolean);\n let current = parsed.root;\n let foundSymlink = false;\n for (const component of components) {\n current = path.join(current, component);\n try {\n const stat = await fs.lstat(current);\n if (stat.isSymbolicLink()) {\n foundSymlink = true;\n break;\n }\n } catch {\n break;\n }\n }\n if (foundSymlink) {\n return true;\n }\n } else {\n return true;\n }\n }\n\n const relativeParent = path.relative(closestExistingAncestor, parentDir);\n const segments = relativeParent.split(path.sep).filter(Boolean);\n let currentPath = closestExistingAncestor;\n\n for (const segment of segments) {\n currentPath = path.join(currentPath, segment);\n try {\n const stat = await fs.lstat(currentPath);\n if (stat.isSymbolicLink()) {\n return true;\n }\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n break;\n }\n throw error;\n }\n }\n\n return false;\n}\n\nasync function findClosestExistingAncestor(targetDir: string): Promise<string> {\n let currentDir = targetDir;\n\n while (true) {\n try {\n await fs.lstat(currentDir);\n return currentDir;\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n throw error;\n }\n\n const nextDir = path.dirname(currentDir);\n if (nextDir === currentDir) {\n return currentDir;\n }\n currentDir = nextDir;\n }\n }\n}\n\nfunction isAllowedSystemAlias(originalPath: string, realPath: string): boolean {\n if (process.platform !== \"darwin\") {\n return false;\n }\n\n const allowsVarAlias =\n (originalPath === \"/var\" || originalPath.startsWith(\"/var/\")) &&\n (realPath === \"/private/var\" || realPath.startsWith(\"/private/var/\")) &&\n originalPath.slice(\"/var\".length) === realPath.slice(\"/private/var\".length);\n\n const allowsTmpAlias =\n (originalPath === \"/tmp\" || originalPath.startsWith(\"/tmp/\")) &&\n (realPath === \"/private/tmp\" || realPath.startsWith(\"/private/tmp/\")) &&\n originalPath.slice(\"/tmp\".length) === realPath.slice(\"/private/tmp\".length);\n\n return allowsVarAlias || allowsTmpAlias;\n}\n\n/**\n * Validate that constructed path segments stay within the expected root directory.\n * Prevents traversal in the relative segments (e.g. \"../../../etc\") but does NOT\n * validate the cacheRoot itself — callers are responsible for ensuring cacheRoot\n * is a trusted path before passing it here.\n */\nexport function validateCachePath(cacheRoot: string, ...segments: string[]): string {\n const resolvedRoot = path.resolve(cacheRoot);\n const resolved = path.resolve(cacheRoot, ...segments);\n if (!resolved.startsWith(resolvedRoot + path.sep) && resolved !== resolvedRoot) {\n throw new Error(`Invalid path: escapes cache directory (${resolved})`);\n }\n return resolved;\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function safeReadDir(dirPath: string): Promise<string[]> {\n try {\n return await fs.readdir(dirPath);\n } catch {\n return [];\n }\n}\n\nexport async function readJson(filePath: string): Promise<Record<string, unknown> | undefined> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nexport function buildTimestampedName(baseName: string, extension = \".json\"): string {\n const stamp = new Date().toISOString().replace(/[:.]/gu, \"-\");\n return `${baseName}-${stamp}${extension}`;\n}\n","import chalk from \"chalk\";\n\nimport type { RepoAnalysis } from \"../services/analyzer\";\n\nexport function prettyPrintSummary(analysis: RepoAnalysis): void {\n const log = (msg: string) => process.stderr.write(msg + \"\\n\");\n log(chalk.bold(\"Repository analysis\"));\n log(`- Path: ${analysis.path}`);\n log(`- Git: ${analysis.isGitRepo ? \"yes\" : \"no\"}`);\n log(`- Languages: ${analysis.languages.join(\", \") || \"unknown\"}`);\n log(`- Frameworks: ${analysis.frameworks.join(\", \") || \"none\"}`);\n log(`- Package manager: ${analysis.packageManager ?? \"unknown\"}`);\n if (analysis.isMonorepo) {\n log(\n `- Monorepo: yes (${analysis.workspaceType ?? \"unknown\"}, ${analysis.apps?.length ?? 0} apps)`\n );\n }\n if (analysis.areas && analysis.areas.length > 0) {\n log(`- Areas: ${analysis.areas.map((a) => a.name).join(\", \")}`);\n }\n}\n","/**\n * Structured output utilities for headless / JSON CLI mode.\n *\n * Convention:\n * - stdout → machine-readable JSON (only when `json` flag is set)\n * - stderr → human-readable progress, logs, and errors\n */\n\nexport type CommandResult<T = unknown> = {\n ok: boolean;\n status: \"success\" | \"partial\" | \"noop\" | \"error\";\n data?: T;\n errors?: string[];\n};\n\nexport interface ProgressReporter {\n update(message: string): void;\n succeed(message: string): void;\n fail(message: string): void;\n done(): void;\n}\n\nclass HumanProgressReporter implements ProgressReporter {\n update(message: string): void {\n process.stderr.write(` ${message}\\n`);\n }\n succeed(message: string): void {\n process.stderr.write(` ✓ ${message}\\n`);\n }\n fail(message: string): void {\n process.stderr.write(` ✗ ${message}\\n`);\n }\n done(): void {\n /* noop */\n }\n}\n\nclass SilentProgressReporter implements ProgressReporter {\n update(): void {\n /* noop */\n }\n succeed(): void {\n /* noop */\n }\n fail(): void {\n /* noop */\n }\n done(): void {\n /* noop */\n }\n}\n\nexport function createProgressReporter(silent: boolean): ProgressReporter {\n return silent ? new SilentProgressReporter() : new HumanProgressReporter();\n}\n\nexport function shouldLog(options: { json?: boolean; quiet?: boolean }): boolean {\n return !options.json && !options.quiet;\n}\n\nexport function outputResult<T>(result: CommandResult<T>, json: boolean): void {\n if (json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n }\n}\n\nexport function deriveFileStatus(files: { action: string }[]): {\n ok: boolean;\n status: \"success\" | \"partial\" | \"noop\";\n} {\n const hasWrites = files.some((f) => f.action === \"wrote\");\n const hasSkips = files.some((f) => f.action !== \"wrote\");\n if (hasWrites && hasSkips) return { ok: true, status: \"partial\" };\n if (hasWrites || files.length === 0) return { ok: true, status: \"success\" };\n return { ok: true, status: \"noop\" };\n}\n\nexport function outputError(message: string, json: boolean): void {\n if (json) {\n const result: CommandResult = { ok: false, status: \"error\", errors: [message] };\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n } else {\n process.stderr.write(`Error: ${message}\\n`);\n }\n process.exitCode = 1;\n}\n","import readline from \"readline\";\n\nimport type { AzureDevOpsRepo } from \"@agentrc/core/services/azureDevops\";\nimport { getAzureDevOpsToken, getRepo as getAzureRepo } from \"@agentrc/core/services/azureDevops\";\nimport {\n runBatchHeadlessGitHub,\n runBatchHeadlessAzure,\n sanitizeError\n} from \"@agentrc/core/services/batch\";\nimport type { ProcessResult } from \"@agentrc/core/services/batch\";\nimport type { GitHubRepo } from \"@agentrc/core/services/github\";\nimport { getGitHubToken, getRepo as getGitHubRepo } from \"@agentrc/core/services/github\";\nimport { safeWriteFile } from \"@agentrc/core/utils/fs\";\nimport type { CommandResult } from \"@agentrc/core/utils/output\";\nimport {\n outputResult,\n outputError,\n createProgressReporter,\n shouldLog\n} from \"@agentrc/core/utils/output\";\nimport { GITHUB_REPO_RE, AZURE_REPO_RE } from \"@agentrc/core/utils/repo\";\nimport { render } from \"ink\";\nimport React from \"react\";\n\nimport { BatchTui } from \"../ui/BatchTui\";\nimport { BatchTuiAzure } from \"../ui/BatchTuiAzure\";\n\ntype BatchOptions = {\n output?: string;\n provider?: string;\n model?: string;\n branch?: string;\n json?: boolean;\n quiet?: boolean;\n accessible?: boolean;\n};\n\nexport async function batchCommand(repos: string[], options: BatchOptions): Promise<void> {\n const provider = options.provider ?? \"github\";\n if (provider !== \"github\" && provider !== \"azure\") {\n outputError(\"Invalid provider. Use github or azure.\", Boolean(options.json));\n return;\n }\n\n // Read repos from stdin if piped\n const stdinRepos = await readStdinRepos();\n if (stdinRepos.length > 0 && repos.length > 0) {\n outputError(\n \"Provide repos via positional arguments OR stdin, not both.\",\n Boolean(options.json)\n );\n return;\n }\n\n const allRepoArgs = repos.length > 0 ? repos : stdinRepos;\n const isHeadless = allRepoArgs.length > 0 || Boolean(options.json);\n\n if (isHeadless) {\n if (allRepoArgs.length === 0) {\n outputError(\n \"No repos provided. Pass repos as arguments or pipe via stdin.\",\n Boolean(options.json)\n );\n return;\n }\n await runHeadless(allRepoArgs, provider, options);\n return;\n }\n\n // Interactive TUI mode\n if (provider === \"azure\") {\n const token = getAzureDevOpsToken();\n if (!token) {\n outputError(\n \"Azure DevOps authentication required. Set AZURE_DEVOPS_PAT (or AZDO_PAT).\",\n Boolean(options.json)\n );\n return;\n }\n\n try {\n const { waitUntilExit } = render(\n <BatchTuiAzure token={token} outputPath={options.output} />,\n { isScreenReaderEnabled: options.accessible ? true : undefined }\n );\n await waitUntilExit();\n } catch (error) {\n outputError(\n `TUI failed: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n }\n return;\n }\n\n const token = await getGitHubToken();\n if (!token) {\n outputError(\n \"GitHub authentication required. Install and authenticate GitHub CLI (gh auth login) or set GITHUB_TOKEN.\",\n Boolean(options.json)\n );\n return;\n }\n\n try {\n const { waitUntilExit } = render(<BatchTui token={token} outputPath={options.output} />, {\n isScreenReaderEnabled: options.accessible ? true : undefined\n });\n await waitUntilExit();\n } catch (error) {\n outputError(\n `TUI failed: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n }\n}\n\n// ── Headless implementation ──\n\nasync function runHeadless(\n repoArgs: string[],\n provider: string,\n options: BatchOptions\n): Promise<void> {\n const progress = createProgressReporter(!shouldLog(options));\n\n if (provider === \"azure\") {\n const token = getAzureDevOpsToken();\n if (!token) {\n outputError(\n \"Set AZURE_DEVOPS_PAT (or AZDO_PAT) to use Azure DevOps batch automation.\",\n Boolean(options.json)\n );\n return;\n }\n\n const repos: AzureDevOpsRepo[] = [];\n for (const arg of repoArgs) {\n const match = arg.match(AZURE_REPO_RE);\n if (!match) {\n outputError(\n `Invalid Azure DevOps repo format: \"${arg}\". Use org/project/repo.`,\n Boolean(options.json)\n );\n return;\n }\n const [, org, project, name] = match;\n progress.update(`Fetching ${arg}...`);\n try {\n const repo = await getAzureRepo(token, org, project, name);\n repos.push(repo);\n } catch (error) {\n outputError(\n `Failed to fetch repo ${arg}: ${sanitizeError(error instanceof Error ? error.message : String(error))}`,\n Boolean(options.json)\n );\n return;\n }\n }\n\n const results = await runBatchHeadlessAzure(repos, token, progress, {\n model: options.model,\n branch: options.branch\n });\n await emitResults(results, options);\n return;\n }\n\n // GitHub provider\n const token = await getGitHubToken();\n if (!token) {\n outputError(\n \"Set GITHUB_TOKEN or GH_TOKEN, or authenticate with GitHub CLI.\",\n Boolean(options.json)\n );\n return;\n }\n\n const repos: GitHubRepo[] = [];\n for (const arg of repoArgs) {\n const match = arg.match(GITHUB_REPO_RE);\n if (!match) {\n outputError(`Invalid GitHub repo format: \"${arg}\". Use owner/name.`, Boolean(options.json));\n return;\n }\n const [, owner, name] = match;\n progress.update(`Fetching ${arg}...`);\n try {\n const repo = await getGitHubRepo(token, owner, name);\n repos.push(repo);\n } catch (error) {\n outputError(\n `Failed to fetch repo ${arg}: ${sanitizeError(error instanceof Error ? error.message : String(error))}`,\n Boolean(options.json)\n );\n return;\n }\n }\n\n const results = await runBatchHeadlessGitHub(repos, token, progress, {\n model: options.model,\n branch: options.branch\n });\n await emitResults(results, options);\n}\n\nasync function emitResults(results: ProcessResult[], options: BatchOptions): Promise<void> {\n const succeeded = results.filter((r) => r.success).length;\n const failed = results.length - succeeded;\n\n if (options.output) {\n await safeWriteFile(options.output, JSON.stringify(results, null, 2), true);\n }\n\n if (options.json) {\n const result: CommandResult<{ results: ProcessResult[]; succeeded: number; failed: number }> = {\n ok: failed === 0,\n status: failed === 0 ? \"success\" : succeeded > 0 ? \"partial\" : \"error\",\n data: { results, succeeded, failed }\n };\n outputResult(result, true);\n } else if (shouldLog(options)) {\n process.stderr.write(`\\nBatch complete: ${succeeded} succeeded, ${failed} failed\\n`);\n for (const r of results) {\n if (r.success) {\n process.stderr.write(` ✓ ${r.repo}${r.prUrl ? ` → ${r.prUrl}` : \"\"}\\n`);\n } else {\n process.stderr.write(` ✗ ${r.repo} (${r.error})\\n`);\n }\n }\n }\n\n if (failed > 0) {\n process.exitCode = 1;\n }\n}\n\n// ── Stdin reader ──\n\nasync function readStdinRepos(): Promise<string[]> {\n if (process.stdin.isTTY) return [];\n\n return new Promise((resolve) => {\n const repos: string[] = [];\n const rl = readline.createInterface({ input: process.stdin });\n rl.on(\"line\", (line) => {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n repos.push(trimmed);\n }\n });\n rl.on(\"close\", () => resolve(repos));\n rl.on(\"error\", () => resolve(repos));\n });\n}\n","type AzureDevOpsProfileResponse = {\n id: string;\n displayName: string;\n};\n\ntype AzureDevOpsAccountResponse = {\n accountId: string;\n accountName: string;\n accountUri: string;\n};\n\ntype AzureDevOpsListResponse<T> = {\n value: T[];\n};\n\ntype AzureDevOpsProjectResponse = {\n id: string;\n name: string;\n url: string;\n};\n\ntype AzureDevOpsRepoResponse = {\n id: string;\n name: string;\n webUrl: string;\n remoteUrl: string;\n isPrivate: boolean;\n defaultBranch?: string;\n project?: {\n id: string;\n name: string;\n };\n};\n\nexport type AzureDevOpsOrg = {\n id: string;\n name: string;\n url: string;\n};\n\nexport type AzureDevOpsProject = {\n id: string;\n name: string;\n organization: string;\n url: string;\n};\n\nexport type AzureDevOpsRepo = {\n id: string;\n name: string;\n organization: string;\n project: string;\n projectId: string;\n webUrl: string;\n cloneUrl: string;\n isPrivate: boolean;\n defaultBranch: string;\n hasInstructions?: boolean;\n};\n\nconst PROFILE_URL =\n \"https://app.vssps.visualstudio.com/_apis/profile/profiles/me?api-version=7.1-preview.1\";\n\nconst ADO_SLUG_RE = /^[\\w][\\w.-]*$/u;\n\nfunction validateAdoSlug(value: string, label: string): string {\n if (!ADO_SLUG_RE.test(value)) {\n throw new Error(`Invalid ${label}: ${value}`);\n }\n return encodeURIComponent(value);\n}\n\nexport type AdoAuthMode = \"pat\" | \"bearer\";\n\nfunction getAuthHeader(token: string, authMode: AdoAuthMode = \"pat\"): string {\n if (authMode === \"bearer\") {\n return `Bearer ${token}`;\n }\n const encoded = Buffer.from(`:${token}`).toString(\"base64\");\n return `Basic ${encoded}`;\n}\n\nasync function adoRequest<T>(\n url: string,\n token: string,\n init?: RequestInit & { authMode?: AdoAuthMode }\n): Promise<T> {\n const { authMode, ...fetchInit } = init ?? {};\n const response = await fetch(url, {\n ...fetchInit,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: getAuthHeader(token, authMode),\n ...(fetchInit.headers ?? {})\n }\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Azure DevOps request failed (${response.status}): ${text}`);\n }\n\n return (await response.json()) as T;\n}\n\nexport function getAzureDevOpsToken(): string | null {\n return process.env.AZURE_DEVOPS_PAT ?? process.env.AZDO_PAT ?? null;\n}\n\nexport async function listOrganizations(token: string): Promise<AzureDevOpsOrg[]> {\n const profile = await adoRequest<AzureDevOpsProfileResponse>(PROFILE_URL, token);\n const accountsUrl = `https://app.vssps.visualstudio.com/_apis/accounts?memberId=${encodeURIComponent(profile.id)}&api-version=7.1-preview.1`;\n const accounts = await adoRequest<AzureDevOpsListResponse<AzureDevOpsAccountResponse>>(\n accountsUrl,\n token\n );\n\n return accounts.value.map((account) => ({\n id: account.accountId,\n name: account.accountName,\n url: account.accountUri\n }));\n}\n\nexport async function listProjects(\n token: string,\n organization: string\n): Promise<AzureDevOpsProject[]> {\n const org = validateAdoSlug(organization, \"organization\");\n const url = `https://dev.azure.com/${org}/_apis/projects?stateFilter=wellFormed&api-version=7.1-preview.1`;\n const response = await adoRequest<AzureDevOpsListResponse<AzureDevOpsProjectResponse>>(\n url,\n token\n );\n\n return response.value.map((project) => ({\n id: project.id,\n name: project.name,\n organization,\n url: project.url\n }));\n}\n\nexport async function listRepos(\n token: string,\n organization: string,\n project: string\n): Promise<AzureDevOpsRepo[]> {\n const org = validateAdoSlug(organization, \"organization\");\n const proj = validateAdoSlug(project, \"project\");\n const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories?api-version=7.1-preview.1`;\n const response = await adoRequest<AzureDevOpsListResponse<AzureDevOpsRepoResponse>>(url, token);\n\n return response.value.map((repo) => ({\n id: repo.id,\n name: repo.name,\n organization,\n project,\n projectId: repo.project?.id ?? \"\",\n webUrl: repo.webUrl,\n cloneUrl: repo.remoteUrl,\n isPrivate: repo.isPrivate,\n defaultBranch: repo.defaultBranch ?? \"refs/heads/main\"\n }));\n}\n\nexport async function getRepo(\n token: string,\n organization: string,\n project: string,\n repo: string,\n authMode: AdoAuthMode = \"pat\"\n): Promise<AzureDevOpsRepo> {\n const org = validateAdoSlug(organization, \"organization\");\n const proj = validateAdoSlug(project, \"project\");\n const r = validateAdoSlug(repo, \"repo\");\n const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories/${r}?api-version=7.1-preview.1`;\n const response = await adoRequest<AzureDevOpsRepoResponse>(url, token, { authMode });\n\n return {\n id: response.id,\n name: response.name,\n organization,\n project,\n projectId: response.project?.id ?? \"\",\n webUrl: response.webUrl,\n cloneUrl: response.remoteUrl,\n isPrivate: response.isPrivate,\n defaultBranch: response.defaultBranch ?? \"refs/heads/main\"\n };\n}\n\nfunction toRefName(branch: string): string {\n if (branch.startsWith(\"refs/\")) return branch;\n return `refs/heads/${branch}`;\n}\n\nexport async function createPullRequest(params: {\n token: string;\n organization: string;\n project: string;\n repoId: string;\n repoName: string;\n title: string;\n body: string;\n sourceBranch: string;\n targetBranch: string;\n authMode?: AdoAuthMode;\n}): Promise<string> {\n const org = validateAdoSlug(params.organization, \"organization\");\n const proj = validateAdoSlug(params.project, \"project\");\n const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories/${encodeURIComponent(params.repoId)}/pullrequests?api-version=7.1-preview.1`;\n const payload = {\n title: params.title,\n description: params.body,\n sourceRefName: toRefName(params.sourceBranch),\n targetRefName: toRefName(params.targetBranch)\n };\n\n const response = await adoRequest<{ pullRequestId: number }>(url, params.token, {\n method: \"POST\",\n body: JSON.stringify(payload),\n authMode: params.authMode\n });\n\n return `https://dev.azure.com/${org}/${proj}/_git/${encodeURIComponent(\n params.repoName\n )}/pullrequest/${response.pullRequestId}`;\n}\n\nexport async function checkRepoHasInstructions(\n token: string,\n organization: string,\n project: string,\n repoId: string,\n authMode: AdoAuthMode = \"pat\"\n): Promise<boolean> {\n const org = validateAdoSlug(organization, \"organization\");\n const proj = validateAdoSlug(project, \"project\");\n const url = `https://dev.azure.com/${org}/${proj}/_apis/git/repositories/${encodeURIComponent(repoId)}/items?path=/.github/copilot-instructions.md&includeContentMetadata=true&api-version=7.1-preview.1`;\n const response = await fetch(url, {\n headers: {\n Authorization: getAuthHeader(token, authMode)\n }\n });\n\n if (response.status === 404) {\n return false;\n }\n\n if (!response.ok) {\n throw new Error(`Azure DevOps request failed (${response.status})`);\n }\n\n return true;\n}\n\n/** CLI-only batch helper — always uses PAT auth (no authMode param needed). */\nexport async function checkReposForInstructions(\n token: string,\n repos: AzureDevOpsRepo[],\n onProgress?: (checked: number, total: number) => void\n): Promise<AzureDevOpsRepo[]> {\n const concurrency = 10;\n const results: AzureDevOpsRepo[] = [];\n let checked = 0;\n\n for (let i = 0; i < repos.length; i += concurrency) {\n const batch = repos.slice(i, i + concurrency);\n const checks = await Promise.all(\n batch.map(async (repo) => {\n const hasInstructions = await checkRepoHasInstructions(\n token,\n repo.organization,\n repo.project,\n repo.id\n );\n return { ...repo, hasInstructions };\n })\n );\n results.push(...checks);\n checked += batch.length;\n onProgress?.(checked, repos.length);\n }\n\n return results;\n}\n","import path from \"path\";\n\nimport { DEFAULT_MODEL } from \"../config\";\nimport { ensureDir, safeWriteFile, validateCachePath } from \"../utils/fs\";\nimport type { ProgressReporter } from \"../utils/output\";\nimport { buildInstructionsPrBody } from \"../utils/pr\";\n\nimport type { AzureDevOpsRepo } from \"./azureDevops\";\nimport { createPullRequest as createAzurePullRequest } from \"./azureDevops\";\nimport {\n buildAuthedUrl,\n checkoutBranch,\n cloneRepo,\n commitAll,\n isGitRepo,\n pushBranch,\n setRemoteUrl\n} from \"./git\";\nimport type { GitHubRepo } from \"./github\";\nimport { createPullRequest as createGitHubPullRequest } from \"./github\";\nimport { generateCopilotInstructions } from \"./instructions\";\nimport type { ReadinessReport } from \"./readiness\";\nimport { runReadinessReport } from \"./readiness\";\n\n// ── Types ──\n\nexport type ProcessResult = {\n repo: string;\n success: boolean;\n prUrl?: string;\n error?: string;\n};\n\nexport type ProcessGitHubRepoOptions = {\n repo: GitHubRepo;\n token: string;\n branch?: string;\n model?: string;\n timeoutMs?: number;\n progress?: ProgressReporter;\n};\n\nexport type ProcessAzureRepoOptions = {\n repo: AzureDevOpsRepo;\n token: string;\n branch?: string;\n model?: string;\n timeoutMs?: number;\n progress?: ProgressReporter;\n};\n\n// ── Token sanitization ──\n\nexport function sanitizeError(raw: string): string {\n return raw\n .replace(/x-access-token:[^@]+@/g, \"x-access-token:***@\")\n .replace(/pat:[^@]+@/g, \"pat:***@\")\n .replace(/https:\\/\\/[^@]+@/g, \"https://***@\");\n}\n\n// ── Shared repo processing core ──\n\ntype ProcessRepoParams = {\n label: string;\n cacheParts: string[];\n cloneUrl: string;\n token: string;\n provider: \"github\" | \"azure\";\n branch: string;\n model: string;\n timeoutMs: number;\n progress?: ProgressReporter;\n createPr: (repoPath: string, branch: string) => Promise<string>;\n};\n\nasync function processRepo(params: ProcessRepoParams): Promise<ProcessResult> {\n const {\n label,\n cacheParts,\n cloneUrl,\n token,\n provider,\n branch,\n model,\n timeoutMs,\n progress,\n createPr\n } = params;\n\n try {\n progress?.update(`${label}: Cloning...`);\n const cacheRoot = path.join(process.cwd(), \".agentrc-cache\");\n const repoPath = validateCachePath(cacheRoot, ...cacheParts);\n await ensureDir(repoPath);\n\n if (!(await isGitRepo(repoPath))) {\n const authedUrl = buildAuthedUrl(cloneUrl, token, provider);\n try {\n await cloneRepo(authedUrl, repoPath, { shallow: true, timeoutMs });\n } finally {\n await setRemoteUrl(repoPath, cloneUrl).catch(() => {});\n }\n }\n\n progress?.update(`${label}: Creating branch...`);\n await checkoutBranch(repoPath, branch);\n\n progress?.update(`${label}: Generating instructions...`);\n const instructions = await withTimeout(\n generateCopilotInstructions({\n repoPath,\n model,\n onProgress: (msg) => progress?.update(`${label}: ${msg}`)\n }),\n timeoutMs\n );\n\n if (!instructions.trim()) {\n throw new Error(\"Generated instructions were empty\");\n }\n\n const instructionsPath = path.join(repoPath, \".github\", \"copilot-instructions.md\");\n await ensureDir(path.dirname(instructionsPath));\n const { wrote, reason } = await safeWriteFile(instructionsPath, instructions, true);\n if (!wrote) {\n throw new Error(\n `Refused to write instructions (${reason === \"symlink\" ? \"path is a symlink\" : \"file exists\"})`\n );\n }\n\n progress?.update(`${label}: Committing...`);\n await commitAll(repoPath, \"chore: add copilot instructions via AgentRC\");\n\n progress?.update(`${label}: Pushing...`);\n await pushBranch(repoPath, branch, token, provider);\n\n progress?.update(`${label}: Creating PR...`);\n const prUrl = await createPr(repoPath, branch);\n\n progress?.succeed(`${label}: PR created`);\n return { repo: label, success: true, prUrl };\n } catch (error) {\n const msg = sanitizeError(error instanceof Error ? error.message : String(error));\n progress?.fail(`${label}: ${msg}`);\n return { repo: label, success: false, error: msg };\n }\n}\n\n// ── GitHub batch processing ──\n\nexport async function processGitHubRepo(options: ProcessGitHubRepoOptions): Promise<ProcessResult> {\n const {\n repo,\n token,\n branch = \"agentrc/add-instructions\",\n model = DEFAULT_MODEL,\n timeoutMs = 120_000,\n progress\n } = options;\n\n return processRepo({\n label: repo.fullName,\n cacheParts: [repo.owner, repo.name],\n cloneUrl: repo.cloneUrl,\n token,\n provider: \"github\",\n branch,\n model,\n timeoutMs,\n progress,\n createPr: (_repoPath, branchName) =>\n createGitHubPullRequest({\n token,\n owner: repo.owner,\n repo: repo.name,\n title: \"🤖 Add Copilot instructions via AgentRC\",\n body: buildInstructionsPrBody(),\n head: branchName,\n base: repo.defaultBranch\n })\n });\n}\n\n// ── Azure DevOps batch processing ──\n\nexport async function processAzureRepo(options: ProcessAzureRepoOptions): Promise<ProcessResult> {\n const {\n repo,\n token,\n branch = \"agentrc/add-instructions\",\n model = DEFAULT_MODEL,\n timeoutMs = 120_000,\n progress\n } = options;\n\n return processRepo({\n label: `${repo.organization}/${repo.project}/${repo.name}`,\n cacheParts: [repo.organization, repo.project, repo.name],\n cloneUrl: repo.cloneUrl,\n token,\n provider: \"azure\",\n branch,\n model,\n timeoutMs,\n progress,\n createPr: (_repoPath, branchName) =>\n createAzurePullRequest({\n token,\n organization: repo.organization,\n project: repo.project,\n repoId: repo.id,\n repoName: repo.name,\n title: \"🤖 Add Copilot instructions via AgentRC\",\n body: buildInstructionsPrBody(),\n sourceBranch: branchName,\n targetBranch: repo.defaultBranch\n })\n });\n}\n\n// ── Headless batch runners ──\n\nexport async function runBatchHeadlessGitHub(\n repos: GitHubRepo[],\n token: string,\n progress?: ProgressReporter,\n options?: { model?: string; branch?: string }\n): Promise<ProcessResult[]> {\n const results: ProcessResult[] = [];\n for (let i = 0; i < repos.length; i++) {\n progress?.update(`[${i + 1}/${repos.length}] Processing ${repos[i].fullName}...`);\n const result = await processGitHubRepo({\n repo: repos[i],\n token,\n progress,\n model: options?.model,\n branch: options?.branch\n });\n results.push(result);\n }\n progress?.done();\n return results;\n}\n\nexport async function runBatchHeadlessAzure(\n repos: AzureDevOpsRepo[],\n token: string,\n progress?: ProgressReporter,\n options?: { model?: string; branch?: string }\n): Promise<ProcessResult[]> {\n const results: ProcessResult[] = [];\n for (let i = 0; i < repos.length; i++) {\n const label = `${repos[i].organization}/${repos[i].project}/${repos[i].name}`;\n progress?.update(`[${i + 1}/${repos.length}] Processing ${label}...`);\n const result = await processAzureRepo({\n repo: repos[i],\n token,\n progress,\n model: options?.model,\n branch: options?.branch\n });\n results.push(result);\n }\n progress?.done();\n return results;\n}\n\n// ── Helpers ──\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout>;\n const timeout = new Promise<T>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Operation timed out after ${timeoutMs / 1000}s`)),\n timeoutMs\n );\n });\n try {\n return await Promise.race([promise, timeout]);\n } finally {\n clearTimeout(timer!);\n }\n}\n\n// ── Readiness batch processing ──\n\nexport type ReadinessProcessResult = {\n repo: string;\n report?: ReadinessReport;\n error?: string;\n};\n\nexport type ProcessBatchReadinessRepoOptions = {\n repo: GitHubRepo;\n token: string;\n repoDir: string;\n policies?: string[];\n onProgress?: (message: string) => void;\n};\n\n/**\n * Clone a single GitHub repo and run the AI-readiness report.\n * Credential-stripped clone URL is restored on the remote after cloning.\n * Extracted from BatchReadinessTui so the TUI remains a thin presenter.\n */\nexport async function processBatchReadinessRepo(\n options: ProcessBatchReadinessRepoOptions\n): Promise<ReadinessProcessResult> {\n const { repo, token, repoDir, policies, onProgress } = options;\n const progress = onProgress ?? (() => {});\n\n try {\n progress(`Cloning ${repo.fullName}...`);\n const authedUrl = buildAuthedUrl(repo.cloneUrl, token, \"github\");\n await ensureDir(path.dirname(repoDir));\n await cloneRepo(authedUrl, repoDir, { shallow: true });\n // Best-effort: strip credentials from the remote after cloning.\n // A failure here should not turn a successful readiness run into an error.\n await setRemoteUrl(repoDir, repo.cloneUrl).catch(() => {});\n\n progress(`Running readiness report for ${repo.fullName}...`);\n const report = await runReadinessReport({ repoPath: repoDir, policies });\n\n return { repo: repo.fullName, report };\n } catch (error) {\n return {\n repo: repo.fullName,\n error: sanitizeError(error instanceof Error ? error.message : \"Unknown error\")\n };\n }\n}\n","/** File patterns that AgentRC generates and should be included in PRs. */\nexport const AGENTRC_FILE_PATTERNS = [\n \".github/copilot-instructions.md\",\n \".vscode/mcp.json\",\n \".vscode/settings.json\",\n \"AGENTS.md\",\n \"agentrc.eval.json\"\n] as const;\n\n/** Check if a file path is a AgentRC-generated file. */\nexport function isAgentrcFile(filePath: string): boolean {\n const normalized = filePath.replace(/\\\\/g, \"/\");\n return (\n AGENTRC_FILE_PATTERNS.some((p) => normalized === p) || normalized.endsWith(\".instructions.md\")\n );\n}\n\nexport function buildInstructionsPrBody(): string {\n return [\n \"## 🤖 Copilot Instructions Added\",\n \"\",\n \"This PR adds a `.github/copilot-instructions.md` file to help GitHub Copilot understand this codebase better.\",\n \"\",\n \"### What's Included\",\n \"\",\n \"The instructions file contains:\",\n \"- Project overview and architecture\",\n \"- Tech stack and conventions\",\n \"- Build/test commands\",\n \"- Key directories and files\",\n \"\",\n \"### Benefits\",\n \"\",\n \"With these instructions, Copilot will:\",\n \"- Generate more contextually-aware code suggestions\",\n \"- Follow project-specific patterns and conventions\",\n \"- Understand the codebase structure\",\n \"\",\n \"---\",\n \"*Generated by [AgentRC](https://github.com/microsoft/agentrc) - Prime your repos for AI*\"\n ].join(\"\\n\");\n}\n\nexport function buildFullPrBody(): string {\n return [\n \"## 🤖 Primed for AI\",\n \"\",\n \"This PR adds configurations to prime this repository for AI coding assistants.\",\n \"\",\n \"### Added Files\",\n \"\",\n \"| File | Purpose |\",\n \"|------|---------|\",\n \"| `.github/copilot-instructions.md` | Custom instructions for GitHub Copilot |\",\n \"| `.vscode/settings.json` | VS Code settings for optimal AI assistance |\",\n \"| `.vscode/mcp.json` | Model Context Protocol server configuration |\",\n \"\",\n \"### What's Included\",\n \"\",\n \"The instructions file contains:\",\n \"- Project overview and architecture\",\n \"- Tech stack and conventions\",\n \"- Build/test commands\",\n \"- Key directories and files\",\n \"\",\n \"### Benefits\",\n \"\",\n \"With these configurations, Copilot will:\",\n \"- Generate more contextually-aware code suggestions\",\n \"- Follow project-specific patterns and conventions\",\n \"- Understand the codebase structure\",\n \"- Have access to MCP tools for enhanced capabilities\",\n \"\",\n \"### How to Use\",\n \"\",\n \"1. Merge this PR\",\n \"2. Open the project in VS Code\",\n \"3. Start chatting with Copilot — it now understands your project!\",\n \"\",\n \"---\",\n \"*Generated by [AgentRC](https://github.com/microsoft/agentrc) - Prime your repos for AI*\"\n ].join(\"\\n\");\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport type { SimpleGitProgressEvent } from \"simple-git\";\nimport simpleGit from \"simple-git\";\n\nexport async function isGitRepo(repoPath: string): Promise<boolean> {\n try {\n await fs.access(path.join(repoPath, \".git\"));\n return true;\n } catch {\n return false;\n }\n}\n\nexport type CloneOptions = {\n shallow?: boolean;\n timeoutMs?: number;\n onProgress?: (stage: string, progress: number) => void;\n};\n\nexport async function cloneRepo(\n repoUrl: string,\n destination: string,\n options: CloneOptions = {}\n): Promise<void> {\n const { shallow = true, timeoutMs = 60000, onProgress } = options;\n\n const git = simpleGit({\n progress: onProgress\n ? ({ stage, progress }: SimpleGitProgressEvent) => {\n onProgress(stage, progress);\n }\n : undefined,\n timeout: {\n block: timeoutMs\n }\n });\n\n const cloneArgs: string[] = [];\n if (shallow) {\n cloneArgs.push(\"--depth\", \"1\");\n }\n\n await git.clone(repoUrl, destination, cloneArgs);\n}\n\n/**\n * Replace the remote origin URL, typically to strip embedded credentials\n * after cloning with an authenticated URL.\n */\nexport async function setRemoteUrl(repoPath: string, url: string): Promise<void> {\n const git = simpleGit(repoPath);\n await git.remote([\"set-url\", \"origin\", url]);\n}\n\nexport async function checkoutBranch(repoPath: string, branch: string): Promise<void> {\n const git = simpleGit(repoPath);\n const branches = await git.branchLocal();\n if (!branches.all.includes(branch)) {\n await git.checkoutLocalBranch(branch);\n return;\n }\n await git.checkout(branch);\n}\n\nexport async function commitAll(repoPath: string, message: string): Promise<void> {\n const git = simpleGit(repoPath);\n await git.add([\"-A\"]);\n const status = await git.status();\n if (status.files.length === 0) return;\n await git.commit(message);\n}\n\nexport type AuthProvider = \"github\" | \"azure\";\n\n/** Normalize a git URL by removing trailing slashes and any existing auth */\nfunction normalizeGitUrl(url: string): string {\n let normalized = url.trim();\n // Remove trailing slashes\n while (normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n // Remove any existing x-access-token auth\n normalized = normalized.replace(/https:\\/\\/x-access-token:[^@]+@/, \"https://\");\n // Remove any existing PAT auth\n normalized = normalized.replace(/https:\\/\\/pat:[^@]+@/, \"https://\");\n return normalized;\n}\n\nexport function buildAuthedUrl(url: string, token: string, provider: AuthProvider): string {\n const normalizedUrl = normalizeGitUrl(url);\n if (!normalizedUrl.startsWith(\"https://\")) return normalizedUrl;\n if (provider === \"azure\") {\n return normalizedUrl.replace(\"https://\", `https://pat:${token}@`);\n }\n return normalizedUrl.replace(\"https://\", `https://x-access-token:${token}@`);\n}\n\nexport async function pushBranch(\n repoPath: string,\n branch: string,\n token?: string,\n provider: AuthProvider = \"github\"\n): Promise<void> {\n const git = simpleGit(repoPath);\n\n if (token) {\n // Set up credentials for this push\n const remoteUrl = (await git.remote([\"get-url\", \"origin\"])) ?? \"\";\n const normalizedUrl = normalizeGitUrl(remoteUrl);\n if (normalizedUrl.startsWith(\"https://\")) {\n const authedUrl = buildAuthedUrl(normalizedUrl, token, provider);\n await git.remote([\"set-url\", \"origin\", authedUrl]);\n try {\n await git.push([\"-u\", \"origin\", branch]);\n } catch (err) {\n // Strip embedded credentials from error messages to avoid leaking tokens\n const sanitized =\n err instanceof Error\n ? new Error(err.message.replace(/https:\\/\\/[^@]+@/g, \"https://***@\"))\n : err;\n throw sanitized;\n } finally {\n // Restore original URL to avoid leaking token\n await git.remote([\"set-url\", \"origin\", normalizedUrl]);\n }\n return;\n }\n }\n\n await git.push([\"-u\", \"origin\", branch]);\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nimport { Octokit } from \"@octokit/rest\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Get a GitHub token from environment variables or the GitHub CLI.\n * Tries GITHUB_TOKEN, GH_TOKEN, then `gh auth token` in that order.\n */\nexport async function getGitHubToken(): Promise<string | null> {\n // Check environment variables first\n const envToken = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;\n if (envToken) {\n return envToken;\n }\n\n // Fall back to GitHub CLI\n try {\n const { stdout } = await execFileAsync(\"gh\", [\"auth\", \"token\"], { timeout: 5000 });\n const token = stdout.trim();\n if (token) {\n return token;\n }\n } catch {\n // gh CLI not installed or not authenticated\n }\n\n return null;\n}\n\nexport type GitHubRepo = {\n name: string;\n owner: string;\n fullName: string;\n cloneUrl: string;\n isPrivate: boolean;\n defaultBranch: string;\n hasInstructions?: boolean;\n};\n\nexport function createGitHubClient(token: string): Octokit {\n return new Octokit({ auth: token });\n}\n\nexport async function listAccessibleRepos(token: string, limit = 100): Promise<GitHubRepo[]> {\n const client = createGitHubClient(token);\n\n // Fetch only first page - avoids timeout for users with many repos\n const repos = await client.rest.repos.listForAuthenticatedUser({\n visibility: \"all\",\n affiliation: \"owner\",\n sort: \"pushed\",\n per_page: Math.min(limit, 100)\n });\n\n return repos.data.slice(0, limit).map((repo) => ({\n name: repo.name,\n owner: repo.owner?.login ?? \"unknown\",\n fullName: repo.full_name,\n cloneUrl: repo.clone_url ?? \"\",\n isPrivate: repo.private,\n defaultBranch: repo.default_branch ?? \"main\"\n }));\n}\n\nexport async function getRepo(token: string, owner: string, repo: string): Promise<GitHubRepo> {\n const client = createGitHubClient(token);\n const response = await client.rest.repos.get({ owner, repo });\n\n return {\n name: response.data.name,\n owner: response.data.owner?.login ?? owner,\n fullName: response.data.full_name,\n cloneUrl: response.data.clone_url,\n isPrivate: response.data.private,\n defaultBranch: response.data.default_branch\n };\n}\n\nexport async function createPullRequest(params: {\n token: string;\n owner: string;\n repo: string;\n title: string;\n body: string;\n head: string;\n base: string;\n}): Promise<string> {\n const client = createGitHubClient(params.token);\n const response = await client.rest.pulls.create({\n owner: params.owner,\n repo: params.repo,\n title: params.title,\n body: params.body,\n head: params.head,\n base: params.base\n });\n\n return response.data.html_url;\n}\n\nexport type GitHubOrg = {\n login: string;\n name: string | null;\n};\n\nexport async function listUserOrgs(token: string): Promise<GitHubOrg[]> {\n const client = createGitHubClient(token);\n const orgs = await client.paginate(client.rest.orgs.listForAuthenticatedUser, {\n per_page: 100\n });\n\n return orgs.map((org) => ({\n login: org.login,\n name: org.description ?? null\n }));\n}\n\nexport async function listOrgRepos(token: string, org: string, limit = 100): Promise<GitHubRepo[]> {\n const client = createGitHubClient(token);\n\n // Fetch only the first page(s) up to limit - avoids timeout on huge orgs\n const repos = await client.rest.repos.listForOrg({\n org,\n type: \"all\",\n sort: \"pushed\",\n per_page: Math.min(limit, 100)\n });\n\n return repos.data.slice(0, limit).map((repo) => ({\n name: repo.name,\n owner: repo.owner?.login ?? org,\n fullName: repo.full_name,\n cloneUrl: repo.clone_url ?? \"\",\n isPrivate: repo.private,\n defaultBranch: repo.default_branch ?? \"main\"\n }));\n}\n\n/**\n * Check if a repo has .github/copilot-instructions.md\n */\nexport async function checkRepoHasInstructions(\n token: string,\n owner: string,\n repo: string\n): Promise<boolean> {\n const client = createGitHubClient(token);\n try {\n await client.rest.repos.getContent({\n owner,\n repo,\n path: \".github/copilot-instructions.md\"\n });\n return true;\n } catch (error: unknown) {\n if (\n error &&\n typeof error === \"object\" &&\n \"status\" in error &&\n (error as { status: number }).status === 404\n ) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Check multiple repos for instructions in parallel (with concurrency limit)\n */\nexport async function checkReposForInstructions(\n token: string,\n repos: GitHubRepo[],\n onProgress?: (checked: number, total: number) => void\n): Promise<GitHubRepo[]> {\n const concurrency = 10;\n const results: GitHubRepo[] = [];\n let checked = 0;\n\n for (let i = 0; i < repos.length; i += concurrency) {\n const batch = repos.slice(i, i + concurrency);\n const checks = await Promise.all(\n batch.map(async (repo) => {\n const hasInstructions = await checkRepoHasInstructions(token, repo.owner, repo.name);\n return { ...repo, hasInstructions };\n })\n );\n results.push(...checks);\n checked += batch.length;\n onProgress?.(checked, repos.length);\n }\n\n return results;\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport type { PermissionHandler, Tool } from \"@github/copilot-sdk\";\n\nimport { DEFAULT_MODEL } from \"../config\";\nimport { ensureDir, safeWriteFile } from \"../utils/fs\";\n\nimport type { Area, InstructionStrategy } from \"./analyzer\";\nimport { sanitizeAreaName } from \"./analyzer\";\nimport { assertCopilotCliReady } from \"./copilot\";\nimport { createCopilotClient, loadCopilotSdk } from \"./copilotSdk\";\nimport type { FileAction } from \"./generator\";\n\ntype CopilotClient = Awaited<ReturnType<typeof createCopilotClient>>;\n\nexport type { InstructionStrategy };\n\nexport type NestedInstructionsResult = {\n hub: { relativePath: string; content: string };\n details: Array<{ relativePath: string; content: string; topic: string }>;\n claudeMd?: { relativePath: string; content: string };\n warnings: string[];\n};\n\nexport type NestedHub = {\n hubContent: string;\n topics: Array<{ slug: string; title: string; description: string }>;\n};\n\nexport type ExistingInstructionsContext = {\n /** AGENTS.md files found in the repo tree. */\n agentsMdFiles: string[];\n /** CLAUDE.md files found in the repo tree. */\n claudeMdFiles: string[];\n /** .github/instructions/*.instructions.md files. */\n instructionMdFiles: string[];\n /** Detail files found in nested strategy directories (e.g. .agents/*.md). */\n detailFiles: string[];\n};\n\n/**\n * Detect existing AI instruction files in a repository.\n * Returns context about AGENTS.md, CLAUDE.md, .instructions.md, and nested detail files\n * so instruction generation can avoid duplicating content they already cover.\n */\nexport async function detectExistingInstructions(\n repoPath: string,\n detailDirName = \".agents\"\n): Promise<ExistingInstructionsContext> {\n const { agentsMdFiles, claudeMdFiles } = await findInstructionMarkerFiles(repoPath);\n const instructionMdFiles = await findModularInstructionFiles(repoPath);\n const detailFiles = await findDetailFiles(repoPath, detailDirName);\n return { agentsMdFiles, claudeMdFiles, instructionMdFiles, detailFiles };\n}\n\n/**\n * Walk the repo tree to find AGENTS.md and CLAUDE.md files,\n * excluding directories that cannot contain user-authored content.\n */\nasync function findInstructionMarkerFiles(repoPath: string): Promise<{\n agentsMdFiles: string[];\n claudeMdFiles: string[];\n}> {\n const agentsMdFiles: string[] = [];\n const claudeMdFiles: string[] = [];\n const excludeDirs = new Set([\".git\", \"node_modules\", \"apm_modules\", \".apm\"]);\n\n async function walk(dir: string, relPath: string): Promise<void> {\n const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const entry of entries) {\n if (excludeDirs.has(entry.name)) continue;\n if (entry.isSymbolicLink()) continue;\n if (entry.isFile()) {\n if (entry.name === \"AGENTS.md\") {\n agentsMdFiles.push(relPath ? `${relPath}/${entry.name}` : entry.name);\n } else if (entry.name === \"CLAUDE.md\") {\n claudeMdFiles.push(relPath ? `${relPath}/${entry.name}` : entry.name);\n }\n } else if (entry.isDirectory()) {\n await walk(path.join(dir, entry.name), relPath ? `${relPath}/${entry.name}` : entry.name);\n }\n }\n }\n\n await walk(repoPath, \"\");\n return { agentsMdFiles: agentsMdFiles.sort(), claudeMdFiles: claudeMdFiles.sort() };\n}\n\n/**\n * Find modular .instructions.md files in .github/instructions/.\n */\nasync function findModularInstructionFiles(repoPath: string): Promise<string[]> {\n const dir = path.join(repoPath, \".github\", \"instructions\");\n const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);\n return entries\n .filter((e) => !e.isSymbolicLink() && e.isFile() && e.name.endsWith(\".instructions.md\"))\n .map((e) => `.github/instructions/${e.name}`)\n .sort();\n}\n\n/**\n * Find detail files in nested strategy directories.\n * Walks the repo tree looking for directories matching detailDirName\n * and lists .md files inside them.\n */\nasync function findDetailFiles(repoPath: string, detailDirName: string): Promise<string[]> {\n const detailFiles: string[] = [];\n const excludeDirs = new Set([\".git\", \"node_modules\", \"apm_modules\", \".apm\"]);\n\n async function walk(dir: string, relPath: string): Promise<void> {\n const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const entry of entries) {\n if (excludeDirs.has(entry.name)) continue;\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) {\n if (entry.name === detailDirName) {\n // Found a detail directory — list .md files inside\n const detailDir = path.join(dir, entry.name);\n const detailEntries = await fs\n .readdir(detailDir, { withFileTypes: true })\n .catch(() => []);\n for (const de of detailEntries) {\n if (!de.isSymbolicLink() && de.isFile() && de.name.endsWith(\".md\")) {\n const rel = relPath\n ? `${relPath}/${entry.name}/${de.name}`\n : `${entry.name}/${de.name}`;\n detailFiles.push(rel);\n }\n }\n } else {\n await walk(path.join(dir, entry.name), relPath ? `${relPath}/${entry.name}` : entry.name);\n }\n }\n }\n }\n\n await walk(repoPath, \"\");\n return detailFiles.sort();\n}\n\n/**\n * Build a prompt section listing existing instruction files.\n * Only emits content when instruction files actually exist,\n * so the LLM knows what content is already covered.\n */\nexport function buildExistingInstructionsSection(ctx: ExistingInstructionsContext): string {\n const allFiles = [\n ...ctx.agentsMdFiles,\n ...ctx.claudeMdFiles,\n ...ctx.instructionMdFiles,\n ...ctx.detailFiles\n ];\n if (allFiles.length === 0) return \"\";\n\n const lines: string[] = [\n \"\",\n \"## Existing Instruction Files\",\n \"This repo already contains instruction files that AI agents load automatically:\",\n ...allFiles.map((f) => `- \\`${f}\\``),\n \"\",\n \"### Output rules\",\n \"- Content in the above files is already loaded by AI agents — do not restate it.\",\n \"- For topics covered by existing files, use a single markdown link (e.g., `See [AGENTS.md](AGENTS.md)`).\",\n \"- Focus only on project-specific conventions not already covered by the above files.\",\n \"\"\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Strip outer markdown code fences that LLMs sometimes wrap around generated file content.\n * Only removes a single outer fence (```markdown or bare ```) — internal fences are preserved.\n */\nexport function stripMarkdownFences(content: string): string {\n const trimmed = content.trim();\n // Match an opening fence at the very start and a closing fence at the very end.\n // The opening fence may specify a language tag (e.g. ```markdown).\n const fenceRe = /^```(?:markdown|md)?[ \\t]*\\n([\\s\\S]*?)\\n```[ \\t]*$/;\n const match = fenceRe.exec(trimmed);\n return match ? match[1].trim() : trimmed;\n}\n\n/**\n * Create a custom SDK tool that captures emitted file content into a closure.\n * The agent calls this tool instead of outputting content in chat, giving us\n * structured content free of commentary and code-fence wrapping.\n */\nasync function createEmitTool(): Promise<{\n tool: Tool<{ content: string }>;\n getContent: () => string | undefined;\n}> {\n const sdk = await loadCopilotSdk();\n let captured: string | undefined;\n const tool = sdk.defineTool(\"emit_file_content\", {\n description:\n \"Emit the complete generated file content. Call this tool exactly once \" +\n \"with the full markdown content of the file you were asked to generate. \" +\n \"Do NOT output the content in chat — use this tool instead.\",\n parameters: {\n type: \"object\",\n properties: {\n content: {\n type: \"string\",\n description: \"The complete markdown file content to emit\"\n }\n },\n required: [\"content\"]\n },\n handler: (args: { content: string }) => {\n captured = args.content;\n return \"Content captured successfully.\";\n }\n });\n return { tool, getContent: () => captured };\n}\n\nconst INSTRUCTION_GENERATION_EXCLUDED_TOOLS = [\n \"edit_file\",\n \"create_file\",\n \"bash\",\n \"str_replace_editor\"\n];\n\nconst READ_ONLY_PERMISSION_HANDLER: PermissionHandler = (request) => {\n if (request.kind === \"read\" || request.kind === \"custom-tool\") {\n return { kind: \"approved\" };\n }\n\n return {\n kind: \"denied-no-approval-rule-and-could-not-request-from-user\"\n };\n};\n\nfunction getSessionError(errorMsg: string): Error {\n if (errorMsg.toLowerCase().includes(\"auth\") || errorMsg.toLowerCase().includes(\"login\")) {\n return new Error(\"Copilot CLI not logged in. Run `copilot` then `/login` to authenticate.\");\n }\n\n return new Error(errorMsg);\n}\n\nfunction isCopilotAuthError(error: unknown): boolean {\n return error instanceof Error && error.message.includes(\"Copilot CLI not logged in.\");\n}\n\nfunction resolveAreaWorkingDirectory(repoPath: string, area?: Area): string {\n const repoRoot = path.resolve(repoPath);\n const rawWorkingDirectory = area?.workingDirectory ?? area?.path;\n if (!rawWorkingDirectory) return repoRoot;\n\n const resolved = area?.workingDirectory\n ? path.resolve(repoRoot, rawWorkingDirectory)\n : path.isAbsolute(rawWorkingDirectory)\n ? path.resolve(rawWorkingDirectory)\n : path.resolve(repoRoot, rawWorkingDirectory);\n\n if (resolved !== repoRoot && !resolved.startsWith(repoRoot + path.sep)) {\n throw new Error(`Invalid workingDirectory \"${rawWorkingDirectory}\": escapes repo boundary`);\n }\n\n return resolved;\n}\n\n/**\n * Try to set autopilot mode on a session via the RPC surface.\n * This is best-effort — the RPC method is public but undocumented,\n * so we swallow errors silently.\n */\ntype SessionWithRpc = { rpc: { mode: { set: (p: { mode: string }) => Promise<unknown> } } };\n\nasync function trySetAutopilot(\n session: Awaited<ReturnType<CopilotClient[\"createSession\"]>>\n): Promise<void> {\n try {\n await (session as unknown as SessionWithRpc).rpc.mode.set({ mode: \"autopilot\" });\n } catch {\n // Autopilot mode is best-effort; ignore failures.\n }\n}\n\n/** Resolve final content: prefer tool-captured content, fall back to chat stream, apply fence stripping. */\nfunction resolveContent(emitContent: string | undefined, chatContent: string): string {\n const raw = emitContent ?? chatContent;\n return stripMarkdownFences(raw);\n}\n\ntype GenerateInstructionsOptions = {\n repoPath: string;\n model?: string;\n onProgress?: (message: string) => void;\n strategy?: InstructionStrategy;\n detailDir?: string;\n claudeMd?: boolean;\n};\n\nexport async function generateCopilotInstructions(\n options: GenerateInstructionsOptions\n): Promise<string> {\n const repoPath = options.repoPath;\n const progress = options.onProgress ?? (() => {});\n\n progress(\"Checking Copilot CLI...\");\n const cliConfig = await assertCopilotCliReady();\n\n progress(\"Detecting existing instructions...\");\n const existingCtx = await detectExistingInstructions(repoPath);\n const existingSection = buildExistingInstructionsSection(existingCtx);\n const hasExistingInstructions = existingSection.length > 0;\n\n progress(\"Starting Copilot SDK...\");\n const client = await createCopilotClient(cliConfig);\n\n try {\n progress(\"Creating session...\");\n const preferredModel = options.model ?? DEFAULT_MODEL;\n\n const systemContent = hasExistingInstructions\n ? \"You are an expert codebase analyst. Your task is to generate a concise .github/copilot-instructions.md that complements existing instruction files. Use the available tools (glob, view, grep) to explore the codebase. When done, call the emit_file_content tool with the final markdown.\"\n : \"You are an expert codebase analyst. Your task is to generate a concise .github/copilot-instructions.md file. Use the available tools (glob, view, grep) to explore the codebase. When done, call the emit_file_content tool with the final markdown.\";\n\n const { tool: emitTool, getContent } = await createEmitTool();\n\n const session = await client.createSession({\n model: preferredModel,\n streaming: true,\n workingDirectory: repoPath,\n systemMessage: {\n content: systemContent\n },\n tools: [emitTool],\n excludedTools: INSTRUCTION_GENERATION_EXCLUDED_TOOLS,\n onPermissionRequest: READ_ONLY_PERMISSION_HANDLER,\n infiniteSessions: { enabled: false }\n });\n\n await trySetAutopilot(session);\n\n let content = \"\";\n let sessionError: Error | undefined;\n\n // Subscribe to events for progress and to capture content\n session.on((event) => {\n const e = event as { type: string; data?: Record<string, unknown> };\n if (e.type === \"assistant.message_delta\") {\n const delta = e.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(\"Generating instructions...\");\n }\n } else if (e.type === \"tool.execution_start\") {\n const toolName = e.data?.toolName as string | undefined;\n progress(`Using tool: ${toolName ?? \"...\"}`);\n } else if (e.type === \"session.error\") {\n const errorMsg = (e.data?.message as string) ?? \"Unknown error\";\n sessionError = getSessionError(errorMsg);\n }\n });\n\n // Simple prompt - let the agent use tools to explore\n const prompt = `Analyze this codebase and generate a .github/copilot-instructions.md file.\n\nFan out multiple Explore subagents to map out the codebase in parallel:\n1. Check for existing instruction files: glob for **/{.github/copilot-instructions.md,AGENT.md,CLAUDE.md,.cursorrules,README.md}\n2. Identify the tech stack: look at package.json, tsconfig.json, pyproject.toml, Cargo.toml, go.mod, *.csproj, *.sln, build.gradle, pom.xml, etc.\n3. Understand the structure: list key directories\n4. Detect monorepo structures: check for workspace configs (npm/pnpm/yarn workspaces, Cargo.toml [workspace], go.work, .sln solution files, settings.gradle include directives, pom.xml modules)\n\nGenerate concise instructions (~20-50 lines) covering:\n- Tech stack and architecture\n- Build/test commands\n- Project-specific conventions\n- Key files/directories\n- Monorepo structure and per-app layout (if this is a monorepo, describe the workspace organization, how apps relate to each other, and any shared libraries)\n${existingSection}\nWhen you have the complete markdown content, call the \\`emit_file_content\\` tool with it. Do NOT output the file content directly in chat.`;\n\n progress(\"Analyzing codebase...\");\n let sendError: unknown;\n try {\n await session.sendAndWait({ prompt }, 180000);\n } catch (err) {\n sendError = err;\n } finally {\n await session.destroy();\n }\n if (sessionError) throw sessionError;\n if (sendError !== undefined)\n throw sendError instanceof Error ? sendError : new Error(String(sendError));\n\n return resolveContent(getContent(), content) || \"\";\n } finally {\n await client.stop();\n }\n}\n\ntype GenerateAreaInstructionsOptions = {\n repoPath: string;\n area: Area;\n model?: string;\n onProgress?: (message: string) => void;\n strategy?: InstructionStrategy;\n detailDir?: string;\n claudeMd?: boolean;\n};\n\nexport async function generateAreaInstructions(\n options: GenerateAreaInstructionsOptions\n): Promise<string> {\n const { repoPath, area } = options;\n const progress = options.onProgress ?? (() => {});\n\n progress(`Checking Copilot CLI for area \"${area.name}\"...`);\n const cliConfig = await assertCopilotCliReady();\n\n progress(`Detecting existing instructions for area \"${area.name}\"...`);\n const existingCtx = await detectExistingInstructions(repoPath);\n const existingSection = buildExistingInstructionsSection(existingCtx);\n const hasExistingInstructions = existingSection.length > 0;\n\n progress(`Starting Copilot SDK for area \"${area.name}\"...`);\n const client = await createCopilotClient(cliConfig);\n\n try {\n const applyToPatterns = Array.isArray(area.applyTo) ? area.applyTo : [area.applyTo];\n const applyToStr = applyToPatterns.join(\", \");\n\n progress(`Creating session for area \"${area.name}\"...`);\n const preferredModel = options.model ?? DEFAULT_MODEL;\n\n const areaSystemContent = hasExistingInstructions\n ? `You are an expert codebase analyst. Your task is to generate a concise .instructions.md file for a specific area of a codebase. This file will be used as a file-based custom instruction in VS Code Copilot, automatically applied when working on files matching certain patterns. This file should complement, not duplicate, existing instruction files. Use the Explore subagents and read-only tools to explore the codebase. When done, call the emit_file_content tool with the final markdown.`\n : `You are an expert codebase analyst. Your task is to generate a concise .instructions.md file for a specific area of a codebase. This file will be used as a file-based custom instruction in VS Code Copilot, automatically applied when working on files matching certain patterns. Use the Explore subagents and read-only tools to explore the codebase. When done, call the emit_file_content tool with the final markdown.`;\n\n const { tool: emitTool, getContent } = await createEmitTool();\n\n const session = await client.createSession({\n model: preferredModel,\n streaming: true,\n workingDirectory: resolveAreaWorkingDirectory(repoPath, area),\n systemMessage: {\n content: areaSystemContent\n },\n tools: [emitTool],\n excludedTools: INSTRUCTION_GENERATION_EXCLUDED_TOOLS,\n onPermissionRequest: READ_ONLY_PERMISSION_HANDLER,\n infiniteSessions: { enabled: false }\n });\n\n await trySetAutopilot(session);\n\n let content = \"\";\n let sessionError: Error | undefined;\n\n session.on((event) => {\n const e = event as { type: string; data?: Record<string, unknown> };\n if (e.type === \"assistant.message_delta\") {\n const delta = e.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(`Generating instructions for \"${area.name}\"...`);\n }\n } else if (e.type === \"tool.execution_start\") {\n const toolName = e.data?.toolName as string | undefined;\n progress(`${area.name}: using tool ${toolName ?? \"...\"}`);\n } else if (e.type === \"session.error\") {\n const errorMsg = (e.data?.message as string) ?? \"Unknown error\";\n sessionError = getSessionError(errorMsg);\n }\n });\n\n const prompt = `Analyze the \"${area.name}\" area of this codebase and generate a file-based instruction file.\n\nThis area covers files matching: ${applyToStr}\n${area.description ? `Description: ${area.description}` : \"\"}\n\nUse tools to explore ONLY the files and directories within this area:\n1. List the key files: glob for ${applyToPatterns.map((p) => `\"${p}\"`).join(\", \")}\n2. Identify the tech stack, dependencies, and frameworks used in this area\n3. Look at key source files to understand patterns and conventions specific to this area\n\nGenerate concise instructions (~10-30 lines) covering:\n- What this area does and its role in the overall project\n- Area-specific tech stack, dependencies, and frameworks\n- Coding conventions and patterns specific to this area\n- Build/test commands relevant to this area (if different from root)\n- Key files and directory structure within this area\n\nIMPORTANT:\n- Focus ONLY on this specific area, not the whole repo\n- Do NOT repeat repo-wide information (that goes in the root copilot-instructions.md)\n- Keep it complementary to root instructions\n${existingSection ? `- Do NOT duplicate content already covered by existing instruction files\\n${existingSection}` : \"\"}\n- When you have the complete markdown content, call the \\`emit_file_content\\` tool with it. Do NOT output the file content directly in chat.`;\n\n progress(`Analyzing area \"${area.name}\"...`);\n let sendError: unknown;\n try {\n await session.sendAndWait({ prompt }, 180000);\n } catch (err) {\n sendError = err;\n } finally {\n await session.destroy();\n }\n if (sessionError) throw sessionError;\n if (sendError !== undefined)\n throw sendError instanceof Error ? sendError : new Error(String(sendError));\n\n return resolveContent(getContent(), content) || \"\";\n } finally {\n await client.stop();\n }\n}\n\nfunction escapeYamlString(value: string): string {\n return value\n .replace(/\\0/gu, \"\")\n .replace(/\\\\/gu, \"\\\\\\\\\")\n .replace(/\"/gu, '\\\\\"')\n .replace(/\\n/gu, \"\\\\n\")\n .replace(/\\r/gu, \"\\\\r\")\n .replace(/\\t/gu, \"\\\\t\");\n}\n\nexport function buildAreaFrontmatter(area: Area): string {\n const applyTo = Array.isArray(area.applyTo) ? area.applyTo : [area.applyTo];\n const applyToValue =\n applyTo.length === 1\n ? `\"${escapeYamlString(applyTo[0])}\"`\n : `[${applyTo.map((p) => `\"${escapeYamlString(p)}\"`).join(\", \")}]`;\n const desc = area.description\n ? `Use when working on ${area.name}. ${area.description}`\n : `Use when working on ${area.name}`;\n\n return `---\ndescription: \"${escapeYamlString(desc)}\"\napplyTo: ${applyToValue}\n---`;\n}\n\nexport function buildAreaInstructionContent(area: Area, body: string): string {\n return `${buildAreaFrontmatter(area)}\\n\\n${body}\\n`;\n}\n\nexport function areaInstructionPath(repoPath: string, area: Area): string {\n return path.join(\n repoPath,\n \".github\",\n \"instructions\",\n `${sanitizeAreaName(area.name)}.instructions.md`\n );\n}\n\nexport type WriteAreaResult = {\n status: \"written\" | \"skipped\" | \"symlink\" | \"empty\";\n filePath: string;\n};\n\nexport async function writeAreaInstruction(\n repoPath: string,\n area: Area,\n body: string,\n force?: boolean\n): Promise<WriteAreaResult> {\n const filePath = areaInstructionPath(repoPath, area);\n if (!body.trim()) return { status: \"empty\", filePath };\n await ensureDir(path.dirname(filePath));\n const { wrote, reason } = await safeWriteFile(\n filePath,\n buildAreaInstructionContent(area, body),\n Boolean(force)\n );\n if (!wrote) {\n return { status: reason === \"symlink\" ? \"symlink\" : \"skipped\", filePath };\n }\n return { status: \"written\", filePath };\n}\n\n/**\n * Write an instruction file to an arbitrary repo-relative path.\n * Validates the path stays within the repo root.\n */\nexport async function writeInstructionFile(\n repoPath: string,\n relativePath: string,\n content: string,\n force?: boolean\n): Promise<WriteAreaResult> {\n const resolvedRoot = path.resolve(repoPath);\n const filePath = path.resolve(repoPath, relativePath);\n if (!filePath.startsWith(resolvedRoot + path.sep) && filePath !== resolvedRoot) {\n throw new Error(`Invalid path: escapes repository root (${relativePath})`);\n }\n if (!content.trim()) return { status: \"empty\", filePath };\n await ensureDir(path.dirname(filePath));\n const { wrote, reason } = await safeWriteFile(filePath, content, Boolean(force));\n if (!wrote) {\n return { status: reason === \"symlink\" ? \"symlink\" : \"skipped\", filePath };\n }\n return { status: \"written\", filePath };\n}\n\nfunction statusToAction(status: WriteAreaResult[\"status\"]): FileAction[\"action\"] {\n switch (status) {\n case \"written\":\n return \"wrote\";\n case \"symlink\":\n return \"symlink\";\n case \"empty\":\n return \"empty\";\n default:\n return \"skipped\";\n }\n}\n\n/**\n * Write all files for a nested instruction set (hub + details + optional CLAUDE.md).\n */\nexport async function writeNestedInstructions(\n repoPath: string,\n result: NestedInstructionsResult,\n force?: boolean\n): Promise<FileAction[]> {\n const actions: FileAction[] = [];\n\n // Write hub\n const hubResult = await writeInstructionFile(\n repoPath,\n result.hub.relativePath,\n result.hub.content,\n force\n );\n actions.push({\n path: hubResult.filePath,\n action: statusToAction(hubResult.status)\n });\n\n // Write detail files\n for (const detail of result.details) {\n const detailResult = await writeInstructionFile(\n repoPath,\n detail.relativePath,\n detail.content,\n force\n );\n actions.push({\n path: detailResult.filePath,\n action: statusToAction(detailResult.status)\n });\n }\n\n // Write optional CLAUDE.md\n if (result.claudeMd) {\n const claudeResult = await writeInstructionFile(\n repoPath,\n result.claudeMd.relativePath,\n result.claudeMd.content,\n force\n );\n actions.push({\n path: claudeResult.filePath,\n action: statusToAction(claudeResult.status)\n });\n }\n\n return actions;\n}\n\n// ─── Nested strategy generation ───\n\ntype NestedTopic = {\n slug: string;\n title: string;\n description: string;\n};\n\ntype HubResult = {\n hubContent: string;\n topics: NestedTopic[];\n};\n\n/**\n * Parse topics JSON from a fenced code block at the end of hub content.\n * Returns parsed topics and content with the JSON block stripped.\n */\nexport function parseTopicsFromHub(content: string): {\n cleanContent: string;\n topics: NestedTopic[];\n} {\n // Match last fenced JSON block\n const jsonBlockRe = /```json\\s*\\n([\\s\\S]*?)\\n```\\s*$/;\n const match = jsonBlockRe.exec(content);\n if (!match) return { cleanContent: content, topics: [] };\n\n try {\n const parsed = JSON.parse(match[1]) as unknown;\n if (!Array.isArray(parsed)) return { cleanContent: content, topics: [] };\n const topics = parsed\n .filter(\n (t): t is Record<string, unknown> =>\n typeof t === \"object\" &&\n t !== null &&\n typeof (t as Record<string, unknown>).slug === \"string\" &&\n typeof (t as Record<string, unknown>).title === \"string\"\n )\n .map((t) => ({\n slug: sanitizeAreaName(t.slug as string),\n title: t.title as string,\n description: typeof t.description === \"string\" ? t.description : \"\"\n }))\n .slice(0, 7); // Cap at 7 topics\n const cleanContent = content.slice(0, match.index).trimEnd();\n return { cleanContent, topics };\n } catch {\n return { cleanContent: content, topics: [] };\n }\n}\n\nasync function generateNestedHub(\n client: CopilotClient,\n options: {\n repoPath: string;\n detailDir: string;\n area?: Area;\n childAreas?: Area[];\n model?: string;\n onProgress?: (message: string) => void;\n }\n): Promise<HubResult> {\n const progress = options.onProgress ?? (() => {});\n const model = options.model ?? DEFAULT_MODEL;\n\n const existingCtx = await detectExistingInstructions(options.repoPath, options.detailDir);\n const existingSection = buildExistingInstructionsSection(existingCtx);\n\n const { tool: emitTool, getContent } = await createEmitTool();\n\n const session = await client.createSession({\n model,\n streaming: true,\n workingDirectory: resolveAreaWorkingDirectory(options.repoPath, options.area),\n systemMessage: {\n content: options.area\n ? `You are an expert codebase analyst. Generate a lean AGENTS.md hub file for the \"${options.area.name}\" area. Use tools to explore the codebase. When done, call the emit_file_content tool with the final markdown.`\n : \"You are an expert codebase analyst. Generate a lean AGENTS.md hub file for this repository. Use tools to explore the codebase. When done, call the emit_file_content tool with the final markdown.\"\n },\n tools: [emitTool],\n excludedTools: INSTRUCTION_GENERATION_EXCLUDED_TOOLS,\n onPermissionRequest: READ_ONLY_PERMISSION_HANDLER,\n infiniteSessions: { enabled: false }\n });\n\n await trySetAutopilot(session);\n\n let content = \"\";\n let sessionError: Error | undefined;\n session.on((event) => {\n const e = event as { type: string; data?: Record<string, unknown> };\n if (e.type === \"assistant.message_delta\") {\n const delta = e.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(\n options.area ? `Generating hub for \"${options.area.name}\"...` : \"Generating hub...\"\n );\n }\n } else if (e.type === \"tool.execution_start\") {\n const toolName = e.data?.toolName as string | undefined;\n progress(`Using tool: ${toolName ?? \"...\"}`);\n } else if (e.type === \"session.error\") {\n const errorMsg = (e.data?.message as string) ?? \"Unknown error\";\n sessionError = getSessionError(errorMsg);\n }\n });\n\n const areaContext = options.area\n ? `\\nThis hub is for the \"${options.area.name}\" area (files matching: ${Array.isArray(options.area.applyTo) ? options.area.applyTo.join(\", \") : options.area.applyTo}).${options.area.description ? ` ${options.area.description}` : \"\"}`\n : \"\";\n\n const childContext = options.childAreas?.length\n ? `\\n\\nThis area has sub-projects:\\n${options.childAreas.map((c) => `- ${c.name} (${c.path ?? \"unknown path\"})`).join(\"\\n\")}\\nInclude a \"## Sub-Projects\" section with links to each child's AGENTS.md.`\n : \"\";\n\n const parentContext = options.area?.parentArea\n ? `\\nThis is a sub-project of \"${options.area.parentArea}\". Include a note linking back to the parent area.`\n : \"\";\n\n const prompt = `Analyze this codebase and generate a lean AGENTS.md hub file (~90-120 lines).${areaContext}${parentContext}\n\nUse tools to explore the codebase structure, tech stack, and conventions.\n\nThe hub should contain:\n- Project overview and purpose\n- Key concepts and architecture\n- Coding conventions and guardrails\n- A \"## Detailed Instructions\" section listing links to detail files in \\`${options.detailDir}/\\`${childContext}\n\nAt the END of your output, emit a fenced JSON block with recommended topics for detail files:\n\\`\\`\\`json\n[{\"slug\":\"testing\",\"title\":\"Testing Guide\",\"description\":\"How to write and run tests\"},{\"slug\":\"architecture\",\"title\":\"Architecture\",\"description\":\"Codebase structure and patterns\"}]\n\\`\\`\\`\n\nRecommend 3-5 topics that would benefit from deep-dive detail files. Each slug becomes a filename: \\`${options.detailDir}/{slug}.md\\`.\n\nIMPORTANT:\n- Keep the hub LEAN — overview and guardrails only, details go in separate files\n- The JSON block will be parsed and removed from the final output\n${existingSection ? `- Do NOT duplicate content from existing instruction files\\n${existingSection}` : \"\"}\n- When you have the complete markdown content (including the trailing JSON topic block), call the \\`emit_file_content\\` tool with it. Do NOT output the content directly in chat.`;\n\n let sendError: unknown;\n try {\n await session.sendAndWait({ prompt }, 180000);\n } catch (err) {\n sendError = err;\n } finally {\n await session.destroy();\n }\n\n if (sessionError) throw sessionError;\n if (sendError !== undefined)\n throw sendError instanceof Error ? sendError : new Error(String(sendError));\n\n const resolved = resolveContent(getContent(), content);\n const { cleanContent, topics } = parseTopicsFromHub(resolved);\n if (!cleanContent.trim()) {\n throw new Error(\"No AGENTS.md hub content was generated.\");\n }\n\n return { hubContent: cleanContent, topics };\n}\n\nasync function generateNestedDetail(\n client: CopilotClient,\n options: {\n repoPath: string;\n topic: NestedTopic;\n area?: Area;\n model?: string;\n onProgress?: (message: string) => void;\n }\n): Promise<string> {\n const progress = options.onProgress ?? (() => {});\n const model = options.model ?? DEFAULT_MODEL;\n\n const { tool: emitTool, getContent } = await createEmitTool();\n\n const session = await client.createSession({\n model,\n streaming: true,\n workingDirectory: resolveAreaWorkingDirectory(options.repoPath, options.area),\n systemMessage: {\n content: `You are an expert codebase analyst. Generate a deep-dive instruction file about \"${options.topic.title}\". Use tools to explore the codebase. When done, call the emit_file_content tool with the final markdown.`\n },\n tools: [emitTool],\n excludedTools: INSTRUCTION_GENERATION_EXCLUDED_TOOLS,\n onPermissionRequest: READ_ONLY_PERMISSION_HANDLER,\n infiniteSessions: { enabled: false }\n });\n\n await trySetAutopilot(session);\n\n let content = \"\";\n let sessionError: Error | undefined;\n session.on((event) => {\n const e = event as { type: string; data?: Record<string, unknown> };\n if (e.type === \"assistant.message_delta\") {\n const delta = e.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(`Generating detail: ${options.topic.title}...`);\n }\n } else if (e.type === \"tool.execution_start\") {\n const toolName = e.data?.toolName as string | undefined;\n progress(`${options.topic.slug}: using tool ${toolName ?? \"...\"}`);\n } else if (e.type === \"session.error\") {\n const errorMsg = (e.data?.message as string) ?? \"Unknown error\";\n sessionError = getSessionError(errorMsg);\n }\n });\n\n const areaContext = options.area\n ? `Focus on the \"${options.area.name}\" area (files matching: ${Array.isArray(options.area.applyTo) ? options.area.applyTo.join(\", \") : options.area.applyTo}).`\n : \"Focus on the entire repository.\";\n\n const prompt = `Generate a deep-dive instruction file about \"${options.topic.title}\" for this codebase.\n${areaContext}\n\nTopic: ${options.topic.title}\nDescription: ${options.topic.description}\n\nUse tools to explore the codebase and understand the specific patterns, APIs, and conventions related to this topic.\n\nThe file should:\n- Start with \\`# ${options.topic.title}\\`\n- Include \\`**When to read:** {one-line trigger condition}\\` right after the heading\n- Cover ~50-100 lines of practical, actionable guidance\n- Include code patterns and examples found in the actual codebase\n- Be specific to this codebase, not generic advice\n\nWhen you have the complete markdown content, call the \\`emit_file_content\\` tool with it. Do NOT output the content directly in chat.`;\n\n let sendError: unknown;\n try {\n await session.sendAndWait({ prompt }, 180000);\n } catch (err) {\n sendError = err;\n } finally {\n await session.destroy();\n }\n\n if (sessionError) throw sessionError;\n if (sendError !== undefined)\n throw sendError instanceof Error ? sendError : new Error(String(sendError));\n\n const resolved = resolveContent(getContent(), content);\n if (!resolved.trim()) {\n throw new Error(`No detail content was generated for \"${options.topic.title}\".`);\n }\n\n return resolved;\n}\n\n/**\n * Generate a full nested instruction set (hub + detail files + optional CLAUDE.md).\n * Reuses a single CopilotClient across all SDK sessions.\n */\nexport async function generateNestedInstructions(\n options: GenerateInstructionsOptions & {\n detailDir: string;\n claudeMd: boolean;\n area?: Area;\n childAreas?: Area[];\n }\n): Promise<NestedInstructionsResult> {\n const progress = options.onProgress ?? (() => {});\n\n progress(\"Checking Copilot CLI...\");\n const cliConfig = await assertCopilotCliReady();\n\n progress(\"Starting Copilot SDK...\");\n const client = await createCopilotClient(cliConfig);\n\n try {\n // Step 1: Generate hub\n const { hubContent, topics } = await generateNestedHub(client, {\n repoPath: options.repoPath,\n detailDir: options.detailDir,\n area: options.area,\n childAreas: options.childAreas,\n model: options.model,\n onProgress: options.onProgress\n });\n\n // Determine output paths\n const basePath = options.area?.path ?? \".\";\n const hubRelativePath = path.join(basePath, \"AGENTS.md\");\n\n // Hub content: prepend frontmatter if area-scoped\n let finalHubContent = hubContent;\n if (options.area) {\n finalHubContent = `${buildAreaFrontmatter(options.area)}\\n\\n${hubContent}`;\n }\n\n const result: NestedInstructionsResult = {\n hub: { relativePath: hubRelativePath, content: finalHubContent },\n details: [],\n warnings: []\n };\n\n // Step 2: Generate detail files (sequential, one session per topic)\n for (const [i, topic] of topics.entries()) {\n progress(`Generating detail ${i + 1}/${topics.length}: ${topic.title}...`);\n try {\n const detailContent = await generateNestedDetail(client, {\n repoPath: options.repoPath,\n topic,\n area: options.area,\n model: options.model,\n onProgress: options.onProgress\n });\n if (detailContent) {\n result.details.push({\n relativePath: path.join(basePath, options.detailDir, `${topic.slug}.md`),\n content: detailContent,\n topic: topic.title\n });\n }\n } catch (err) {\n if (isCopilotAuthError(err)) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Failed to generate detail for \"${topic.title}\": ${msg}`);\n }\n }\n\n // Step 3: Optional CLAUDE.md\n if (options.claudeMd) {\n result.claudeMd = {\n relativePath: path.join(basePath, \"CLAUDE.md\"),\n content: \"@AGENTS.md\\n\"\n };\n }\n\n return result;\n } finally {\n await client.stop();\n }\n}\n\n/**\n * Generate nested instructions for a specific area.\n */\nexport async function generateNestedAreaInstructions(\n options: GenerateAreaInstructionsOptions & {\n detailDir: string;\n claudeMd: boolean;\n childAreas?: Area[];\n }\n): Promise<NestedInstructionsResult> {\n return generateNestedInstructions({\n repoPath: options.repoPath,\n area: options.area,\n childAreas: options.childAreas,\n model: options.model,\n onProgress: options.onProgress,\n detailDir: options.detailDir,\n claudeMd: options.claudeMd\n });\n}\n","import fs from \"fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport path from \"path\";\n\nimport fg from \"fast-glob\";\n\nconst execFileAsync = promisify(execFile);\n\nconst COPILOT_DEBUG_ENABLED = /^(1|true|yes|on)$/iu.test(process.env.AGENTRC_DEBUG_COPILOT ?? \"\");\n\nexport function logCopilotDebug(message: string): void {\n if (!COPILOT_DEBUG_ENABLED) return;\n process.stderr.write(`[agentrc:copilot] ${message}\\n`);\n}\n\nexport type CopilotCliConfig = {\n cliPath: string;\n cliArgs?: string[];\n};\n\ntype CopilotCliCandidate = {\n config: CopilotCliConfig;\n source: string;\n};\n\nlet cachedCliConfig: CopilotCliConfig | null = null;\nlet cachedCliConfigTimestamp = 0;\nconst CLI_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\nfunction cacheConfig(config: CopilotCliConfig): CopilotCliConfig {\n cachedCliConfig = config;\n cachedCliConfigTimestamp = Date.now();\n return config;\n}\n\nexport async function assertCopilotCliReady(): Promise<CopilotCliConfig> {\n const config = await findCopilotCliConfig();\n const desc = config.cliArgs ? `${config.cliPath} ${config.cliArgs.join(\" \")}` : config.cliPath;\n logCopilotDebug(`validating CLI compatibility with ${desc}`);\n\n try {\n const isNpx = config.cliArgs?.includes(\"@github/copilot\") ?? false;\n const timeout = isNpx ? 30000 : 5000;\n const [cmd, args] = buildExecArgs(config, [\"--headless\", \"--version\"]);\n await execFileAsync(cmd, args, { timeout });\n } catch {\n cachedCliConfig = null;\n throw new Error(\n `Copilot CLI at ${desc} is not compatible with SDK server mode. ` +\n \"Expected support for '--headless'. Install/update the VS Code Copilot Chat CLI or adjust PATH.\"\n );\n }\n\n return config;\n}\n\nexport async function listCopilotModels(): Promise<string[]> {\n const config = await assertCopilotCliReady();\n const [cmd, args] = buildExecArgs(config, [\"--help\"]);\n const { stdout } = await execFileAsync(cmd, args, { timeout: 5000 });\n return extractModelChoices(stdout);\n}\n\nexport function buildExecArgs(config: CopilotCliConfig, extraArgs: string[]): [string, string[]] {\n if (config.cliArgs && config.cliArgs.length > 0) {\n return [config.cliPath, [...config.cliArgs, ...extraArgs]];\n }\n if (\n process.platform === \"win32\" &&\n (config.cliPath.endsWith(\".bat\") || config.cliPath.endsWith(\".cmd\"))\n ) {\n return [\"cmd\", [\"/c\", config.cliPath, ...extraArgs]];\n }\n return [config.cliPath, extraArgs];\n}\n\nasync function findCopilotCliConfig(): Promise<CopilotCliConfig> {\n if (cachedCliConfig && Date.now() - cachedCliConfigTimestamp < CLI_CACHE_TTL_MS) {\n logCopilotDebug(\"using cached CLI config\");\n return cachedCliConfig;\n }\n\n const overrideCliPath = process.env.AGENTRC_COPILOT_CLI_PATH;\n if (overrideCliPath) {\n const overrideConfig = { cliPath: overrideCliPath };\n logCopilotDebug(`trying override AGENTRC_COPILOT_CLI_PATH=${overrideCliPath}`);\n if (await isHeadlessCompatible(overrideConfig)) {\n logCopilotDebug(\"override CLI is compatible\");\n return cacheConfig(overrideConfig);\n }\n throw new Error(\n `AGENTRC_COPILOT_CLI_PATH points to an incompatible CLI (${overrideCliPath}). ` +\n \"It must support '--headless --version'.\"\n );\n }\n\n const isWindows = process.platform === \"win32\";\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n const appData = process.env.APPDATA ?? \"\";\n const candidates: CopilotCliCandidate[] = [];\n\n // On Windows, prefer npm-installed binary and use node + cliArgs approach.\n // This bypasses .cmd/.bat wrapper issues that prevent direct spawning.\n // See: https://github.com/microsoft/vscode/issues/291990\n if (isWindows && appData) {\n const npmLoaderPath = path.join(\n appData,\n \"npm\",\n \"node_modules\",\n \"@github\",\n \"copilot\",\n \"npm-loader.js\"\n );\n try {\n await fs.access(npmLoaderPath);\n candidates.push({\n config: { cliPath: process.execPath, cliArgs: [npmLoaderPath] },\n source: \"Windows npm loader\"\n });\n logCopilotDebug(\n `discovered candidate from Windows npm loader: ${process.execPath} ${npmLoaderPath}`\n );\n } catch {\n // npm binary not found, will try PATH and VS Code locations\n }\n }\n\n const whichCmd = isWindows ? \"where\" : \"which\";\n try {\n const { stdout } = await execFileAsync(whichCmd, [\"copilot\"], { timeout: 5000 });\n const found = stdout.trim().split(/\\r?\\n/)[0];\n if (found) {\n candidates.push({ config: { cliPath: found }, source: \"PATH\" });\n logCopilotDebug(`discovered candidate from PATH: ${found}`);\n }\n } catch {\n // Not on PATH, will try npx and VS Code locations\n }\n\n // Try npx as a fallback — always fetches the latest @github/copilot\n try {\n const { stdout } = await execFileAsync(whichCmd, [\"npx\"], { timeout: 5000 });\n const npxPath = stdout.trim().split(/\\r?\\n/)[0];\n if (npxPath) {\n candidates.push({\n config: { cliPath: npxPath, cliArgs: [\"--yes\", \"@github/copilot\"] },\n source: \"npx @github/copilot\"\n });\n logCopilotDebug(`discovered candidate from npx: ${npxPath} --yes @github/copilot`);\n }\n } catch {\n // npx not available\n }\n\n const staticLocations: string[] = [];\n\n if (process.platform === \"darwin\") {\n staticLocations.push(\n `${home}/Library/Application Support/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`,\n `${home}/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot`\n );\n } else if (process.platform === \"linux\") {\n staticLocations.push(\n `${home}/.config/Code - Insiders/User/globalStorage/github.copilot-chat/copilotCli/copilot`,\n `${home}/.config/Code/User/globalStorage/github.copilot-chat/copilotCli/copilot`\n );\n } else if (isWindows && appData) {\n staticLocations.push(\n `${appData}\\\\Code - Insiders\\\\User\\\\globalStorage\\\\github.copilot-chat\\\\copilotCli\\\\copilot.bat`,\n `${appData}\\\\Code\\\\User\\\\globalStorage\\\\github.copilot-chat\\\\copilotCli\\\\copilot.bat`\n );\n }\n\n for (const location of staticLocations) {\n try {\n await fs.access(location);\n candidates.push({ config: { cliPath: location }, source: \"VS Code globalStorage\" });\n logCopilotDebug(`discovered candidate from VS Code globalStorage: ${location}`);\n } catch {\n // Try next\n }\n }\n\n const exts = isWindows ? \"{.exe,.bat,.cmd}\" : \"\";\n const normalizedHome = home.replace(/\\\\/g, \"/\");\n const globPatterns = [\n `${normalizedHome}/.vscode-insiders/extensions/github.copilot-chat-*/copilotCli/copilot${exts}`,\n `${normalizedHome}/.vscode/extensions/github.copilot-chat-*/copilotCli/copilot${exts}`\n ];\n\n for (const pattern of globPatterns) {\n const matches = await fg(pattern, { onlyFiles: true });\n for (const match of matches) {\n const normalized = path.normalize(match);\n candidates.push({\n config: { cliPath: normalized },\n source: \"VS Code extensions\"\n });\n logCopilotDebug(`discovered candidate from VS Code extensions: ${normalized}`);\n }\n }\n\n const compatible = await findFirstCompatibleCandidate(candidates);\n if (compatible) {\n const desc = compatible.config.cliArgs\n ? `${compatible.config.cliPath} ${compatible.config.cliArgs.join(\" \")}`\n : compatible.config.cliPath;\n logCopilotDebug(`selected compatible candidate from ${compatible.source}: ${desc}`);\n return cacheConfig(compatible.config);\n }\n\n if (candidates.length > 0) {\n const first = candidates[0];\n const desc = first.config.cliArgs\n ? `${first.config.cliPath} ${first.config.cliArgs.join(\" \")}`\n : first.config.cliPath;\n throw new Error(\n `Found Copilot CLI candidate from ${first.source} (${desc}) but it does not support '--headless'. ` +\n \"AgentRC requires a Copilot CLI build compatible with SDK server mode. \" +\n \"Install/update GitHub Copilot Chat in VS Code, or point AGENTRC_COPILOT_CLI_PATH to a compatible CLI binary.\"\n );\n }\n\n const platformHint = isWindows\n ? \" Searched APPDATA and VS Code extension paths.\"\n : process.platform === \"linux\"\n ? \" Searched ~/.config/Code and VS Code extension paths.\"\n : \" Searched ~/Library/Application Support/Code and VS Code extension paths.\";\n\n throw new Error(\n `Copilot CLI not found. Install GitHub Copilot Chat extension in VS Code or run: npm install -g @github/copilot.${platformHint}`\n );\n}\n\nasync function findFirstCompatibleCandidate(\n candidates: CopilotCliCandidate[]\n): Promise<CopilotCliCandidate | null> {\n const seen = new Set<string>();\n\n for (const candidate of candidates) {\n const key = [candidate.config.cliPath, ...(candidate.config.cliArgs ?? [])].join(\"\\u0000\");\n if (seen.has(key)) {\n logCopilotDebug(`skipping duplicate candidate: ${candidate.config.cliPath}`);\n continue;\n }\n seen.add(key);\n\n const compatible = await isHeadlessCompatible(candidate.config);\n const desc = candidate.config.cliArgs\n ? `${candidate.config.cliPath} ${candidate.config.cliArgs.join(\" \")}`\n : candidate.config.cliPath;\n logCopilotDebug(\n `probe ${candidate.source}: ${desc} => ${compatible ? \"compatible\" : \"incompatible\"}`\n );\n if (compatible) {\n return candidate;\n }\n }\n\n return null;\n}\n\nasync function isHeadlessCompatible(config: CopilotCliConfig): Promise<boolean> {\n // npx may need to download the package on first run, so allow a longer timeout\n const isNpx = config.cliArgs?.includes(\"@github/copilot\") ?? false;\n const timeout = isNpx ? 30000 : 5000;\n try {\n const [cmd, args] = buildExecArgs(config, [\"--headless\", \"--version\"]);\n await execFileAsync(cmd, args, { timeout });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction extractModelChoices(helpText: string): string[] {\n const lines = helpText.split(\"\\n\");\n let captured = \"\";\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n if (!line.includes(\"--model\")) continue;\n\n captured = line.trim();\n while (!captured.includes(\")\") && index + 1 < lines.length) {\n index += 1;\n captured += ` ${lines[index].trim()}`;\n }\n break;\n }\n\n const match = captured.match(/choices:\\s*([^)]*)/);\n if (!match) return [];\n\n const models: string[] = [];\n const matcher = /\"([^\"]+)\"/g;\n let entry = matcher.exec(match[1]);\n while (entry) {\n models.push(entry[1]);\n entry = matcher.exec(match[1]);\n }\n\n return models;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\n\nimport type * as CopilotSdk from \"@github/copilot-sdk\";\n\nimport { buildExecArgs, logCopilotDebug, type CopilotCliConfig } from \"./copilot\";\n\nexport type CopilotSdkModule = typeof CopilotSdk;\n\nlet cachedSdkModule: Promise<CopilotSdkModule> | null = null;\n\nfunction normalizeSdkLoadError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n const isMissingModule =\n message.includes(\"@github/copilot-sdk\") &&\n /(Cannot find module|Cannot find package|ERR_MODULE_NOT_FOUND)/iu.test(message);\n\n if (!isMissingModule) {\n return error instanceof Error ? error : new Error(message);\n }\n\n return new Error(\n \"Copilot SDK package '@github/copilot-sdk' could not be loaded. \" +\n \"If running from source, run `npm install` in this repository. \" +\n \"If this is running inside the AgentRC VS Code extension, rebuild and reinstall the extension so the SDK is bundled (`cd vscode-extension && npm run build`).\"\n );\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction shouldFallbackToExternalServer(error: unknown): boolean {\n const message = normalizeError(error).message.toLowerCase();\n return (\n message.includes(\"unknown option '--headless'\") ||\n message.includes(\"unknown option '--no-auto-update'\") ||\n message.includes(\"copilot cli not found\")\n );\n}\n\nasync function startExternalServer(cliConfig: CopilotCliConfig): Promise<{\n cliProcess: ChildProcess;\n cliUrl: string;\n}> {\n const [cmd, args] = buildExecArgs(cliConfig, [\"--headless\", \"--log-level\", \"debug\"]);\n logCopilotDebug(`starting external CLI server: ${cmd} ${args.join(\" \")}`);\n\n return await new Promise((resolve, reject) => {\n const isWindows = process.platform === \"win32\";\n const cliProcess = spawn(cmd, args, {\n cwd: process.cwd(),\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n detached: !isWindows\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const finishReject = (reason: unknown): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n killProcessTree(cliProcess);\n reject(normalizeError(reason));\n };\n\n const finishResolve = (port: string): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n // Stop accumulating output after settling to avoid unbounded memory growth\n cliProcess.stdout?.removeAllListeners(\"data\");\n cliProcess.stderr?.removeAllListeners(\"data\");\n resolve({\n cliProcess,\n cliUrl: `localhost:${port}`\n });\n };\n\n cliProcess.stdout?.on(\"data\", (data: Buffer) => {\n const chunk = data.toString();\n stdout += chunk;\n const match = stdout.match(/listening on port (\\d+)/iu);\n if (match) {\n finishResolve(match[1]);\n }\n });\n\n cliProcess.stderr?.on(\"data\", (data: Buffer) => {\n const chunk = data.toString();\n stderr += chunk;\n const lines = chunk.split(\"\\n\");\n for (const line of lines) {\n if (line.trim()) {\n process.stderr.write(`[CLI subprocess] ${line}\\n`);\n }\n }\n });\n\n cliProcess.on(\"error\", (error) => {\n finishReject(error);\n });\n\n cliProcess.on(\"exit\", (code) => {\n if (settled) return;\n const details = stderr.trim() || stdout.trim();\n finishReject(\n new Error(\n details\n ? `External CLI server exited with code ${code}\\n${details}`\n : `External CLI server exited with code ${code}`\n )\n );\n });\n\n timer = setTimeout(() => {\n finishReject(new Error(\"Timeout waiting for external CLI server to start\"));\n }, 10000);\n });\n}\n\n/**\n * Subset of SessionConfig where onPermissionRequest is optional.\n * attachDefaultPermissionHandler injects a default approve-all handler so\n * call-sites do not need to supply one.\n */\ntype SessionConfigInput = Omit<CopilotSdk.SessionConfig, \"onPermissionRequest\"> & {\n onPermissionRequest?: CopilotSdk.PermissionHandler;\n};\n\n/**\n * The type returned by createCopilotClient after the default permission handler\n * has been attached. createSession accepts configs where onPermissionRequest\n * is optional because attachDefaultPermissionHandler injects a default.\n */\nexport type PatchedCopilotClient = Omit<\n InstanceType<CopilotSdkModule[\"CopilotClient\"]>,\n \"createSession\"\n> & {\n createSession(config: SessionConfigInput): Promise<CopilotSdk.CopilotSession>;\n};\n\n/**\n * Wrap createSession so every session automatically approves all permission\n * requests. Copilot SDK >= 0.1.28 requires an explicit onPermissionRequest\n * handler; without one, session creation fails. Injecting it here keeps the\n * concern centralised and prevents call-sites from forgetting the handler.\n */\nexport function attachDefaultPermissionHandler(\n client: InstanceType<CopilotSdkModule[\"CopilotClient\"]>\n): void {\n const approveAll: CopilotSdk.PermissionHandler = () => ({ kind: \"approved\" as const });\n const originalCreateSession = client.createSession.bind(client);\n // Override createSession so onPermissionRequest is optional at call sites.\n // The cast targets our PatchedCopilotClient createSession signature which\n // accepts the optional permission handler; the 'unknown' intermediate step\n // is safe because attachDefaultPermissionHandler always injects a default.\n (client as unknown as PatchedCopilotClient).createSession = (config: SessionConfigInput) =>\n originalCreateSession({\n ...(config as CopilotSdk.SessionConfig),\n onPermissionRequest: config.onPermissionRequest ?? approveAll\n });\n}\n\nfunction killProcessTree(cliProcess: ChildProcess): void {\n if (cliProcess.killed) return;\n // On Unix, kill the process group (negative PID) to clean up grandchild processes (e.g. npx -> copilot)\n if (process.platform !== \"win32\" && cliProcess.pid) {\n try {\n process.kill(-cliProcess.pid, \"SIGTERM\");\n } catch {\n cliProcess.kill();\n }\n } else {\n cliProcess.kill();\n }\n cliProcess.stdout?.destroy();\n cliProcess.stderr?.destroy();\n cliProcess.unref();\n}\n\nfunction attachExternalServerCleanup(\n client: InstanceType<CopilotSdkModule[\"CopilotClient\"]>,\n cliProcess: ChildProcess\n): void {\n const originalStop = client.stop.bind(client);\n client.stop = (async () => {\n const errors = await originalStop();\n killProcessTree(cliProcess);\n return errors;\n }) as typeof client.stop;\n}\n\nexport async function loadCopilotSdk(): Promise<CopilotSdkModule> {\n if (!cachedSdkModule) {\n cachedSdkModule = import(\"@github/copilot-sdk\").catch((error) => {\n cachedSdkModule = null;\n throw normalizeSdkLoadError(error);\n });\n }\n\n return cachedSdkModule;\n}\n\nexport async function createCopilotClient(\n cliConfig: CopilotCliConfig\n): Promise<PatchedCopilotClient> {\n const sdk = await loadCopilotSdk();\n const desc = cliConfig.cliArgs\n ? `${cliConfig.cliPath} ${cliConfig.cliArgs.join(\" \")}`\n : cliConfig.cliPath;\n logCopilotDebug(`creating SDK client with cliPath=${desc} useStdio=false`);\n\n // npx spawns a grandchild process (npx -> node -> copilot) that the SDK\n // cannot clean up — killing npx leaves the copilot binary running.\n // Use external server mode where we manage the process tree ourselves.\n const isNpx = /\\bnpx(?:\\.cmd)?$/iu.test(cliConfig.cliPath);\n if (isNpx) {\n logCopilotDebug(\"npx wrapper detected; using external server mode\");\n const external = await startExternalServer(cliConfig);\n const client = new sdk.CopilotClient({ cliUrl: external.cliUrl });\n try {\n await client.start();\n } catch (startError) {\n killProcessTree(external.cliProcess);\n throw normalizeError(startError);\n }\n attachExternalServerCleanup(client, external.cliProcess);\n attachDefaultPermissionHandler(client);\n return client as unknown as PatchedCopilotClient;\n }\n\n // Always pass an explicit CLI config so the SDK does not fall back to package-local CLI resolution.\n // Use TCP transport because some VS Code Copilot CLI shims reject stdio mode.\n const primaryClient = new sdk.CopilotClient({ ...cliConfig, useStdio: false });\n\n try {\n await primaryClient.start();\n attachDefaultPermissionHandler(primaryClient);\n return primaryClient as unknown as PatchedCopilotClient;\n } catch (error) {\n if (!shouldFallbackToExternalServer(error)) {\n throw normalizeError(error);\n }\n\n logCopilotDebug(\"primary SDK-managed startup failed; falling back to external server mode\");\n try {\n await primaryClient.stop();\n } catch {\n // Best-effort cleanup before fallback\n }\n\n const external = await startExternalServer(cliConfig);\n const fallbackClient = new sdk.CopilotClient({ cliUrl: external.cliUrl });\n try {\n await fallbackClient.start();\n } catch (fallbackError) {\n if (!external.cliProcess.killed) {\n external.cliProcess.kill();\n }\n throw normalizeError(fallbackError);\n }\n\n attachExternalServerCleanup(fallbackClient, external.cliProcess);\n attachDefaultPermissionHandler(fallbackClient);\n return fallbackClient as unknown as PatchedCopilotClient;\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { fileExists, safeReadDir, readJson } from \"../utils/fs\";\n\nimport type { RepoApp, RepoAnalysis, Area } from \"./analyzer\";\nimport { analyzeRepo, sanitizeAreaName, loadAgentrcConfig } from \"./analyzer\";\nimport type { ExtraDefinition, PolicyConfig } from \"./policy\";\nimport { loadPolicy, resolveChain } from \"./policy\";\nimport { executePlugins } from \"./policy/engine\";\nimport { loadPluginChain } from \"./policy/loader\";\nimport type { Grade, PolicyContext, PolicyWarning, Recommendation, Signal } from \"./policy/types\";\n\nexport type ReadinessPillar =\n | \"style-validation\"\n | \"build-system\"\n | \"testing\"\n | \"documentation\"\n | \"dev-environment\"\n | \"code-quality\"\n | \"observability\"\n | \"security-governance\"\n | \"ai-tooling\";\n\nexport type PillarGroup = \"repo-health\" | \"ai-setup\";\n\nexport const PILLAR_GROUPS: Record<ReadinessPillar, PillarGroup> = {\n \"style-validation\": \"repo-health\",\n \"build-system\": \"repo-health\",\n testing: \"repo-health\",\n documentation: \"repo-health\",\n \"dev-environment\": \"repo-health\",\n \"code-quality\": \"repo-health\",\n observability: \"repo-health\",\n \"security-governance\": \"repo-health\",\n \"ai-tooling\": \"ai-setup\"\n};\n\nexport const PILLAR_GROUP_NAMES: Record<PillarGroup, string> = {\n \"repo-health\": \"Repo Health\",\n \"ai-setup\": \"AI Setup\"\n};\n\nexport function groupPillars(\n pillars: ReadinessPillarSummary[]\n): Array<{ group: PillarGroup; label: string; pillars: ReadinessPillarSummary[] }> {\n const groups: PillarGroup[] = [\"repo-health\", \"ai-setup\"];\n return groups.map((group) => ({\n group,\n label: PILLAR_GROUP_NAMES[group],\n pillars: pillars.filter((p) => PILLAR_GROUPS[p.id] === group)\n }));\n}\n\nexport function getLevelName(level: number): string {\n const names: Record<number, string> = {\n 1: \"Functional\",\n 2: \"Documented\",\n 3: \"Standardized\",\n 4: \"Optimized\",\n 5: \"Autonomous\"\n };\n return names[level] || \"Unknown\";\n}\n\nexport function getLevelDescription(level: number): string {\n const descriptions: Record<number, string> = {\n 1: \"Repo builds, tests run, and basic tooling (linter, lockfile) is in place. AI agents can clone and get started.\",\n 2: \"README, CONTRIBUTING guide, and custom AI instructions exist. Agents understand project context and conventions.\",\n 3: \"CI/CD, security policies, CODEOWNERS, and observability are configured. Agents operate within well-defined guardrails.\",\n 4: \"MCP servers, custom agents, and AI skills are set up. Agents have deep integration with project-specific tools and workflows.\",\n 5: \"Full AI-native development: agents can independently plan, implement, test, and ship changes with minimal human oversight.\"\n };\n return descriptions[level] || \"\";\n}\n\nexport type ReadinessScope = \"repo\" | \"app\" | \"area\";\n\nexport type ReadinessStatus = \"pass\" | \"fail\" | \"skip\";\n\nexport type ReadinessCriterionResult = {\n id: string;\n title: string;\n pillar: ReadinessPillar;\n level: number;\n scope: ReadinessScope;\n impact: \"high\" | \"medium\" | \"low\";\n effort: \"low\" | \"medium\" | \"high\";\n status: ReadinessStatus;\n reason?: string;\n evidence?: string[];\n passRate?: number;\n appSummary?: { passed: number; total: number };\n appFailures?: string[];\n areaSummary?: { passed: number; total: number };\n areaFailures?: string[];\n};\n\nexport type ReadinessExtraResult = {\n id: string;\n title: string;\n status: ReadinessStatus;\n reason?: string;\n};\n\nexport type ReadinessPillarSummary = {\n id: ReadinessPillar;\n name: string;\n passed: number;\n total: number;\n passRate: number;\n};\n\nexport type ReadinessLevelSummary = {\n level: number;\n name: string;\n passed: number;\n total: number;\n passRate: number;\n achieved: boolean;\n};\n\nexport type AreaReadinessReport = {\n area: Area;\n criteria: ReadinessCriterionResult[];\n pillars: ReadinessPillarSummary[];\n};\n\nexport type ReadinessReport = {\n repoPath: string;\n generatedAt: string;\n isMonorepo: boolean;\n apps: Array<{ name: string; path: string }>;\n pillars: ReadinessPillarSummary[];\n levels: ReadinessLevelSummary[];\n achievedLevel: number;\n criteria: ReadinessCriterionResult[];\n extras: ReadinessExtraResult[];\n areaReports?: AreaReadinessReport[];\n policies?: { chain: string[]; criteriaCount: number };\n /** New plugin engine data (populated when using the unified engine). */\n engine?: {\n signals: ReadonlyArray<Signal>;\n recommendations: ReadonlyArray<Recommendation>;\n policyWarnings: ReadonlyArray<PolicyWarning>;\n score: number;\n grade: Grade;\n };\n};\n\ntype ReadinessOptions = {\n repoPath: string;\n includeExtras?: boolean;\n perArea?: boolean;\n policies?: string[];\n /** Run the plugin engine alongside the legacy path and populate report.engine. */\n shadow?: boolean;\n};\n\nexport type ReadinessContext = {\n repoPath: string;\n analysis: RepoAnalysis;\n apps: RepoApp[];\n rootFiles: string[];\n rootPackageJson?: Record<string, unknown>;\n areaPath?: string;\n areaFiles?: string[];\n};\n\nexport type ReadinessCriterion = {\n id: string;\n title: string;\n pillar: ReadinessPillar;\n level: number;\n scope: ReadinessScope;\n impact: \"high\" | \"medium\" | \"low\";\n effort: \"low\" | \"medium\" | \"high\";\n check: (context: ReadinessContext, app?: RepoApp, area?: Area) => Promise<CheckResult>;\n};\n\nexport type CheckResult = {\n status: ReadinessStatus;\n reason?: string;\n evidence?: string[];\n};\n\nexport async function runReadinessReport(options: ReadinessOptions): Promise<ReadinessReport> {\n const repoPath = options.repoPath;\n const analysis = await analyzeRepo(repoPath);\n const rootFiles = await safeReadDir(repoPath);\n const rootPackageJson = await readJson(path.join(repoPath, \"package.json\"));\n const apps = analysis.apps?.length ? analysis.apps : [];\n\n const context: ReadinessContext = {\n repoPath,\n analysis,\n apps,\n rootFiles,\n rootPackageJson\n };\n\n // ── Policy resolution ──\n let policySources = options.policies;\n // isConfigSourced tracks whether policies were loaded from config (vs CLI --policy flag).\n // Used to restrict config-sourced policies to JSON-only, preventing dynamic import() calls.\n let isConfigSourced = false;\n if (!policySources?.length) {\n // Check agentrc.config.json for policy config\n const agentrcConfig = await loadAgentrcConfig(repoPath);\n if (agentrcConfig?.policies?.length) {\n policySources = agentrcConfig.policies;\n isConfigSourced = true;\n }\n }\n\n const baseCriteria = buildCriteria();\n const baseExtras = buildExtras();\n let resolvedCriteria: ReadinessCriterion[];\n let resolvedExtras: ExtraDefinition[];\n let passRateThreshold = 0.8;\n let policyInfo: { chain: string[]; criteriaCount: number } | undefined;\n\n if (policySources?.length) {\n const policyConfigs: PolicyConfig[] = [];\n for (const source of policySources) {\n policyConfigs.push(await loadPolicy(source, { jsonOnly: isConfigSourced }));\n }\n const resolved = resolveChain(baseCriteria, baseExtras, policyConfigs);\n resolvedCriteria = resolved.criteria;\n resolvedExtras = resolved.extras;\n passRateThreshold = resolved.thresholds.passRate;\n policyInfo = { chain: resolved.chain, criteriaCount: resolved.criteria.length };\n } else {\n resolvedCriteria = baseCriteria;\n resolvedExtras = baseExtras;\n }\n\n const criteriaResults: ReadinessCriterionResult[] = [];\n\n for (const criterion of resolvedCriteria) {\n if (criterion.scope === \"repo\") {\n const result = await criterion.check(context);\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: result.status,\n reason: result.reason,\n evidence: result.evidence\n });\n continue;\n }\n\n if (criterion.scope === \"area\") {\n if (!options.perArea) continue; // Exclude area criteria unless --per-area\n // Area criteria get a placeholder — populated by per-area loop below\n const areas = analysis.areas ?? [];\n if (areas.length === 0) continue; // No areas, nothing to aggregate\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: \"skip\",\n reason: \"Run with --per-area for area breakdown.\"\n });\n continue;\n }\n\n const appResults = await Promise.all(\n apps.map(async (app) => ({\n app,\n result: await criterion.check(context, app)\n }))\n );\n\n if (!appResults.length) {\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: \"skip\",\n reason: \"No application packages detected.\"\n });\n continue;\n }\n\n const passed = appResults.filter((entry) => entry.result.status === \"pass\").length;\n const total = appResults.length;\n const passRate = total ? passed / total : 0;\n const status: ReadinessStatus = passRate >= passRateThreshold ? \"pass\" : \"fail\";\n const failures = appResults\n .filter((entry) => entry.result.status !== \"pass\")\n .map((entry) => entry.app.name);\n\n criteriaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status,\n reason: status === \"pass\" ? undefined : `Only ${passed}/${total} apps pass this check.`,\n passRate,\n appSummary: { passed, total },\n appFailures: failures\n });\n }\n\n // Per-area breakdown\n let areaReports: AreaReadinessReport[] | undefined;\n const areas = analysis.areas ?? [];\n\n if (options.perArea && areas.length > 0) {\n const areaCriteria = resolvedCriteria.filter((c) => c.scope === \"area\");\n areaReports = [];\n\n for (const area of areas) {\n if (!area.path) continue;\n const areaFiles = await safeReadDir(area.path);\n const areaContext: ReadinessContext = {\n ...context,\n areaPath: area.path,\n areaFiles\n };\n\n const areaResults: ReadinessCriterionResult[] = [];\n for (const criterion of areaCriteria) {\n const result = await criterion.check(areaContext, undefined, area);\n areaResults.push({\n id: criterion.id,\n title: criterion.title,\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n status: result.status,\n reason: result.reason,\n evidence: result.evidence\n });\n }\n\n const areaPillars = summarizePillars(areaResults);\n areaReports.push({ area, criteria: areaResults, pillars: areaPillars });\n }\n\n // Update aggregate area criteria in main results\n for (const criterion of criteriaResults) {\n if (criterion.scope !== \"area\") continue;\n const perAreaResults = areaReports\n .map((ar) => ar.criteria.find((c) => c.id === criterion.id))\n .filter(Boolean) as ReadinessCriterionResult[];\n if (!perAreaResults.length) continue;\n\n const passed = perAreaResults.filter((r) => r.status === \"pass\").length;\n const total = perAreaResults.length;\n const passRate = total ? passed / total : 0;\n criterion.status = passRate >= passRateThreshold ? \"pass\" : \"fail\";\n criterion.reason =\n criterion.status === \"pass\" ? undefined : `Only ${passed}/${total} areas pass this check.`;\n criterion.passRate = passRate;\n criterion.areaSummary = { passed, total };\n criterion.areaFailures = areaReports\n .filter((ar) => ar.criteria.find((c) => c.id === criterion.id)?.status !== \"pass\")\n .map((ar) => ar.area.name);\n }\n }\n\n // Compute summaries after area aggregation so they reflect final statuses\n const pillars = summarizePillars(criteriaResults);\n const levels = summarizeLevels(criteriaResults, passRateThreshold);\n const achievedLevel = levels\n .filter((level) => level.achieved)\n .reduce((acc, level) => Math.max(acc, level.level), 0);\n\n const extras = options.includeExtras === false ? [] : await runExtras(context, resolvedExtras);\n\n // ── Plugin engine: run shadow comparison when opts.shadow is enabled ──\n let engine: ReadinessReport[\"engine\"];\n if (options.shadow) {\n const policyCtx: PolicyContext = {\n repoPath,\n rootFiles,\n rootPackageJson,\n cache: new Map(),\n analysis,\n apps\n };\n const engineChain = await loadPluginChain(policySources ?? [], { jsonOnly: isConfigSourced });\n const engineReport = await executePlugins(engineChain.plugins, policyCtx, engineChain.options);\n engine = {\n signals: engineReport.signals,\n recommendations: engineReport.recommendations,\n policyWarnings: engineReport.policyWarnings,\n score: engineReport.score,\n grade: engineReport.grade\n };\n }\n\n return {\n repoPath,\n generatedAt: new Date().toISOString(),\n isMonorepo: analysis.isMonorepo ?? false,\n apps: apps.map((app) => ({ name: app.name, path: app.path })),\n pillars,\n levels,\n achievedLevel,\n criteria: criteriaResults,\n extras,\n areaReports,\n policies: policyInfo,\n engine\n };\n}\n\nexport function buildCriteria(): ReadinessCriterion[] {\n return [\n {\n id: \"lint-config\",\n title: \"Linting configured\",\n pillar: \"style-validation\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasLintConfig(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing ESLint/Biome/Prettier configuration.\",\n evidence: [\"eslint.config.js\", \".eslintrc\", \"biome.json\", \".prettierrc\"]\n };\n }\n },\n {\n id: \"typecheck-config\",\n title: \"Type checking configured\",\n pillar: \"style-validation\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasTypecheckConfig(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing type checking config (tsconfig or equivalent).\",\n evidence: [\"tsconfig.json\", \"pyproject.toml\", \"mypy.ini\"]\n };\n }\n },\n {\n id: \"build-script\",\n title: \"Build script present\",\n pillar: \"build-system\",\n level: 1,\n scope: \"app\",\n impact: \"high\",\n effort: \"low\",\n check: async (_context, app) => {\n const found = Boolean(app?.scripts?.build);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing build script in package.json.\"\n };\n }\n },\n {\n id: \"ci-config\",\n title: \"CI workflow configured\",\n pillar: \"build-system\",\n level: 2,\n scope: \"repo\",\n impact: \"high\",\n effort: \"medium\",\n check: async (context) => {\n const found = await hasGithubWorkflows(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing .github/workflows CI configuration.\",\n evidence: [\".github/workflows\"]\n };\n }\n },\n {\n id: \"test-script\",\n title: \"Test script present\",\n pillar: \"testing\",\n level: 1,\n scope: \"app\",\n impact: \"high\",\n effort: \"low\",\n check: async (_context, app) => {\n const found = Boolean(app?.scripts?.test);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing test script in package.json.\"\n };\n }\n },\n {\n id: \"readme\",\n title: \"README present\",\n pillar: \"documentation\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasReadme(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing README documentation.\",\n evidence: [\"README.md\"]\n };\n }\n },\n {\n id: \"contributing\",\n title: \"CONTRIBUTING guide present\",\n pillar: \"documentation\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await fileExists(path.join(context.repoPath, \"CONTRIBUTING.md\"));\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing CONTRIBUTING.md for contributor workflows.\"\n };\n }\n },\n {\n id: \"lockfile\",\n title: \"Lockfile present\",\n pillar: \"dev-environment\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = hasAnyFile(context.rootFiles, [\n \"pnpm-lock.yaml\",\n \"yarn.lock\",\n \"package-lock.json\",\n \"bun.lockb\"\n ]);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing package manager lockfile.\"\n };\n }\n },\n {\n id: \"env-example\",\n title: \"Environment example present\",\n pillar: \"dev-environment\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = hasAnyFile(context.rootFiles, [\".env.example\", \".env.sample\"]);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing .env.example or .env.sample for setup guidance.\"\n };\n }\n },\n {\n id: \"format-config\",\n title: \"Formatter configured\",\n pillar: \"code-quality\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasFormatterConfig(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing Prettier/Biome formatting config.\"\n };\n }\n },\n {\n id: \"codeowners\",\n title: \"CODEOWNERS present\",\n pillar: \"security-governance\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasCodeowners(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing CODEOWNERS file.\"\n };\n }\n },\n {\n id: \"license\",\n title: \"LICENSE present\",\n pillar: \"security-governance\",\n level: 1,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasLicense(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing LICENSE file.\"\n };\n }\n },\n {\n id: \"security-policy\",\n title: \"Security policy present\",\n pillar: \"security-governance\",\n level: 3,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await fileExists(path.join(context.repoPath, \"SECURITY.md\"));\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing SECURITY.md policy.\"\n };\n }\n },\n {\n id: \"dependabot\",\n title: \"Dependabot configured\",\n pillar: \"security-governance\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const found = await fileExists(path.join(context.repoPath, \".github\", \"dependabot.yml\"));\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing .github/dependabot.yml configuration.\"\n };\n }\n },\n {\n id: \"observability\",\n title: \"Observability tooling present\",\n pillar: \"observability\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const deps = await readAllDependencies(context);\n const has = deps.some((dep) =>\n [\"@opentelemetry/api\", \"@opentelemetry/sdk\", \"pino\", \"winston\", \"bunyan\"].includes(dep)\n );\n return {\n status: has ? \"pass\" : \"fail\",\n reason: \"No observability dependencies detected (OpenTelemetry/logging).\"\n };\n }\n },\n {\n id: \"custom-instructions\",\n title: \"Custom AI instructions or agent guidance\",\n pillar: \"ai-tooling\",\n level: 1,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const rootFound = await hasCustomInstructions(context.repoPath);\n if (rootFound.length === 0) {\n return {\n status: \"fail\",\n reason:\n \"Missing custom AI instructions (e.g. copilot-instructions.md, CLAUDE.md, AGENTS.md, .cursorrules).\",\n evidence: [\n \"copilot-instructions.md\",\n \"CLAUDE.md\",\n \"AGENTS.md\",\n \".cursorrules\",\n \".github/copilot-instructions.md\"\n ]\n };\n }\n\n // Check for file-based instructions (.github/instructions/*.instructions.md)\n const fileBasedInstructions = await hasFileBasedInstructions(context.repoPath);\n const areas = context.analysis.areas ?? [];\n\n // For monorepos or repos with detected areas, check coverage\n if (areas.length > 0) {\n if (fileBasedInstructions.length === 0) {\n return {\n status: \"pass\",\n reason: `Root instructions found, but no file-based instructions for ${areas.length} detected areas. Run \\`agentrc instructions --areas\\` to generate.`,\n evidence: [...rootFound, ...areas.map((a) => `${a.name}: missing .instructions.md`)]\n };\n }\n return {\n status: \"pass\",\n reason: `Root + ${fileBasedInstructions.length} file-based instruction(s) found.`,\n evidence: [...rootFound, ...fileBasedInstructions]\n };\n }\n\n // For monorepos without areas, check per-app instructions (legacy behavior)\n if (context.analysis.isMonorepo && context.apps.length > 1) {\n const appsMissing: string[] = [];\n for (const app of context.apps) {\n const appFound = await hasCustomInstructions(app.path);\n if (appFound.length === 0) {\n appsMissing.push(app.name);\n }\n }\n if (appsMissing.length > 0) {\n return {\n status: \"pass\",\n reason: `Root instructions found, but ${appsMissing.length}/${context.apps.length} apps missing their own: ${appsMissing.join(\", \")}`,\n evidence: [\n ...rootFound,\n ...appsMissing.map((name) => `${name}: missing app-level instructions`)\n ]\n };\n }\n }\n\n return {\n status: \"pass\",\n evidence: rootFound\n };\n }\n },\n {\n id: \"instructions-consistency\",\n title: \"AI instruction files are consistent\",\n pillar: \"ai-tooling\",\n level: 2,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n const rootFound = await hasCustomInstructions(context.repoPath);\n if (rootFound.length <= 1) {\n return { status: \"skip\", reason: \"Fewer than 2 instruction files found.\" };\n }\n const result = await checkInstructionConsistency(context.repoPath, rootFound);\n if (result.unified) {\n return {\n status: \"pass\",\n reason: `${rootFound.length} instruction files are consistent.`,\n evidence: rootFound\n };\n }\n return {\n status: \"fail\",\n reason: `${rootFound.length} instruction files are diverging (${result.similarity !== undefined ? `${Math.round(result.similarity * 100)}% similar` : \"different content\"}). Consider consolidating or symlinking them.`,\n evidence: rootFound\n };\n }\n },\n {\n id: \"mcp-config\",\n title: \"MCP configuration present\",\n pillar: \"ai-tooling\",\n level: 2,\n scope: \"repo\",\n impact: \"high\",\n effort: \"low\",\n check: async (context) => {\n const found = await hasMcpConfig(context.repoPath);\n return {\n status: found.length > 0 ? \"pass\" : \"fail\",\n reason: \"Missing MCP (Model Context Protocol) configuration (e.g. .vscode/mcp.json).\",\n evidence:\n found.length > 0\n ? found\n : [\".vscode/mcp.json\", \".vscode/settings.json (mcp section)\", \"mcp.json\"]\n };\n }\n },\n {\n id: \"custom-agents\",\n title: \"Custom AI agents configured\",\n pillar: \"ai-tooling\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const found = await hasCustomAgents(context.repoPath);\n return {\n status: found.length > 0 ? \"pass\" : \"fail\",\n reason: \"No custom AI agents configured (e.g. .github/agents/, .copilot/agents/).\",\n evidence:\n found.length > 0\n ? found\n : [\".github/agents/\", \".copilot/agents/\", \".github/copilot/agents/\"]\n };\n }\n },\n {\n id: \"copilot-skills\",\n title: \"Copilot/Claude skills present\",\n pillar: \"ai-tooling\",\n level: 3,\n scope: \"repo\",\n impact: \"medium\",\n effort: \"medium\",\n check: async (context) => {\n const found = await hasCopilotSkills(context.repoPath);\n return {\n status: found.length > 0 ? \"pass\" : \"fail\",\n reason: \"No Copilot or Claude skills found (e.g. .copilot/skills/, .github/skills/).\",\n evidence:\n found.length > 0 ? found : [\".copilot/skills/\", \".github/skills/\", \".claude/skills/\"]\n };\n }\n },\n // ── Area-scoped criteria (only run when areaPath is set) ──\n {\n id: \"area-readme\",\n title: \"Area README present\",\n pillar: \"documentation\",\n level: 1,\n scope: \"area\",\n impact: \"medium\",\n effort: \"low\",\n check: async (context) => {\n if (!context.areaPath || !context.areaFiles) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n const found = context.areaFiles.some(\n (f) => f.toLowerCase() === \"readme.md\" || f.toLowerCase() === \"readme\"\n );\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing README in area directory.\"\n };\n }\n },\n {\n id: \"area-build-script\",\n title: \"Area build script present\",\n pillar: \"build-system\",\n level: 1,\n scope: \"area\",\n impact: \"high\",\n effort: \"low\",\n check: async (context, _app, area) => {\n if (!context.areaPath || !context.areaFiles) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n // Check area.scripts from enriched Area type\n if (area?.scripts?.build) {\n return { status: \"pass\" };\n }\n // Fallback: check for package.json with build script in area\n const pkgPath = path.join(context.areaPath, \"package.json\");\n const pkg = await readJson(pkgPath);\n const scripts = (pkg?.scripts ?? {}) as Record<string, string>;\n const found = Boolean(scripts.build);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing build script in area.\"\n };\n }\n },\n {\n id: \"area-test-script\",\n title: \"Area test script present\",\n pillar: \"testing\",\n level: 1,\n scope: \"area\",\n impact: \"high\",\n effort: \"low\",\n check: async (context, _app, area) => {\n if (!context.areaPath || !context.areaFiles) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n if (area?.scripts?.test) {\n return { status: \"pass\" };\n }\n const pkgPath = path.join(context.areaPath, \"package.json\");\n const pkg = await readJson(pkgPath);\n const scripts = (pkg?.scripts ?? {}) as Record<string, string>;\n const found = Boolean(scripts.test);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing test script in area.\"\n };\n }\n },\n {\n id: \"area-instructions\",\n title: \"Area-specific instructions present\",\n pillar: \"ai-tooling\",\n level: 2,\n scope: \"area\",\n impact: \"high\",\n effort: \"low\",\n check: async (context, _app, area) => {\n if (!area) {\n return { status: \"skip\", reason: \"No area context.\" };\n }\n const sanitized = sanitizeAreaName(area.name);\n const instructionPath = path.join(\n context.repoPath,\n \".github\",\n \"instructions\",\n `${sanitized}.instructions.md`\n );\n const found = await fileExists(instructionPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : `Missing .github/instructions/${sanitized}.instructions.md`\n };\n }\n }\n ];\n}\n\nexport function buildExtras(): ExtraDefinition[] {\n return [\n {\n id: \"agents-doc\",\n title: \"AGENTS.md present\",\n check: async (context) => {\n const found = await fileExists(path.join(context.repoPath, \"AGENTS.md\"));\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing AGENTS.md to guide coding agents.\"\n };\n }\n },\n {\n id: \"pr-template\",\n title: \"Pull request template present\",\n check: async (context) => {\n const found = await hasPullRequestTemplate(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing PR template for consistent reviews.\"\n };\n }\n },\n {\n id: \"pre-commit\",\n title: \"Pre-commit hooks configured\",\n check: async (context) => {\n const found = await hasPrecommitConfig(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing pre-commit or Husky configuration for fast feedback.\"\n };\n }\n },\n {\n id: \"architecture-doc\",\n title: \"Architecture guide present\",\n check: async (context) => {\n const found = await hasArchitectureDoc(context.repoPath);\n return {\n status: found ? \"pass\" : \"fail\",\n reason: found ? undefined : \"Missing architecture documentation.\"\n };\n }\n }\n ];\n}\n\nasync function runExtras(\n context: ReadinessContext,\n extraDefs: ExtraDefinition[]\n): Promise<ReadinessExtraResult[]> {\n const results: ReadinessExtraResult[] = [];\n for (const def of extraDefs) {\n const result = await def.check(context);\n results.push({\n id: def.id,\n title: def.title,\n status: result.status,\n reason: result.reason\n });\n }\n return results;\n}\n\nfunction summarizePillars(criteria: ReadinessCriterionResult[]): ReadinessPillarSummary[] {\n const pillarNames: Record<ReadinessPillar, string> = {\n \"style-validation\": \"Style & Validation\",\n \"build-system\": \"Build System\",\n testing: \"Testing\",\n documentation: \"Documentation\",\n \"dev-environment\": \"Dev Environment\",\n \"code-quality\": \"Code Quality\",\n observability: \"Observability\",\n \"security-governance\": \"Security & Governance\",\n \"ai-tooling\": \"AI Tooling\"\n };\n\n return (Object.keys(pillarNames) as ReadinessPillar[]).map((pillar) => {\n const items = criteria.filter((criterion) => criterion.pillar === pillar);\n const { passed, total } = countStatus(items);\n return {\n id: pillar,\n name: pillarNames[pillar],\n passed,\n total,\n passRate: total ? passed / total : 0\n };\n });\n}\n\nfunction summarizeLevels(\n criteria: ReadinessCriterionResult[],\n passRateThreshold = 0.8\n): ReadinessLevelSummary[] {\n const levelNames: Record<number, string> = {\n 1: \"Functional\",\n 2: \"Documented\",\n 3: \"Standardized\",\n 4: \"Optimized\",\n 5: \"Autonomous\"\n };\n\n const summaries: ReadinessLevelSummary[] = [];\n for (let level = 1; level <= 5; level += 1) {\n const items = criteria.filter((criterion) => criterion.level === level);\n const { passed, total } = countStatus(items);\n const passRate = total ? passed / total : 0;\n summaries.push({\n level,\n name: levelNames[level],\n passed,\n total,\n passRate,\n achieved: false\n });\n }\n\n for (const summary of summaries) {\n const allPrior = summaries.filter((candidate) => candidate.level <= summary.level);\n const achieved = allPrior.every(\n (candidate) => candidate.total > 0 && candidate.passRate >= passRateThreshold\n );\n summary.achieved = achieved;\n }\n\n return summaries;\n}\n\nfunction countStatus(items: ReadinessCriterionResult[]): { passed: number; total: number } {\n const relevant = items.filter((item) => item.status !== \"skip\");\n const passed = relevant.filter((item) => item.status === \"pass\").length;\n return { passed, total: relevant.length };\n}\n\nfunction hasAnyFile(files: string[], candidates: string[]): boolean {\n return candidates.some((candidate) => files.includes(candidate));\n}\n\nasync function hasReadme(repoPath: string): Promise<boolean> {\n const files = await safeReadDir(repoPath);\n return files.some(\n (file) => file.toLowerCase() === \"readme.md\" || file.toLowerCase() === \"readme\"\n );\n}\n\nasync function hasLintConfig(repoPath: string): Promise<boolean> {\n return hasAnyFile(await safeReadDir(repoPath), [\n \"eslint.config.js\",\n \"eslint.config.mjs\",\n \".eslintrc\",\n \".eslintrc.js\",\n \".eslintrc.cjs\",\n \".eslintrc.json\",\n \".eslintrc.yml\",\n \".eslintrc.yaml\",\n \"biome.json\",\n \"biome.jsonc\",\n \".prettierrc\",\n \".prettierrc.json\",\n \".prettierrc.js\",\n \".prettierrc.cjs\",\n \"prettier.config.js\",\n \"prettier.config.cjs\"\n ]);\n}\n\nasync function hasFormatterConfig(repoPath: string): Promise<boolean> {\n return hasAnyFile(await safeReadDir(repoPath), [\n \"biome.json\",\n \"biome.jsonc\",\n \".prettierrc\",\n \".prettierrc.json\",\n \".prettierrc.js\",\n \".prettierrc.cjs\",\n \"prettier.config.js\",\n \"prettier.config.cjs\"\n ]);\n}\n\nasync function hasTypecheckConfig(repoPath: string): Promise<boolean> {\n return hasAnyFile(await safeReadDir(repoPath), [\n \"tsconfig.json\",\n \"tsconfig.base.json\",\n \"pyproject.toml\",\n \"mypy.ini\"\n ]);\n}\n\nasync function hasGithubWorkflows(repoPath: string): Promise<boolean> {\n return fileExists(path.join(repoPath, \".github\", \"workflows\"));\n}\n\nasync function hasCodeowners(repoPath: string): Promise<boolean> {\n const root = await fileExists(path.join(repoPath, \"CODEOWNERS\"));\n const github = await fileExists(path.join(repoPath, \".github\", \"CODEOWNERS\"));\n return root || github;\n}\n\nasync function hasLicense(repoPath: string): Promise<boolean> {\n const files = await safeReadDir(repoPath);\n return files.some((file) => file.toLowerCase().startsWith(\"license\"));\n}\n\nasync function hasPullRequestTemplate(repoPath: string): Promise<boolean> {\n const direct = await fileExists(path.join(repoPath, \".github\", \"PULL_REQUEST_TEMPLATE.md\"));\n if (direct) return true;\n const dir = path.join(repoPath, \".github\", \"PULL_REQUEST_TEMPLATE\");\n try {\n const entries = await fs.readdir(dir);\n return entries.some((entry) => entry.toLowerCase().endsWith(\".md\"));\n } catch {\n return false;\n }\n}\n\nasync function hasPrecommitConfig(repoPath: string): Promise<boolean> {\n const precommit = await fileExists(path.join(repoPath, \".pre-commit-config.yaml\"));\n if (precommit) return true;\n return fileExists(path.join(repoPath, \".husky\"));\n}\n\nasync function hasArchitectureDoc(repoPath: string): Promise<boolean> {\n const files = await safeReadDir(repoPath);\n if (files.some((file) => file.toLowerCase() === \"architecture.md\")) return true;\n return fileExists(path.join(repoPath, \"docs\", \"architecture.md\"));\n}\n\nasync function hasCustomInstructions(repoPath: string): Promise<string[]> {\n const found: string[] = [];\n const candidates = [\n \".github/copilot-instructions.md\",\n \"CLAUDE.md\",\n \".claude/CLAUDE.md\",\n \"AGENTS.md\",\n \".github/AGENTS.md\",\n \".cursorrules\",\n \".cursorignore\",\n \".windsurfrules\",\n \".github/instructions.md\",\n \"copilot-instructions.md\"\n ];\n for (const candidate of candidates) {\n if (await fileExists(path.join(repoPath, candidate))) {\n found.push(candidate);\n }\n }\n return found;\n}\n\nasync function hasFileBasedInstructions(repoPath: string): Promise<string[]> {\n const instructionsDir = path.join(repoPath, \".github\", \"instructions\");\n try {\n const entries = await fs.readdir(instructionsDir);\n return entries\n .filter((e) => e.endsWith(\".instructions.md\"))\n .map((e) => `.github/instructions/${e}`);\n } catch {\n return [];\n }\n}\n\nexport type InstructionConsistencyResult = {\n unified: boolean;\n files: string[];\n similarity?: number;\n};\n\n/**\n * Jaccard similarity on normalized line sets.\n * Returns 1.0 for identical (after normalization), 0.0 for completely disjoint.\n */\nexport function contentSimilarity(a: string, b: string): number {\n const normalize = (s: string) =>\n new Set(\n s\n .toLowerCase()\n .split(\"\\n\")\n .map((l) => l.trim().replace(/\\s+/gu, \" \"))\n .filter((l) => l.length > 0)\n );\n const setA = normalize(a);\n const setB = normalize(b);\n if (setA.size === 0 && setB.size === 0) return 1;\n let intersection = 0;\n for (const line of setA) {\n if (setB.has(line)) intersection++;\n }\n const union = new Set([...setA, ...setB]).size;\n return union === 0 ? 1 : intersection / union;\n}\n\n/**\n * Check whether multiple instruction files in a repo are consistent.\n * Files sharing the same realpath (symlinks) are treated as unified.\n * For distinct files, content is compared via Jaccard similarity.\n */\nexport async function checkInstructionConsistency(\n repoPath: string,\n foundFiles: string[]\n): Promise<InstructionConsistencyResult> {\n if (foundFiles.length <= 1) {\n return { unified: true, files: foundFiles };\n }\n\n // Group files by their real path (symlinks collapse)\n const realPathMap = new Map<string, string[]>();\n for (const file of foundFiles) {\n const fullPath = path.join(repoPath, file);\n try {\n const real = await fs.realpath(fullPath);\n const group = realPathMap.get(real) ?? [];\n group.push(file);\n realPathMap.set(real, group);\n } catch {\n // If realpath fails, treat as unique\n realPathMap.set(fullPath, [file]);\n }\n }\n\n const groups = [...realPathMap.values()];\n // All files resolve to the same real path → unified via symlinks\n if (groups.length <= 1) {\n return { unified: true, files: foundFiles };\n }\n\n // Read content from one representative file per group and compare pairwise\n const contents: string[] = [];\n for (const group of groups) {\n try {\n contents.push(await fs.readFile(path.join(repoPath, group[0]), \"utf8\"));\n } catch {\n contents.push(\"\");\n }\n }\n\n // Compute minimum pairwise similarity\n let minSimilarity = 1;\n for (let i = 0; i < contents.length; i++) {\n for (let j = i + 1; j < contents.length; j++) {\n minSimilarity = Math.min(minSimilarity, contentSimilarity(contents[i], contents[j]));\n }\n }\n\n return {\n unified: minSimilarity >= 0.9,\n files: foundFiles,\n similarity: Math.round(minSimilarity * 100) / 100\n };\n}\n\nasync function hasMcpConfig(repoPath: string): Promise<string[]> {\n const found: string[] = [];\n // Check .vscode/mcp.json\n if (await fileExists(path.join(repoPath, \".vscode\", \"mcp.json\"))) {\n found.push(\".vscode/mcp.json\");\n }\n // Check root mcp.json\n if (await fileExists(path.join(repoPath, \"mcp.json\"))) {\n found.push(\"mcp.json\");\n }\n // Check .vscode/settings.json for MCP section\n const settings = await readJson(path.join(repoPath, \".vscode\", \"settings.json\"));\n if (settings && (settings[\"mcp\"] || settings[\"github.copilot.chat.mcp.enabled\"])) {\n found.push(\".vscode/settings.json (mcp section)\");\n }\n // Check .claude/mcp.json\n if (await fileExists(path.join(repoPath, \".claude\", \"mcp.json\"))) {\n found.push(\".claude/mcp.json\");\n }\n return found;\n}\n\nasync function hasCustomAgents(repoPath: string): Promise<string[]> {\n const found: string[] = [];\n const agentDirs = [\".github/agents\", \".copilot/agents\", \".github/copilot/agents\"];\n for (const dir of agentDirs) {\n if (await fileExists(path.join(repoPath, dir))) {\n found.push(dir);\n }\n }\n // Check for agent config files\n const agentFiles = [\".github/copilot-agents.yml\", \".github/copilot-agents.yaml\"];\n for (const agentFile of agentFiles) {\n if (await fileExists(path.join(repoPath, agentFile))) {\n found.push(agentFile);\n }\n }\n return found;\n}\n\nasync function hasCopilotSkills(repoPath: string): Promise<string[]> {\n const found: string[] = [];\n const skillDirs = [\n \".copilot/skills\",\n \".github/skills\",\n \".claude/skills\",\n \".github/copilot/skills\"\n ];\n for (const dir of skillDirs) {\n if (await fileExists(path.join(repoPath, dir))) {\n found.push(dir);\n }\n }\n return found;\n}\n\nasync function readAllDependencies(context: ReadinessContext): Promise<string[]> {\n const dependencies: string[] = [];\n const apps = context.apps.length ? context.apps : [];\n for (const app of apps) {\n if (!app.packageJsonPath) continue;\n const pkg = await readJson(app.packageJsonPath);\n const deps = (pkg?.dependencies ?? {}) as Record<string, unknown>;\n const devDeps = (pkg?.devDependencies ?? {}) as Record<string, unknown>;\n dependencies.push(\n ...Object.keys({\n ...deps,\n ...devDeps\n })\n );\n }\n\n if (!apps.length && context.rootPackageJson) {\n const rootDeps = (context.rootPackageJson.dependencies ?? {}) as Record<string, unknown>;\n const rootDevDeps = (context.rootPackageJson.devDependencies ?? {}) as Record<string, unknown>;\n dependencies.push(\n ...Object.keys({\n ...rootDeps,\n ...rootDevDeps\n })\n );\n }\n\n return Array.from(new Set(dependencies));\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { readJson } from \"../utils/fs\";\n\nimport type { ReadinessCriterion, ReadinessContext } from \"./readiness\";\n\n// ─── Policy configuration types ───\n\ntype CriterionMetadata = Pick<\n ReadinessCriterion,\n \"title\" | \"pillar\" | \"level\" | \"scope\" | \"impact\" | \"effort\"\n>;\n\nexport type ExtraDefinition = {\n id: string;\n title: string;\n check: (context: ReadinessContext) => Promise<{ status: \"pass\" | \"fail\"; reason?: string }>;\n};\n\nexport type PolicyConfig = {\n name: string;\n version?: string;\n criteria?: {\n disable?: string[];\n add?: ReadinessCriterion[];\n override?: Record<string, Partial<CriterionMetadata>>;\n };\n extras?: {\n disable?: string[];\n add?: ExtraDefinition[];\n };\n thresholds?: {\n passRate?: number;\n };\n};\n\nexport type ResolvedPolicy = {\n chain: string[];\n criteria: ReadinessCriterion[];\n extras: ExtraDefinition[];\n thresholds: { passRate: number };\n};\n\n// ─── Default thresholds ───\n\nconst DEFAULT_PASS_RATE = 0.8;\n\n// ─── Validation ───\n\nfunction validatePolicyConfig(\n obj: unknown,\n source: string,\n format: \"json\" | \"module\" = \"module\"\n): PolicyConfig {\n if (typeof obj !== \"object\" || obj === null) {\n throw new Error(`Policy \"${source}\" is invalid: expected an object, got ${typeof obj}`);\n }\n const record = obj as Record<string, unknown>;\n if (typeof record.name !== \"string\" || !record.name.trim()) {\n throw new Error(`Policy \"${source}\" is invalid: missing required field \"name\" at root`);\n }\n if (record.criteria !== undefined) {\n if (typeof record.criteria !== \"object\") {\n throw new Error(`Policy \"${source}\" is invalid: \"criteria\" must be an object`);\n }\n const criteria = record.criteria as Record<string, unknown>;\n if (criteria.disable !== undefined && !isStringArray(criteria.disable)) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"criteria.disable\" must be an array of strings`\n );\n }\n if (criteria.override !== undefined) {\n if (\n typeof criteria.override !== \"object\" ||\n criteria.override === null ||\n Array.isArray(criteria.override)\n ) {\n throw new Error(`Policy \"${source}\" is invalid: \"criteria.override\" must be an object`);\n }\n const ALLOWED_OVERRIDE_KEYS = new Set([\n \"title\",\n \"pillar\",\n \"level\",\n \"scope\",\n \"impact\",\n \"effort\"\n ]);\n for (const [id, value] of Object.entries(\n criteria.override as Record<string, Record<string, unknown>>\n )) {\n if (typeof value !== \"object\" || value === null) continue;\n for (const key of Object.keys(value)) {\n if (!ALLOWED_OVERRIDE_KEYS.has(key)) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"criteria.override.${id}\" contains disallowed key \"${key}\". Allowed keys: ${[...ALLOWED_OVERRIDE_KEYS].join(\", \")}`\n );\n }\n }\n }\n }\n if (format === \"json\" && criteria.add !== undefined) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"criteria.add\" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.`\n );\n }\n }\n if (record.extras !== undefined) {\n if (typeof record.extras !== \"object\" || record.extras === null) {\n throw new Error(`Policy \"${source}\" is invalid: \"extras\" must be an object`);\n }\n const extras = record.extras as Record<string, unknown>;\n if (extras.disable !== undefined && !isStringArray(extras.disable)) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"extras.disable\" must be an array of strings`\n );\n }\n if (format === \"json\" && extras.add !== undefined) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"extras.add\" is not supported in JSON policies (check functions cannot be serialized). Use a .ts or .js policy file instead.`\n );\n }\n }\n if (record.thresholds !== undefined) {\n if (typeof record.thresholds !== \"object\" || record.thresholds === null) {\n throw new Error(`Policy \"${source}\" is invalid: \"thresholds\" must be an object`);\n }\n const thresholds = record.thresholds as Record<string, unknown>;\n if (thresholds.passRate !== undefined && typeof thresholds.passRate !== \"number\") {\n throw new Error(`Policy \"${source}\" is invalid: \"thresholds.passRate\" must be a number`);\n }\n if (\n typeof thresholds.passRate === \"number\" &&\n (thresholds.passRate < 0 || thresholds.passRate > 1)\n ) {\n throw new Error(\n `Policy \"${source}\" is invalid: \"thresholds.passRate\" must be between 0 and 1`\n );\n }\n }\n return record as unknown as PolicyConfig;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\n// ─── Helpers ───\n\nexport function parsePolicySources(raw: string | undefined): string[] | undefined {\n if (!raw) return undefined;\n const sources = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return sources.length ? sources : undefined;\n}\n\n// ─── Loading ───\n\nexport async function loadPolicy(\n source: string,\n options?: { jsonOnly?: boolean }\n): Promise<PolicyConfig> {\n const jsonOnly = options?.jsonOnly ?? false;\n\n // Local file path (relative or absolute)\n if (source.startsWith(\".\") || path.isAbsolute(source)) {\n const resolved = path.resolve(source);\n if (resolved.endsWith(\".json\")) {\n const data = await readJson(resolved);\n if (!data) {\n throw new Error(`Policy \"${source}\" not found at: ${resolved}`);\n }\n return validatePolicyConfig(data, source, \"json\");\n }\n // TS/JS module — blocked when jsonOnly\n if (/\\.[mc]?[jt]s$/u.test(resolved)) {\n if (jsonOnly) {\n throw new Error(\n `Policy \"${source}\" rejected: only JSON policies are allowed from agentrc.config.json. Module policies (.ts/.js) must be passed via --policy.`\n );\n }\n try {\n const mod = (await import(resolved)) as Record<string, unknown>;\n const config = (mod.default ?? mod) as unknown;\n return validatePolicyConfig(config, source);\n } catch (err) {\n if (\n err instanceof Error &&\n (err.message.includes(\"Cannot find module\") || err.message.includes(\"MODULE_NOT_FOUND\"))\n ) {\n throw new Error(`Policy \"${source}\" not found at: ${resolved}`);\n }\n throw err;\n }\n }\n // Unsupported extension — try as JSON\n try {\n const raw = await fs.readFile(resolved, \"utf8\");\n const data = JSON.parse(raw) as unknown;\n return validatePolicyConfig(data, source, \"json\");\n } catch {\n throw new Error(\n `Policy \"${source}\" could not be loaded from: ${resolved}. Supported formats: .json, .js, .ts, .mjs`\n );\n }\n }\n\n // npm package (bare specifier or scoped) — blocked when jsonOnly\n if (jsonOnly) {\n throw new Error(\n `Policy \"${source}\" rejected: only JSON file policies are allowed from agentrc.config.json. npm policies must be passed via --policy.`\n );\n }\n try {\n const mod = (await import(source)) as Record<string, unknown>;\n const config = (mod.default ?? mod) as unknown;\n return validatePolicyConfig(config, source);\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n if (\n message.includes(\"Cannot find module\") ||\n message.includes(\"Cannot find package\") ||\n message.includes(\"MODULE_NOT_FOUND\") ||\n message.includes(\"ERR_MODULE_NOT_FOUND\")\n ) {\n throw new Error(`Policy \"${source}\" not found. Install it with: npm install ${source}`);\n }\n throw err;\n }\n}\n\n// ─── Chain resolution ───\n\nexport function resolveChain(\n baseCriteria: ReadinessCriterion[],\n baseExtras: ExtraDefinition[],\n policies: PolicyConfig[]\n): ResolvedPolicy {\n const chain: string[] = [];\n let criteria = [...baseCriteria];\n let extras = [...baseExtras];\n let passRate = DEFAULT_PASS_RATE;\n\n for (const policy of policies) {\n chain.push(policy.name);\n\n if (policy.criteria) {\n // Disable criteria by id\n if (policy.criteria.disable?.length) {\n const disableSet = new Set(policy.criteria.disable);\n criteria = criteria.filter((c) => !disableSet.has(c.id));\n }\n\n // Override metadata by id\n if (policy.criteria.override) {\n for (const [id, overrides] of Object.entries(policy.criteria.override)) {\n const idx = criteria.findIndex((c) => c.id === id);\n if (idx >= 0) {\n criteria[idx] = { ...criteria[idx], ...overrides };\n }\n }\n }\n\n // Add new criteria\n if (policy.criteria.add?.length) {\n for (const newCriterion of policy.criteria.add) {\n // Replace if same id exists, otherwise append\n const existingIdx = criteria.findIndex((c) => c.id === newCriterion.id);\n if (existingIdx >= 0) {\n criteria[existingIdx] = newCriterion;\n } else {\n criteria.push(newCriterion);\n }\n }\n }\n }\n\n if (policy.extras) {\n if (policy.extras.disable?.length) {\n const disableSet = new Set(policy.extras.disable);\n extras = extras.filter((e) => !disableSet.has(e.id));\n }\n if (policy.extras.add?.length) {\n for (const newExtra of policy.extras.add) {\n const existingIdx = extras.findIndex((e) => e.id === newExtra.id);\n if (existingIdx >= 0) {\n extras[existingIdx] = newExtra;\n } else {\n extras.push(newExtra);\n }\n }\n }\n }\n\n if (policy.thresholds?.passRate !== undefined) {\n passRate = policy.thresholds.passRate;\n }\n }\n\n return { chain, criteria, extras, thresholds: { passRate } };\n}\n","// ─── Signal & Recommendation Types ───\n// Core types for the unified plugin policy system.\n// Both imperative hook plugins and declarative JSON policies compile to\n// the same runtime contract via these types.\n\nimport type { RepoAnalysis, RepoApp } from \"../analyzer\";\n\n/** Classification of what a signal detects. */\nexport type SignalKind = \"file\" | \"setting\" | \"mcp-server\" | \"model-config\" | \"git\" | \"custom\";\n\n/** Result status of a signal detection. */\nexport type SignalStatus = \"detected\" | \"not-detected\" | \"error\";\n\n/** Tracks which plugin created or modified a signal/recommendation. */\nexport type Provenance = {\n addedBy: string;\n modifiedBy?: string[];\n};\n\n/** A single detection emitted by a detector. */\nexport type Signal = {\n id: string;\n kind: SignalKind;\n status: SignalStatus;\n label: string;\n evidence?: string[];\n reason?: string;\n origin: Provenance;\n metadata?: Record<string, unknown>;\n};\n\n/** Impact level for a recommendation. */\nexport type RecommendationImpact = \"critical\" | \"high\" | \"medium\" | \"low\" | \"info\";\n\n/** An actionable recommendation derived from signals. */\nexport type Recommendation = {\n id: string;\n signalId: string;\n impact: RecommendationImpact;\n message: string;\n origin: Provenance;\n supersedes?: string[];\n metadata?: Record<string, unknown>;\n};\n\n/** A warning emitted during policy execution (non-fatal). */\nexport type PolicyWarning = {\n pluginName: string;\n stage: PluginStage;\n message: string;\n};\n\n// ─── Patch types for immutable hook returns ───\n\nexport type SignalPatch = {\n add?: Signal[];\n remove?: string[];\n modify?: Array<{ id: string; changes: Partial<Omit<Signal, \"id\" | \"origin\">> }>;\n};\n\nexport type RecommendationPatch = {\n add?: Recommendation[];\n remove?: string[];\n modify?: Array<{ id: string; changes: Partial<Omit<Recommendation, \"id\" | \"origin\">> }>;\n};\n\n// ─── Plugin lifecycle ───\n\nexport type PluginStage =\n | \"detect\"\n | \"afterDetect\"\n | \"beforeRecommend\"\n | \"recommend\"\n | \"afterRecommend\";\n\n/** Read-only context available to all plugin lifecycle stages. */\nexport type PolicyContext = {\n repoPath: string;\n rootFiles: string[];\n rootPackageJson?: Record<string, unknown>;\n /** Shared key-value cache scoped to a single engine run. */\n cache: Map<string, unknown>;\n /** Full repo analysis, populated when running inside the readiness engine. */\n analysis?: RepoAnalysis;\n /** Detected repo apps, populated when running inside the readiness engine. */\n apps?: RepoApp[];\n};\n\n/** A detector emits signals about the state of a repository. */\nexport type Detector = {\n id: string;\n kind: SignalKind;\n detect: (ctx: PolicyContext) => Promise<Signal | Signal[]>;\n};\n\n/** A recommender emits actionable recommendations based on signals. */\nexport type Recommender = {\n id: string;\n recommend: (\n signals: ReadonlyArray<Signal>,\n ctx: PolicyContext\n ) => Promise<Recommendation | Recommendation[]>;\n};\n\n/** Trust tier determines what a plugin is allowed to do. */\nexport type PluginTrust = \"trusted-code\" | \"safe-declarative\";\n\n/** Source type of the plugin. */\nexport type PluginSourceType = \"module\" | \"json\" | \"builtin\";\n\n/** Metadata describing a plugin. */\nexport type PluginMeta = {\n name: string;\n version?: string;\n /** Semver range of engine versions this plugin is compatible with. */\n engine?: string;\n /** Capabilities this plugin implements (e.g. \"detect\", \"recommend\", \"hook\"). */\n capabilities?: string[];\n sourceType: PluginSourceType;\n trust: PluginTrust;\n};\n\n/**\n * The canonical plugin contract.\n * Both imperative module plugins and compiled JSON policies implement this.\n * All hook stages are optional — plugins only implement what they need.\n */\nexport type PolicyPlugin = {\n meta: PluginMeta;\n\n /** Detectors that emit signals about repository state. */\n detectors?: Detector[];\n\n /** Called after all detectors run. Returns a patch to mutate signals. */\n afterDetect?: (\n signals: ReadonlyArray<Signal>,\n ctx: PolicyContext\n ) => Promise<SignalPatch | undefined>;\n\n /** Called before recommenders run. Returns a patch to mutate signals. */\n beforeRecommend?: (\n signals: ReadonlyArray<Signal>,\n ctx: PolicyContext\n ) => Promise<SignalPatch | undefined>;\n\n /** Recommenders that emit actionable recommendations. */\n recommenders?: Recommender[];\n\n /** Called after all recommenders run. Returns a patch to mutate recommendations. */\n afterRecommend?: (\n recommendations: ReadonlyArray<Recommendation>,\n signals: ReadonlyArray<Signal>,\n ctx: PolicyContext\n ) => Promise<RecommendationPatch | undefined>;\n\n /** Per-plugin error handler. Return true to continue remaining detectors/recommenders for this plugin, false to abort them. Does not affect other plugins in the chain. Note: return value is ignored for hook stages (afterDetect, beforeRecommend, afterRecommend); only effective in detect/recommend loops. */\n onError?: (error: Error, stage: PluginStage, ctx: PolicyContext) => boolean;\n};\n\n// ─── Engine output ───\n\n/** Grade label for a readiness score. */\nexport type Grade = \"A\" | \"B\" | \"C\" | \"D\" | \"F\";\n\n/** Complete output from the plugin engine. */\nexport type EngineReport = {\n readonly signals: ReadonlyArray<Signal>;\n readonly recommendations: ReadonlyArray<Recommendation>;\n readonly policyWarnings: ReadonlyArray<PolicyWarning>;\n readonly score: number;\n readonly grade: Grade;\n readonly pluginChain: ReadonlyArray<string>;\n};\n\n// ─── Scoring ───\n\nconst IMPACT_WEIGHTS: Record<RecommendationImpact, number> = {\n critical: 5,\n high: 4,\n medium: 3,\n low: 2,\n info: 0\n};\n\n/**\n * Engine-level scoring reducer.\n * Score = 1 - (weighted unresolved recommendations / max possible weight).\n * Max weight per signal is \"critical\" (5) — a single critical recommendation\n * against one signal will produce score 0. This is intentional: critical\n * findings are designed to dominate the score.\n */\nexport function calculateScore(\n signals: ReadonlyArray<Signal>,\n recommendations: ReadonlyArray<Recommendation>\n): { score: number; grade: Grade } {\n // Exclude not-detected (skipped/non-applicable) signals from scoring denominator.\n // Including them would inflate maxWeight and artificially boost scores for repos\n // with many non-applicable criteria.\n const activeSignals = signals.filter((s) => s.status !== \"not-detected\");\n if (activeSignals.length === 0) {\n return { score: 1, grade: \"A\" };\n }\n\n const maxWeight = activeSignals.length * IMPACT_WEIGHTS.critical;\n\n const deductions = recommendations.reduce((sum, rec) => sum + IMPACT_WEIGHTS[rec.impact], 0);\n\n const score = Math.max(0, Math.min(1, 1 - deductions / maxWeight));\n return { score, grade: scoreToGrade(score) };\n}\n\nfunction scoreToGrade(score: number): Grade {\n if (score >= 0.9) return \"A\";\n if (score >= 0.8) return \"B\";\n if (score >= 0.7) return \"C\";\n if (score >= 0.6) return \"D\";\n return \"F\";\n}\n\n// ─── Patch application ───\n\n/** Apply a SignalPatch to a list of signals, recording provenance. */\nexport function applySignalPatch(\n signals: Signal[],\n patch: SignalPatch,\n pluginName: string\n): Signal[] {\n let result = [...signals];\n\n if (patch.remove?.length) {\n const removeSet = new Set(patch.remove);\n result = result.filter((s) => !removeSet.has(s.id));\n }\n\n if (patch.modify?.length) {\n for (const mod of patch.modify) {\n const idx = result.findIndex((s) => s.id === mod.id);\n if (idx >= 0) {\n const existing = result[idx];\n const changes = { ...mod.changes };\n // Deep-merge metadata to avoid wiping existing fields (e.g. checkStatus)\n if (changes.metadata && existing.metadata) {\n changes.metadata = { ...existing.metadata, ...changes.metadata };\n }\n result[idx] = {\n ...existing,\n ...changes,\n origin: {\n ...existing.origin,\n modifiedBy: [...(existing.origin.modifiedBy ?? []), pluginName]\n }\n };\n }\n }\n }\n\n if (patch.add?.length) {\n result.push(\n ...patch.add.map((s) => ({\n ...s,\n evidence: s.evidence ? [...s.evidence] : undefined,\n metadata: s.metadata ? { ...s.metadata } : undefined\n }))\n );\n }\n\n return result;\n}\n\n/** Apply a RecommendationPatch to a list of recommendations, recording provenance. */\nexport function applyRecommendationPatch(\n recommendations: Recommendation[],\n patch: RecommendationPatch,\n pluginName: string\n): Recommendation[] {\n let result = [...recommendations];\n\n if (patch.remove?.length) {\n const removeSet = new Set(patch.remove);\n result = result.filter((r) => !removeSet.has(r.id));\n }\n\n if (patch.modify?.length) {\n for (const mod of patch.modify) {\n const idx = result.findIndex((r) => r.id === mod.id);\n if (idx >= 0) {\n const existing = result[idx];\n result[idx] = {\n ...existing,\n ...mod.changes,\n origin: {\n ...existing.origin,\n modifiedBy: [...(existing.origin.modifiedBy ?? []), pluginName]\n }\n };\n }\n }\n }\n\n if (patch.add?.length) {\n result.push(\n ...patch.add.map((r) => ({\n ...r,\n supersedes: r.supersedes ? [...r.supersedes] : undefined,\n metadata: r.metadata ? { ...r.metadata } : undefined\n }))\n );\n }\n\n return result;\n}\n\n/**\n * Resolve supersedes: remove recommendations that are superseded by others.\n * Records provenance on the superseding recommendation.\n * Circular supersedes chains result in all involved recommendations being dropped.\n */\nexport function resolveSupersedes(recommendations: Recommendation[]): Recommendation[] {\n const supersededIds = new Set<string>();\n const recIds = new Set(recommendations.map((r) => r.id));\n for (const rec of recommendations) {\n if (rec.supersedes?.length) {\n for (const id of rec.supersedes) {\n // Only supersede IDs that actually exist in the list\n if (recIds.has(id)) {\n supersededIds.add(id);\n }\n }\n }\n }\n return recommendations\n .filter((r) => !supersededIds.has(r.id))\n .map((r) => {\n if (!r.supersedes?.length) return r;\n // Record which recommendations were actually superseded\n const actuallySuperseded = r.supersedes.filter((id) => supersededIds.has(id));\n if (actuallySuperseded.length === 0) return r;\n return {\n ...r,\n origin: {\n ...r.origin,\n modifiedBy: [\n ...(r.origin.modifiedBy ?? []),\n ...actuallySuperseded.map((id) => `superseded:${id}`)\n ]\n }\n };\n });\n}\n","import type {\n PolicyPlugin,\n PolicyContext,\n Signal,\n Recommendation,\n PolicyWarning,\n EngineReport,\n PluginStage\n} from \"./types\";\nimport {\n applySignalPatch,\n applyRecommendationPatch,\n resolveSupersedes,\n calculateScore\n} from \"./types\";\n\nexport type EngineOptions = {\n /** IDs of rules to skip entirely (detectors + recommenders). */\n disabledRuleIds?: Set<string>;\n};\n\n/**\n * Execute a chain of plugins through the deterministic pipeline:\n * 1. All detectors (all plugins, source order)\n * 2. afterDetect hooks (all plugins, source order)\n * 3. beforeRecommend hooks (all plugins, source order)\n * 4. All recommenders (all plugins, source order)\n * 5. afterRecommend hooks (all plugins, source order)\n * 6. Resolve supersedes\n * 7. Engine-level scoring\n */\nexport async function executePlugins(\n plugins: PolicyPlugin[],\n ctx: PolicyContext,\n options?: EngineOptions\n): Promise<EngineReport> {\n const warnings: PolicyWarning[] = [];\n const disabledIds = options?.disabledRuleIds ?? new Set<string>();\n\n // ── Stage 1: Detect ──\n let signals: Signal[] = [];\n for (const plugin of plugins) {\n if (!plugin.detectors?.length) continue;\n for (const detector of plugin.detectors) {\n if (disabledIds.has(detector.id)) continue;\n try {\n const result = await detector.detect(ctx);\n const emitted = Array.isArray(result) ? result : [result];\n signals.push(...emitted);\n } catch (err) {\n const cont = handleError(plugin, err, \"detect\", ctx, warnings);\n if (!cont) break;\n }\n }\n }\n\n // ── Stage 2: afterDetect hooks ──\n // Hook stages (2, 3, 5) do not honor onError abort on the outer plugin loop.\n // Each hook is a single call per plugin, so \"abort\" only applies to inner\n // detector/recommender loops in stages 1 and 4.\n for (const plugin of plugins) {\n if (!plugin.afterDetect) continue;\n try {\n const patch = await plugin.afterDetect(signals, ctx);\n if (patch) {\n signals = applySignalPatch(signals, patch, plugin.meta.name);\n }\n } catch (err) {\n handleError(plugin, err, \"afterDetect\", ctx, warnings);\n }\n }\n\n // ── Stage 3: beforeRecommend hooks ──\n for (const plugin of plugins) {\n if (!plugin.beforeRecommend) continue;\n try {\n const patch = await plugin.beforeRecommend(signals, ctx);\n if (patch) {\n signals = applySignalPatch(signals, patch, plugin.meta.name);\n }\n } catch (err) {\n handleError(plugin, err, \"beforeRecommend\", ctx, warnings);\n }\n }\n\n // ── Stage 4: Recommend ──\n let recommendations: Recommendation[] = [];\n for (const plugin of plugins) {\n if (!plugin.recommenders?.length) continue;\n for (const recommender of plugin.recommenders) {\n if (disabledIds.has(recommender.id)) continue;\n try {\n const result = await recommender.recommend(signals, ctx);\n const emitted = Array.isArray(result) ? result : [result];\n recommendations.push(...emitted);\n } catch (err) {\n const cont = handleError(plugin, err, \"recommend\", ctx, warnings);\n if (!cont) break;\n }\n }\n }\n\n // ── Stage 5: afterRecommend hooks ──\n for (const plugin of plugins) {\n if (!plugin.afterRecommend) continue;\n try {\n const patch = await plugin.afterRecommend(recommendations, signals, ctx);\n if (patch) {\n recommendations = applyRecommendationPatch(recommendations, patch, plugin.meta.name);\n }\n } catch (err) {\n handleError(plugin, err, \"afterRecommend\", ctx, warnings);\n }\n }\n\n // ── Stage 6: Resolve supersedes ──\n recommendations = resolveSupersedes(recommendations);\n\n // ── Stage 7: Score ──\n const { score, grade } = calculateScore(signals, recommendations);\n\n return {\n signals,\n recommendations,\n policyWarnings: warnings,\n score,\n grade,\n pluginChain: plugins.map((p) => p.meta.name)\n };\n}\n\nfunction handleError(\n plugin: PolicyPlugin,\n err: unknown,\n stage: PluginStage,\n ctx: PolicyContext,\n warnings: PolicyWarning[]\n): boolean {\n const error = err instanceof Error ? err : new Error(String(err));\n // Always record the warning for audit trail, even on abort\n warnings.push({\n pluginName: plugin.meta.name,\n stage,\n message: error.message\n });\n if (plugin.onError) {\n return plugin.onError(error, stage, ctx);\n }\n return true;\n}\n","/**\n * Phase E: Declarative-to-Plugin Compiler.\n *\n * Compiles a declarative PolicyConfig (JSON policy) into a PolicyPlugin adapter\n * so that both imperative and declarative policies share the same runtime.\n *\n * Declarative policies can:\n * - disable criteria/extras → mapped to EngineOptions.disabledRuleIds\n * - override criterion metadata → mapped to afterDetect hook (SignalPatch.modify)\n * - add new criteria → mapped to detectors + recommenders\n * - set thresholds → returned alongside the plugin for engine-level use\n */\nimport type { PolicyConfig, ExtraDefinition } from \"../policy\";\nimport type { ReadinessCriterion, ReadinessContext } from \"../readiness\";\n\nimport type {\n PolicyPlugin,\n Detector,\n RecommendationImpact,\n Recommender,\n Signal,\n SignalPatch,\n PolicyContext\n} from \"./types\";\n\nexport type CompilationResult = {\n plugin: PolicyPlugin;\n /** Criterion/extra IDs to disable at engine level. */\n disabledIds: string[];\n /** Pass-rate threshold from the policy (undefined if not set). */\n passRateThreshold?: number;\n};\n\n/**\n * Compile a declarative PolicyConfig into a PolicyPlugin.\n *\n * The compiled plugin has trust \"safe-declarative\" and sourceType \"json\".\n * It cannot contain arbitrary code — only metadata overrides and static checks.\n */\nexport function compilePolicyConfig(\n config: PolicyConfig,\n /** Base criteria used for metadata override resolution. */\n _baseCriteria: ReadonlyArray<ReadinessCriterion>\n): CompilationResult {\n const disabledIds: string[] = [];\n const detectors: Detector[] = [];\n const recommenders: Recommender[] = [];\n let afterDetect:\n | ((signals: ReadonlyArray<Signal>, ctx: PolicyContext) => Promise<SignalPatch | undefined>)\n | undefined;\n\n // ── Collect disabled IDs ──\n if (config.criteria?.disable?.length) {\n disabledIds.push(...config.criteria.disable);\n }\n if (config.extras?.disable?.length) {\n disabledIds.push(...config.extras.disable);\n }\n\n // ── Build afterDetect hook for metadata overrides ──\n if (config.criteria?.override && Object.keys(config.criteria.override).length > 0) {\n const overrides = config.criteria.override;\n afterDetect = async (signals) => {\n const modifications: SignalPatch[\"modify\"] = [];\n for (const [id, changes] of Object.entries(overrides)) {\n // Only modify signals that exist\n const exists = signals.some((s) => s.id === id);\n if (exists) {\n // Map criterion metadata overrides to signal label/metadata changes\n const signalChanges: Record<string, unknown> = {};\n if (changes.title) {\n signalChanges.label = changes.title;\n }\n // Store remaining overrides in metadata\n const meta: Record<string, unknown> = {};\n if (changes.pillar) meta.pillar = changes.pillar;\n if (changes.level !== undefined) meta.level = changes.level;\n if (changes.scope) meta.scope = changes.scope;\n if (changes.impact) meta.impact = changes.impact;\n if (changes.effort) meta.effort = changes.effort;\n if (Object.keys(meta).length > 0) {\n signalChanges.metadata = meta;\n }\n if (Object.keys(signalChanges).length > 0) {\n modifications.push({\n id,\n changes: signalChanges as Partial<Omit<Signal, \"id\" | \"origin\">>\n });\n }\n }\n }\n return modifications.length > 0 ? { modify: modifications } : undefined;\n };\n }\n\n // ── Build detectors + recommenders from criteria.add ──\n if (config.criteria?.add?.length) {\n for (const criterion of config.criteria.add) {\n detectors.push(criterionToDetector(criterion));\n recommenders.push(criterionToRecommender(criterion));\n }\n }\n\n // ── Build detectors + recommenders from extras.add ──\n if (config.extras?.add?.length) {\n for (const extra of config.extras.add) {\n detectors.push(extraToDetector(extra));\n recommenders.push(extraToRecommender(extra));\n }\n }\n\n const plugin: PolicyPlugin = {\n meta: {\n name: config.name,\n version: config.version,\n sourceType: \"json\",\n trust: \"safe-declarative\"\n },\n ...(detectors.length > 0 ? { detectors } : {}),\n ...(afterDetect ? { afterDetect } : {}),\n ...(recommenders.length > 0 ? { recommenders } : {})\n };\n\n return {\n plugin,\n disabledIds,\n passRateThreshold: config.thresholds?.passRate\n };\n}\n\nfunction criterionToDetector(criterion: ReadinessCriterion): Detector {\n return {\n id: criterion.id,\n kind: mapScope(criterion.scope),\n detect: async (ctx) => {\n const readinessCtx = policyCtxToReadinessCtx(ctx);\n const result = await criterion.check(readinessCtx);\n return {\n id: criterion.id,\n kind: mapScope(criterion.scope),\n status: result.status === \"skip\" ? \"not-detected\" : \"detected\",\n label: criterion.title,\n evidence: result.evidence,\n reason: result.reason,\n origin: { addedBy: `compiled:${criterion.id}` },\n metadata: {\n pillar: criterion.pillar,\n level: criterion.level,\n scope: criterion.scope,\n impact: criterion.impact,\n effort: criterion.effort,\n checkStatus: result.status\n }\n };\n }\n };\n}\n\nfunction criterionToRecommender(criterion: ReadinessCriterion): Recommender {\n return {\n id: `${criterion.id}-rec`,\n recommend: async (signals) => {\n const signal = signals.find((s) => s.id === criterion.id);\n if (!signal) return [];\n const checkStatus = (signal.metadata as Record<string, unknown>)?.checkStatus;\n if (checkStatus !== \"fail\") return [];\n // Read impact from signal metadata at call time so afterDetect overrides\n // (e.g. from a declarative policy's override block) are reflected in scoring.\n const runtimeImpact = (signal.metadata as Record<string, unknown>)?.impact as\n | RecommendationImpact\n | undefined;\n const impact =\n runtimeImpact ??\n (criterion.impact === \"high\" ? \"high\" : criterion.impact === \"medium\" ? \"medium\" : \"low\");\n return {\n id: `${criterion.id}-fix`,\n signalId: criterion.id,\n impact,\n message: signal.reason ?? `Fix: ${criterion.title}`,\n origin: { addedBy: `compiled:${criterion.id}` }\n };\n }\n };\n}\n\nfunction extraToDetector(extra: ExtraDefinition): Detector {\n return {\n id: extra.id,\n kind: \"custom\",\n detect: async (ctx) => {\n const readinessCtx = policyCtxToReadinessCtx(ctx);\n const result = await extra.check(readinessCtx);\n return {\n id: extra.id,\n kind: \"custom\" as const,\n status: \"detected\" as const,\n label: extra.title,\n reason: result.reason,\n origin: { addedBy: `compiled:${extra.id}` },\n metadata: { checkStatus: result.status }\n };\n }\n };\n}\n\nfunction extraToRecommender(extra: ExtraDefinition): Recommender {\n return {\n id: `${extra.id}-rec`,\n recommend: async (signals) => {\n const signal = signals.find((s) => s.id === extra.id);\n if (!signal) return [];\n const checkStatus = (signal.metadata as Record<string, unknown>)?.checkStatus;\n if (checkStatus !== \"fail\") return [];\n return {\n id: `${extra.id}-fix`,\n signalId: extra.id,\n impact: \"low\" as const,\n message: signal.reason ?? `Fix: ${extra.title}`,\n origin: { addedBy: `compiled:${extra.id}` }\n };\n }\n };\n}\n\nfunction mapScope(scope: string): \"file\" | \"git\" | \"custom\" {\n switch (scope) {\n case \"repo\":\n return \"file\";\n case \"app\":\n return \"file\";\n case \"area\":\n return \"file\";\n default:\n return \"custom\";\n }\n}\n\n/**\n * Bridge from PolicyContext to ReadinessContext.\n * Used by compiled detectors to run legacy check functions.\n * When running inside the readiness engine, `ctx.analysis` and `ctx.apps`\n * are populated and forwarded directly. Outside that path they are stubbed\n * with safe empty values — criteria that rely on language/framework data\n * should not be compiled into declarative JSON policies.\n */\nfunction policyCtxToReadinessCtx(ctx: PolicyContext): ReadinessContext {\n return {\n repoPath: ctx.repoPath,\n analysis: ctx.analysis ?? {\n path: ctx.repoPath,\n isGitRepo: true,\n languages: [],\n frameworks: [],\n isMonorepo: false\n },\n apps: ctx.apps ?? [],\n rootFiles: ctx.rootFiles,\n rootPackageJson: ctx.rootPackageJson\n };\n}\n","/**\n * Phase F: Plugin loader and chain composition.\n *\n * Resolves built-in, local/npm imperative, and compiled JSON plugins\n * into an ordered plugin chain. Source/load order determines execution.\n *\n * Loader responsibilities:\n * - Build the built-in plugin from current `buildCriteria`/`buildExtras`\n * - Load imperative (.ts/.js) plugins with trust \"trusted-code\"\n * - Load declarative (.json) policies via the DSL compiler (trust \"safe-declarative\")\n * - Aggregate disabledIds across all compiled policies into EngineOptions\n * - Return the ready-to-execute plugin chain + engine options\n */\nimport type { PolicyConfig } from \"../policy\";\nimport { loadPolicy } from \"../policy\";\nimport type { ReadinessCriterion } from \"../readiness\";\nimport { buildCriteria, buildExtras } from \"../readiness\";\n\nimport { compilePolicyConfig } from \"./compiler\";\nimport type { CompilationResult } from \"./compiler\";\nimport type { EngineOptions } from \"./engine\";\nimport type { PolicyPlugin } from \"./types\";\n\nexport type LoadedChain = {\n plugins: PolicyPlugin[];\n options: EngineOptions;\n /** Pass-rate threshold (last policy wins). */\n passRateThreshold: number;\n};\n\n/**\n * Build the built-in plugin from the current `buildCriteria`/`buildExtras`.\n * Each criterion becomes a detector + recommender pair.\n * Extras also become detector + recommender pairs.\n */\nexport function buildBuiltinPlugin(): { plugin: PolicyPlugin; baseCriteria: ReadinessCriterion[] } {\n const baseCriteria = buildCriteria();\n const baseExtras = buildExtras();\n\n // Only include repo-scoped criteria — app/area-scoped criteria need\n // iteration context that the engine doesn't provide yet.\n const repoCriteria = baseCriteria.filter((c) => c.scope === \"repo\");\n\n const compiledCriteria = compilePolicyConfig(\n {\n name: \"__builtin__\",\n criteria: { add: repoCriteria },\n extras: { add: baseExtras }\n },\n []\n );\n\n const plugin: PolicyPlugin = {\n ...compiledCriteria.plugin,\n meta: {\n ...compiledCriteria.plugin.meta,\n name: \"builtin\",\n sourceType: \"builtin\",\n trust: \"trusted-code\"\n }\n };\n\n return { plugin, baseCriteria };\n}\n\n/**\n * Load a chain of plugins from policy sources.\n *\n * @param policySources - Policy file paths or npm specifiers\n * @param options - Loading options\n * @returns Ready-to-execute plugin chain and engine options\n */\nexport async function loadPluginChain(\n policySources: string[],\n options?: { jsonOnly?: boolean }\n): Promise<LoadedChain> {\n const { plugin: builtinPlugin, baseCriteria } = buildBuiltinPlugin();\n const plugins: PolicyPlugin[] = [builtinPlugin];\n const allDisabledIds: string[] = [];\n let passRateThreshold = 0.8;\n\n for (const source of policySources) {\n const policyConfig: PolicyConfig = await loadPolicy(source, {\n jsonOnly: options?.jsonOnly\n });\n\n // Check if this is a module policy (imperative plugin) with code-level hooks\n if (isImperativePlugin(policyConfig)) {\n // Module policies: wrap as trusted-code plugin\n const { plugin: imperativePlugin, compiled } = wrapImperativePolicy(\n policyConfig,\n baseCriteria\n );\n plugins.push(imperativePlugin);\n allDisabledIds.push(...compiled.disabledIds);\n if (compiled.passRateThreshold !== undefined) {\n passRateThreshold = compiled.passRateThreshold;\n }\n } else {\n // Declarative JSON policies: compile to safe-declarative plugin\n const compiled: CompilationResult = compilePolicyConfig(policyConfig, baseCriteria);\n plugins.push(compiled.plugin);\n allDisabledIds.push(...compiled.disabledIds);\n if (compiled.passRateThreshold !== undefined) {\n passRateThreshold = compiled.passRateThreshold;\n }\n }\n }\n\n return {\n plugins,\n options: {\n disabledRuleIds: allDisabledIds.length > 0 ? new Set(allDisabledIds) : undefined\n },\n passRateThreshold\n };\n}\n\n/**\n * Detect if a PolicyConfig contains imperative code.\n *\n * Module-sourced policies may contain check functions (criteria.add/extras.add)\n * which cannot exist in JSON policies. Any policy with add entries\n * is treated as imperative; policies with only disable/override are\n * purely declarative regardless of source format.\n */\nfunction isImperativePlugin(config: PolicyConfig): boolean {\n const hasAddedCriteria = Boolean(config.criteria?.add?.length);\n const hasAddedExtras = Boolean(config.extras?.add?.length);\n return hasAddedCriteria || hasAddedExtras;\n}\n\n/**\n * Wrap a module-sourced PolicyConfig as a trusted-code plugin.\n * Uses the compiler for the heavy lifting, then overrides the trust tier.\n * Also propagates disabledIds and passRateThreshold from the module policy.\n */\nfunction wrapImperativePolicy(\n config: PolicyConfig,\n baseCriteria: ReadonlyArray<ReadinessCriterion>\n): { plugin: PolicyPlugin; compiled: CompilationResult } {\n const compiled = compilePolicyConfig(config, baseCriteria);\n const plugin: PolicyPlugin = {\n ...compiled.plugin,\n meta: {\n ...compiled.plugin.meta,\n sourceType: \"module\",\n trust: \"trusted-code\"\n }\n };\n return { plugin, compiled };\n}\n","/** owner/name — rejects . and .. as segments */\nexport const GITHUB_REPO_RE = /^(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}$)([a-zA-Z0-9._-]+)$/;\n\n/** org/project/repo — rejects . and .. as segments */\nexport const AZURE_REPO_RE =\n /^(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}$)([a-zA-Z0-9._-]+)$/;\n","import { processGitHubRepo } from \"@agentrc/core/services/batch\";\nimport type { ProcessResult } from \"@agentrc/core/services/batch\";\nimport type { GitHubOrg, GitHubRepo } from \"@agentrc/core/services/github\";\nimport {\n listUserOrgs,\n listOrgRepos,\n listAccessibleRepos,\n checkReposForInstructions\n} from \"@agentrc/core/services/github\";\nimport { safeWriteFile } from \"@agentrc/core/utils/fs\";\nimport { Box, Text, useApp, useInput, useIsScreenReaderEnabled } from \"ink\";\nimport React, { useEffect, useState } from \"react\";\n\nimport { StaticBanner } from \"./AnimatedBanner\";\n\ntype Props = {\n token: string;\n outputPath?: string;\n};\n\ntype Status =\n | \"loading-orgs\"\n | \"select-orgs\"\n | \"loading-repos\"\n | \"select-repos\"\n | \"confirm\"\n | \"processing\"\n | \"complete\"\n | \"error\";\n\nexport function BatchTui({ token, outputPath }: Props): React.JSX.Element {\n const app = useApp();\n const accessible = useIsScreenReaderEnabled();\n const [status, setStatus] = useState<Status>(\"loading-orgs\");\n const [message, setMessage] = useState<string>(\"Fetching organizations...\");\n const [errorMessage, setErrorMessage] = useState<string>(\"\");\n\n // Data\n const [orgs, setOrgs] = useState<GitHubOrg[]>([]);\n const [repos, setRepos] = useState<GitHubRepo[]>([]);\n const [selectedOrgIndices, setSelectedOrgIndices] = useState<Set<number>>(new Set());\n const [selectedRepoIndices, setSelectedRepoIndices] = useState<Set<number>>(new Set());\n const [cursorIndex, setCursorIndex] = useState(0);\n\n // Processing\n const [results, setResults] = useState<ProcessResult[]>([]);\n const [processingMessage, setProcessingMessage] = useState(\"\");\n\n // Load orgs on mount\n useEffect(() => {\n loadOrgs();\n }, []);\n\n async function loadOrgs() {\n try {\n const userOrgs = await listUserOrgs(token);\n // Add a \"personal repos\" option\n const allOrgs: GitHubOrg[] = [\n { login: \"__personal__\", name: \"Personal Repositories\" },\n ...userOrgs\n ];\n setOrgs(allOrgs);\n setStatus(\"select-orgs\");\n setMessage(\"Select organizations (space to toggle, enter to confirm)\");\n } catch (error) {\n setStatus(\"error\");\n setErrorMessage(error instanceof Error ? error.message : \"Failed to fetch organizations\");\n }\n }\n\n async function loadRepos() {\n setStatus(\"loading-repos\");\n setMessage(\"Fetching repositories...\");\n try {\n const selectedOrgs = Array.from(selectedOrgIndices).map((i) => orgs[i]);\n let allRepos: GitHubRepo[] = [];\n\n for (let idx = 0; idx < selectedOrgs.length; idx++) {\n const org = selectedOrgs[idx];\n setMessage(\n `Fetching repos from ${org.name ?? org.login} (${idx + 1}/${selectedOrgs.length})...`\n );\n\n if (org.login === \"__personal__\") {\n // Fetch personal repos (limited to 100 most recently pushed)\n const personalRepos = await listAccessibleRepos(token);\n // Filter to only repos owned by the user (not org repos)\n const userRepos = personalRepos\n .filter((r) => !orgs.some((o) => o.login !== \"__personal__\" && o.login === r.owner))\n .slice(0, 100);\n allRepos = [...allRepos, ...userRepos];\n } else {\n // Limit to 100 most recently pushed repos per org\n const orgRepos = await listOrgRepos(token, org.login, 100);\n allRepos = [...allRepos, ...orgRepos];\n }\n }\n\n // Deduplicate by fullName\n const seen = new Set<string>();\n const uniqueRepos = allRepos.filter((r) => {\n if (seen.has(r.fullName)) return false;\n seen.add(r.fullName);\n return true;\n });\n\n // Check which repos already have instructions\n setMessage(`Checking ${uniqueRepos.length} repos for existing instructions...`);\n const reposWithStatus = await checkReposForInstructions(\n token,\n uniqueRepos,\n (checked, total) =>\n setMessage(`Checking for existing instructions (${checked}/${total})...`)\n );\n\n // Sort: repos without instructions first\n reposWithStatus.sort((a, b) => {\n if (a.hasInstructions === b.hasInstructions) return 0;\n return a.hasInstructions ? 1 : -1;\n });\n\n const withInstructions = reposWithStatus.filter((r) => r.hasInstructions).length;\n const withoutInstructions = reposWithStatus.length - withInstructions;\n\n setRepos(reposWithStatus);\n setCursorIndex(0);\n setSelectedRepoIndices(new Set());\n setStatus(\"select-repos\");\n setMessage(\n `Found ${reposWithStatus.length} repos (${withoutInstructions} need instructions, ${withInstructions} already have them)`\n );\n } catch (error) {\n setStatus(\"error\");\n setErrorMessage(error instanceof Error ? error.message : \"Failed to fetch repositories\");\n }\n }\n\n async function processRepos() {\n const selectedRepos = Array.from(selectedRepoIndices).map((i) => repos[i]);\n setStatus(\"processing\");\n setResults([]);\n\n const localResults: ProcessResult[] = [];\n\n for (let i = 0; i < selectedRepos.length; i++) {\n const repo = selectedRepos[i];\n setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${repo.fullName}: Starting...`);\n\n const result = await processGitHubRepo({\n repo,\n token,\n progress: {\n update: (msg) => setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${msg}`),\n succeed: (msg) =>\n setProcessingMessage(\n `[${i + 1}/${selectedRepos.length}] ${accessible ? \"OK\" : \"✓\"} ${msg}`\n ),\n fail: (msg) =>\n setProcessingMessage(\n `[${i + 1}/${selectedRepos.length}] ${accessible ? \"FAIL\" : \"✗\"} ${msg}`\n ),\n done: () => {}\n }\n });\n\n localResults.push(result);\n setResults([...localResults]);\n }\n\n // Write results if output path specified\n if (outputPath) {\n await safeWriteFile(outputPath, JSON.stringify(localResults, null, 2), true);\n }\n\n setStatus(\"complete\");\n setMessage(\"Batch processing complete!\");\n }\n\n useInput((input, key) => {\n if (key.escape || input.toLowerCase() === \"q\") {\n app.exit();\n return;\n }\n\n if (status === \"select-orgs\") {\n const items = orgs;\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(items.length - 1, prev + 1));\n } else if (input === \" \") {\n setSelectedOrgIndices((prev) => {\n const next = new Set(prev);\n if (next.has(cursorIndex)) {\n next.delete(cursorIndex);\n } else {\n next.add(cursorIndex);\n }\n return next;\n });\n } else if (key.return && selectedOrgIndices.size > 0) {\n loadRepos().catch((err) => {\n setStatus(\"error\");\n setErrorMessage(err instanceof Error ? err.message : \"Failed to load repos\");\n });\n }\n }\n\n if (status === \"select-repos\") {\n const items = repos;\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(items.length - 1, prev + 1));\n } else if (input === \" \") {\n setSelectedRepoIndices((prev) => {\n const next = new Set(prev);\n if (next.has(cursorIndex)) {\n next.delete(cursorIndex);\n } else {\n next.add(cursorIndex);\n }\n return next;\n });\n } else if (input.toLowerCase() === \"a\") {\n // Select all repos WITHOUT instructions\n const indicesWithoutInstructions = repos\n .map((r, i) => ({ r, i }))\n .filter(({ r }) => !r.hasInstructions)\n .map(({ i }) => i);\n setSelectedRepoIndices(new Set(indicesWithoutInstructions));\n } else if (key.return && selectedRepoIndices.size > 0) {\n setStatus(\"confirm\");\n setMessage(\n `Ready to process ${selectedRepoIndices.size} repositories. Press Y to confirm, N to go back.`\n );\n }\n }\n\n if (status === \"confirm\") {\n if (input.toLowerCase() === \"y\") {\n processRepos().catch((err) => {\n setStatus(\"error\");\n setErrorMessage(err instanceof Error ? err.message : \"Processing failed\");\n });\n } else if (input.toLowerCase() === \"n\") {\n setStatus(\"select-repos\");\n setMessage(\"Select repos (space to toggle, enter to confirm)\");\n }\n }\n });\n\n // Visible window for long lists\n const windowSize = 15;\n const getVisibleItems = <T,>(items: T[], cursor: number): { items: T[]; startIndex: number } => {\n const start = Math.max(0, cursor - Math.floor(windowSize / 2));\n const end = Math.min(items.length, start + windowSize);\n const adjustedStart = Math.max(0, end - windowSize);\n return { items: items.slice(adjustedStart, end), startIndex: adjustedStart };\n };\n\n return (\n <Box\n flexDirection=\"column\"\n padding={1}\n {...(accessible ? {} : { borderStyle: \"round\" as const })}\n >\n <StaticBanner />\n <Text color=\"cyan\">Batch Processing - Prime repositories at scale</Text>\n <Box marginTop={1}>\n <Text>{message}</Text>\n </Box>\n\n {status === \"error\" && (\n <Box marginTop={1}>\n <Text color=\"red\">Error: {errorMessage}</Text>\n </Box>\n )}\n\n {status === \"select-orgs\" && (\n <Box flexDirection=\"column\" marginTop={1}>\n {(() => {\n const { items: visibleOrgs, startIndex } = getVisibleItems(orgs, cursorIndex);\n return visibleOrgs.map((org, i) => {\n const realIndex = startIndex + i;\n const isSelected = selectedOrgIndices.has(realIndex);\n const isCursor = realIndex === cursorIndex;\n return (\n <Text key={org.login}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? (accessible ? \"> \" : \"❯ \") : \" \"}\n </Text>\n <Text color={isSelected ? \"green\" : \"gray\"}>\n {isSelected ? (accessible ? \"[x]\" : \"◉\") : accessible ? \"[ ]\" : \"○\"}{\" \"}\n </Text>\n <Text>{org.name ?? org.login}</Text>\n <Text color=\"gray\"> ({org.login})</Text>\n </Text>\n );\n });\n })()}\n {orgs.length > windowSize && (\n <Text color=\"gray\" dimColor>\n Showing {Math.min(windowSize, orgs.length)} of {orgs.length} • Use ↑↓ to scroll\n </Text>\n )}\n </Box>\n )}\n\n {status === \"select-repos\" && (\n <Box flexDirection=\"column\" marginTop={1}>\n {(() => {\n const { items: visibleRepos, startIndex } = getVisibleItems(repos, cursorIndex);\n return visibleRepos.map((repo, i) => {\n const realIndex = startIndex + i;\n const isSelected = selectedRepoIndices.has(realIndex);\n const isCursor = realIndex === cursorIndex;\n return (\n <Text key={repo.fullName}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? (accessible ? \"> \" : \"❯ \") : \" \"}\n </Text>\n <Text color={isSelected ? \"green\" : \"gray\"}>\n {isSelected ? (accessible ? \"[x]\" : \"◉\") : accessible ? \"[ ]\" : \"○\"}{\" \"}\n </Text>\n <Text color={repo.hasInstructions ? \"green\" : \"red\"}>\n {repo.hasInstructions\n ? accessible\n ? \"Has Instructions\"\n : \"✓\"\n : accessible\n ? \"Needs Instructions\"\n : \"✗\"}{\" \"}\n </Text>\n <Text color={repo.hasInstructions ? \"gray\" : undefined}>{repo.fullName}</Text>\n {repo.isPrivate && <Text color=\"yellow\"> (private)</Text>}\n </Text>\n );\n });\n })()}\n {repos.length > windowSize && (\n <Text color=\"gray\" dimColor>\n Showing {Math.min(windowSize, repos.length)} of {repos.length} • Use ↑↓ to scroll\n </Text>\n )}\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Selected: {selectedRepoIndices.size} repos\n </Text>\n </Box>\n </Box>\n )}\n\n {status === \"processing\" && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"yellow\">{processingMessage}</Text>\n {results.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\">Completed:</Text>\n {results.slice(-5).map((r) => (\n <Text key={r.repo} color={r.success ? \"green\" : \"red\"}>\n {r.success ? (accessible ? \"OK\" : \"✓\") : accessible ? \"FAIL\" : \"✗\"} {r.repo}\n {r.success && r.prUrl && (\n <Text color=\"gray\">\n {\" \"}\n {accessible ? \"-\" : \"→\"} {r.prUrl}\n </Text>\n )}\n {!r.success && r.error && <Text color=\"gray\"> ({r.error})</Text>}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n )}\n\n {status === \"complete\" && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"green\" bold>\n {accessible ? \"OK\" : \"✓\"} Batch complete: {results.filter((r) => r.success).length}{\" \"}\n succeeded, {results.filter((r) => !r.success).length} failed\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {results.map((r) => (\n <Text key={r.repo} color={r.success ? \"green\" : \"red\"}>\n {r.success ? (accessible ? \"OK\" : \"✓\") : accessible ? \"FAIL\" : \"✗\"} {r.repo}\n {r.success && r.prUrl && (\n <Text color=\"gray\">\n {\" \"}\n {accessible ? \"-\" : \"→\"} {r.prUrl}\n </Text>\n )}\n {!r.success && r.error && <Text color=\"gray\"> ({r.error})</Text>}\n </Text>\n ))}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1}>\n {status === \"select-orgs\" && (\n <Text color=\"cyan\">Keys: [Space] Toggle [Enter] Confirm [Q] Quit</Text>\n )}\n {status === \"select-repos\" && (\n <Text color=\"cyan\">Keys: [Space] Toggle [A] Select Missing [Enter] Confirm [Q] Quit</Text>\n )}\n {status === \"confirm\" && (\n <Text color=\"cyan\">Keys: [Y] Yes, proceed [N] Go back [Q] Quit</Text>\n )}\n {(status === \"complete\" || status === \"error\") && <Text color=\"cyan\">Keys: [Q] Quit</Text>}\n </Box>\n </Box>\n );\n}\n","import { Box, Text, useIsScreenReaderEnabled } from \"ink\";\nimport React, { useState, useEffect } from \"react\";\n\n/**\n * Animation frames for the AGENTRC banner fly-in effect.\n * Uses frame-based architecture from GitHub Copilot CLI patterns.\n * ~75ms per frame = ~13fps (optimal for terminal rendering).\n */\n\n// The final banner text\nconst FULL_BANNER = [\n \" █████╗ ██████╗ ███████╗███╗ ██╗████████╗██████╗ ██████╗\",\n \"██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝██╔══██╗██╔════╝\",\n \"███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ██████╔╝██║ \",\n \"██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ██╔══██╗██║ \",\n \"██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ██║ ██║╚██████╗\",\n \"╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝\"\n];\n\n// Animation frames - slide in from right with progressive reveal\nconst generateFrames = (): string[][] => {\n const frames: string[][] = [];\n const width = FULL_BANNER[0].length;\n\n // Frame 0-4: Empty -> sparkles appearing\n frames.push([\"\", \"\", \"\", \"\", \"\", \"\"]);\n frames.push([\"\", \"\", \" ✦\", \"\", \"\", \"\"]);\n frames.push([\" ✦\", \"\", \" ✦ ✧\", \"\", \" ✦\", \"\"]);\n\n // Frame 5-15: Slide in from right\n for (let offset = width; offset >= 0; offset -= 4) {\n const frame = FULL_BANNER.map((line) => {\n if (offset >= line.length) return \"\";\n return \" \".repeat(Math.max(0, offset)) + line.slice(0, Math.max(0, line.length - offset));\n });\n frames.push(frame);\n }\n\n // Final frame: Full banner\n frames.push([...FULL_BANNER]);\n\n return frames;\n};\n\nconst FRAMES = generateFrames();\nconst FRAME_DURATION = 75; // ~13fps\n\n// Semantic color roles for theme compatibility (4-bit ANSI)\ntype ColorRole = \"primary\" | \"accent\" | \"sparkle\";\n\nconst THEME_DARK: Record<ColorRole, string> = {\n primary: \"magentaBright\",\n accent: \"cyanBright\",\n sparkle: \"yellowBright\"\n};\n\nconst THEME_LIGHT: Record<ColorRole, string> = {\n primary: \"magenta\",\n accent: \"cyan\",\n sparkle: \"yellow\"\n};\n\ntype AnimatedBannerProps = {\n onComplete?: () => void;\n skipAnimation?: boolean;\n darkMode?: boolean;\n maxWidth?: number;\n};\n\nexport function AnimatedBanner({\n onComplete,\n skipAnimation = false,\n darkMode = true,\n maxWidth\n}: AnimatedBannerProps): React.JSX.Element {\n const accessible = useIsScreenReaderEnabled();\n const [frameIndex, setFrameIndex] = useState(skipAnimation || accessible ? FRAMES.length - 1 : 0);\n const [isComplete, setIsComplete] = useState(skipAnimation || accessible);\n\n const theme = darkMode ? THEME_DARK : THEME_LIGHT;\n\n useEffect(() => {\n if (skipAnimation || accessible || isComplete) return;\n\n const interval = setInterval(() => {\n setFrameIndex((current) => {\n const next = current + 1;\n if (next >= FRAMES.length) {\n clearInterval(interval);\n setIsComplete(true);\n return FRAMES.length - 1;\n }\n return next;\n });\n }, FRAME_DURATION);\n\n return () => clearInterval(interval);\n }, [skipAnimation, isComplete]);\n\n // Call onComplete in a separate effect to avoid setState during render\n useEffect(() => {\n if (isComplete) {\n onComplete?.();\n }\n }, [isComplete, onComplete]);\n\n if (accessible) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>AGENTRC</Text>\n </Box>\n );\n }\n\n const currentFrame = FRAMES[frameIndex];\n const showSparkles = frameIndex < 3;\n const bannerWidth = FULL_BANNER[0].length;\n const shouldTruncate = maxWidth != null && maxWidth < bannerWidth;\n\n return (\n <Box flexDirection=\"column\">\n {currentFrame.map((line, i) => (\n <Text\n key={i}\n color={showSparkles && line.includes(\"✦\") ? theme.sparkle : theme.primary}\n bold={!showSparkles}\n >\n {(shouldTruncate ? line.slice(0, maxWidth) : line) || \" \"}\n </Text>\n ))}\n </Box>\n );\n}\n\n/**\n * Static banner for use after animation or when animation is disabled.\n */\nexport function StaticBanner({\n darkMode = true,\n maxWidth\n}: {\n darkMode?: boolean;\n maxWidth?: number;\n}): React.JSX.Element {\n const accessible = useIsScreenReaderEnabled();\n\n if (accessible) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>AGENTRC</Text>\n </Box>\n );\n }\n\n const color = darkMode ? \"magentaBright\" : \"magenta\";\n const bannerWidth = FULL_BANNER[0].length;\n const shouldTruncate = maxWidth != null && maxWidth < bannerWidth;\n\n return (\n <Box flexDirection=\"column\">\n {FULL_BANNER.map((line, i) => (\n <Text key={i} color={color} bold>\n {(shouldTruncate ? line.slice(0, maxWidth) : line) || \" \"}\n </Text>\n ))}\n </Box>\n );\n}\n","import type {\n AzureDevOpsOrg,\n AzureDevOpsProject,\n AzureDevOpsRepo\n} from \"@agentrc/core/services/azureDevops\";\nimport {\n listOrganizations,\n listProjects,\n listRepos,\n checkReposForInstructions\n} from \"@agentrc/core/services/azureDevops\";\nimport { processAzureRepo } from \"@agentrc/core/services/batch\";\nimport type { ProcessResult } from \"@agentrc/core/services/batch\";\nimport { safeWriteFile } from \"@agentrc/core/utils/fs\";\nimport { Box, Text, useApp, useInput, useIsScreenReaderEnabled } from \"ink\";\nimport React, { useEffect, useState } from \"react\";\n\nimport { StaticBanner } from \"./AnimatedBanner\";\n\ntype Props = {\n token: string;\n outputPath?: string;\n};\n\ntype Status =\n | \"loading-orgs\"\n | \"select-orgs\"\n | \"loading-projects\"\n | \"select-projects\"\n | \"loading-repos\"\n | \"select-repos\"\n | \"confirm\"\n | \"processing\"\n | \"complete\"\n | \"error\";\n\nexport function BatchTuiAzure({ token, outputPath }: Props): React.JSX.Element {\n const app = useApp();\n const accessible = useIsScreenReaderEnabled();\n const [status, setStatus] = useState<Status>(\"loading-orgs\");\n const [message, setMessage] = useState<string>(\"Fetching organizations...\");\n const [errorMessage, setErrorMessage] = useState<string>(\"\");\n\n const [orgs, setOrgs] = useState<AzureDevOpsOrg[]>([]);\n const [projects, setProjects] = useState<AzureDevOpsProject[]>([]);\n const [repos, setRepos] = useState<AzureDevOpsRepo[]>([]);\n const [selectedOrgIndices, setSelectedOrgIndices] = useState<Set<number>>(new Set());\n const [selectedProjectIndices, setSelectedProjectIndices] = useState<Set<number>>(new Set());\n const [selectedRepoIndices, setSelectedRepoIndices] = useState<Set<number>>(new Set());\n const [cursorIndex, setCursorIndex] = useState(0);\n\n const [results, setResults] = useState<ProcessResult[]>([]);\n const [processingMessage, setProcessingMessage] = useState(\"\");\n\n useEffect(() => {\n loadOrgs();\n }, []);\n\n async function loadOrgs() {\n try {\n const userOrgs = await listOrganizations(token);\n setOrgs(userOrgs);\n setStatus(\"select-orgs\");\n setMessage(\"Select organizations (space to toggle, enter to confirm)\");\n } catch (error) {\n setStatus(\"error\");\n setErrorMessage(error instanceof Error ? error.message : \"Failed to fetch organizations\");\n }\n }\n\n async function loadProjects() {\n setStatus(\"loading-projects\");\n setMessage(\"Fetching projects...\");\n\n try {\n const selectedOrgs = Array.from(selectedOrgIndices).map((i) => orgs[i]);\n let allProjects: AzureDevOpsProject[] = [];\n\n for (let idx = 0; idx < selectedOrgs.length; idx++) {\n const org = selectedOrgs[idx];\n setMessage(`Fetching projects from ${org.name} (${idx + 1}/${selectedOrgs.length})...`);\n const orgProjects = await listProjects(token, org.name);\n allProjects = [...allProjects, ...orgProjects];\n }\n\n setProjects(allProjects);\n setCursorIndex(0);\n setSelectedProjectIndices(new Set());\n setStatus(\"select-projects\");\n setMessage(\"Select projects (space to toggle, enter to confirm)\");\n } catch (error) {\n setStatus(\"error\");\n setErrorMessage(error instanceof Error ? error.message : \"Failed to fetch projects\");\n }\n }\n\n async function loadRepos() {\n setStatus(\"loading-repos\");\n setMessage(\"Fetching repositories...\");\n\n try {\n const selectedProjects = Array.from(selectedProjectIndices).map((i) => projects[i]);\n let allRepos: AzureDevOpsRepo[] = [];\n\n for (let idx = 0; idx < selectedProjects.length; idx++) {\n const project = selectedProjects[idx];\n setMessage(\n `Fetching repos from ${project.organization}/${project.name} (${idx + 1}/${selectedProjects.length})...`\n );\n const projectRepos = await listRepos(token, project.organization, project.name);\n allRepos = [...allRepos, ...projectRepos];\n }\n\n const seen = new Set<string>();\n const uniqueRepos = allRepos.filter((repo) => {\n const key = `${repo.organization}/${repo.project}/${repo.name}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n setMessage(`Checking ${uniqueRepos.length} repos for existing instructions...`);\n const reposWithStatus = await checkReposForInstructions(\n token,\n uniqueRepos,\n (checked, total) =>\n setMessage(`Checking for existing instructions (${checked}/${total})...`)\n );\n\n reposWithStatus.sort((a, b) => {\n if (a.hasInstructions === b.hasInstructions) return 0;\n return a.hasInstructions ? 1 : -1;\n });\n\n const withInstructions = reposWithStatus.filter((r) => r.hasInstructions).length;\n const withoutInstructions = reposWithStatus.length - withInstructions;\n\n setRepos(reposWithStatus);\n setCursorIndex(0);\n setSelectedRepoIndices(new Set());\n setStatus(\"select-repos\");\n setMessage(\n `Found ${reposWithStatus.length} repos (${withoutInstructions} need instructions, ${withInstructions} already have them)`\n );\n } catch (error) {\n setStatus(\"error\");\n setErrorMessage(error instanceof Error ? error.message : \"Failed to fetch repositories\");\n }\n }\n\n async function processRepos() {\n const selectedRepos = Array.from(selectedRepoIndices).map((i) => repos[i]);\n setStatus(\"processing\");\n setResults([]);\n\n const localResults: ProcessResult[] = [];\n\n for (let i = 0; i < selectedRepos.length; i++) {\n const repo = selectedRepos[i];\n const label = `${repo.organization}/${repo.project}/${repo.name}`;\n setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${label}: Starting...`);\n\n const result = await processAzureRepo({\n repo,\n token,\n progress: {\n update: (msg) => setProcessingMessage(`[${i + 1}/${selectedRepos.length}] ${msg}`),\n succeed: (msg) =>\n setProcessingMessage(\n `[${i + 1}/${selectedRepos.length}] ${accessible ? \"OK\" : \"✓\"} ${msg}`\n ),\n fail: (msg) =>\n setProcessingMessage(\n `[${i + 1}/${selectedRepos.length}] ${accessible ? \"FAIL\" : \"✗\"} ${msg}`\n ),\n done: () => {}\n }\n });\n\n localResults.push(result);\n setResults([...localResults]);\n }\n\n if (outputPath) {\n await safeWriteFile(outputPath, JSON.stringify(localResults, null, 2), true);\n }\n\n setStatus(\"complete\");\n setMessage(\"Batch processing complete!\");\n }\n\n useInput((input, key) => {\n if (key.escape || input.toLowerCase() === \"q\") {\n app.exit();\n return;\n }\n\n if (status === \"select-orgs\") {\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(orgs.length - 1, prev + 1));\n } else if (input === \" \") {\n setSelectedOrgIndices((prev) => {\n const next = new Set(prev);\n if (next.has(cursorIndex)) {\n next.delete(cursorIndex);\n } else {\n next.add(cursorIndex);\n }\n return next;\n });\n } else if (key.return && selectedOrgIndices.size > 0) {\n loadProjects().catch((err) => {\n setStatus(\"error\");\n setErrorMessage(err instanceof Error ? err.message : \"Failed to load projects\");\n });\n }\n }\n\n if (status === \"select-projects\") {\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(projects.length - 1, prev + 1));\n } else if (input === \" \") {\n setSelectedProjectIndices((prev) => {\n const next = new Set(prev);\n if (next.has(cursorIndex)) {\n next.delete(cursorIndex);\n } else {\n next.add(cursorIndex);\n }\n return next;\n });\n } else if (key.return && selectedProjectIndices.size > 0) {\n loadRepos().catch((err) => {\n setStatus(\"error\");\n setErrorMessage(err instanceof Error ? err.message : \"Failed to load repos\");\n });\n }\n }\n\n if (status === \"select-repos\") {\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(repos.length - 1, prev + 1));\n } else if (input === \" \") {\n setSelectedRepoIndices((prev) => {\n const next = new Set(prev);\n if (next.has(cursorIndex)) {\n next.delete(cursorIndex);\n } else {\n next.add(cursorIndex);\n }\n return next;\n });\n } else if (input.toLowerCase() === \"a\") {\n const indicesWithoutInstructions = repos\n .map((r, i) => ({ r, i }))\n .filter(({ r }) => !r.hasInstructions)\n .map(({ i }) => i);\n setSelectedRepoIndices(new Set(indicesWithoutInstructions));\n } else if (key.return && selectedRepoIndices.size > 0) {\n setStatus(\"confirm\");\n setMessage(\n `Ready to process ${selectedRepoIndices.size} repositories. Press Y to confirm, N to go back.`\n );\n }\n }\n\n if (status === \"confirm\") {\n if (input.toLowerCase() === \"y\") {\n processRepos().catch((err) => {\n setStatus(\"error\");\n setErrorMessage(err instanceof Error ? err.message : \"Processing failed\");\n });\n } else if (input.toLowerCase() === \"n\") {\n setStatus(\"select-repos\");\n setMessage(\"Select repos (space to toggle, enter to confirm)\");\n }\n }\n });\n\n const windowSize = 15;\n const getVisibleItems = <T,>(items: T[], cursor: number): { items: T[]; startIndex: number } => {\n const start = Math.max(0, cursor - Math.floor(windowSize / 2));\n const end = Math.min(items.length, start + windowSize);\n const adjustedStart = Math.max(0, end - windowSize);\n return { items: items.slice(adjustedStart, end), startIndex: adjustedStart };\n };\n\n return (\n <Box\n flexDirection=\"column\"\n padding={1}\n {...(accessible ? {} : { borderStyle: \"round\" as const })}\n >\n <StaticBanner />\n <Text color=\"cyan\">Batch Processing - Azure DevOps</Text>\n <Box marginTop={1}>\n <Text>{message}</Text>\n </Box>\n\n {status === \"error\" && (\n <Box marginTop={1}>\n <Text color=\"red\">Error: {errorMessage}</Text>\n </Box>\n )}\n\n {status === \"select-orgs\" && (\n <Box flexDirection=\"column\" marginTop={1}>\n {(() => {\n const { items: visibleOrgs, startIndex } = getVisibleItems(orgs, cursorIndex);\n return visibleOrgs.map((org, i) => {\n const realIndex = startIndex + i;\n const isSelected = selectedOrgIndices.has(realIndex);\n const isCursor = realIndex === cursorIndex;\n return (\n <Text key={org.id}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? (accessible ? \"> \" : \"❯ \") : \" \"}\n </Text>\n <Text color={isSelected ? \"green\" : \"gray\"}>\n {isSelected ? (accessible ? \"[x]\" : \"◉\") : accessible ? \"[ ]\" : \"○\"}{\" \"}\n </Text>\n <Text>{org.name}</Text>\n </Text>\n );\n });\n })()}\n {orgs.length > windowSize && (\n <Text color=\"gray\" dimColor>\n Showing {Math.min(windowSize, orgs.length)} of {orgs.length} • Use ↑↓ to scroll\n </Text>\n )}\n </Box>\n )}\n\n {status === \"select-projects\" && (\n <Box flexDirection=\"column\" marginTop={1}>\n {(() => {\n const { items: visibleProjects, startIndex } = getVisibleItems(projects, cursorIndex);\n return visibleProjects.map((project, i) => {\n const realIndex = startIndex + i;\n const isSelected = selectedProjectIndices.has(realIndex);\n const isCursor = realIndex === cursorIndex;\n return (\n <Text key={`${project.organization}/${project.id}`}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? (accessible ? \"> \" : \"❯ \") : \" \"}\n </Text>\n <Text color={isSelected ? \"green\" : \"gray\"}>\n {isSelected ? (accessible ? \"[x]\" : \"◉\") : accessible ? \"[ ]\" : \"○\"}{\" \"}\n </Text>\n <Text>\n {project.organization}/{project.name}\n </Text>\n </Text>\n );\n });\n })()}\n {projects.length > windowSize && (\n <Text color=\"gray\" dimColor>\n Showing {Math.min(windowSize, projects.length)} of {projects.length} • Use ↑↓ to\n scroll\n </Text>\n )}\n </Box>\n )}\n\n {status === \"select-repos\" && (\n <Box flexDirection=\"column\" marginTop={1}>\n {(() => {\n const { items: visibleRepos, startIndex } = getVisibleItems(repos, cursorIndex);\n return visibleRepos.map((repo, i) => {\n const realIndex = startIndex + i;\n const isSelected = selectedRepoIndices.has(realIndex);\n const isCursor = realIndex === cursorIndex;\n return (\n <Text key={`${repo.organization}/${repo.project}/${repo.name}`}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? (accessible ? \"> \" : \"❯ \") : \" \"}\n </Text>\n <Text color={isSelected ? \"green\" : \"gray\"}>\n {isSelected ? (accessible ? \"[x]\" : \"◉\") : accessible ? \"[ ]\" : \"○\"}{\" \"}\n </Text>\n <Text color={repo.hasInstructions ? \"green\" : \"red\"}>\n {repo.hasInstructions\n ? accessible\n ? \"Has Instructions\"\n : \"✓\"\n : accessible\n ? \"Needs Instructions\"\n : \"✗\"}{\" \"}\n </Text>\n <Text color={repo.hasInstructions ? \"gray\" : undefined}>\n {repo.organization}/{repo.project}/{repo.name}\n </Text>\n {repo.isPrivate && <Text color=\"yellow\"> (private)</Text>}\n </Text>\n );\n });\n })()}\n {repos.length > windowSize && (\n <Text color=\"gray\" dimColor>\n Showing {Math.min(windowSize, repos.length)} of {repos.length} • Use ↑↓ to scroll\n </Text>\n )}\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n Selected: {selectedRepoIndices.size} repos\n </Text>\n </Box>\n </Box>\n )}\n\n {status === \"processing\" && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"yellow\">{processingMessage}</Text>\n {results.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"cyan\">Completed:</Text>\n {results.slice(-5).map((r) => (\n <Text key={r.repo} color={r.success ? \"green\" : \"red\"}>\n {r.success ? (accessible ? \"OK\" : \"✓\") : accessible ? \"FAIL\" : \"✗\"} {r.repo}\n {r.success && r.prUrl && (\n <Text color=\"gray\">\n {\" \"}\n {accessible ? \"-\" : \"→\"} {r.prUrl}\n </Text>\n )}\n {!r.success && r.error && <Text color=\"gray\"> ({r.error})</Text>}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n )}\n\n {status === \"complete\" && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color=\"green\" bold>\n {accessible ? \"OK\" : \"✓\"} Batch complete: {results.filter((r) => r.success).length}{\" \"}\n succeeded, {results.filter((r) => !r.success).length} failed\n </Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {results.map((r) => (\n <Text key={r.repo} color={r.success ? \"green\" : \"red\"}>\n {r.success ? (accessible ? \"OK\" : \"✓\") : accessible ? \"FAIL\" : \"✗\"} {r.repo}\n {r.success && r.prUrl && (\n <Text color=\"gray\">\n {\" \"}\n {accessible ? \"-\" : \"→\"} {r.prUrl}\n </Text>\n )}\n {!r.success && r.error && <Text color=\"gray\"> ({r.error})</Text>}\n </Text>\n ))}\n </Box>\n </Box>\n )}\n\n <Box marginTop={1}>\n {status === \"select-orgs\" && (\n <Text color=\"cyan\">Keys: [Space] Toggle [Enter] Confirm [Q] Quit</Text>\n )}\n {status === \"select-projects\" && (\n <Text color=\"cyan\">Keys: [Space] Toggle [Enter] Confirm [Q] Quit</Text>\n )}\n {status === \"select-repos\" && (\n <Text color=\"cyan\">Keys: [Space] Toggle [A] Select Missing [Enter] Confirm [Q] Quit</Text>\n )}\n {status === \"confirm\" && (\n <Text color=\"cyan\">Keys: [Y] Yes, proceed [N] Go back [Q] Quit</Text>\n )}\n {(status === \"complete\" || status === \"error\") && <Text color=\"cyan\">Keys: [Q] Quit</Text>}\n </Box>\n </Box>\n );\n}\n","import { getGitHubToken } from \"@agentrc/core/services/github\";\nimport { parsePolicySources } from \"@agentrc/core/services/policy\";\nimport { outputError } from \"@agentrc/core/utils/output\";\nimport { render } from \"ink\";\nimport React from \"react\";\n\nimport { BatchReadinessTui } from \"../ui/BatchReadinessTui\";\n\ntype BatchReadinessOptions = {\n output?: string;\n policy?: string;\n json?: boolean;\n quiet?: boolean;\n accessible?: boolean;\n};\n\nexport async function batchReadinessCommand(options: BatchReadinessOptions): Promise<void> {\n const token = await getGitHubToken();\n if (!token) {\n outputError(\n \"GitHub authentication required. Install and authenticate GitHub CLI (gh auth login) or set GITHUB_TOKEN.\",\n Boolean(options.json)\n );\n return;\n }\n\n try {\n const policies = parsePolicySources(options.policy);\n const { waitUntilExit } = render(\n <BatchReadinessTui token={token} outputPath={options.output} policies={policies} />,\n { isScreenReaderEnabled: options.accessible ? true : undefined }\n );\n await waitUntilExit();\n } catch (error) {\n outputError(\n `TUI failed: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n }\n}\n","import fs from \"fs/promises\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport type { ReadinessProcessResult } from \"@agentrc/core/services/batch\";\nimport { processBatchReadinessRepo } from \"@agentrc/core/services/batch\";\nimport type { GitHubOrg, GitHubRepo } from \"@agentrc/core/services/github\";\nimport { listUserOrgs, listOrgRepos, listAccessibleRepos } from \"@agentrc/core/services/github\";\nimport { generateVisualReport } from \"@agentrc/core/services/visualReport\";\nimport { safeWriteFile, ensureDir, validateCachePath } from \"@agentrc/core/utils/fs\";\nimport { Box, Text, useApp, useInput, useIsScreenReaderEnabled } from \"ink\";\nimport React, { useEffect, useState } from \"react\";\n\nimport { StaticBanner } from \"./AnimatedBanner\";\n\ntype Props = {\n token: string;\n outputPath?: string;\n policies?: string[];\n};\n\ntype Status =\n | \"loading-orgs\"\n | \"select-orgs\"\n | \"loading-repos\"\n | \"select-repos\"\n | \"confirm\"\n | \"processing\"\n | \"complete\"\n | \"error\";\n\nexport function BatchReadinessTui({ token, outputPath, policies }: Props): React.JSX.Element {\n const app = useApp();\n const accessible = useIsScreenReaderEnabled();\n const [status, setStatus] = useState<Status>(\"loading-orgs\");\n const [message, setMessage] = useState<string>(\"Fetching organizations...\");\n const [errorMessage, setErrorMessage] = useState<string>(\"\");\n\n // Data\n const [orgs, setOrgs] = useState<GitHubOrg[]>([]);\n const [repos, setRepos] = useState<GitHubRepo[]>([]);\n const [selectedOrgIndices, setSelectedOrgIndices] = useState<Set<number>>(new Set());\n const [selectedRepoIndices, setSelectedRepoIndices] = useState<Set<number>>(new Set());\n const [cursorIndex, setCursorIndex] = useState(0);\n\n // Processing\n const [results, setResults] = useState<ReadinessProcessResult[]>([]);\n const [currentRepoIndex, setCurrentRepoIndex] = useState(0);\n const [processingMessage, setProcessingMessage] = useState(\"\");\n\n // Load orgs on mount\n useEffect(() => {\n loadOrgs();\n }, []);\n\n async function loadOrgs() {\n try {\n const userOrgs = await listUserOrgs(token);\n const allOrgs: GitHubOrg[] = [\n { login: \"__personal__\", name: \"Personal Repositories\" },\n ...userOrgs\n ];\n setOrgs(allOrgs);\n setStatus(\"select-orgs\");\n setMessage(\"Select organizations (space to toggle, enter to confirm)\");\n } catch (error) {\n setStatus(\"error\");\n setErrorMessage(error instanceof Error ? error.message : \"Failed to fetch organizations\");\n }\n }\n\n async function loadRepos() {\n setStatus(\"loading-repos\");\n setMessage(\"Fetching repositories...\");\n try {\n const selectedOrgs = Array.from(selectedOrgIndices).map((i) => orgs[i]);\n let allRepos: GitHubRepo[] = [];\n\n for (let idx = 0; idx < selectedOrgs.length; idx++) {\n const org = selectedOrgs[idx];\n setMessage(\n `Fetching repos from ${org.name ?? org.login} (${idx + 1}/${selectedOrgs.length})...`\n );\n\n if (org.login === \"__personal__\") {\n const personalRepos = await listAccessibleRepos(token);\n const userRepos = personalRepos\n .filter((r) => !orgs.some((o) => o.login !== \"__personal__\" && o.login === r.owner))\n .slice(0, 100);\n allRepos = [...allRepos, ...userRepos];\n } else {\n const orgRepos = await listOrgRepos(token, org.login, 100);\n allRepos = [...allRepos, ...orgRepos];\n }\n }\n\n setRepos(allRepos);\n setStatus(\"select-repos\");\n setMessage(`Select repositories (${allRepos.length} available)`);\n setCursorIndex(0);\n } catch (error) {\n setStatus(\"error\");\n setErrorMessage(error instanceof Error ? error.message : \"Failed to fetch repositories\");\n }\n }\n\n async function processRepos() {\n setStatus(\"processing\");\n const selectedRepos = Array.from(selectedRepoIndices).map((i) => repos[i]);\n const results: ReadinessProcessResult[] = [];\n const tmpDir = path.join(os.tmpdir(), `agentrc-batch-readiness-${Date.now()}`);\n\n try {\n await ensureDir(tmpDir);\n\n for (let i = 0; i < selectedRepos.length; i++) {\n const repo = selectedRepos[i];\n setCurrentRepoIndex(i);\n setProcessingMessage(`Analyzing ${repo.fullName} (${i + 1}/${selectedRepos.length})`);\n\n const repoDir = validateCachePath(tmpDir, repo.owner, repo.name);\n const result = await processBatchReadinessRepo({\n repo,\n token,\n repoDir,\n policies,\n onProgress: (msg) => setProcessingMessage(msg)\n });\n results.push(result);\n }\n\n setResults(results);\n\n // Generate visual report\n const html = generateVisualReport({\n reports: results\n .filter((r) => r.report || r.error)\n .map((r) => ({\n repo: r.repo,\n report: r.report ?? {\n repoPath: r.repo,\n generatedAt: new Date().toISOString(),\n isMonorepo: false,\n apps: [],\n pillars: [],\n levels: [],\n achievedLevel: 0,\n criteria: [],\n extras: []\n },\n error: r.error\n })),\n title: \"Batch AI Readiness Report\",\n generatedAt: new Date().toISOString()\n });\n\n const finalOutputPath = outputPath ?? path.join(process.cwd(), \"batch-readiness-report.html\");\n const { wrote, reason } = await safeWriteFile(finalOutputPath, html, true);\n if (!wrote) throw new Error(reason === \"symlink\" ? \"Path is a symlink\" : \"Write failed\");\n\n setStatus(\"complete\");\n setMessage(`Report generated: ${finalOutputPath}`);\n } catch (error) {\n setStatus(\"error\");\n setErrorMessage(error instanceof Error ? error.message : \"Failed to process repositories\");\n } finally {\n // Clean up temp directory\n try {\n await fs.rm(tmpDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n\n useInput((input, key) => {\n if (key.escape || input.toLowerCase() === \"q\") {\n app.exit();\n return;\n }\n\n if (status === \"select-orgs\") {\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(orgs.length - 1, prev + 1));\n } else if (input === \" \") {\n setSelectedOrgIndices((prev) => {\n const next = new Set(prev);\n if (next.has(cursorIndex)) {\n next.delete(cursorIndex);\n } else {\n next.add(cursorIndex);\n }\n return next;\n });\n } else if (key.return) {\n if (selectedOrgIndices.size === 0) {\n setMessage(\"Please select at least one organization\");\n return;\n }\n loadRepos().catch((err) => {\n setStatus(\"error\");\n setErrorMessage(err instanceof Error ? err.message : \"Failed to load repos\");\n });\n } else if (input.toLowerCase() === \"a\") {\n setSelectedOrgIndices(new Set(orgs.map((_, i) => i)));\n }\n }\n\n if (status === \"select-repos\") {\n if (key.upArrow) {\n setCursorIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex((prev) => Math.min(repos.length - 1, prev + 1));\n } else if (input === \" \") {\n setSelectedRepoIndices((prev) => {\n const next = new Set(prev);\n if (next.has(cursorIndex)) {\n next.delete(cursorIndex);\n } else {\n next.add(cursorIndex);\n }\n return next;\n });\n } else if (key.return) {\n if (selectedRepoIndices.size === 0) {\n setMessage(\"Please select at least one repository\");\n return;\n }\n setStatus(\"confirm\");\n setMessage(`Process ${selectedRepoIndices.size} repositories? (y/n)`);\n } else if (input.toLowerCase() === \"a\") {\n setSelectedRepoIndices(new Set(repos.map((_, i) => i)));\n }\n }\n\n if (status === \"confirm\") {\n if (input.toLowerCase() === \"y\") {\n processRepos().catch((err) => {\n setStatus(\"error\");\n setErrorMessage(err instanceof Error ? err.message : \"Processing failed\");\n });\n } else if (input.toLowerCase() === \"n\") {\n setStatus(\"select-repos\");\n setMessage(`Select repositories (${repos.length} available)`);\n }\n }\n\n if (status === \"complete\" || status === \"error\") {\n app.exit();\n }\n });\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <StaticBanner />\n <Box marginTop={1}>\n <Text bold>Batch Readiness Report</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color={status === \"error\" ? \"red\" : \"cyan\"}>{message}</Text>\n </Box>\n\n {status === \"error\" && errorMessage && (\n <Box marginTop={1}>\n <Text color=\"red\">{errorMessage}</Text>\n </Box>\n )}\n\n {status === \"select-orgs\" && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>Organizations:</Text>\n {orgs.slice(0, 20).map((org, i) => (\n <Text key={i}>\n {i === cursorIndex ? \">\" : \" \"} [\n {selectedOrgIndices.has(i) ? (accessible ? \"x\" : \"●\") : \" \"}] {org.name ?? org.login}\n </Text>\n ))}\n <Box marginTop={1}>\n <Text dimColor>[Space] toggle • [A] select all • [Enter] confirm • [Q] quit</Text>\n </Box>\n </Box>\n )}\n\n {status === \"select-repos\" && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text dimColor>Repositories ({repos.length}):</Text>\n {repos\n .slice(Math.max(0, cursorIndex - 10), Math.min(repos.length, cursorIndex + 10))\n .map((repo, i) => {\n const actualIndex = Math.max(0, cursorIndex - 10) + i;\n return (\n <Text key={actualIndex}>\n {actualIndex === cursorIndex ? \">\" : \" \"} [\n {selectedRepoIndices.has(actualIndex) ? (accessible ? \"x\" : \"●\") : \" \"}]{\" \"}\n {repo.fullName}\n </Text>\n );\n })}\n <Box marginTop={1}>\n <Text dimColor>[Space] toggle • [A] select all • [Enter] confirm • [Q] quit</Text>\n </Box>\n </Box>\n )}\n\n {status === \"processing\" && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text>Processing repositories...</Text>\n <Text>{processingMessage}</Text>\n <Text>\n Progress: {currentRepoIndex + 1}/{Array.from(selectedRepoIndices).length}\n </Text>\n </Box>\n )}\n\n {status === \"complete\" && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"green\">{accessible ? \"OK\" : \"✓\"} Complete!</Text>\n <Text>Total repositories: {results.length}</Text>\n <Text>Successful: {results.filter((r) => !r.error).length}</Text>\n <Text>Failed: {results.filter((r) => r.error).length}</Text>\n </Box>\n )}\n </Box>\n );\n}\n","import { PILLAR_GROUPS, PILLAR_GROUP_NAMES, getLevelName, getLevelDescription } from \"./readiness\";\nimport type { AreaReadinessReport, PillarGroup, ReadinessReport } from \"./readiness\";\n\ntype VisualReportOptions = {\n reports: Array<{ repo: string; report: ReadinessReport; error?: string }>;\n title?: string;\n generatedAt?: string;\n};\n\nexport function generateVisualReport(options: VisualReportOptions): string {\n const {\n reports,\n title = \"AI Readiness Report\",\n generatedAt = new Date().toISOString()\n } = options;\n\n const successfulReports = reports.filter((r) => !r.error);\n const failedReports = reports.filter((r) => r.error);\n\n const totalRepos = reports.length;\n const successfulRepos = successfulReports.length;\n const avgLevel =\n successfulReports.length > 0\n ? successfulReports.reduce((sum, r) => sum + r.report.achievedLevel, 0) /\n successfulReports.length\n : 0;\n\n const pillarStats = calculatePillarStats(successfulReports);\n const aiToolingData = calculateAiToolingData(successfulReports);\n\n return `<!DOCTYPE html>\n<html lang=\"en\" data-color-mode=\"dark\" data-dark-theme=\"dark\">\n<head>\n <meta charset=\"UTF-8\">\n <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline';\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(title)}</title>\n <style>\n :root, [data-theme=\"dark\"], body.vscode-dark {\n --color-canvas-default: #0d1117;\n --color-canvas-subtle: #161b22;\n --color-canvas-inset: #010409;\n --color-border-default: #30363d;\n --color-border-muted: #21262d;\n --color-fg-default: #e6edf3;\n --color-fg-muted: #8b949e;\n --color-fg-subtle: #6e7681;\n --color-accent-fg: #58a6ff;\n --color-accent-emphasis: #1f6feb;\n --color-success-fg: #3fb950;\n --color-success-emphasis: #238636;\n --color-danger-fg: #f85149;\n --color-danger-emphasis: #da3633;\n --color-attention-fg: #d29922;\n --color-done-fg: #a371f7;\n }\n\n [data-theme=\"light\"], body.vscode-light, body.vscode-high-contrast-light {\n --color-canvas-default: #ffffff;\n --color-canvas-subtle: #f6f8fa;\n --color-canvas-inset: #eff2f5;\n --color-border-default: #d0d7de;\n --color-border-muted: #d8dee4;\n --color-fg-default: #1f2328;\n --color-fg-muted: #656d76;\n --color-fg-subtle: #6e7781;\n --color-accent-fg: #0969da;\n --color-accent-emphasis: #0550ae;\n --color-success-fg: #1a7f37;\n --color-success-emphasis: #116329;\n --color-danger-fg: #cf222e;\n --color-danger-emphasis: #a40e26;\n --color-attention-fg: #9a6700;\n --color-done-fg: #8250df;\n }\n\n * { margin: 0; padding: 0; box-sizing: border-box; }\n\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n background: var(--color-canvas-default);\n color: var(--color-fg-default);\n padding: 24px;\n line-height: 1.5;\n font-size: 14px;\n }\n\n .container { max-width: 1280px; margin: 0 auto; }\n\n /* Header */\n .header {\n background: var(--color-canvas-subtle);\n border: 1px solid var(--color-border-default);\n padding: 20px 24px;\n border-radius: 6px;\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .header-logo { width: 32px; height: 32px; flex-shrink: 0; }\n .header-text h1 { font-size: 20px; font-weight: 600; color: var(--color-fg-default); }\n .header .subtitle { color: var(--color-fg-muted); font-size: 12px; }\n\n /* Summary Cards (multi-repo) */\n .summary-cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n margin-bottom: 16px;\n }\n .card {\n background: var(--color-canvas-subtle);\n border: 1px solid var(--color-border-default);\n padding: 16px;\n border-radius: 6px;\n }\n .card-title { font-size: 12px; color: var(--color-fg-muted); font-weight: 500; margin-bottom: 4px; }\n .card-value { font-size: 32px; font-weight: 600; color: var(--color-accent-fg); }\n .card-subtitle { font-size: 12px; color: var(--color-fg-subtle); margin-top: 4px; }\n\n /* Single-repo Hero */\n .hero {\n background: var(--color-canvas-subtle);\n border: 1px solid var(--color-border-default);\n padding: 24px;\n border-radius: 6px;\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n gap: 20px;\n }\n .hero-level {\n width: 80px; height: 80px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n font-size: 28px; font-weight: 700; flex-shrink: 0;\n }\n .hero-level.level-high { background: rgba(63,185,80,0.12); border: 2px solid var(--color-success-fg); color: var(--color-success-fg); }\n .hero-level.level-mid { background: rgba(210,153,34,0.12); border: 2px solid var(--color-attention-fg); color: var(--color-attention-fg); }\n .hero-level.level-low { background: rgba(88,166,255,0.12); border: 2px solid var(--color-accent-fg); color: var(--color-accent-fg); }\n .hero-info { flex: 1; }\n .hero-name { font-size: 20px; font-weight: 600; color: var(--color-fg-default); margin-bottom: 2px; }\n .hero-subtitle { color: var(--color-fg-muted); font-size: 14px; }\n .hero-next { margin-top: 8px; font-size: 13px; color: var(--color-fg-subtle); }\n .hero-next strong { color: var(--color-fg-muted); }\n\n /* Fix First */\n .fix-first {\n background: var(--color-canvas-subtle);\n border: 1px solid var(--color-border-default);\n padding: 24px;\n border-radius: 6px;\n margin-bottom: 16px;\n }\n .fix-first .section-title { color: var(--color-attention-fg); }\n .fix-list { display: grid; gap: 8px; }\n .fix-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 12px 14px;\n border-radius: 6px;\n background: var(--color-canvas-default);\n border: 1px solid var(--color-border-muted);\n }\n .fix-item-icon {\n width: 24px; height: 24px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; flex-shrink: 0; font-weight: 700;\n background: rgba(248,81,73,0.12); color: var(--color-danger-fg);\n }\n .fix-item-text { flex: 1; min-width: 0; }\n .fix-item-title { font-weight: 600; font-size: 13px; color: var(--color-fg-default); }\n .fix-item-reason { font-size: 12px; color: var(--color-fg-muted); margin-top: 2px; }\n .fix-item-badges { display: flex; gap: 6px; margin-top: 4px; }\n .fix-badge {\n font-size: 11px;\n padding: 1px 8px;\n border-radius: 2em;\n border: 1px solid transparent;\n }\n .fix-badge.impact-high { color: var(--color-danger-fg); background: rgba(248,81,73,0.08); border-color: rgba(248,81,73,0.2); }\n .fix-badge.impact-medium { color: var(--color-attention-fg); background: rgba(210,153,34,0.08); border-color: rgba(210,153,34,0.2); }\n .fix-badge.impact-low { color: var(--color-fg-muted); background: rgba(139,148,158,0.08); border-color: rgba(139,148,158,0.15); }\n .fix-badge.effort-low { color: var(--color-success-fg); background: rgba(63,185,80,0.08); border-color: rgba(63,185,80,0.2); }\n .fix-badge.effort-medium { color: var(--color-attention-fg); background: rgba(210,153,34,0.08); border-color: rgba(210,153,34,0.2); }\n .fix-badge.effort-high { color: var(--color-fg-muted); background: rgba(139,148,158,0.08); border-color: rgba(139,148,158,0.15); }\n\n /* Sections */\n .section {\n background: var(--color-canvas-subtle);\n border: 1px solid var(--color-border-default);\n padding: 24px;\n border-radius: 6px;\n margin-bottom: 16px;\n }\n .section-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--color-fg-default);\n margin-bottom: 16px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--color-border-muted);\n }\n\n /* Pillar Grid */\n .pillar-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 12px;\n }\n .pillar-card {\n padding: 12px 16px;\n border-radius: 6px;\n background: var(--color-canvas-default);\n border: 1px solid var(--color-border-muted);\n }\n .pillar-card.all-passing {\n opacity: 0.7;\n }\n .pillar-card.has-failures {\n border-color: var(--color-attention-fg);\n }\n .pillar-card.all-passing .pillar-name::before {\n content: '\\\\2713 ';\n color: var(--color-success-fg);\n }\n .pillar-name { font-size: 13px; font-weight: 600; color: var(--color-fg-default); margin-bottom: 8px; }\n .pillar-stats { display: flex; align-items: center; gap: 12px; }\n .progress-bar { flex: 1; height: 8px; background: var(--color-border-muted); border-radius: 4px; overflow: hidden; }\n .progress-fill { height: 100%; border-radius: 4px; transition: width 0.3s ease; }\n .progress-fill.low { background: var(--color-danger-fg); }\n .progress-fill.medium { background: var(--color-attention-fg); }\n .progress-fill.high { background: var(--color-success-fg); }\n .pillar-stats span { font-size: 12px; color: var(--color-fg-muted); white-space: nowrap; }\n\n /* Repo List */\n .repo-list { display: grid; gap: 12px; }\n .repo-item {\n padding: 16px;\n border-radius: 6px;\n background: var(--color-canvas-default);\n border: 1px solid var(--color-border-muted);\n }\n .repo-item.error { border-color: var(--color-danger-emphasis); }\n .repo-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; }\n .repo-name { font-size: 16px; font-weight: 600; color: var(--color-accent-fg); }\n .error-message { color: var(--color-danger-fg); font-size: 13px; margin-top: 8px; }\n\n /* Level Badges */\n .level-badge {\n padding: 2px 10px;\n border-radius: 2em;\n font-size: 12px;\n font-weight: 500;\n border: 1px solid transparent;\n }\n .level-0 { background: rgba(139,148,158,0.1); color: var(--color-fg-muted); border-color: var(--color-border-default); }\n .level-1 { background: rgba(88,166,255,0.12); color: var(--color-accent-fg); border-color: rgba(88,166,255,0.3); }\n .level-2 { background: rgba(121,192,255,0.12); color: #79c0ff; border-color: rgba(121,192,255,0.3); }\n .level-3 { background: rgba(63,185,80,0.12); color: var(--color-success-fg); border-color: rgba(63,185,80,0.3); }\n .level-4 { background: rgba(210,153,34,0.12); color: var(--color-attention-fg); border-color: rgba(210,153,34,0.3); }\n .level-5 { background: rgba(163,113,247,0.12); color: var(--color-done-fg); border-color: rgba(163,113,247,0.3); }\n\n /* Repo Pillars (expandable) */\n .repo-pillars {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 8px;\n margin-top: 12px;\n }\n .repo-pillar {\n background: var(--color-canvas-subtle);\n border: 1px solid var(--color-border-muted);\n border-radius: 6px;\n font-size: 13px;\n overflow: hidden;\n }\n .repo-pillar details { cursor: pointer; }\n .repo-pillar summary {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n list-style: none;\n user-select: none;\n }\n .repo-pillar summary::-webkit-details-marker { display: none; }\n .repo-pillar summary::before {\n content: '\\\\25B8';\n color: var(--color-fg-subtle);\n margin-right: 6px;\n font-size: 10px;\n }\n .repo-pillar details[open] summary::before { content: '\\\\25BE'; }\n .repo-pillar summary:hover { background: rgba(177,186,196,0.04); }\n .repo-pillar-name { color: var(--color-fg-muted); }\n .repo-pillar-value { font-weight: 600; color: var(--color-fg-default); font-size: 12px; }\n .pillar-criteria-list { padding: 4px 12px 8px; border-top: 1px solid var(--color-border-muted); }\n .criterion-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 4px 0;\n font-size: 12px;\n color: var(--color-fg-muted);\n }\n .criterion-row + .criterion-row { border-top: 1px solid rgba(33,38,45,0.5); }\n .criterion-status {\n font-size: 12px;\n font-weight: 500;\n padding: 1px 8px;\n border-radius: 2em;\n border: 1px solid transparent;\n }\n .criterion-status.pass { color: var(--color-success-fg); background: rgba(63,185,80,0.1); border-color: rgba(63,185,80,0.2); }\n .criterion-status.fail { color: var(--color-danger-fg); background: rgba(248,81,73,0.1); border-color: rgba(248,81,73,0.2); }\n .criterion-status.skip { color: var(--color-fg-muted); background: rgba(139,148,158,0.08); border-color: rgba(139,148,158,0.15); }\n\n /* Level Distribution */\n .level-distribution { display: flex; gap: 12px; margin: 8px 0 16px; align-items: flex-end; }\n .level-bar {\n flex: 1;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-end;\n min-height: 160px;\n }\n .level-bar-count { font-size: 14px; font-weight: 600; color: var(--color-accent-fg); margin-bottom: 4px; }\n .level-bar-fill {\n width: 100%;\n background: linear-gradient(180deg, var(--color-accent-fg), var(--color-accent-emphasis));\n border-radius: 6px 6px 0 0;\n transition: height 0.3s ease;\n }\n .level-bar-fill.empty { background: var(--color-border-muted); height: 3px !important; border-radius: 3px; }\n .level-bar-label { margin-top: 8px; font-size: 11px; color: var(--color-fg-muted); font-weight: 500; }\n\n /* Maturity Model */\n .maturity-descriptions { display: grid; gap: 8px; }\n .maturity-item {\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--color-canvas-default);\n border: 1px solid var(--color-border-muted);\n }\n .maturity-item.has-repos { border-color: var(--color-accent-fg); }\n .maturity-header { display: flex; align-items: center; gap: 10px; margin-bottom: 4px; }\n .maturity-name { font-size: 14px; font-weight: 600; color: var(--color-fg-default); }\n .maturity-count { margin-left: auto; font-size: 12px; color: var(--color-fg-muted); }\n .maturity-desc { font-size: 12px; color: var(--color-fg-muted); line-height: 1.5; }\n\n /* AI Hero */\n .ai-hero {\n background: var(--color-canvas-subtle);\n border: 1px solid var(--color-border-default);\n padding: 24px;\n border-radius: 6px;\n margin-bottom: 16px;\n position: relative;\n overflow: hidden;\n }\n .ai-hero::before {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0;\n height: 3px;\n background: linear-gradient(90deg, var(--color-accent-fg), var(--color-done-fg), var(--color-success-fg));\n }\n .ai-hero .section-title { color: var(--color-fg-default); }\n .ai-hero-subtitle { color: var(--color-fg-muted); font-size: 13px; margin-bottom: 16px; }\n .ai-score-header { display: flex; align-items: center; gap: 16px; margin-bottom: 16px; }\n .ai-score-ring {\n width: 72px; height: 72px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n font-size: 20px; font-weight: 700; flex-shrink: 0;\n }\n .ai-score-ring.score-high { background: rgba(63,185,80,0.1); border: 2px solid var(--color-success-fg); color: var(--color-success-fg); }\n .ai-score-ring.score-medium { background: rgba(210,153,34,0.1); border: 2px solid var(--color-attention-fg); color: var(--color-attention-fg); }\n .ai-score-ring.score-low { background: rgba(248,81,73,0.1); border: 2px solid var(--color-danger-fg); color: var(--color-danger-fg); }\n .ai-score-detail { flex: 1; }\n .ai-score-label { font-size: 16px; font-weight: 600; color: var(--color-fg-default); margin-bottom: 2px; }\n .ai-score-desc { color: var(--color-fg-muted); font-size: 13px; }\n .ai-criteria-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 8px; }\n .ai-criterion {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 6px;\n background: var(--color-canvas-default);\n border: 1px solid var(--color-border-muted);\n transition: border-color 0.15s;\n }\n .ai-criterion:hover { border-color: var(--color-border-default); }\n .ai-criterion-icon {\n width: 28px; height: 28px;\n border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; flex-shrink: 0; font-weight: 700;\n }\n .ai-criterion-icon.pass { background: rgba(63,185,80,0.12); color: var(--color-success-fg); }\n .ai-criterion-icon.fail { background: rgba(248,81,73,0.12); color: var(--color-danger-fg); }\n .ai-criterion-text { flex: 1; min-width: 0; }\n .ai-criterion-title { font-weight: 600; font-size: 13px; color: var(--color-fg-default); }\n .ai-criterion-reason { font-size: 12px; color: var(--color-fg-muted); margin-top: 1px; }\n\n /* Footer */\n .footer {\n text-align: center;\n color: var(--color-fg-subtle);\n margin-top: 24px;\n padding-top: 16px;\n border-top: 1px solid var(--color-border-muted);\n font-size: 12px;\n }\n .footer a { color: var(--color-accent-fg); text-decoration: none; }\n .footer a:hover { text-decoration: underline; }\n\n /* Compact Maturity Progress */\n .maturity-progress {\n display: flex;\n gap: 4px;\n margin-bottom: 16px;\n align-items: stretch;\n height: 8px;\n }\n .maturity-segment {\n flex: 1;\n border-radius: 4px;\n background: var(--color-border-muted);\n position: relative;\n }\n .maturity-segment.achieved { background: var(--color-accent-fg); }\n .maturity-segment.current { background: var(--color-accent-fg); box-shadow: 0 0 0 2px var(--color-accent-emphasis); }\n\n .maturity-labels {\n display: flex;\n gap: 4px;\n margin-bottom: 16px;\n }\n .maturity-label {\n flex: 1;\n text-align: center;\n font-size: 11px;\n color: var(--color-fg-subtle);\n }\n .maturity-label.current { color: var(--color-accent-fg); font-weight: 600; }\n\n /* Theme Toggle */\n .theme-toggle {\n margin-left: auto;\n background: var(--color-canvas-default);\n border: 1px solid var(--color-border-default);\n border-radius: 6px;\n padding: 4px 12px;\n cursor: pointer;\n color: var(--color-fg-muted);\n font-size: 12px;\n font-family: inherit;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: border-color 0.15s;\n }\n .theme-toggle:hover {\n border-color: var(--color-accent-fg);\n color: var(--color-fg-default);\n }\n .theme-toggle-icon { font-size: 14px; }\n\n @media (max-width: 768px) {\n body { padding: 16px; }\n .summary-cards { grid-template-columns: 1fr; }\n .pillar-grid { grid-template-columns: 1fr; }\n .ai-criteria-grid { grid-template-columns: 1fr; }\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <svg class=\"header-logo\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.26-1.24-.55-1.49 1.81-.2 3.71-.89 3.71-4 0-.88-.31-1.61-.82-2.17.08-.2.36-1.02-.08-2.13 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.93-.08 2.13-.51.56-.82 1.28-.82 2.17 0 3.07 1.87 3.75 3.65 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z\"></path>\n </svg>\n <div class=\"header-text\">\n <h1>${escapeHtml(title)}</h1>\n <p class=\"subtitle\">Generated ${new Date(generatedAt).toLocaleString()}</p>\n </div>\n <button class=\"theme-toggle\" onclick=\"toggleTheme()\" aria-label=\"Toggle theme\">\n <span class=\"theme-toggle-icon\" id=\"theme-icon\">&#9789;</span>\n <span id=\"theme-label\">Light</span>\n </button>\n </div>\n\n ${successfulReports.length === 1 ? buildSingleRepoHero(successfulReports[0]) : buildMultiRepoSummary(totalRepos, successfulRepos, failedReports.length, avgLevel)}\n\n ${\n successfulReports.length > 0\n ? `\n ${buildFixFirstHtml(successfulReports)}\n\n ${buildAiToolingHeroHtml(aiToolingData, successfulReports)}\n\n <div class=\"section\">\n <h2 class=\"section-title\">Pillar Performance</h2>\n ${buildGroupedPillarsHtml(pillarStats)}\n </div>\n\n ${buildCompactMaturityHtml(successfulReports)}\n `\n : \"\"\n }\n\n <div class=\"section\">\n <h2 class=\"section-title\">${successfulReports.length === 1 ? \"Pillar Details\" : \"Repository Details\"}</h2>\n <div class=\"repo-list\">\n ${reports\n .map(({ repo, report, error }) => {\n if (error) {\n return `\n <div class=\"repo-item error\">\n <div class=\"repo-header\">\n <div class=\"repo-name\">${escapeHtml(repo)}</div>\n <span class=\"level-badge level-0\">Error</span>\n </div>\n <div class=\"error-message\">${escapeHtml(error)}</div>\n </div>\n `;\n }\n\n return `\n <div class=\"repo-item\">\n ${\n successfulReports.length > 1\n ? `\n <div class=\"repo-header\">\n <div class=\"repo-name\">${escapeHtml(repo)}</div>\n <div class=\"level-badge level-${report.achievedLevel}\">\n Level ${report.achievedLevel}: ${getLevelName(report.achievedLevel)}\n </div>\n </div>`\n : \"\"\n }\n ${report.isMonorepo ? `<div style=\"color: var(--color-fg-muted); font-size: 12px; margin-bottom: 8px;\">Monorepo &middot; ${report.apps.length} apps</div>` : \"\"}\n <div class=\"repo-pillars\">\n ${report.pillars\n .map((pillar) => {\n const pillarCriteria = report.criteria.filter((c) => c.pillar === pillar.id);\n const allPass = pillar.passed === pillar.total;\n return `\n <div class=\"repo-pillar\">\n <details${allPass ? \"\" : \" open\"}>\n <summary>\n <span class=\"repo-pillar-name\">${allPass ? \"&#10003; \" : \"\"}${escapeHtml(pillar.name)}</span>\n <span class=\"repo-pillar-value\" style=\"${allPass ? \"color: var(--color-success-fg);\" : \"\"}\">${pillar.passed}/${pillar.total}${allPass ? \"\" : ` (${Math.round(pillar.passRate * 100)}%)`}</span>\n </summary>\n <div class=\"pillar-criteria-list\">\n ${pillarCriteria\n .map(\n (c) => `\n <div class=\"criterion-row\">\n <span>${escapeHtml(c.title)}</span>\n <span class=\"criterion-status ${c.status}\">${c.status === \"pass\" ? \"Pass\" : c.status === \"fail\" ? \"Fail\" : \"Skip\"}</span>\n </div>\n `\n )\n .join(\"\")}\n ${pillarCriteria.length === 0 ? '<div class=\"criterion-row\" style=\"color: var(--color-fg-subtle);\">No criteria</div>' : \"\"}\n </div>\n </details>\n </div>\n `;\n })\n .join(\"\")}\n </div>\n ${buildAreaReportsHtml(report.areaReports)}\n </div>\n `;\n })\n .join(\"\")}\n </div>\n </div>\n\n ${\n failedReports.length > 0\n ? `\n <div class=\"section\">\n <h2 class=\"section-title\">Failed Repositories</h2>\n <div class=\"repo-list\">\n ${failedReports\n .map(\n ({ repo, error }) => `\n <div class=\"repo-item error\">\n <div class=\"repo-name\">${escapeHtml(repo)}</div>\n <div class=\"error-message\">${escapeHtml(error || \"Unknown error\")}</div>\n </div>\n `\n )\n .join(\"\")}\n </div>\n </div>\n `\n : \"\"\n }\n\n <div class=\"footer\">\n <p>Generated with <a href=\"https://github.com/microsoft/agentrc\">AgentRC</a> &middot; AI Readiness Tool</p>\n </div>\n </div>\n <script>\n function getPreferredTheme() {\n // In VS Code webviews, body classes are injected automatically\n if (document.body.classList.contains('vscode-light') || document.body.classList.contains('vscode-high-contrast-light')) return 'light';\n if (document.body.classList.contains('vscode-dark') || document.body.classList.contains('vscode-high-contrast')) return 'dark';\n const stored = localStorage.getItem('agentrc-report-theme');\n if (stored) return stored;\n return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';\n }\n function applyTheme(theme) {\n document.documentElement.setAttribute('data-theme', theme);\n const icon = document.getElementById('theme-icon');\n const label = document.getElementById('theme-label');\n if (icon) icon.innerHTML = theme === 'dark' ? '&#9789;' : '&#9788;';\n if (label) label.textContent = theme === 'dark' ? 'Light' : 'Dark';\n }\n function toggleTheme() {\n const current = document.documentElement.getAttribute('data-theme') || 'dark';\n const next = current === 'dark' ? 'light' : 'dark';\n localStorage.setItem('agentrc-report-theme', next);\n applyTheme(next);\n }\n applyTheme(getPreferredTheme());\n </script>\n</body>\n</html>`;\n}\n\n// ── Helper Functions ──────────────────────────────────────────────────\n\nfunction buildSingleRepoHero(entry: { repo: string; report: ReadinessReport }): string {\n const { repo, report } = entry;\n const level = report.achievedLevel;\n const name = getLevelName(level);\n const levelClass = level >= 4 ? \"level-high\" : level >= 2 ? \"level-mid\" : \"level-low\";\n\n const nextLevel = report.levels.find((l) => l.level === level + 1);\n let nextHtml = \"\";\n if (nextLevel && !nextLevel.achieved) {\n const nextName = getLevelName(nextLevel.level);\n const remaining = nextLevel.total - nextLevel.passed;\n nextHtml = `<div class=\"hero-next\">Next: <strong>Level ${nextLevel.level} — ${nextName}</strong> (${remaining} more check${remaining !== 1 ? \"s\" : \"\"} needed)</div>`;\n } else if (level === 5) {\n nextHtml = `<div class=\"hero-next\" style=\"color: var(--color-success-fg);\">&#10003; Maximum level achieved</div>`;\n }\n\n const totalPassed = report.pillars.reduce((s, p) => s + p.passed, 0);\n const totalChecks = report.pillars.reduce((s, p) => s + p.total, 0);\n\n return `\n <div class=\"hero\">\n <div class=\"hero-level ${levelClass}\">${level}</div>\n <div class=\"hero-info\">\n <div class=\"hero-name\">${escapeHtml(repo)}</div>\n <div class=\"hero-subtitle\">Level ${level}: ${name} — ${totalPassed} of ${totalChecks} checks passing</div>\n ${nextHtml}\n </div>\n </div>\n `;\n}\n\nfunction buildMultiRepoSummary(\n totalRepos: number,\n successfulRepos: number,\n failedCount: number,\n avgLevel: number\n): string {\n return `\n <div class=\"summary-cards\">\n <div class=\"card\">\n <div class=\"card-title\">Repositories</div>\n <div class=\"card-value\">${totalRepos}</div>\n <div class=\"card-subtitle\">${successfulRepos} analyzed successfully</div>\n </div>\n <div class=\"card\">\n <div class=\"card-title\">Avg Maturity</div>\n <div class=\"card-value\">${avgLevel.toFixed(1)}</div>\n <div class=\"card-subtitle\">${getLevelName(Math.round(avgLevel))}</div>\n </div>\n <div class=\"card\">\n <div class=\"card-title\">Success Rate</div>\n <div class=\"card-value\">${totalRepos > 0 ? Math.round((successfulRepos / totalRepos) * 100) : 0}%</div>\n <div class=\"card-subtitle\">${failedCount > 0 ? failedCount + \" failed\" : \"All succeeded\"}</div>\n </div>\n </div>\n `;\n}\n\nfunction buildFixFirstHtml(reports: Array<{ repo: string; report: ReadinessReport }>): string {\n // Collect all failing criteria across repos, deduplicate by id\n const failMap = new Map<string, { criterion: ReadinessReport[\"criteria\"][0]; repos: string[] }>();\n for (const { repo, report } of reports) {\n for (const c of report.criteria) {\n if (c.status !== \"fail\") continue;\n const existing = failMap.get(c.id);\n if (existing) {\n existing.repos.push(repo);\n } else {\n failMap.set(c.id, { criterion: c, repos: [repo] });\n }\n }\n }\n\n const sorted = Array.from(failMap.values())\n .sort((a, b) => {\n const impactWeight = { high: 3, medium: 2, low: 1 };\n const effortWeight = { low: 1, medium: 2, high: 3 };\n const delta = impactWeight[b.criterion.impact] - impactWeight[a.criterion.impact];\n if (delta !== 0) return delta;\n return effortWeight[a.criterion.effort] - effortWeight[b.criterion.effort];\n })\n .slice(0, 5);\n\n if (sorted.length === 0) {\n return `\n <div class=\"section\" style=\"border-color: var(--color-success-emphasis);\">\n <h2 class=\"section-title\" style=\"color: var(--color-success-fg);\">&#10003; All Checks Passing</h2>\n <p style=\"color: var(--color-fg-muted); font-size: 13px;\">This repository passes all readiness criteria.</p>\n </div>\n `;\n }\n\n const multiRepo = reports.length > 1;\n return `\n <div class=\"fix-first\">\n <h2 class=\"section-title\">&#9888; Fix First</h2>\n <div class=\"fix-list\">\n ${sorted\n .map(\n ({ criterion: c, repos }) => `\n <div class=\"fix-item\">\n <div class=\"fix-item-icon\">&#10007;</div>\n <div class=\"fix-item-text\">\n <div class=\"fix-item-title\">${escapeHtml(c.title)}</div>\n ${c.reason ? `<div class=\"fix-item-reason\">${escapeHtml(c.reason)}</div>` : \"\"}\n <div class=\"fix-item-badges\">\n <span class=\"fix-badge impact-${c.impact}\">${c.impact} impact</span>\n <span class=\"fix-badge effort-${c.effort}\">${c.effort} effort</span>\n ${multiRepo ? `<span class=\"fix-badge impact-low\">${repos.length} repo${repos.length > 1 ? \"s\" : \"\"}</span>` : \"\"}\n </div>\n </div>\n </div>\n `\n )\n .join(\"\")}\n </div>\n </div>\n `;\n}\n\nfunction buildCompactMaturityHtml(\n reports: Array<{ repo: string; report: ReadinessReport }>\n): string {\n const level =\n reports.length === 1\n ? reports[0].report.achievedLevel\n : Math.floor(reports.reduce((s, r) => s + r.report.achievedLevel, 0) / reports.length);\n\n return `\n <div class=\"section\">\n <h2 class=\"section-title\">Maturity Model</h2>\n <div class=\"maturity-progress\">\n ${[1, 2, 3, 4, 5]\n .map(\n (l) =>\n `<div class=\"maturity-segment${l < level ? \" achieved\" : l === level ? \" current\" : \"\"}\"></div>`\n )\n .join(\"\")}\n </div>\n <div class=\"maturity-labels\">\n ${[1, 2, 3, 4, 5]\n .map(\n (l) =>\n `<div class=\"maturity-label${l === level ? \" current\" : \"\"}\">${l}. ${getLevelName(l)}</div>`\n )\n .join(\"\")}\n </div>\n ${[level, level + 1]\n .filter((l) => l >= 1 && l <= 5)\n .map(\n (l) => `\n <div class=\"maturity-item${l === level ? \" has-repos\" : \"\"}\">\n <div class=\"maturity-header\">\n <span class=\"level-badge level-${l}\">${l}</span>\n <span class=\"maturity-name\">${getLevelName(l)}</span>\n ${l === level ? '<span class=\"maturity-count\" style=\"color: var(--color-accent-fg);\">Current</span>' : '<span class=\"maturity-count\">Next</span>'}\n </div>\n <div class=\"maturity-desc\">${getLevelDescription(l)}</div>\n </div>\n `\n )\n .join(\"\")}\n </div>\n `;\n}\n\nfunction calculatePillarStats(reports: Array<{ repo: string; report: ReadinessReport }>): Array<{\n id: string;\n name: string;\n passed: number;\n total: number;\n passRate: number;\n}> {\n const pillarMap = new Map<string, { name: string; passed: number; total: number }>();\n\n for (const { report } of reports) {\n for (const pillar of report.pillars) {\n const existing = pillarMap.get(pillar.id);\n if (existing) {\n existing.passed += pillar.passed;\n existing.total += pillar.total;\n } else {\n pillarMap.set(pillar.id, {\n name: pillar.name,\n passed: pillar.passed,\n total: pillar.total\n });\n }\n }\n }\n\n return Array.from(pillarMap.entries()).map(([id, stats]) => ({\n id,\n name: stats.name,\n passed: stats.passed,\n total: stats.total,\n passRate: stats.total > 0 ? stats.passed / stats.total : 0\n }));\n}\n\nfunction getProgressClass(passRate: number): string {\n if (passRate >= 0.8) return \"high\";\n if (passRate >= 0.5) return \"medium\";\n return \"low\";\n}\n\n// ── AI Tooling Hero ───────────────────────────────────────────────────\n\ntype AiToolingCriterionSummary = {\n id: string;\n title: string;\n passCount: number;\n totalRepos: number;\n status: \"pass\" | \"fail\";\n evidence: string[];\n reason: string;\n};\n\ntype AiToolingData = {\n criteria: AiToolingCriterionSummary[];\n passed: number;\n total: number;\n passRate: number;\n};\n\nfunction calculateAiToolingData(\n reports: Array<{ repo: string; report: ReadinessReport }>\n): AiToolingData {\n const criterionMap = new Map<string, AiToolingCriterionSummary>();\n\n for (const { report } of reports) {\n const aiCriteria = report.criteria.filter((c) => c.pillar === \"ai-tooling\");\n for (const c of aiCriteria) {\n const existing = criterionMap.get(c.id);\n if (existing) {\n existing.totalRepos += 1;\n if (c.status === \"pass\") existing.passCount += 1;\n if (c.evidence) existing.evidence.push(...c.evidence);\n } else {\n criterionMap.set(c.id, {\n id: c.id,\n title: c.title,\n passCount: c.status === \"pass\" ? 1 : 0,\n totalRepos: 1,\n status: c.status === \"pass\" ? \"pass\" : \"fail\",\n evidence: c.evidence ? [...c.evidence] : [],\n reason: c.reason || \"\"\n });\n }\n }\n }\n\n const criteria = Array.from(criterionMap.values()).map((c) => ({\n ...c,\n status: (c.passCount / c.totalRepos >= 0.5 ? \"pass\" : \"fail\") as \"pass\" | \"fail\",\n evidence: [...new Set(c.evidence)]\n }));\n\n const passed = criteria.filter((c) => c.status === \"pass\").length;\n return {\n criteria,\n passed,\n total: criteria.length,\n passRate: criteria.length > 0 ? passed / criteria.length : 0\n };\n}\n\nfunction getAiScoreClass(passRate: number): string {\n if (passRate >= 0.6) return \"score-high\";\n if (passRate >= 0.3) return \"score-medium\";\n return \"score-low\";\n}\n\nfunction getAiScoreLabel(passRate: number): string {\n if (passRate >= 0.8) return \"Excellent\";\n if (passRate >= 0.6) return \"Good\";\n if (passRate >= 0.4) return \"Fair\";\n if (passRate >= 0.2) return \"Getting Started\";\n return \"Not Started\";\n}\n\nfunction getAiCriterionIcon(id: string): string {\n const icons: Record<string, string> = {\n \"custom-instructions\": \"&#128221;\",\n \"mcp-config\": \"&#128268;\",\n \"custom-agents\": \"&#129302;\",\n \"copilot-skills\": \"&#9889;\"\n };\n return icons[id] || \"&#128295;\";\n}\n\nfunction buildAiToolingHeroHtml(\n data: AiToolingData,\n reports: Array<{ repo: string; report: ReadinessReport }>\n): string {\n if (data.criteria.length === 0) return \"\";\n\n const pct = Math.round(data.passRate * 100);\n const scoreClass = getAiScoreClass(data.passRate);\n const scoreLabel = getAiScoreLabel(data.passRate);\n\n const multiRepo = reports.length > 1;\n const perRepoHtml = multiRepo\n ? `\n <div style=\"margin-top: 16px; border-top: 1px solid var(--color-border-muted); padding-top: 12px;\">\n <div style=\"font-size: 12px; font-weight: 600; color: var(--color-fg-muted); margin-bottom: 8px;\">Per Repository</div>\n <div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 6px;\">\n ${reports\n .map(({ repo, report }) => {\n const aiPillar = report.pillars.find((p) => p.id === \"ai-tooling\");\n const repoPct = aiPillar ? Math.round(aiPillar.passRate * 100) : 0;\n const repoPass = aiPillar?.passed ?? 0;\n const repoTotal = aiPillar?.total ?? 0;\n return `<div style=\"display: flex; justify-content: space-between; padding: 6px 10px; background: var(--color-canvas-default); border: 1px solid var(--color-border-muted); border-radius: 6px; font-size: 12px;\">\n <span style=\"color: var(--color-accent-fg);\">${escapeHtml(repo)}</span>\n <span style=\"font-weight: 600; color: ${repoPct >= 60 ? \"var(--color-success-fg)\" : repoPct >= 30 ? \"var(--color-attention-fg)\" : \"var(--color-danger-fg)\"};\">${repoPass}/${repoTotal} (${repoPct}%)</span>\n </div>`;\n })\n .join(\"\")}\n </div>\n </div>\n `\n : \"\";\n\n return `\n <div class=\"ai-hero\">\n <h2 class=\"section-title\">AI Tooling Readiness</h2>\n <p class=\"ai-hero-subtitle\">How well prepared ${multiRepo ? \"your repositories are\" : \"this repository is\"} for AI-assisted development</p>\n\n <div class=\"ai-score-header\">\n <div class=\"ai-score-ring ${scoreClass}\">${pct}%</div>\n <div class=\"ai-score-detail\">\n <div class=\"ai-score-label\">${scoreLabel}</div>\n <div class=\"ai-score-desc\">${data.passed} of ${data.total} AI tooling checks passing${multiRepo ? ` across ${reports.length} repositories` : \"\"}</div>\n </div>\n </div>\n\n <div class=\"ai-criteria-grid\">\n ${data.criteria\n .map(\n (c) => `\n <div class=\"ai-criterion\">\n <div class=\"ai-criterion-icon ${c.status}\">\n ${c.status === \"pass\" ? \"&#10003;\" : \"&#10007;\"}\n </div>\n <div class=\"ai-criterion-text\">\n <div class=\"ai-criterion-title\">${getAiCriterionIcon(c.id)} ${escapeHtml(c.title)}</div>\n <div class=\"ai-criterion-reason\">${\n c.status === \"pass\"\n ? multiRepo\n ? `${c.passCount}/${c.totalRepos} repos`\n : \"Detected\"\n : escapeHtml(c.reason)\n }</div>\n </div>\n </div>\n `\n )\n .join(\"\")}\n </div>\n ${perRepoHtml}\n </div>\n `;\n}\n\nfunction buildGroupedPillarsHtml(\n pillarStats: Array<{ id: string; name: string; passed: number; total: number; passRate: number }>\n): string {\n const groups: PillarGroup[] = [\"repo-health\", \"ai-setup\"];\n return groups\n .map((group) => {\n const pillars = pillarStats.filter(\n (p) => PILLAR_GROUPS[p.id as keyof typeof PILLAR_GROUPS] === group\n );\n if (pillars.length === 0) return \"\";\n return `\n <h3 style=\"font-size: 13px; font-weight: 600; color: var(--color-fg-muted); margin-bottom: 8px; margin-top: 12px;\">${escapeHtml(PILLAR_GROUP_NAMES[group])}</h3>\n <div class=\"pillar-grid\">\n ${pillars\n .map((pillar) => {\n const allPass = pillar.passed === pillar.total;\n return `\n <div class=\"pillar-card${allPass ? \" all-passing\" : \" has-failures\"}\">\n <div class=\"pillar-name\">${escapeHtml(pillar.name)}</div>\n <div class=\"pillar-stats\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill ${getProgressClass(pillar.passRate)}\" style=\"width: ${Math.max(pillar.passRate * 100, pillar.total > 0 ? 2 : 0)}%\"></div>\n </div>\n <span>${allPass ? \"All passing\" : `${pillar.passed} of ${pillar.total}`}</span>\n </div>\n </div>\n `;\n })\n .join(\"\")}\n </div>\n `;\n })\n .join(\"\");\n}\n\nfunction escapeHtml(text: string): string {\n const map: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#039;\"\n };\n return text.replace(/[&<>\"']/g, (m) => map[m]);\n}\n\nfunction buildAreaReportsHtml(areaReports?: AreaReadinessReport[]): string {\n if (!areaReports?.length) return \"\";\n\n return `\n <div style=\"margin-top: 16px; border-top: 1px solid var(--color-border-muted); padding-top: 12px;\">\n <div style=\"font-size: 12px; font-weight: 600; color: var(--color-fg-muted); margin-bottom: 8px;\">Per-Area Breakdown</div>\n <div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 8px;\">\n ${areaReports\n .map((ar) => {\n const relevant = ar.criteria.filter((c) => c.status !== \"skip\");\n const passed = relevant.filter((c) => c.status === \"pass\").length;\n const total = relevant.length;\n const pct = total ? Math.round((passed / total) * 100) : 0;\n const sourceLabel = ar.area.source === \"config\" ? \"config\" : \"auto\";\n const applyTo = Array.isArray(ar.area.applyTo)\n ? ar.area.applyTo.join(\", \")\n : ar.area.applyTo;\n\n return `\n <div style=\"background: var(--color-canvas-default); border: 1px solid var(--color-border-muted); border-radius: 6px; overflow: hidden;\">\n <details>\n <summary style=\"display: flex; justify-content: space-between; align-items: center; padding: 10px 12px; cursor: pointer; list-style: none; user-select: none;\">\n <span style=\"font-weight: 600; font-size: 13px; color: var(--color-fg-default);\">${escapeHtml(ar.area.name)}</span>\n <span style=\"display: flex; align-items: center; gap: 8px;\">\n <span style=\"font-size: 10px; padding: 1px 6px; border-radius: 2em; background: rgba(139,148,158,0.08); color: var(--color-fg-subtle); border: 1px solid var(--color-border-muted);\">${sourceLabel}</span>\n <span style=\"font-weight: 600; font-size: 12px; color: ${pct >= 80 ? \"var(--color-success-fg)\" : pct >= 50 ? \"var(--color-attention-fg)\" : \"var(--color-danger-fg)\"};\">${passed}/${total} (${pct}%)</span>\n </span>\n </summary>\n <div style=\"padding: 4px 12px 8px; border-top: 1px solid var(--color-border-muted);\">\n <div style=\"font-size: 11px; color: var(--color-fg-subtle); margin-bottom: 6px;\">${escapeHtml(applyTo)}</div>\n ${ar.criteria\n .map(\n (c) => `\n <div class=\"criterion-row\">\n <span>${escapeHtml(c.title)}</span>\n <span class=\"criterion-status ${c.status}\">${c.status === \"pass\" ? \"Pass\" : c.status === \"fail\" ? \"Fail\" : \"Skip\"}</span>\n </div>\n `\n )\n .join(\"\")}\n </div>\n </details>\n </div>\n `;\n })\n .join(\"\")}\n </div>\n </div>\n `;\n}\n","import path from \"path\";\n\nimport { DEFAULT_MODEL, DEFAULT_JUDGE_MODEL } from \"@agentrc/core/config\";\nimport { listCopilotModels } from \"@agentrc/core/services/copilot\";\nimport { generateEvalScaffold } from \"@agentrc/core/services/evalScaffold\";\nimport { runEval } from \"@agentrc/core/services/evaluator\";\nimport { safeWriteFile } from \"@agentrc/core/utils/fs\";\nimport type { CommandResult } from \"@agentrc/core/utils/output\";\nimport {\n outputResult,\n outputError,\n createProgressReporter,\n shouldLog\n} from \"@agentrc/core/utils/output\";\n\ntype EvalOptions = {\n repo?: string;\n model?: string;\n judgeModel?: string;\n output?: string;\n init?: boolean;\n count?: string;\n listModels?: boolean;\n failLevel?: string;\n json?: boolean;\n quiet?: boolean;\n};\n\nexport async function evalCommand(\n configPathArg: string | undefined,\n options: EvalOptions\n): Promise<void> {\n const repoPath = path.resolve(options.repo ?? process.cwd());\n\n if (options.listModels) {\n try {\n const models = await listCopilotModels();\n if (!models.length) {\n if (options.json) {\n const result: CommandResult<{ models: string[] }> = {\n ok: true,\n status: \"success\",\n data: { models: [] }\n };\n outputResult(result, true);\n } else if (shouldLog(options)) {\n process.stderr.write(\"No models detected from Copilot CLI.\\n\");\n }\n return;\n }\n if (options.json) {\n const result: CommandResult<{ models: string[] }> = {\n ok: true,\n status: \"success\",\n data: { models }\n };\n outputResult(result, true);\n } else if (shouldLog(options)) {\n process.stderr.write(models.join(\"\\n\") + \"\\n\");\n }\n } catch (error) {\n outputError(\n `Failed to list models: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n }\n return;\n }\n\n // Handle --init flag\n if (options.init) {\n const outputPath = path.join(repoPath, \"agentrc.eval.json\");\n const desiredCount = Math.max(1, Number.parseInt(options.count ?? \"5\", 10) || 5);\n try {\n const progress = createProgressReporter(!shouldLog(options));\n const scaffold = await generateEvalScaffold({\n repoPath,\n count: desiredCount,\n model: options.model,\n onProgress: (msg) => progress.update(msg)\n });\n const { wrote, reason } = await safeWriteFile(\n outputPath,\n JSON.stringify(scaffold, null, 2),\n false\n );\n if (!wrote) {\n const why = reason === \"symlink\" ? \"path is a symlink\" : \"file exists\";\n outputError(`Skipped ${outputPath}: ${why}`, Boolean(options.json));\n return;\n }\n\n if (options.json) {\n const result: CommandResult<{ outputPath: string }> = {\n ok: true,\n status: \"success\",\n data: { outputPath }\n };\n outputResult(result, true);\n } else if (shouldLog(options)) {\n process.stderr.write(`Created ${outputPath}\\n`);\n process.stderr.write(\n \"Edit the file to add your own test cases, then run 'agentrc eval' to test.\\n\"\n );\n }\n } catch (error) {\n outputError(\n `Failed to scaffold eval config: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n }\n return;\n }\n\n const configPath = path.resolve(configPathArg ?? path.join(repoPath, \"agentrc.eval.json\"));\n\n try {\n const progress = createProgressReporter(!shouldLog(options));\n const { summary, results, viewerPath } = await runEval({\n configPath,\n repoPath,\n model: options.model ?? DEFAULT_MODEL,\n judgeModel: options.judgeModel ?? DEFAULT_JUDGE_MODEL,\n outputPath: options.output,\n onProgress: (msg) => progress.update(msg)\n });\n\n if (options.json) {\n const result: CommandResult<{ summary: string; viewerPath?: string }> = {\n ok: true,\n status: \"success\",\n data: { summary, viewerPath }\n };\n outputResult(result, true);\n } else if (shouldLog(options)) {\n process.stderr.write(summary + \"\\n\");\n if (viewerPath) {\n process.stderr.write(`Trajectory viewer: ${viewerPath}\\n`);\n }\n }\n\n const threshold = Number.parseInt(options.failLevel ?? \"\", 10);\n if (Number.isFinite(threshold)) {\n const total = results.length;\n const passed = results.filter((r) => r.verdict === \"pass\").length;\n const passRate = total > 0 ? Math.round((passed / total) * 100) : 0;\n if (passRate < threshold) {\n outputError(\n `Pass rate ${passRate}% (${passed}/${total}) is below threshold ${threshold}%`,\n Boolean(options.json)\n );\n process.exitCode = 1;\n }\n }\n } catch (error) {\n outputError(\n `Eval failed: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n }\n}\n","import { DEFAULT_MODEL } from \"../config\";\n\nimport type { Area } from \"./analyzer\";\nimport { assertCopilotCliReady } from \"./copilot\";\nimport { createCopilotClient } from \"./copilotSdk\";\n\nconst EVAL_SCAFFOLD_TIMEOUT_MS = 600000;\nconst EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS = 90000;\n\nexport type EvalCase = {\n id?: string;\n prompt: string;\n expectation: string;\n area?: string;\n workingDirectory?: string;\n};\n\nexport type EvalConfig = {\n instructionFile?: string;\n cases: EvalCase[];\n systemMessage?: string;\n outputPath?: string;\n ui?: {\n modelPicker?: \"visible\" | \"hidden\";\n };\n};\n\ntype EvalScaffoldOptions = {\n repoPath: string;\n count: number;\n model?: string;\n areas?: Area[];\n onProgress?: (message: string) => void;\n};\n\nexport async function generateEvalScaffold(options: EvalScaffoldOptions): Promise<EvalConfig> {\n const repoPath = options.repoPath;\n const count = Math.max(1, options.count);\n const progress = options.onProgress ?? (() => {});\n\n progress(\"Checking Copilot CLI...\");\n const cliConfig = await assertCopilotCliReady();\n\n progress(\"Starting Copilot SDK...\");\n const client = await createCopilotClient(cliConfig);\n\n try {\n progress(\"Creating session...\");\n const preferredModel = options.model ?? DEFAULT_MODEL;\n const session = await client.createSession({\n model: preferredModel,\n streaming: true,\n workingDirectory: repoPath,\n systemMessage: {\n content:\n \"You are an expert codebase analyst specializing in deep architectural analysis. Generate challenging, cross-cutting eval cases for this repository that require synthesizing information from multiple files and tracing logic across layers. Avoid trivial questions answerable from a single file read or grep. Use tools (glob, view, grep) extensively to inspect the codebase. Output ONLY JSON with keys: instructionFile, cases (array of {id,prompt,expectation}).\"\n },\n infiniteSessions: { enabled: false }\n });\n\n let content = \"\";\n let sessionError: Error | undefined;\n session.on((event: { type: string; data?: Record<string, unknown> }) => {\n if (event.type === \"assistant.message_delta\") {\n const delta = event.data?.deltaContent as string | undefined;\n if (delta) {\n content += delta;\n progress(\"Generating eval cases...\");\n }\n } else if (event.type === \"tool.execution_start\") {\n const toolName = event.data?.toolName as string | undefined;\n progress(`Using tool: ${toolName ?? \"...\"}`);\n } else if (event.type === \"session.error\") {\n const errorMsg = (event.data?.message as string) ?? \"Unknown error\";\n if (errorMsg.toLowerCase().includes(\"auth\") || errorMsg.toLowerCase().includes(\"login\")) {\n sessionError = new Error(\n \"Copilot CLI not logged in. Run `copilot` then `/login` to authenticate.\"\n );\n }\n }\n });\n\n const areaContext = options.areas?.length\n ? [\n \"\",\n \"AREA CONTEXT:\",\n \"This repo has the following areas:\",\n ...options.areas.map((a) => {\n const patterns = Array.isArray(a.applyTo) ? a.applyTo.join(\", \") : a.applyTo;\n const workDir = a.workingDirectory ? ` [workspace: ${a.workingDirectory}]` : \"\";\n return `- ${a.name} (${patterns})${workDir}`;\n }),\n \"\",\n \"Generate a mix of:\",\n \"- Single-area cases that go deep into one area's internals\",\n \"- Cross-area cases that test interactions between areas\",\n 'Include an optional \"area\" field in each case to tag which area(s) it targets.',\n 'For areas with a workspace (workingDirectory), include a \"workingDirectory\" field set to that workspace path so evals run scoped to the correct folder.'\n ].join(\"\\n\")\n : \"\";\n\n const prompt = [\n `Analyze this repository and generate ${count} eval cases.`,\n \"\",\n \"IMPORTANT: Generate HARD eval cases that require deep, cross-cutting understanding of the codebase.\",\n \"Each case should require synthesizing information from MULTIPLE files or tracing logic across several layers.\",\n \"Do NOT generate simple questions that can be answered by reading a single file or running a single grep.\",\n \"\",\n \"Good eval case examples (adapt to this repo):\",\n \"- Questions about how data flows end-to-end through multiple modules (e.g., 'Trace what happens when X is called — which services, transforms, and side effects are involved?')\",\n \"- Questions about implicit conventions or patterns that span many files (e.g., 'What error-handling pattern is used across the service layer, and where does it deviate?')\",\n \"- Questions requiring understanding of runtime behavior not obvious from static code (e.g., 'What is the order of initialization and what would break if module X loaded before Y?')\",\n \"- Questions about non-obvious interactions between components (e.g., 'How does changing config option X affect the behavior of feature Y?')\",\n \"- Questions about edge cases or failure modes that require reading implementation details across files\",\n \"- Questions that require understanding the type system, generics, or shared interfaces across module boundaries\",\n \"\",\n \"Bad eval case examples (avoid these):\",\n \"- 'What does this project do?' (answered by README alone)\",\n \"- 'How do I build/test?' (answered by package.json alone)\",\n \"- 'What is the entrypoint?' (answered by a single file)\",\n \"- Any question answerable by reading one file or searching for one keyword\",\n \"\",\n \"Use tools extensively to inspect the codebase — read multiple files, trace imports, follow call chains.\",\n \"If this is a monorepo (npm/pnpm/yarn workspaces, Cargo workspace, Go workspace, .NET solution, Gradle/Maven multi-module), generate cases that involve cross-app dependencies, shared libraries, and how changes in one app affect others.\",\n \"Ensure cases cover cross-cutting concerns: data flow, error propagation, configuration impact, implicit coupling, architectural invariants.\",\n \"Include a systemMessage that keeps answers scoped to this repository (avoid generic Copilot CLI details unless asked).\",\n \"Return JSON ONLY (no markdown, no commentary) in this schema:\",\n '{\\n \"instructionFile\": \".github/copilot-instructions.md\",\\n \"systemMessage\": \"...\",\\n \"cases\": [\\n {\"id\": \"case-1\", \"prompt\": \"...\", \"expectation\": \"...\", \"area\": \"optional-area-name\"}\\n ]\\n}',\n areaContext\n ].join(\"\\n\");\n\n progress(\"Analyzing codebase...\");\n let timedOutWaitingForIdle = false;\n let sendError: unknown;\n try {\n await session.sendAndWait({ prompt }, EVAL_SCAFFOLD_TIMEOUT_MS);\n } catch (error) {\n if (!isSessionIdleTimeoutError(error)) {\n sendError = error;\n } else {\n timedOutWaitingForIdle = true;\n progress(\"Generation took longer than expected; requesting final JSON output...\");\n\n try {\n await session.sendAndWait(\n {\n prompt:\n \"Stop analysis and return only the final JSON scaffold now. Do not include markdown or commentary.\"\n },\n EVAL_SCAFFOLD_RECOVERY_TIMEOUT_MS\n );\n } catch (recoveryError) {\n if (!isSessionIdleTimeoutError(recoveryError)) {\n sendError = recoveryError;\n } else {\n progress(\"Still waiting on idle; attempting to parse partial output...\");\n }\n }\n }\n } finally {\n await session.destroy();\n }\n\n if (sessionError) throw sessionError;\n if (sendError !== undefined)\n throw sendError instanceof Error ? sendError : new Error(String(sendError));\n\n let parsed: EvalConfig;\n try {\n parsed = parseEvalConfig(content);\n } catch (error) {\n if (timedOutWaitingForIdle) {\n throw new Error(\n \"Timed out waiting for scaffold generation to become idle before a complete JSON payload was returned. Try again or lower `--count`.\"\n );\n }\n throw error;\n }\n\n const normalized = normalizeEvalConfig(parsed, count);\n return normalized;\n } finally {\n await client.stop();\n }\n}\n\nfunction isSessionIdleTimeoutError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return message.includes(\"timeout\") && message.includes(\"session.idle\");\n}\n\nfunction parseEvalConfig(raw: string): EvalConfig {\n const match = raw.match(/\\{[\\s\\S]*\\}/u);\n if (!match) {\n throw new Error(\"Failed to parse eval scaffold JSON.\");\n }\n const parsed = JSON.parse(match[0]) as EvalConfig;\n if (!parsed || !Array.isArray(parsed.cases)) {\n throw new Error(\"Eval scaffold JSON is missing cases.\");\n }\n return parsed;\n}\n\nfunction normalizeEvalConfig(parsed: EvalConfig, count: number): EvalConfig {\n const cases = (parsed.cases ?? []).slice(0, count).map((entry, index) => {\n const id = typeof entry.id === \"string\" && entry.id.trim() ? entry.id : `case-${index + 1}`;\n return {\n id,\n prompt: String(entry.prompt ?? \"\").trim(),\n expectation: String(entry.expectation ?? \"\").trim(),\n area: typeof entry.area === \"string\" && entry.area.trim() ? entry.area.trim() : undefined,\n workingDirectory:\n typeof entry.workingDirectory === \"string\" && entry.workingDirectory.trim()\n ? entry.workingDirectory.trim()\n : undefined\n };\n });\n\n if (!cases.length) {\n throw new Error(\"Eval scaffold JSON did not include any usable cases.\");\n }\n\n const defaultSystemMessage =\n \"You are answering questions about this repository. Use tools to inspect the repo and cite its files. Avoid generic Copilot CLI details unless the prompt explicitly asks for them.\";\n\n return {\n instructionFile: parsed.instructionFile ?? \".github/copilot-instructions.md\",\n systemMessage: parsed.systemMessage ?? defaultSystemMessage,\n cases\n };\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport { buildTimestampedName, safeWriteFile } from \"../utils/fs\";\n\nimport { assertCopilotCliReady } from \"./copilot\";\nimport { createCopilotClient } from \"./copilotSdk\";\nimport type { EvalConfig } from \"./evalScaffold\";\n\nconst DEFAULT_SYSTEM_MESSAGE =\n \"You are answering questions about this repository. Use tools to inspect the repo and cite its files. Avoid generic Copilot CLI details unless the prompt explicitly asks for them.\";\n\ninterface CopilotSession {\n on(handler: (event: { type: string; data?: Record<string, unknown> }) => void): void;\n sendAndWait(params: { prompt: string }, timeoutMs?: number): Promise<unknown>;\n destroy(): Promise<void>;\n}\n\ninterface CopilotClient {\n createSession(config: Record<string, unknown>): Promise<CopilotSession>;\n stop(): Promise<unknown>;\n}\n\ntype EvalRunOptions = {\n configPath: string;\n repoPath: string;\n model: string;\n judgeModel: string;\n outputPath?: string;\n onProgress?: (message: string) => void;\n};\n\ntype TokenUsage = {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n};\n\ntype ToolCallSummary = {\n count: number;\n byName: Record<string, number>;\n totalDurationMs: number;\n};\n\ntype AskMetrics = {\n durationMs: number;\n tokenUsage?: TokenUsage;\n toolCalls: ToolCallSummary;\n};\n\ntype EvalMetrics = {\n withoutInstructions: AskMetrics;\n withInstructions: AskMetrics;\n judge: AskMetrics;\n totalDurationMs: number;\n};\n\ntype EvalPhase = \"withoutInstructions\" | \"withInstructions\" | \"judge\";\n\ntype TrajectoryEvent = {\n timestampMs: number;\n phase: EvalPhase;\n type: string;\n data?: Record<string, unknown>;\n};\n\nexport type EvalResult = {\n id: string;\n prompt: string;\n expectation: string;\n withInstructions?: string;\n withoutInstructions?: string;\n verdict?: \"pass\" | \"fail\" | \"unknown\";\n score?: number;\n rationale?: string;\n metrics?: EvalMetrics;\n trajectory?: TrajectoryEvent[];\n};\n\nexport async function runEval(\n options: EvalRunOptions\n): Promise<{ summary: string; results: EvalResult[]; viewerPath?: string }> {\n const config = await loadConfig(options.configPath);\n const instructionFile = config.instructionFile ?? \".github/copilot-instructions.md\";\n const instructionPath = path.resolve(options.repoPath, instructionFile);\n const instructionText = await readOptionalFile(instructionPath);\n const baseSystemMessage = config.systemMessage ?? DEFAULT_SYSTEM_MESSAGE;\n const progress = options.onProgress ?? (() => {});\n const defaultOutputPath = path.resolve(\n options.repoPath,\n \".agentrc\",\n \"evals\",\n buildTimestampedName(\"eval-results\")\n );\n const outputPath =\n resolveOutputPath(options.repoPath, options.outputPath, config.outputPath) ?? defaultOutputPath;\n const runStartedAt = Date.now();\n\n progress(\"Starting Copilot SDK...\");\n const cliConfig = await assertCopilotCliReady();\n const client = await createCopilotClient(cliConfig);\n\n try {\n const results: EvalResult[] = [];\n const total = config.cases.length;\n\n for (const [index, testCase] of config.cases.entries()) {\n const id = testCase.id ?? `case-${index + 1}`;\n const prompt = buildPrompt(options.repoPath, testCase.prompt);\n const caseStartedAt = Date.now();\n\n // Resolve working directory: per-case override (from workspace config) or repo root\n let caseWorkingDir: string | undefined;\n if (testCase.workingDirectory) {\n const resolved = path.resolve(options.repoPath, testCase.workingDirectory);\n const root = path.resolve(options.repoPath);\n if (resolved !== root && !resolved.startsWith(root + path.sep)) {\n throw new Error(\n `Invalid workingDirectory \"${testCase.workingDirectory}\": escapes repo boundary`\n );\n }\n caseWorkingDir = resolved;\n }\n\n progress(`Running eval ${index + 1}/${total}: ${id} (without instructions)...`);\n const withoutResult = await askOnce(client, {\n prompt,\n model: options.model,\n systemMessage: baseSystemMessage,\n phase: \"withoutInstructions\",\n workingDirectory: caseWorkingDir\n });\n\n progress(`Running eval ${index + 1}/${total}: ${id} (with instructions)...`);\n const withResult = await askOnce(client, {\n prompt,\n model: options.model,\n systemMessage: [baseSystemMessage, instructionText].filter(Boolean).join(\"\\n\\n\"),\n phase: \"withInstructions\",\n workingDirectory: caseWorkingDir\n });\n\n progress(`Running eval ${index + 1}/${total}: ${id} (judging)...`);\n const judgment = await judge(client, {\n model: options.judgeModel,\n prompt: testCase.prompt,\n expectation: testCase.expectation,\n withoutInstructions: withoutResult.content,\n withInstructions: withResult.content\n });\n\n const metrics: EvalMetrics = {\n withoutInstructions: withoutResult.metrics,\n withInstructions: withResult.metrics,\n judge: judgment.metrics,\n totalDurationMs: Date.now() - caseStartedAt\n };\n\n const trajectory = [\n ...withoutResult.trajectory,\n ...withResult.trajectory,\n ...judgment.trajectory\n ];\n\n results.push({\n id,\n prompt: testCase.prompt,\n expectation: testCase.expectation,\n withInstructions: withResult.content,\n withoutInstructions: withoutResult.content,\n verdict: judgment.result.verdict,\n score: judgment.result.score,\n rationale: judgment.result.rationale,\n metrics,\n trajectory\n });\n\n progress(\n `Eval ${index + 1}/${total}: ${id} → ${judgment.result.verdict} (score: ${judgment.result.score})`\n );\n }\n\n const runFinishedAt = Date.now();\n const output = {\n repoPath: options.repoPath,\n model: options.model,\n judgeModel: options.judgeModel,\n runMetrics: {\n startedAt: new Date(runStartedAt).toISOString(),\n finishedAt: new Date(runFinishedAt).toISOString(),\n durationMs: runFinishedAt - runStartedAt\n },\n results\n };\n let viewerPath: string | undefined;\n if (outputPath) {\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await safeWriteFile(outputPath, JSON.stringify(output, null, 2), true);\n viewerPath = buildViewerPath(outputPath);\n await safeWriteFile(viewerPath, buildTrajectoryViewerHtml(output), true);\n }\n\n const summary = formatSummary(results, runFinishedAt - runStartedAt);\n return { summary, results, viewerPath };\n } finally {\n await client.stop();\n }\n}\n\ntype AskOptions = {\n prompt: string;\n model: string;\n systemMessage?: string;\n phase: EvalPhase;\n workingDirectory?: string;\n};\n\ntype AskResult = {\n content: string;\n metrics: AskMetrics;\n trajectory: TrajectoryEvent[];\n};\n\nasync function askOnce(client: CopilotClient, options: AskOptions): Promise<AskResult> {\n const session = await client.createSession({\n model: options.model,\n streaming: true,\n infiniteSessions: { enabled: false },\n systemMessage: options.systemMessage ? { content: options.systemMessage } : undefined,\n ...(options.workingDirectory ? { workingDirectory: options.workingDirectory } : {})\n });\n\n let content = \"\";\n const telemetry = createTelemetry(options.phase);\n const startedAt = Date.now();\n session.on((event: { type: string; data?: Record<string, unknown> }) => {\n captureTelemetryEvent(event, telemetry);\n if (event.type === \"assistant.message_delta\") {\n const delta = event.data?.deltaContent as string | undefined;\n if (delta) content += delta;\n }\n });\n\n await session.sendAndWait({ prompt: options.prompt }, 120000);\n await session.destroy();\n const finishedAt = Date.now();\n return {\n content: content.trim(),\n metrics: {\n durationMs: finishedAt - startedAt,\n tokenUsage: normalizeTokenUsage(telemetry.tokenUsage),\n toolCalls: telemetry.toolCalls\n },\n trajectory: telemetry.trajectory\n };\n}\n\ntype JudgeOptions = {\n model: string;\n prompt: string;\n expectation: string;\n withoutInstructions: string;\n withInstructions: string;\n};\n\ntype JudgeResult = {\n verdict: \"pass\" | \"fail\" | \"unknown\";\n score: number;\n rationale: string;\n};\n\nasync function judge(\n client: CopilotClient,\n options: JudgeOptions\n): Promise<{ result: JudgeResult; metrics: AskMetrics; trajectory: TrajectoryEvent[] }> {\n const session = await client.createSession({\n model: options.model,\n streaming: true,\n infiniteSessions: { enabled: false },\n systemMessage: {\n content:\n \"You are a strict evaluator. Return JSON with keys: verdict (pass|fail|unknown), score (0-100), rationale. Do not include any other text.\"\n }\n });\n\n let content = \"\";\n const telemetry = createTelemetry(\"judge\");\n const startedAt = Date.now();\n session.on((event: { type: string; data?: Record<string, unknown> }) => {\n captureTelemetryEvent(event, telemetry);\n if (event.type === \"assistant.message_delta\") {\n const delta = event.data?.deltaContent as string | undefined;\n if (delta) content += delta;\n }\n });\n\n const prompt = [\n \"Evaluate which response best matches the expectation.\",\n \"\",\n `Expectation: ${options.expectation}`,\n \"\",\n \"Response A (without custom instructions):\",\n options.withoutInstructions,\n \"\",\n \"Response B (with custom instructions):\",\n options.withInstructions,\n \"\",\n \"Return JSON only.\"\n ].join(\"\\n\");\n\n await session.sendAndWait({ prompt }, 120000);\n await session.destroy();\n\n const finishedAt = Date.now();\n return {\n result: parseJudge(content),\n metrics: {\n durationMs: finishedAt - startedAt,\n tokenUsage: normalizeTokenUsage(telemetry.tokenUsage),\n toolCalls: telemetry.toolCalls\n },\n trajectory: telemetry.trajectory\n };\n}\n\nfunction parseJudge(content: string): JudgeResult {\n try {\n const match = content.match(/\\{[\\s\\S]*\\}/);\n if (!match) throw new Error(\"No JSON detected\");\n const parsed = JSON.parse(match[0]) as JudgeResult;\n if (!parsed.verdict) throw new Error(\"Missing verdict\");\n return {\n verdict: parsed.verdict,\n score: Number(parsed.score ?? 0),\n rationale: String(parsed.rationale ?? \"\")\n };\n } catch {\n return {\n verdict: \"unknown\",\n score: 0,\n rationale: content.trim()\n };\n }\n}\n\nasync function loadConfig(configPath: string): Promise<EvalConfig> {\n const raw = await fs.readFile(configPath, \"utf8\");\n const parsed = JSON.parse(raw) as EvalConfig;\n if (!parsed || !Array.isArray(parsed.cases)) {\n throw new Error(\"Eval config must have a 'cases' array.\");\n }\n return parsed;\n}\n\nasync function readOptionalFile(filePath: string): Promise<string> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\nfunction buildPrompt(repoPath: string, userPrompt: string): string {\n return [\n \"You are working in this repository:\",\n repoPath,\n \"Use the file system tools when needed to inspect the codebase.\",\n \"\",\n userPrompt\n ].join(\"\\n\");\n}\n\nfunction formatSummary(results: EvalResult[], runDurationMs: number): string {\n const total = results.length;\n const passed = results.filter((r) => r.verdict === \"pass\").length;\n const failed = results.filter((r) => r.verdict === \"fail\").length;\n const unknown = results.filter((r) => r.verdict === \"unknown\").length;\n const totalUsage = aggregateTokenUsage(results);\n const hasUsage = Boolean(\n totalUsage.promptTokens || totalUsage.completionTokens || totalUsage.totalTokens\n );\n\n const lines = [\n `Eval results: ${passed}/${total} pass, ${failed} fail, ${unknown} unknown.`,\n `Runtime: ${formatDuration(runDurationMs)}.`,\n hasUsage ? `Token usage: ${formatTokenUsage(totalUsage)}.` : \"Token usage: unavailable.\"\n ];\n\n for (const result of results) {\n lines.push(`- ${result.id}: ${result.verdict ?? \"unknown\"} (score: ${result.score ?? 0})`);\n }\n\n return `\\n${lines.join(\"\\n\")}`;\n}\n\ntype TelemetryCollector = {\n trajectory: TrajectoryEvent[];\n tokenUsage: TokenUsage;\n toolCalls: ToolCallSummary;\n toolCallMap: Map<string, { name?: string; startMs: number }>;\n phase: EvalPhase;\n};\n\nfunction createTelemetry(phase: EvalPhase): TelemetryCollector {\n return {\n trajectory: [],\n tokenUsage: {},\n toolCalls: { count: 0, byName: {}, totalDurationMs: 0 },\n toolCallMap: new Map(),\n phase\n };\n}\n\nfunction captureTelemetryEvent(\n event: { type: string; data?: Record<string, unknown> },\n telemetry: TelemetryCollector\n): void {\n const timestampMs = Date.now();\n telemetry.trajectory.push({\n timestampMs,\n phase: telemetry.phase,\n type: event.type,\n data: sanitizeEventData(event.data)\n });\n\n if (event.type === \"tool.execution_start\") {\n const toolName = (event.data?.toolName as string | undefined) ?? \"unknown\";\n const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size);\n telemetry.toolCallMap.set(toolId, { name: toolName, startMs: timestampMs });\n telemetry.toolCalls.count += 1;\n telemetry.toolCalls.byName[toolName] = (telemetry.toolCalls.byName[toolName] ?? 0) + 1;\n } else if (event.type === \"tool.execution_finish\" || event.type === \"tool.execution_error\") {\n const toolName = (event.data?.toolName as string | undefined) ?? \"unknown\";\n const toolId = resolveToolId(event.data, toolName, telemetry.toolCallMap.size);\n const entry =\n telemetry.toolCallMap.get(toolId) ?? findLatestToolByName(telemetry.toolCallMap, toolName);\n if (entry) {\n const durationMs = timestampMs - entry.startMs;\n telemetry.toolCalls.totalDurationMs += durationMs;\n telemetry.toolCallMap.delete(toolId);\n }\n }\n\n const usage = extractTokenUsage(event.data);\n if (usage) {\n telemetry.tokenUsage = mergeTokenUsage(telemetry.tokenUsage, usage);\n }\n}\n\nfunction resolveToolId(\n data: Record<string, unknown> | undefined,\n toolName: string,\n index: number\n): string {\n const rawId = data?.executionId ?? data?.toolCallId ?? data?.callId ?? data?.id;\n if (typeof rawId === \"string\" || typeof rawId === \"number\") {\n return String(rawId);\n }\n return `${toolName}-${index + 1}`;\n}\n\nfunction findLatestToolByName(\n map: Map<string, { name?: string; startMs: number }>,\n toolName: string\n): { name?: string; startMs: number } | undefined {\n const entries = Array.from(map.values()).filter((entry) => entry.name === toolName);\n return entries.at(-1);\n}\n\nfunction extractTokenUsage(data: Record<string, unknown> | undefined): TokenUsage | null {\n if (!data) return null;\n const usage = findUsageObject(data);\n const promptTokens = getNumber(\n usage?.prompt_tokens ?? usage?.promptTokens ?? data.promptTokens ?? data.inputTokens\n );\n const completionTokens = getNumber(\n usage?.completion_tokens ??\n usage?.completionTokens ??\n data.completionTokens ??\n data.outputTokens\n );\n const totalTokens = getNumber(usage?.total_tokens ?? usage?.totalTokens ?? data.totalTokens);\n\n if (promptTokens == null && completionTokens == null && totalTokens == null) {\n return null;\n }\n\n return {\n promptTokens: promptTokens ?? undefined,\n completionTokens: completionTokens ?? undefined,\n totalTokens: totalTokens ?? undefined\n };\n}\n\nfunction findUsageObject(data: Record<string, unknown>): Record<string, unknown> | undefined {\n const direct = (data.usage ?? data.tokenUsage ?? data.tokens) as\n | Record<string, unknown>\n | undefined;\n if (direct) return direct;\n\n const candidates = [data.response, data.result, data.message, data.metrics, data.output];\n\n for (const candidate of candidates) {\n if (candidate && typeof candidate === \"object\") {\n const nested =\n (candidate as Record<string, unknown>).usage ??\n (candidate as Record<string, unknown>).tokenUsage;\n if (nested && typeof nested === \"object\") return nested as Record<string, unknown>;\n }\n }\n\n return scanForUsage(data, 0);\n}\n\nfunction scanForUsage(value: unknown, depth: number): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || depth > 4) return undefined;\n if (Array.isArray(value)) {\n for (const entry of value) {\n const found = scanForUsage(entry, depth + 1);\n if (found) return found;\n }\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n if (hasTokenFields(record)) return record;\n\n for (const entry of Object.values(record)) {\n const found = scanForUsage(entry, depth + 1);\n if (found) return found;\n }\n\n return undefined;\n}\n\nfunction hasTokenFields(record: Record<string, unknown>): boolean {\n const keys = Object.keys(record);\n return (\n keys.includes(\"prompt_tokens\") ||\n keys.includes(\"completion_tokens\") ||\n keys.includes(\"total_tokens\") ||\n keys.includes(\"promptTokens\") ||\n keys.includes(\"completionTokens\") ||\n keys.includes(\"totalTokens\") ||\n keys.includes(\"inputTokens\") ||\n keys.includes(\"outputTokens\")\n );\n}\n\nfunction getNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\n// The SDK reports cumulative token counts per session, so we keep the peak (max) value\n// rather than summing incremental deltas.\nfunction mergeTokenUsage(existing: TokenUsage, next: TokenUsage): TokenUsage {\n return {\n promptTokens: Math.max(existing.promptTokens ?? 0, next.promptTokens ?? 0) || undefined,\n completionTokens:\n Math.max(existing.completionTokens ?? 0, next.completionTokens ?? 0) || undefined,\n totalTokens: Math.max(existing.totalTokens ?? 0, next.totalTokens ?? 0) || undefined\n };\n}\n\nfunction normalizeTokenUsage(usage: TokenUsage): TokenUsage | undefined {\n if (!usage.promptTokens && !usage.completionTokens && !usage.totalTokens) return undefined;\n if (!usage.totalTokens) {\n const prompt = usage.promptTokens ?? 0;\n const completion = usage.completionTokens ?? 0;\n const total = prompt + completion;\n return {\n ...usage,\n totalTokens: total || undefined\n };\n }\n return usage;\n}\n\nfunction aggregateTokenUsage(results: EvalResult[]): TokenUsage {\n const total: TokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n for (const result of results) {\n const metrics = result.metrics;\n if (!metrics) continue;\n const usages = [\n metrics.withoutInstructions.tokenUsage,\n metrics.withInstructions.tokenUsage,\n metrics.judge.tokenUsage\n ];\n for (const usage of usages) {\n if (!usage) continue;\n total.promptTokens = (total.promptTokens ?? 0) + (usage.promptTokens ?? 0);\n total.completionTokens = (total.completionTokens ?? 0) + (usage.completionTokens ?? 0);\n total.totalTokens = (total.totalTokens ?? 0) + (usage.totalTokens ?? 0);\n }\n }\n return total;\n}\n\nfunction formatDuration(durationMs: number): string {\n const seconds = Math.round(durationMs / 100) / 10;\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remaining = Math.round((seconds % 60) * 10) / 10;\n return `${minutes}m ${remaining}s`;\n}\n\nfunction formatTokenUsage(usage: TokenUsage): string {\n const prompt = usage.promptTokens ?? 0;\n const completion = usage.completionTokens ?? 0;\n const total = usage.totalTokens ?? prompt + completion;\n return `prompt ${prompt}, completion ${completion}, total ${total}`;\n}\n\nfunction resolveOutputPath(\n repoPath: string,\n override?: string,\n configValue?: string\n): string | undefined {\n const chosen = override ?? configValue;\n if (!chosen) return undefined;\n return path.isAbsolute(chosen) ? chosen : path.resolve(repoPath, chosen);\n}\n\nfunction buildViewerPath(outputPath: string): string {\n if (outputPath.endsWith(\".json\")) {\n return outputPath.replace(/\\.json$/u, \".html\");\n }\n return `${outputPath}.html`;\n}\n\nfunction buildTrajectoryViewerHtml(data: Record<string, unknown>): string {\n const serialized = JSON.stringify(data).replace(/</g, \"\\\\u003c\");\n return `<!doctype html>\n<html lang=\"en\" data-theme=\"light\">\n<head>\n<meta charset=\"utf-8\" />\n<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline';\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<title>AgentRC Eval Results</title>\n<style>\n :root { --bg: #0d1117; --surface: #161b22; --surface2: #1c2128; --border: #30363d; --text: #e6edf3; --text2: #8b949e; --text3: #6e7681; --accent: #8b5cf6; --accent2: #a78bfa; --green: #3fb950; --green-bg: rgba(63,185,80,0.1); --red: #f85149; --red-bg: rgba(248,81,73,0.1); --yellow: #d29922; --yellow-bg: rgba(210,153,34,0.1); --blue: #58a6ff; --blue-bg: rgba(88,166,255,0.1); }\n [data-theme=\"light\"] { --bg: #ffffff; --surface: #f6f8fa; --surface2: #eaeef2; --border: #d0d7de; --text: #1f2328; --text2: #656d76; --text3: #8b949e; --accent: #8b5cf6; --accent2: #7c3aed; --green: #1a7f37; --green-bg: rgba(26,127,55,0.1); --red: #cf222e; --red-bg: rgba(207,34,46,0.1); --yellow: #9a6700; --yellow-bg: rgba(154,103,0,0.1); --blue: #0969da; --blue-bg: rgba(9,105,218,0.1); }\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; background: var(--bg); color: var(--text); line-height: 1.5; }\n\n /* Header */\n .header { padding: 24px 32px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; }\n .header-left { display: flex; align-items: center; gap: 16px; }\n .header h1 { font-size: 20px; font-weight: 600; }\n .header-meta { font-size: 13px; color: var(--text2); display: flex; gap: 16px; align-items: center; }\n .header-meta code { background: var(--surface); padding: 2px 8px; border-radius: 6px; border: 1px solid var(--border); font-size: 12px; }\n .theme-toggle { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 6px 12px; cursor: pointer; color: var(--text2); font-size: 13px; }\n .theme-toggle:hover { border-color: var(--accent); color: var(--text); }\n\n /* Hero metrics */\n .hero { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; padding: 24px 32px; }\n .hero-card { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 20px; }\n .hero-card .label { font-size: 12px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text2); margin-bottom: 4px; }\n .hero-card .value { font-size: 28px; font-weight: 700; }\n .hero-card .sub { font-size: 12px; color: var(--text3); margin-top: 4px; }\n .delta { font-size: 13px; font-weight: 600; margin-left: 8px; }\n .delta.better { color: var(--green); }\n .delta.worse { color: var(--red); }\n .delta.neutral { color: var(--text3); }\n\n /* Section */\n .section { padding: 0 32px 24px; }\n .section-title { font-size: 16px; font-weight: 600; margin-bottom: 16px; padding-top: 24px; border-top: 1px solid var(--border); display: flex; align-items: center; gap: 8px; }\n\n /* Comparison table */\n .comparison-table { width: 100%; border-collapse: separate; border-spacing: 0; border: 1px solid var(--border); border-radius: 12px; overflow: hidden; }\n .comparison-table th { background: var(--surface); font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text2); padding: 12px 16px; text-align: left; border-bottom: 1px solid var(--border); }\n .comparison-table td { padding: 14px 16px; border-bottom: 1px solid var(--border); font-size: 14px; vertical-align: top; }\n .comparison-table tr:last-child td { border-bottom: none; }\n .comparison-table tr:hover td { background: var(--surface); }\n .case-id { font-weight: 600; }\n .verdict-badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 10px; border-radius: 999px; font-size: 12px; font-weight: 600; }\n .verdict-badge.pass { background: var(--green-bg); color: var(--green); }\n .verdict-badge.fail { background: var(--red-bg); color: var(--red); }\n .verdict-badge.unknown { background: var(--yellow-bg); color: var(--yellow); }\n .score-bar { width: 60px; height: 6px; background: var(--surface2); border-radius: 3px; overflow: hidden; display: inline-block; vertical-align: middle; margin-right: 6px; }\n .score-fill { height: 100%; border-radius: 3px; }\n .metric-pair { display: flex; gap: 4px; align-items: baseline; }\n .metric-old { color: var(--text3); text-decoration: line-through; font-size: 12px; }\n .metric-new { font-weight: 600; }\n\n /* Impact bar chart */\n .impact-bars { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n .impact-card { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 20px; }\n .impact-card h3 { font-size: 13px; font-weight: 600; color: var(--text2); margin-bottom: 12px; text-transform: uppercase; letter-spacing: 0.05em; }\n .bar-row { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }\n .bar-label { font-size: 13px; min-width: 80px; color: var(--text2); text-align: right; }\n .bar-track { flex: 1; height: 24px; background: var(--surface2); border-radius: 6px; overflow: hidden; position: relative; }\n .bar-fill { height: 100%; border-radius: 6px; transition: width 0.3s; display: flex; align-items: center; justify-content: flex-end; padding-right: 8px; font-size: 11px; font-weight: 600; color: white; min-width: 40px; }\n .bar-fill.without { background: var(--text3); }\n .bar-fill.with { background: var(--accent); }\n .bar-legend { display: flex; gap: 16px; margin-bottom: 12px; }\n .bar-legend span { font-size: 12px; color: var(--text2); display: flex; align-items: center; gap: 4px; }\n .bar-legend .dot { width: 10px; height: 10px; border-radius: 3px; }\n\n /* Case details */\n .case-detail { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; margin-bottom: 16px; overflow: hidden; }\n .case-detail-header { padding: 16px 20px; cursor: pointer; display: flex; align-items: center; justify-content: space-between; }\n .case-detail-header:hover { background: var(--surface2); }\n .case-detail-body { display: none; padding: 0 20px 20px; }\n .case-detail.open .case-detail-body { display: block; }\n .case-detail .chevron { transition: transform 0.2s; color: var(--text3); }\n .case-detail.open .chevron { transform: rotate(90deg); }\n\n .response-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 16px; }\n .response-col h4 { font-size: 13px; font-weight: 600; color: var(--text2); margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.05em; }\n .response-col pre { background: var(--bg); border: 1px solid var(--border); border-radius: 8px; padding: 16px; font-size: 13px; white-space: pre-wrap; word-break: break-word; max-height: 300px; overflow-y: auto; line-height: 1.6; }\n .rationale { background: var(--blue-bg); border: 1px solid var(--blue); border-radius: 8px; padding: 12px 16px; margin-top: 12px; font-size: 13px; color: var(--text); }\n .rationale strong { color: var(--blue); }\n .prompt-text { font-size: 14px; color: var(--text); margin-bottom: 4px; }\n .expect-text { font-size: 13px; color: var(--text2); margin-top: 4px; }\n\n .metric-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }\n .metric-chip { background: var(--surface2); border: 1px solid var(--border); border-radius: 8px; padding: 6px 12px; font-size: 12px; }\n .metric-chip .chip-label { color: var(--text3); margin-right: 4px; }\n .metric-chip .chip-value { font-weight: 600; color: var(--text); }\n\n /* Responsive */\n @media (max-width: 768px) {\n .hero { grid-template-columns: 1fr 1fr; }\n .impact-bars { grid-template-columns: 1fr; }\n .response-grid { grid-template-columns: 1fr; }\n .header { flex-direction: column; gap: 12px; align-items: flex-start; }\n }\n</style>\n</head>\n<body>\n<div class=\"header\">\n <div class=\"header-left\">\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 16 16\" fill=\"currentColor\" style=\"color:var(--accent)\"><path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"/></svg>\n <div>\n <h1>Eval Results</h1>\n <div class=\"header-meta\" id=\"headerMeta\"></div>\n </div>\n </div>\n <button class=\"theme-toggle\" onclick=\"toggleTheme()\">Toggle theme</button>\n</div>\n\n<div class=\"hero\" id=\"heroCards\"></div>\n\n<div class=\"section\">\n <div class=\"section-title\">Impact of Instructions</div>\n <div class=\"impact-bars\" id=\"impactBars\"></div>\n</div>\n\n<div class=\"section\">\n <div class=\"section-title\">Results by Case</div>\n <table class=\"comparison-table\" id=\"comparisonTable\"></table>\n</div>\n\n<div class=\"section\">\n <div class=\"section-title\">Case Details</div>\n <div id=\"caseDetails\"></div>\n</div>\n\n<script>\nconst data = ${serialized};\nconst results = data.results || [];\nconst esc = s => String(s??'').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;').replace(/'/g,'&#039;');\n\nfunction toggleTheme() {\n const html = document.documentElement;\n html.dataset.theme = html.dataset.theme === 'dark' ? 'light' : 'dark';\n}\n\n// Aggregates\nconst agg = { passCount: 0, failCount: 0, totalScore: 0, totalWithoutDur: 0, totalWithDur: 0, totalWithoutTokens: 0, totalWithTokens: 0, totalWithoutTools: 0, totalWithTools: 0 };\nresults.forEach(r => {\n if (r.verdict === 'pass') agg.passCount++;\n else agg.failCount++;\n agg.totalScore += (r.score ?? 0);\n const m = r.metrics || {};\n const wo = m.withoutInstructions || {};\n const wi = m.withInstructions || {};\n agg.totalWithoutDur += (wo.durationMs || 0);\n agg.totalWithDur += (wi.durationMs || 0);\n agg.totalWithoutTokens += (wo.tokenUsage?.totalTokens || 0);\n agg.totalWithTokens += (wi.tokenUsage?.totalTokens || 0);\n agg.totalWithoutTools += (wo.toolCalls?.count || 0);\n agg.totalWithTools += (wi.toolCalls?.count || 0);\n});\n\nconst avgScore = results.length ? Math.round(agg.totalScore / results.length) : 0;\nconst durDelta = agg.totalWithoutDur ? Math.round((agg.totalWithDur - agg.totalWithoutDur) / agg.totalWithoutDur * 100) : 0;\nconst tokenDelta = agg.totalWithoutTokens ? Math.round((agg.totalWithTokens - agg.totalWithoutTokens) / agg.totalWithoutTokens * 100) : 0;\nconst toolDelta = agg.totalWithoutTools ? Math.round((agg.totalWithTools - agg.totalWithoutTools) / agg.totalWithoutTools * 100) : 0;\nconst runDuration = data.runMetrics?.durationMs || 0;\n\nfunction deltaTag(val, invertBetter) {\n const sign = val > 0 ? '+' : '';\n const cls = val === 0 ? 'neutral' : (invertBetter ? (val > 0 ? 'worse' : 'better') : (val > 0 ? 'better' : 'worse'));\n return '<span class=\"delta ' + cls + '\">' + sign + val + '%</span>';\n}\n\nfunction fmtMs(ms) { return ms < 1000 ? ms + 'ms' : (ms / 1000).toFixed(1) + 's'; }\nfunction fmtTokens(n) { return n >= 1000 ? (n / 1000).toFixed(1) + 'k' : String(n); }\n\n// Header\ndocument.getElementById('headerMeta').innerHTML =\n '<code>' + esc(data.model) + '</code>' +\n '<span>Judge: <code>' + esc(data.judgeModel) + '</code></span>' +\n '<span>' + esc(data.repoPath?.split('/').pop()) + '</span>' +\n '<span>' + fmtMs(runDuration) + ' total</span>';\n\n// Hero cards\nconst heroData = [\n { label: 'Pass Rate', value: agg.passCount + '/' + results.length, sub: agg.failCount > 0 ? agg.failCount + ' failed' : 'All passing', color: agg.failCount === 0 ? 'var(--green)' : 'var(--yellow)' },\n { label: 'Avg Score', value: avgScore, sub: 'out of 100', color: avgScore >= 80 ? 'var(--green)' : avgScore >= 50 ? 'var(--yellow)' : 'var(--red)' },\n { label: 'Speed Impact', value: deltaTag(durDelta, true), sub: fmtMs(agg.totalWithoutDur) + ' → ' + fmtMs(agg.totalWithDur), color: 'var(--text)' },\n { label: 'Token Impact', value: deltaTag(tokenDelta, true), sub: fmtTokens(agg.totalWithoutTokens) + ' → ' + fmtTokens(agg.totalWithTokens), color: 'var(--text)' },\n { label: 'Tool Calls', value: deltaTag(toolDelta, true), sub: agg.totalWithoutTools + ' → ' + agg.totalWithTools + ' calls', color: 'var(--text)' },\n];\ndocument.getElementById('heroCards').innerHTML = heroData.map(h =>\n '<div class=\"hero-card\"><div class=\"label\">' + h.label + '</div>' +\n '<div class=\"value\" style=\"color:' + h.color + '\">' + h.value + '</div>' +\n '<div class=\"sub\">' + h.sub + '</div></div>'\n).join('');\n\n// Impact bars\nfunction renderImpactBars() {\n const maxDur = Math.max(...results.map(r => Math.max(r.metrics?.withoutInstructions?.durationMs || 0, r.metrics?.withInstructions?.durationMs || 0)), 1);\n const maxTok = Math.max(...results.map(r => Math.max(r.metrics?.withoutInstructions?.tokenUsage?.totalTokens || 0, r.metrics?.withInstructions?.tokenUsage?.totalTokens || 0)), 1);\n\n const legend = '<div class=\"bar-legend\"><span><span class=\"dot\" style=\"background:var(--text3)\"></span> Without instructions</span><span><span class=\"dot\" style=\"background:var(--accent)\"></span> With instructions</span></div>';\n\n let durHtml = '<div class=\"impact-card\"><h3>Response Time</h3>' + legend;\n let tokHtml = '<div class=\"impact-card\"><h3>Token Usage</h3>' + legend;\n results.forEach(r => {\n const m = r.metrics || {};\n const woDur = m.withoutInstructions?.durationMs || 0;\n const wiDur = m.withInstructions?.durationMs || 0;\n const woTok = m.withoutInstructions?.tokenUsage?.totalTokens || 0;\n const wiTok = m.withInstructions?.tokenUsage?.totalTokens || 0;\n\n durHtml += '<div class=\"bar-row\"><div class=\"bar-label\">' + esc(r.id) + '</div><div class=\"bar-track\">' +\n '<div class=\"bar-fill without\" style=\"width:' + (woDur/maxDur*100) + '%\">' + fmtMs(woDur) + '</div></div></div>' +\n '<div class=\"bar-row\"><div class=\"bar-label\"></div><div class=\"bar-track\">' +\n '<div class=\"bar-fill with\" style=\"width:' + (wiDur/maxDur*100) + '%\">' + fmtMs(wiDur) + '</div></div></div>';\n\n tokHtml += '<div class=\"bar-row\"><div class=\"bar-label\">' + esc(r.id) + '</div><div class=\"bar-track\">' +\n '<div class=\"bar-fill without\" style=\"width:' + (woTok/maxTok*100) + '%\">' + fmtTokens(woTok) + '</div></div></div>' +\n '<div class=\"bar-row\"><div class=\"bar-label\"></div><div class=\"bar-track\">' +\n '<div class=\"bar-fill with\" style=\"width:' + (wiTok/maxTok*100) + '%\">' + fmtTokens(wiTok) + '</div></div></div>';\n });\n durHtml += '</div>';\n tokHtml += '</div>';\n document.getElementById('impactBars').innerHTML = durHtml + tokHtml;\n}\nrenderImpactBars();\n\n// Comparison table\nfunction renderTable() {\n let html = '<thead><tr><th>Case</th><th>Verdict</th><th>Score</th><th>Speed</th><th>Tokens</th><th>Tool Calls</th></tr></thead><tbody>';\n results.forEach(r => {\n const m = r.metrics || {};\n const wo = m.withoutInstructions || {};\n const wi = m.withInstructions || {};\n const woDur = wo.durationMs || 0;\n const wiDur = wi.durationMs || 0;\n const woTok = wo.tokenUsage?.totalTokens || 0;\n const wiTok = wi.tokenUsage?.totalTokens || 0;\n const woTools = wo.toolCalls?.count || 0;\n const wiTools = wi.toolCalls?.count || 0;\n const durPct = woDur ? Math.round((wiDur - woDur) / woDur * 100) : 0;\n const tokPct = woTok ? Math.round((wiTok - woTok) / woTok * 100) : 0;\n const toolPct = woTools ? Math.round((wiTools - woTools) / woTools * 100) : 0;\n const score = r.score ?? 0;\n const scoreColor = score >= 80 ? 'var(--green)' : score >= 50 ? 'var(--yellow)' : 'var(--red)';\n\n html += '<tr>' +\n '<td class=\"case-id\">' + esc(r.id) + '</td>' +\n '<td><span class=\"verdict-badge ' + (r.verdict || 'unknown') + '\">' + (r.verdict === 'pass' ? '✓' : r.verdict === 'fail' ? '✗' : '?') + ' ' + (r.verdict || 'unknown') + '</span></td>' +\n '<td><div class=\"score-bar\"><div class=\"score-fill\" style=\"width:' + score + '%;background:' + scoreColor + '\"></div></div>' + score + '</td>' +\n '<td><div class=\"metric-pair\"><span class=\"metric-old\">' + fmtMs(woDur) + '</span><span class=\"metric-new\">' + fmtMs(wiDur) + '</span>' + deltaTag(durPct, true) + '</div></td>' +\n '<td><div class=\"metric-pair\"><span class=\"metric-old\">' + fmtTokens(woTok) + '</span><span class=\"metric-new\">' + fmtTokens(wiTok) + '</span>' + deltaTag(tokPct, true) + '</div></td>' +\n '<td><div class=\"metric-pair\"><span class=\"metric-old\">' + woTools + '</span><span class=\"metric-new\">' + wiTools + '</span>' + deltaTag(toolPct, true) + '</div></td>' +\n '</tr>';\n });\n html += '</tbody>';\n document.getElementById('comparisonTable').innerHTML = html;\n}\nrenderTable();\n\n// Case details (expandable)\nfunction renderCaseDetails() {\n let html = '';\n results.forEach(r => {\n const m = r.metrics || {};\n const wo = m.withoutInstructions || {};\n const wi = m.withInstructions || {};\n const score = r.score ?? 0;\n const scoreColor = score >= 80 ? 'var(--green)' : score >= 50 ? 'var(--yellow)' : 'var(--red)';\n\n html += '<div class=\"case-detail\" id=\"detail-' + esc(r.id) + '\">' +\n '<div class=\"case-detail-header\" onclick=\"this.parentElement.classList.toggle(&#39;open&#39;)\">' +\n '<div style=\"display:flex;align-items:center;gap:12px\">' +\n '<span class=\"chevron\">▶</span>' +\n '<span class=\"case-id\">' + esc(r.id) + '</span>' +\n '<span class=\"verdict-badge ' + (r.verdict || 'unknown') + '\">' + (r.verdict === 'pass' ? '✓' : '✗') + ' ' + (r.verdict || 'unknown') + '</span>' +\n '<span style=\"color:' + scoreColor + ';font-weight:600\">' + score + '</span>' +\n '</div>' +\n '<div class=\"metric-chips\">' +\n '<div class=\"metric-chip\"><span class=\"chip-label\">Speed</span><span class=\"chip-value\">' + fmtMs(wi.durationMs || 0) + '</span></div>' +\n '<div class=\"metric-chip\"><span class=\"chip-label\">Tokens</span><span class=\"chip-value\">' + fmtTokens(wi.tokenUsage?.totalTokens || 0) + '</span></div>' +\n '<div class=\"metric-chip\"><span class=\"chip-label\">Tools</span><span class=\"chip-value\">' + (wi.toolCalls?.count || 0) + '</span></div>' +\n '</div>' +\n '</div>' +\n '<div class=\"case-detail-body\">' +\n '<div class=\"prompt-text\"><strong>Prompt:</strong> ' + esc(r.prompt) + '</div>' +\n '<div class=\"expect-text\"><strong>Expected:</strong> ' + esc(r.expectation) + '</div>' +\n (r.rationale ? '<div class=\"rationale\"><strong>Judge rationale:</strong> ' + esc(r.rationale) + '</div>' : '') +\n '<div class=\"response-grid\">' +\n '<div class=\"response-col\"><h4>Without Instructions</h4>' +\n '<div class=\"metric-chips\" style=\"margin-bottom:8px\">' +\n '<div class=\"metric-chip\"><span class=\"chip-label\">Time</span><span class=\"chip-value\">' + fmtMs(wo.durationMs || 0) + '</span></div>' +\n '<div class=\"metric-chip\"><span class=\"chip-label\">Tokens</span><span class=\"chip-value\">' + fmtTokens(wo.tokenUsage?.totalTokens || 0) + '</span></div>' +\n '<div class=\"metric-chip\"><span class=\"chip-label\">Tools</span><span class=\"chip-value\">' + (wo.toolCalls?.count || 0) + '</span></div>' +\n '</div>' +\n '<pre>' + esc(r.withoutInstructions || 'No response') + '</pre>' +\n '</div>' +\n '<div class=\"response-col\"><h4>With Instructions</h4>' +\n '<div class=\"metric-chips\" style=\"margin-bottom:8px\">' +\n '<div class=\"metric-chip\"><span class=\"chip-label\">Time</span><span class=\"chip-value\">' + fmtMs(wi.durationMs || 0) + '</span></div>' +\n '<div class=\"metric-chip\"><span class=\"chip-label\">Tokens</span><span class=\"chip-value\">' + fmtTokens(wi.tokenUsage?.totalTokens || 0) + '</span></div>' +\n '<div class=\"metric-chip\"><span class=\"chip-label\">Tools</span><span class=\"chip-value\">' + (wi.toolCalls?.count || 0) + '</span></div>' +\n '</div>' +\n '<pre>' + esc(r.withInstructions || 'No response') + '</pre>' +\n '</div>' +\n '</div>' +\n '</div>' +\n '</div>';\n });\n document.getElementById('caseDetails').innerHTML = html;\n}\nrenderCaseDetails();\n</script>\n</body>\n</html>`;\n}\n\nfunction sanitizeEventData(\n data: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (!data) return undefined;\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (key === \"deltaContent\" && typeof value === \"string\") {\n sanitized.deltaChars = value.length;\n sanitized.deltaPreview = value.slice(0, 120);\n continue;\n }\n sanitized[key] = sanitizeValue(value, 0);\n }\n return sanitized;\n}\n\nfunction sanitizeValue(value: unknown, depth: number): unknown {\n if (depth > 4) return \"[depth-limit]\";\n if (typeof value === \"string\") {\n return value.length > 2000 ? `${value.slice(0, 2000)}…` : value;\n }\n if (Array.isArray(value)) {\n return value.slice(0, 50).map((entry) => sanitizeValue(entry, depth + 1));\n }\n if (value && typeof value === \"object\") {\n const obj: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n obj[key] = sanitizeValue(entry, depth + 1);\n }\n return obj;\n }\n return value;\n}\n","import path from \"path\";\n\nimport { analyzeRepo } from \"@agentrc/core/services/analyzer\";\nimport type { FileAction } from \"@agentrc/core/services/generator\";\nimport { generateConfigs } from \"@agentrc/core/services/generator\";\nimport type { CommandResult } from \"@agentrc/core/utils/output\";\nimport { outputResult, outputError, deriveFileStatus, shouldLog } from \"@agentrc/core/utils/output\";\n\nimport { instructionsCommand } from \"./instructions\";\n\ntype GenerateOptions = {\n force?: boolean;\n perApp?: boolean;\n model?: string;\n json?: boolean;\n quiet?: boolean;\n strategy?: string;\n};\n\nexport async function generateCommand(\n type: string,\n repoPathArg: string | undefined,\n options: GenerateOptions\n): Promise<void> {\n const repoPath = path.resolve(repoPathArg ?? process.cwd());\n\n if (type === \"instructions\" || type === \"agents\") {\n // Delegate to the canonical instructions command\n const output = type === \"agents\" ? path.join(repoPath, \"AGENTS.md\") : undefined;\n await instructionsCommand({\n repo: repoPath,\n output,\n force: options.force,\n model: options.model,\n json: options.json,\n quiet: options.quiet,\n areas: options.perApp,\n strategy: options.strategy\n });\n return;\n }\n\n let analysis;\n try {\n analysis = await analyzeRepo(repoPath);\n } catch (error) {\n outputError(\n `Failed to analyze repo: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n return;\n }\n\n const selections = [type];\n let genResult;\n try {\n genResult = await generateConfigs({\n repoPath,\n analysis,\n selections,\n force: Boolean(options.force)\n });\n } catch (error) {\n outputError(\n `Failed to generate configs: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n return;\n }\n\n if (options.json) {\n const { ok, status } = deriveFileStatus(genResult.files);\n const result: CommandResult<{ type: string; files: FileAction[] }> = {\n ok,\n status,\n data: { type, files: genResult.files }\n };\n outputResult(result, true);\n if (!ok) process.exitCode = 1;\n } else {\n for (const file of genResult.files) {\n if (shouldLog(options)) {\n process.stderr.write(`${file.action === \"wrote\" ? \"Wrote\" : \"Skipped\"} ${file.path}\\n`);\n }\n }\n if (genResult.files.length === 0 && shouldLog(options)) {\n process.stderr.write(\"No changes made.\\n\");\n }\n }\n}\n","import path from \"path\";\n\nimport { ensureDir, safeWriteFile } from \"../utils/fs\";\n\nimport type { RepoAnalysis } from \"./analyzer\";\n\nexport type FileAction = {\n path: string;\n action: \"wrote\" | \"skipped\" | \"symlink\" | \"empty\";\n};\n\nexport type GenerateResult = {\n files: FileAction[];\n};\n\nexport type GenerateOptions = {\n repoPath: string;\n analysis: RepoAnalysis;\n selections: string[];\n force: boolean;\n};\n\nexport async function generateConfigs(options: GenerateOptions): Promise<GenerateResult> {\n const { repoPath, analysis, selections, force } = options;\n const files: FileAction[] = [];\n\n if (selections.includes(\"mcp\")) {\n const filePath = path.join(repoPath, \".vscode\", \"mcp.json\");\n await ensureDir(path.dirname(filePath));\n const content = renderMcp();\n const { wrote } = await safeWriteFile(filePath, content, force);\n files.push({\n path: path.relative(process.cwd(), filePath),\n action: wrote ? \"wrote\" : \"skipped\"\n });\n }\n\n if (selections.includes(\"vscode\")) {\n const filePath = path.join(repoPath, \".vscode\", \"settings.json\");\n await ensureDir(path.dirname(filePath));\n const content = renderVscodeSettings(analysis);\n const { wrote } = await safeWriteFile(filePath, content, force);\n files.push({\n path: path.relative(process.cwd(), filePath),\n action: wrote ? \"wrote\" : \"skipped\"\n });\n }\n\n return { files };\n}\n\nfunction renderMcp(): string {\n return JSON.stringify(\n {\n servers: {\n github: {\n command: \"npx\",\n args: [\"-y\", \"@modelcontextprotocol/server-github\"],\n env: {\n GITHUB_PERSONAL_ACCESS_TOKEN: \"${input:github_token}\"\n }\n },\n filesystem: {\n command: \"npx\",\n args: [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"${workspaceFolder}\"]\n }\n },\n inputs: [\n {\n id: \"github_token\",\n type: \"promptString\",\n description: \"GitHub Personal Access Token\"\n }\n ]\n },\n null,\n 2\n );\n}\n\nfunction renderVscodeSettings(analysis: RepoAnalysis): string {\n const reviewFocus = analysis.frameworks.length\n ? `Focus on ${analysis.frameworks.join(\", \")} best practices and repo conventions.`\n : \"Focus on repo conventions and maintainability.\";\n\n return JSON.stringify(\n {\n \"github.copilot.chat.codeGeneration.instructions\": [\n { file: \".github/copilot-instructions.md\" }\n ],\n \"github.copilot.chat.reviewSelection.instructions\": [{ text: reviewFocus }],\n \"chat.promptFiles\": true,\n \"chat.mcp.enabled\": true\n },\n null,\n 2\n );\n}\n","import path from \"path\";\n\nimport { analyzeRepo, loadAgentrcConfig } from \"@agentrc/core/services/analyzer\";\nimport type { InstructionStrategy } from \"@agentrc/core/services/instructions\";\nimport {\n generateCopilotInstructions,\n generateAreaInstructions,\n generateNestedInstructions,\n generateNestedAreaInstructions,\n writeAreaInstruction,\n writeNestedInstructions\n} from \"@agentrc/core/services/instructions\";\nimport { ensureDir, safeWriteFile } from \"@agentrc/core/utils/fs\";\nimport type { CommandResult } from \"@agentrc/core/utils/output\";\nimport {\n outputResult,\n outputError,\n createProgressReporter,\n shouldLog\n} from \"@agentrc/core/utils/output\";\n\nfunction skipReason(action: string): string {\n if (action === \"symlink\") return \"symlink\";\n if (action === \"empty\") return \"empty content\";\n return \"exists, use --force\";\n}\n\ntype InstructionsOptions = {\n repo?: string;\n output?: string;\n model?: string;\n json?: boolean;\n quiet?: boolean;\n force?: boolean;\n areas?: boolean;\n areasOnly?: boolean;\n area?: string;\n strategy?: string;\n claudeMd?: boolean;\n};\n\nexport async function instructionsCommand(options: InstructionsOptions): Promise<void> {\n const repoPath = path.resolve(options.repo ?? process.cwd());\n const outputPath = path.resolve(\n options.output ?? path.join(repoPath, \".github\", \"copilot-instructions.md\")\n );\n const progress = createProgressReporter(!shouldLog(options));\n const wantAreas = options.areas || options.areasOnly || options.area;\n\n // Load config for strategy merge (CLI flag > config > default \"flat\")\n let strategy: InstructionStrategy = \"flat\";\n let detailDir = \".agents\";\n let claudeMd = false;\n try {\n const config = await loadAgentrcConfig(repoPath);\n strategy = (options.strategy as InstructionStrategy) ?? config?.strategy ?? \"flat\";\n detailDir = config?.detailDir ?? \".agents\";\n claudeMd = options.claudeMd ?? config?.claudeMd ?? false;\n } catch {\n // Config loading failure is non-fatal; use defaults\n if (options.strategy === \"flat\" || options.strategy === \"nested\") {\n strategy = options.strategy;\n }\n if (options.claudeMd) claudeMd = true;\n }\n\n // Validate strategy value\n if (strategy !== \"flat\" && strategy !== \"nested\") {\n outputError(`Invalid strategy \"${strategy}\". Use \"flat\" or \"nested\".`, Boolean(options.json));\n return;\n }\n\n try {\n // Generate root instructions unless --areas-only\n if (!options.areasOnly && !options.area) {\n if (strategy === \"nested\") {\n // Nested: generate AGENTS.md hub + detail files\n try {\n progress.update(\"Generating nested instructions...\");\n const nestedResult = await generateNestedInstructions({\n repoPath,\n model: options.model,\n onProgress: shouldLog(options) ? (msg) => progress.update(msg) : undefined,\n detailDir,\n claudeMd\n });\n const actions = await writeNestedInstructions(repoPath, nestedResult, options.force);\n for (const action of actions) {\n const relPath = path.relative(process.cwd(), action.path);\n if (action.action === \"wrote\") {\n if (shouldLog(options)) progress.succeed(`Wrote ${relPath}`);\n } else if (shouldLog(options)) {\n progress.update(`Skipped ${relPath} (${skipReason(action.action)})`);\n }\n }\n for (const warning of nestedResult.warnings) {\n if (shouldLog(options)) progress.update(`Warning: ${warning}`);\n }\n if (options.json) {\n const result: CommandResult<{ files: typeof actions }> = {\n ok: true,\n status: \"success\",\n data: { files: actions }\n };\n outputResult(result, true);\n }\n } catch (error) {\n const msg =\n \"Failed to generate nested instructions. \" +\n (error instanceof Error ? error.message : String(error));\n outputError(msg, Boolean(options.json));\n if (!wantAreas) return;\n }\n } else {\n // Flat: existing behavior\n let content = \"\";\n try {\n progress.update(\"Generating instructions...\");\n content = await generateCopilotInstructions({\n repoPath,\n model: options.model\n });\n } catch (error) {\n const msg =\n \"Failed to generate instructions with Copilot SDK. \" +\n \"Ensure the Copilot CLI is installed (copilot --version) and logged in. \" +\n (error instanceof Error ? error.message : String(error));\n outputError(msg, Boolean(options.json));\n if (!wantAreas) return;\n }\n if (!content && !wantAreas) {\n outputError(\"No instructions were generated.\", Boolean(options.json));\n return;\n }\n\n if (content) {\n await ensureDir(path.dirname(outputPath));\n const { wrote, reason } = await safeWriteFile(\n outputPath,\n content,\n Boolean(options.force)\n );\n\n if (!wrote) {\n const relPath = path.relative(process.cwd(), outputPath);\n const why = reason === \"symlink\" ? \"path is a symlink\" : \"file exists (use --force)\";\n if (options.json) {\n const result: CommandResult<{ outputPath: string; skipped: true; reason: string }> = {\n ok: true,\n status: \"noop\",\n data: { outputPath, skipped: true, reason: why }\n };\n outputResult(result, true);\n } else if (shouldLog(options)) {\n progress.update(`Skipped ${relPath}: ${why}`);\n }\n } else {\n const byteCount = Buffer.byteLength(content, \"utf8\");\n\n if (options.json) {\n const result: CommandResult<{\n outputPath: string;\n model: string;\n byteCount: number;\n }> = {\n ok: true,\n status: \"success\",\n data: { outputPath, model: options.model ?? \"default\", byteCount }\n };\n outputResult(result, true);\n } else if (shouldLog(options)) {\n progress.succeed(`Updated ${path.relative(process.cwd(), outputPath)}`);\n }\n }\n }\n }\n }\n\n // Generate area-based instructions\n if (wantAreas) {\n let analysis;\n try {\n analysis = await analyzeRepo(repoPath);\n } catch (error) {\n outputError(\n `Failed to analyze repository: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n return;\n }\n const areas = analysis.areas ?? [];\n\n if (areas.length === 0) {\n if (shouldLog(options)) {\n progress.update(\"No areas detected. Use agentrc.config.json to define custom areas.\");\n }\n return;\n }\n\n const areaFilter = options.area?.toLowerCase();\n const targetAreas = areaFilter\n ? areas.filter((a) => a.name.toLowerCase() === areaFilter)\n : areas;\n\n if (options.area && targetAreas.length === 0) {\n outputError(\n `Area \"${options.area}\" not found. Available: ${areas.map((a) => a.name).join(\", \")}`,\n Boolean(options.json)\n );\n return;\n }\n\n if (shouldLog(options)) {\n progress.update(`Generating file-based instructions for ${targetAreas.length} area(s)...`);\n }\n\n for (const area of targetAreas) {\n try {\n if (shouldLog(options)) {\n progress.update(\n `Generating for \"${area.name}\" (${Array.isArray(area.applyTo) ? area.applyTo.join(\", \") : area.applyTo})...`\n );\n }\n\n if (strategy === \"nested\") {\n // Nested: per-area AGENTS.md hub + detail files\n const childAreas = areas.filter((a) => a.parentArea === area.name);\n const nestedResult = await generateNestedAreaInstructions({\n repoPath,\n area,\n childAreas,\n model: options.model,\n onProgress: shouldLog(options) ? (msg) => progress.update(msg) : undefined,\n detailDir,\n claudeMd\n });\n const actions = await writeNestedInstructions(repoPath, nestedResult, options.force);\n for (const action of actions) {\n const relPath = path.relative(process.cwd(), action.path);\n if (action.action === \"wrote\") {\n if (shouldLog(options)) progress.succeed(`Wrote ${relPath}`);\n } else if (shouldLog(options)) {\n progress.update(`Skipped ${relPath} (${skipReason(action.action)})`);\n }\n }\n for (const warning of nestedResult.warnings) {\n if (shouldLog(options)) progress.update(`Warning: ${warning}`);\n }\n } else {\n // Flat: existing behavior\n const body = await generateAreaInstructions({\n repoPath,\n area,\n model: options.model,\n onProgress: shouldLog(options) ? (msg) => progress.update(msg) : undefined\n });\n\n if (!body.trim()) {\n if (shouldLog(options)) {\n progress.update(`Skipped \"${area.name}\" — no content generated.`);\n }\n continue;\n }\n\n const result = await writeAreaInstruction(repoPath, area, body, options.force);\n if (result.status === \"skipped\") {\n if (shouldLog(options)) {\n progress.update(`Skipped \"${area.name}\" — file exists (use --force to overwrite).`);\n }\n continue;\n }\n if (result.status === \"symlink\") {\n if (shouldLog(options)) {\n progress.update(`Skipped \"${area.name}\" — path is a symlink.`);\n }\n continue;\n }\n if (shouldLog(options)) {\n progress.succeed(`Wrote ${path.relative(process.cwd(), result.filePath)}`);\n }\n }\n } catch (error) {\n if (shouldLog(options)) {\n progress.update(\n `Failed for \"${area.name}\": ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n }\n\n if (!wantAreas && shouldLog(options) && !options.json) {\n process.stderr.write(\"\\nNext steps:\\n\");\n process.stderr.write(\" agentrc eval --init Scaffold evaluation test cases\\n\");\n process.stderr.write(\" agentrc generate mcp Generate MCP configuration\\n\");\n process.stderr.write(\" agentrc generate vscode Generate VS Code settings\\n\");\n }\n } catch (error) {\n outputError(\n `Instructions failed: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n }\n}\n","import path from \"path\";\n\nimport { analyzeRepo, detectWorkspaces } from \"@agentrc/core/services/analyzer\";\nimport type { AgentrcConfig, AgentrcConfigArea } from \"@agentrc/core/services/analyzer\";\nimport type {\n AzureDevOpsOrg,\n AzureDevOpsProject,\n AzureDevOpsRepo\n} from \"@agentrc/core/services/azureDevops\";\nimport {\n getAzureDevOpsToken,\n listOrganizations,\n listProjects,\n listRepos\n} from \"@agentrc/core/services/azureDevops\";\nimport type { FileAction } from \"@agentrc/core/services/generator\";\nimport { generateConfigs } from \"@agentrc/core/services/generator\";\nimport { buildAuthedUrl, cloneRepo, isGitRepo, setRemoteUrl } from \"@agentrc/core/services/git\";\nimport type { GitHubRepo } from \"@agentrc/core/services/github\";\nimport { getGitHubToken, listAccessibleRepos } from \"@agentrc/core/services/github\";\nimport { generateCopilotInstructions } from \"@agentrc/core/services/instructions\";\nimport { ensureDir, safeWriteFile, validateCachePath } from \"@agentrc/core/utils/fs\";\nimport { prettyPrintSummary } from \"@agentrc/core/utils/logger\";\nimport type { CommandResult } from \"@agentrc/core/utils/output\";\nimport { outputResult, outputError, deriveFileStatus, shouldLog } from \"@agentrc/core/utils/output\";\nimport { checkbox, select } from \"@inquirer/prompts\";\n\ntype InitOptions = {\n github?: boolean;\n provider?: string;\n yes?: boolean;\n force?: boolean;\n model?: string;\n json?: boolean;\n quiet?: boolean;\n};\n\nexport async function initCommand(\n repoPathArg: string | undefined,\n options: InitOptions\n): Promise<void> {\n let repoPath = path.resolve(repoPathArg ?? process.cwd());\n const provider = options.provider ?? (options.github ? \"github\" : undefined);\n\n if (provider && provider !== \"github\" && provider !== \"azure\") {\n outputError(\"Invalid provider. Use github or azure.\", Boolean(options.json));\n return;\n }\n\n if (options.json && !options.yes) {\n outputError(\"--json requires --yes to skip interactive prompts.\", true);\n return;\n }\n\n if (options.json && provider) {\n outputError(\n \"--json with --provider is not supported. Use 'agentrc pr' for non-interactive provider workflows.\",\n true\n );\n return;\n }\n\n if (provider === \"github\") {\n const token = await getGitHubToken();\n if (!token) {\n outputError(\n \"Set GITHUB_TOKEN or GH_TOKEN, or authenticate with GitHub CLI.\",\n Boolean(options.json)\n );\n return;\n }\n\n const repos = await listAccessibleRepos(token);\n if (repos.length === 0) {\n outputError(\"No accessible repositories found.\", Boolean(options.json));\n return;\n }\n\n const selection = await select<GitHubRepo>({\n message: \"Choose a repository\",\n choices: repos.map((repo) => ({\n name: `${repo.fullName}${repo.isPrivate ? \" (private)\" : \"\"}`,\n value: repo\n }))\n });\n\n const cacheRoot = path.join(process.cwd(), \".agentrc-cache\");\n repoPath = validateCachePath(cacheRoot, selection.owner, selection.name);\n await ensureDir(repoPath);\n\n const hasGit = await isGitRepo(repoPath);\n if (!hasGit) {\n await cloneRepo(selection.cloneUrl, repoPath);\n }\n }\n\n if (provider === \"azure\") {\n const token = getAzureDevOpsToken();\n if (!token) {\n outputError(\n \"Set AZURE_DEVOPS_PAT (or AZDO_PAT) to use Azure DevOps mode.\",\n Boolean(options.json)\n );\n return;\n }\n\n const orgs = await listOrganizations(token);\n if (orgs.length === 0) {\n outputError(\"No Azure DevOps organizations found.\", Boolean(options.json));\n return;\n }\n\n const orgSelection = await select<AzureDevOpsOrg>({\n message: \"Choose an Azure DevOps organization\",\n choices: orgs.map((org) => ({\n name: org.name,\n value: org\n }))\n });\n\n const projects = await listProjects(token, orgSelection.name);\n if (projects.length === 0) {\n outputError(\"No Azure DevOps projects found.\", Boolean(options.json));\n return;\n }\n\n const projectSelection = await select<AzureDevOpsProject>({\n message: \"Choose an Azure DevOps project\",\n choices: projects.map((project) => ({\n name: project.name,\n value: project\n }))\n });\n\n const repos = await listRepos(token, orgSelection.name, projectSelection.name);\n if (repos.length === 0) {\n outputError(\"No Azure DevOps repositories found.\", Boolean(options.json));\n return;\n }\n\n const repoSelection = await select<AzureDevOpsRepo>({\n message: \"Choose a repository\",\n choices: repos.map((repo) => ({\n name: `${repo.name}${repo.isPrivate ? \" (private)\" : \"\"}`,\n value: repo\n }))\n });\n\n const cacheRoot = path.join(process.cwd(), \".agentrc-cache\");\n repoPath = validateCachePath(\n cacheRoot,\n orgSelection.name,\n projectSelection.name,\n repoSelection.name\n );\n await ensureDir(repoPath);\n\n const hasGit = await isGitRepo(repoPath);\n if (!hasGit) {\n const authedUrl = buildAuthedUrl(repoSelection.cloneUrl, token, \"azure\");\n await cloneRepo(authedUrl, repoPath);\n await setRemoteUrl(repoPath, repoSelection.cloneUrl);\n }\n }\n let analysis;\n try {\n analysis = await analyzeRepo(repoPath);\n } catch (error) {\n outputError(\n `Failed to analyze repo: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n return;\n }\n if (shouldLog(options)) {\n prettyPrintSummary(analysis);\n }\n\n const selections = options.yes\n ? [\"instructions\", \"mcp\", \"vscode\"]\n : await checkbox({\n message: \"What would you like to generate?\",\n choices: [\n { name: \"Custom instructions (.github/copilot-instructions.md)\", value: \"instructions\" },\n { name: \"MCP configuration\", value: \"mcp\" },\n { name: \"VS Code settings\", value: \"vscode\" }\n ],\n required: true\n });\n\n const allFiles: FileAction[] = [];\n\n if (selections.includes(\"instructions\")) {\n const outputPath = path.join(repoPath, \".github\", \"copilot-instructions.md\");\n await ensureDir(path.dirname(outputPath));\n try {\n const content = await generateCopilotInstructions({ repoPath, model: options.model });\n const { wrote } = await safeWriteFile(outputPath, content, Boolean(options.force));\n allFiles.push({\n path: path.relative(process.cwd(), outputPath),\n action: wrote ? \"wrote\" : \"skipped\"\n });\n if (shouldLog(options)) {\n const rel = path.relative(process.cwd(), outputPath);\n process.stderr.write((wrote ? `Wrote ${rel}` : `Skipped ${rel} (exists)`) + \"\\n\");\n }\n } catch (error) {\n outputError(\n `Failed to generate instructions: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n return;\n }\n }\n\n let genResult;\n try {\n genResult = await generateConfigs({\n repoPath,\n analysis,\n selections: selections.filter((item) => item !== \"instructions\"),\n force: Boolean(options.force)\n });\n } catch (error) {\n outputError(\n `Failed to generate configs: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n return;\n }\n allFiles.push(...genResult.files);\n\n // Bootstrap agentrc.config.json with detected workspaces and standalone areas\n if (analysis.areas && analysis.areas.length > 0) {\n const configPath = path.join(repoPath, \"agentrc.config.json\");\n const workspaces = await detectWorkspaces(repoPath, analysis.areas);\n\n // Areas already claimed by a workspace (match by path prefix, not name)\n const workspacePaths = workspaces.map((ws) => ws.path + \"/\");\n\n // Standalone areas not inside any workspace\n const standaloneAreas: AgentrcConfigArea[] = analysis.areas\n .filter((a) => {\n if (!a.path) return true;\n const rel = path.relative(repoPath, a.path).replace(/\\\\/gu, \"/\");\n return !workspacePaths.some((prefix) => rel.startsWith(prefix));\n })\n .map((a) => ({\n name: a.name,\n applyTo: a.applyTo,\n ...(a.description ? { description: a.description } : {})\n }));\n\n const agentrcConfig: AgentrcConfig = {};\n if (workspaces.length > 0) agentrcConfig.workspaces = workspaces;\n if (standaloneAreas.length > 0) agentrcConfig.areas = standaloneAreas;\n\n if (agentrcConfig.workspaces || agentrcConfig.areas) {\n const configContent = JSON.stringify(agentrcConfig, null, 2) + \"\\n\";\n const { wrote } = await safeWriteFile(configPath, configContent, Boolean(options.force));\n const rel = path.relative(process.cwd(), configPath);\n allFiles.push({ path: rel, action: wrote ? \"wrote\" : \"skipped\" });\n if (shouldLog(options)) {\n process.stderr.write((wrote ? `Wrote ${rel}` : `Skipped ${rel} (exists)`) + \"\\n\");\n }\n }\n }\n\n if (options.json) {\n const { ok, status } = deriveFileStatus(allFiles);\n const result: CommandResult<{\n selections: string[];\n files: FileAction[];\n analysis: typeof analysis;\n }> = {\n ok,\n status,\n data: { selections, files: allFiles, analysis }\n };\n outputResult(result, true);\n } else if (shouldLog(options)) {\n for (const file of genResult.files) {\n process.stderr.write(`${file.action === \"wrote\" ? \"Wrote\" : \"Skipped\"} ${file.path}\\n`);\n }\n process.stderr.write(\"\\nNext steps:\\n\");\n process.stderr.write(\" agentrc readiness Check AI readiness across 9 pillars\\n\");\n if (analysis.areas && analysis.areas.length > 0) {\n process.stderr.write(\" agentrc instructions --areas Generate per-area instructions\\n\");\n }\n process.stderr.write(\" agentrc eval --init Scaffold evaluation test cases\\n\");\n }\n}\n","import path from \"path\";\n\nimport { analyzeRepo } from \"@agentrc/core/services/analyzer\";\nimport {\n createPullRequest as createAzurePullRequest,\n getAzureDevOpsToken,\n getRepo as getAzureRepo\n} from \"@agentrc/core/services/azureDevops\";\nimport { sanitizeError } from \"@agentrc/core/services/batch\";\nimport { generateConfigs } from \"@agentrc/core/services/generator\";\nimport {\n buildAuthedUrl,\n checkoutBranch,\n cloneRepo,\n commitAll,\n isGitRepo,\n pushBranch,\n setRemoteUrl\n} from \"@agentrc/core/services/git\";\nimport { createPullRequest, getRepo, getGitHubToken } from \"@agentrc/core/services/github\";\nimport { generateCopilotInstructions } from \"@agentrc/core/services/instructions\";\nimport { ensureDir, safeWriteFile, validateCachePath } from \"@agentrc/core/utils/fs\";\nimport type { CommandResult } from \"@agentrc/core/utils/output\";\nimport {\n outputResult,\n outputError,\n createProgressReporter,\n shouldLog\n} from \"@agentrc/core/utils/output\";\nimport { buildFullPrBody } from \"@agentrc/core/utils/pr\";\nimport { GITHUB_REPO_RE, AZURE_REPO_RE } from \"@agentrc/core/utils/repo\";\n\nconst DEFAULT_PR_BRANCH = \"agentrc/add-ai-config\";\n\ntype PrOptions = {\n branch?: string;\n provider?: string;\n model?: string;\n json?: boolean;\n quiet?: boolean;\n};\n\nexport async function prCommand(repo: string | undefined, options: PrOptions): Promise<void> {\n const provider = options.provider ?? \"github\";\n const progress = createProgressReporter(!shouldLog(options));\n\n if (provider !== \"github\" && provider !== \"azure\") {\n outputError(\"Invalid provider. Use github or azure.\", Boolean(options.json));\n return;\n }\n\n if (!repo) {\n outputError(\n \"Provide a repo identifier (github: owner/name, azure: org/project/repo).\",\n Boolean(options.json)\n );\n return;\n }\n\n if (provider === \"azure\") {\n const token = getAzureDevOpsToken();\n if (!token) {\n outputError(\n \"Set AZURE_DEVOPS_PAT (or AZDO_PAT) to use Azure DevOps PR automation.\",\n Boolean(options.json)\n );\n return;\n }\n\n const match = repo.match(AZURE_REPO_RE);\n if (!match) {\n outputError(\"Invalid Azure DevOps repo format. Use org/project/repo.\", Boolean(options.json));\n return;\n }\n const [, organization, project, name] = match;\n\n try {\n progress.update(\"Fetching repo info...\");\n const repoInfo = await getAzureRepo(token, organization, project, name);\n const cacheRoot = path.join(process.cwd(), \".agentrc-cache\");\n const repoPath = validateCachePath(cacheRoot, organization, project, name);\n await ensureDir(repoPath);\n\n if (!(await isGitRepo(repoPath))) {\n progress.update(\"Cloning...\");\n const authedUrl = buildAuthedUrl(repoInfo.cloneUrl, token, \"azure\");\n await cloneRepo(authedUrl, repoPath);\n await setRemoteUrl(repoPath, repoInfo.cloneUrl);\n }\n\n const branch = options.branch ?? DEFAULT_PR_BRANCH;\n progress.update(\"Creating branch...\");\n await checkoutBranch(repoPath, branch);\n\n progress.update(\"Generating instructions...\");\n const instructions = await generateCopilotInstructions({ repoPath, model: options.model });\n const instructionsPath = path.join(repoPath, \".github\", \"copilot-instructions.md\");\n await ensureDir(path.dirname(instructionsPath));\n const { wrote, reason } = await safeWriteFile(instructionsPath, instructions, true);\n if (!wrote) {\n throw new Error(\n `Refused to write instructions (${reason === \"symlink\" ? \"path is a symlink\" : \"file exists\"})`\n );\n }\n\n progress.update(\"Analyzing...\");\n const analysis = await analyzeRepo(repoPath);\n progress.update(\"Generating configs...\");\n await generateConfigs({\n repoPath,\n analysis,\n selections: [\"mcp\", \"vscode\"],\n force: true\n });\n\n progress.update(\"Committing...\");\n await commitAll(repoPath, \"chore: add AI configurations via AgentRC\");\n progress.update(\"Pushing...\");\n await pushBranch(repoPath, branch, token, \"azure\");\n\n progress.update(\"Creating PR...\");\n const prUrl = await createAzurePullRequest({\n token,\n organization,\n project,\n repoId: repoInfo.id,\n repoName: repoInfo.name,\n title: \"🤖 Prime this repo for AI\",\n body: buildFullPrBody(),\n sourceBranch: branch,\n targetBranch: repoInfo.defaultBranch\n });\n\n if (options.json) {\n const result: CommandResult<{ repo: string; branch: string; prUrl: string }> = {\n ok: true,\n status: \"success\",\n data: { repo, branch, prUrl }\n };\n outputResult(result, true);\n } else {\n progress.succeed(`Created PR: ${prUrl}`);\n }\n } catch (error) {\n outputError(\n sanitizeError(`PR failed: ${error instanceof Error ? error.message : String(error)}`),\n Boolean(options.json)\n );\n }\n return;\n }\n\n // GitHub provider\n const token = await getGitHubToken();\n if (!token) {\n outputError(\n \"Set GITHUB_TOKEN or GH_TOKEN, or authenticate with GitHub CLI.\",\n Boolean(options.json)\n );\n return;\n }\n\n const match = repo.match(GITHUB_REPO_RE);\n if (!match) {\n outputError(\"Invalid repo format. Use owner/name.\", Boolean(options.json));\n return;\n }\n const [, owner, name] = match;\n\n try {\n progress.update(\"Fetching repo info...\");\n const repoInfo = await getRepo(token, owner, name);\n const cacheRoot = path.join(process.cwd(), \".agentrc-cache\");\n const repoPath = validateCachePath(cacheRoot, owner, name);\n await ensureDir(repoPath);\n\n if (!(await isGitRepo(repoPath))) {\n progress.update(\"Cloning...\");\n await cloneRepo(repoInfo.cloneUrl, repoPath);\n }\n\n const branch = options.branch ?? DEFAULT_PR_BRANCH;\n progress.update(\"Creating branch...\");\n await checkoutBranch(repoPath, branch);\n\n progress.update(\"Generating instructions...\");\n const instructions = await generateCopilotInstructions({ repoPath, model: options.model });\n const instructionsPath = path.join(repoPath, \".github\", \"copilot-instructions.md\");\n await ensureDir(path.dirname(instructionsPath));\n const { wrote, reason } = await safeWriteFile(instructionsPath, instructions, true);\n if (!wrote) {\n throw new Error(\n `Refused to write instructions (${reason === \"symlink\" ? \"path is a symlink\" : \"file exists\"})`\n );\n }\n\n progress.update(\"Analyzing...\");\n const analysis = await analyzeRepo(repoPath);\n progress.update(\"Generating configs...\");\n await generateConfigs({\n repoPath,\n analysis,\n selections: [\"mcp\", \"vscode\"],\n force: true\n });\n\n progress.update(\"Committing...\");\n await commitAll(repoPath, \"chore: add AI configurations via AgentRC\");\n progress.update(\"Pushing...\");\n await pushBranch(repoPath, branch, token, \"github\");\n\n progress.update(\"Creating PR...\");\n const prUrl = await createPullRequest({\n token,\n owner,\n repo: name,\n title: \"🤖 Prime this repo for AI\",\n body: buildFullPrBody(),\n head: `${owner}:${branch}`,\n base: repoInfo.defaultBranch\n });\n\n if (options.json) {\n const result: CommandResult<{ repo: string; branch: string; prUrl: string }> = {\n ok: true,\n status: \"success\",\n data: { repo, branch, prUrl }\n };\n outputResult(result, true);\n } else {\n progress.succeed(`Created PR: ${prUrl}`);\n }\n } catch (error) {\n outputError(\n sanitizeError(`PR failed: ${error instanceof Error ? error.message : String(error)}`),\n Boolean(options.json)\n );\n }\n}\n","import path from \"path\";\n\nimport { parsePolicySources } from \"@agentrc/core/services/policy\";\nimport type {\n ReadinessReport,\n ReadinessCriterionResult,\n AreaReadinessReport,\n ReadinessPillarSummary\n} from \"@agentrc/core/services/readiness\";\nimport { runReadinessReport, groupPillars } from \"@agentrc/core/services/readiness\";\nimport { generateVisualReport } from \"@agentrc/core/services/visualReport\";\nimport { safeWriteFile } from \"@agentrc/core/utils/fs\";\nimport type { CommandResult } from \"@agentrc/core/utils/output\";\nimport { outputResult, outputError, shouldLog } from \"@agentrc/core/utils/output\";\nimport chalk from \"chalk\";\n\ntype ReadinessOptions = {\n json?: boolean;\n quiet?: boolean;\n output?: string;\n force?: boolean;\n visual?: boolean;\n perArea?: boolean;\n policy?: string;\n failLevel?: string;\n};\n\nexport async function readinessCommand(\n repoPathArg: string | undefined,\n options: ReadinessOptions\n): Promise<void> {\n const repoPath = path.resolve(repoPathArg ?? process.cwd());\n const repoName = path.basename(repoPath);\n const resolvedOutputPath = options.output ? path.resolve(options.output) : \"\";\n const outputExt = options.output ? path.extname(options.output).toLowerCase() : \"\";\n let failLevelError: string | undefined;\n\n let report: ReadinessReport;\n try {\n const policies = parsePolicySources(options.policy);\n report = await runReadinessReport({ repoPath, perArea: options.perArea, policies });\n } catch (error) {\n outputError(\n `Failed to generate readiness report: ${error instanceof Error ? error.message : String(error)}`,\n Boolean(options.json)\n );\n return;\n }\n\n // Check --fail-level threshold early so it applies regardless of output format\n const failLevel = Number.parseInt(options.failLevel ?? \"\", 10);\n if (Number.isFinite(failLevel)) {\n const clamped = Math.max(1, Math.min(5, failLevel));\n if (clamped !== failLevel && shouldLog(options)) {\n process.stderr.write(`Warning: --fail-level clamped to ${clamped} (valid range: 1–5)\\n`);\n }\n if ((report.achievedLevel ?? 0) < clamped) {\n failLevelError = `Readiness level ${report.achievedLevel ?? 0} is below threshold ${clamped}`;\n if (shouldLog(options)) {\n process.stderr.write(`Error: ${failLevelError}\\n`);\n }\n process.exitCode = 1;\n }\n }\n\n const jsonResult: CommandResult<ReadinessReport> = failLevelError\n ? {\n ok: false,\n status: \"error\",\n data: report,\n errors: [failLevelError]\n }\n : {\n ok: true,\n status: \"success\",\n data: report\n };\n const emitJsonResult = (): void => outputResult(jsonResult, true);\n\n // Validate output extension early, before any output branch\n if (options.output) {\n if (outputExt !== \".json\" && outputExt !== \".md\" && outputExt !== \".html\") {\n outputError(\n `Unsupported output format: ${outputExt || \"(no extension)\"}. Use .json, .md, or .html`,\n Boolean(options.json)\n );\n return;\n }\n }\n\n if (options.visual && outputExt && outputExt !== \".html\") {\n outputError(\n `Cannot use --visual with ${outputExt} output. Use a .html output path or omit --output.`,\n Boolean(options.json)\n );\n return;\n }\n\n // Generate visual HTML report\n if (options.visual || outputExt === \".html\") {\n const html = generateVisualReport({\n reports: [{ repo: repoName, report }],\n title: `AI Readiness Report: ${repoName}`,\n generatedAt: new Date().toISOString()\n });\n\n const outputPath = options.output\n ? resolvedOutputPath\n : path.join(repoPath, \"readiness-report.html\");\n\n const { wrote, reason } = await safeWriteFile(outputPath, html, Boolean(options.force));\n if (!wrote) {\n const why = reason === \"symlink\" ? \"path is a symlink\" : \"file exists (use --force)\";\n outputError(`Skipped ${outputPath}: ${why}`, Boolean(options.json));\n return;\n }\n if (shouldLog(options)) {\n process.stderr.write(chalk.green(`✓ Visual report generated: ${outputPath}`) + \"\\n\");\n }\n if (options.json) {\n emitJsonResult();\n }\n return;\n }\n\n // Output to Markdown file\n if (outputExt === \".md\") {\n const md = formatReadinessMarkdown(report, repoName);\n const { wrote, reason } = await safeWriteFile(resolvedOutputPath, md, Boolean(options.force));\n if (!wrote) {\n const why = reason === \"symlink\" ? \"path is a symlink\" : \"file exists (use --force)\";\n outputError(`Skipped ${resolvedOutputPath}: ${why}`, Boolean(options.json));\n return;\n }\n if (shouldLog(options)) {\n process.stderr.write(chalk.green(`✓ Markdown report saved: ${resolvedOutputPath}`) + \"\\n\");\n }\n if (options.json) {\n emitJsonResult();\n }\n return;\n }\n\n // Output to JSON file\n if (outputExt === \".json\") {\n const { wrote, reason } = await safeWriteFile(\n resolvedOutputPath,\n JSON.stringify(report, null, 2),\n Boolean(options.force)\n );\n if (!wrote) {\n const why = reason === \"symlink\" ? \"path is a symlink\" : \"file exists (use --force)\";\n outputError(`Skipped ${resolvedOutputPath}: ${why}`, Boolean(options.json));\n return;\n }\n if (shouldLog(options)) {\n process.stderr.write(chalk.green(`✓ JSON report saved: ${resolvedOutputPath}`) + \"\\n\");\n }\n if (options.json) {\n emitJsonResult();\n }\n return;\n }\n\n if (options.json) {\n emitJsonResult();\n return;\n }\n\n if (shouldLog(options)) {\n printReadinessChecklist(report);\n }\n}\n\nfunction printReadinessChecklist(report: ReadinessReport): void {\n const log = (msg: string) => process.stderr.write(msg + \"\\n\");\n log(chalk.bold(\"Readiness report\"));\n log(`- Repo: ${report.repoPath}`);\n log(\n `- Monorepo: ${report.isMonorepo ? \"yes\" : \"no\"}${report.apps.length ? ` (${report.apps.length} apps)` : \"\"}`\n );\n log(`- Level: ${report.achievedLevel ?? 1} (${levelName(report.achievedLevel ?? 1)})`);\n\n const groups = groupPillars(report.pillars);\n for (const { label, pillars } of groups) {\n if (pillars.length === 0) continue;\n log(chalk.bold(`\\n${label}`));\n for (const pillar of pillars) {\n const rate = formatPercent(pillar.passRate);\n const icon = pillar.passRate >= 0.8 ? chalk.green(\"●\") : chalk.yellow(\"●\");\n log(`${icon} ${pillar.name}: ${pillar.passed}/${pillar.total} (${rate})`);\n }\n }\n\n log(chalk.bold(\"\\nFix first\"));\n const fixes = rankFixes(report.criteria);\n if (!fixes.length) {\n log(chalk.green(\"✔ No failing criteria detected.\"));\n } else {\n for (const fix of fixes) {\n const impact = colorImpact(fix.impact);\n const effort = colorEffort(fix.effort);\n const scope = fix.scope === \"app\" ? \"app\" : \"repo\";\n const detail = fix.appSummary\n ? ` (${fix.appSummary.passed}/${fix.appSummary.total} apps)`\n : \"\";\n log(`- ${impact} impact / ${effort} effort • ${fix.title}${detail} [${scope}]`);\n if (fix.reason) {\n log(` ${chalk.dim(fix.reason)}`);\n }\n if (fix.appFailures?.length) {\n log(` ${chalk.dim(`Apps: ${fix.appFailures.join(\", \")}`)}`);\n }\n }\n }\n\n if (report.extras.length) {\n log(chalk.bold(\"\\nAI readiness extras\"));\n for (const extra of report.extras) {\n const icon = extra.status === \"pass\" ? chalk.green(\"✔\") : chalk.red(\"✖\");\n log(`${icon} ${extra.title}`);\n }\n }\n\n if (report.areaReports?.length) {\n printAreaBreakdown(report.areaReports);\n }\n}\n\nfunction rankFixes(criteria: ReadinessCriterionResult[]): ReadinessCriterionResult[] {\n return criteria\n .filter((criterion) => criterion.status === \"fail\")\n .sort((a, b) => {\n const impactDelta = impactWeight(b.impact) - impactWeight(a.impact);\n if (impactDelta !== 0) return impactDelta;\n return effortWeight(a.effort) - effortWeight(b.effort);\n });\n}\n\nfunction impactWeight(value: \"high\" | \"medium\" | \"low\"): number {\n if (value === \"high\") return 3;\n if (value === \"medium\") return 2;\n return 1;\n}\n\nfunction effortWeight(value: \"low\" | \"medium\" | \"high\"): number {\n if (value === \"low\") return 1;\n if (value === \"medium\") return 2;\n return 3;\n}\n\nfunction colorImpact(value: \"high\" | \"medium\" | \"low\"): string {\n if (value === \"high\") return chalk.red(\"High\");\n if (value === \"medium\") return chalk.yellow(\"Medium\");\n return chalk.green(\"Low\");\n}\n\nfunction colorEffort(value: \"low\" | \"medium\" | \"high\"): string {\n if (value === \"high\") return chalk.red(\"High\");\n if (value === \"medium\") return chalk.yellow(\"Medium\");\n return chalk.green(\"Low\");\n}\n\nfunction formatPercent(value: number): string {\n return `${Math.round(value * 100)}%`;\n}\n\nfunction levelName(level: number): string {\n if (level === 2) return \"Documented\";\n if (level === 3) return \"Standardized\";\n if (level === 4) return \"Optimized\";\n if (level === 5) return \"Autonomous\";\n return \"Functional\";\n}\n\nfunction printAreaBreakdown(areaReports: AreaReadinessReport[]): void {\n const log = (msg: string) => process.stderr.write(msg + \"\\n\");\n log(chalk.bold(\"\\nPer-area breakdown\"));\n for (const ar of areaReports) {\n // Sum across all pillar summaries for this area\n const passed = ar.pillars.reduce((sum, p) => sum + p.passed, 0);\n const total = ar.pillars.reduce((sum, p) => sum + p.total, 0);\n const pct = total ? Math.round((passed / total) * 100) : 0;\n const icon = total > 0 && passed / total >= 0.8 ? chalk.green(\"●\") : chalk.yellow(\"●\");\n const source = ar.area.source === \"config\" ? chalk.dim(\" (config)\") : \"\";\n log(`${icon} ${ar.area.name}${source}: ${passed}/${total} (${pct}%)`);\n\n const failures = ar.criteria.filter((c) => c.status === \"fail\");\n for (const f of failures) {\n log(` ${chalk.red(\"✖\")} ${f.title}${f.reason ? ` — ${chalk.dim(f.reason)}` : \"\"}`);\n }\n }\n}\n\nexport function formatReadinessMarkdown(report: ReadinessReport, repoName: string): string {\n const lines: string[] = [];\n\n lines.push(`# AI Readiness Report: ${repoName}`);\n lines.push(\"\");\n lines.push(`**Level ${report.achievedLevel}** — ${levelName(report.achievedLevel)}`);\n lines.push(\"\");\n\n // Pillar summary table\n const groups = groupPillars(report.pillars);\n for (const { label, pillars } of groups) {\n if (pillars.length === 0) continue;\n lines.push(`## ${label}`);\n lines.push(\"\");\n lines.push(\"| Pillar | Passed | Total | Rate |\");\n lines.push(\"| --- | ---: | ---: | ---: |\");\n for (const pillar of pillars) {\n const icon = pillar.passRate >= 0.8 ? \"✅\" : \"⚠️\";\n lines.push(\n `| ${icon} ${pillar.name} | ${pillar.passed} | ${pillar.total} | ${formatPercent(pillar.passRate)} |`\n );\n }\n lines.push(\"\");\n }\n\n // Fix-first list\n const fixes = rankFixes(report.criteria);\n if (fixes.length > 0) {\n lines.push(\"## Fix First\");\n lines.push(\"\");\n for (const fix of fixes) {\n const detail = fix.appSummary\n ? ` (${fix.appSummary.passed}/${fix.appSummary.total} apps)`\n : \"\";\n lines.push(`- **${fix.title}**${detail} — ${fix.impact} impact, ${fix.effort} effort`);\n if (fix.reason) {\n lines.push(` - ${fix.reason}`);\n }\n }\n lines.push(\"\");\n }\n\n // Extras\n if (report.extras.length > 0) {\n lines.push(\"## AI Readiness Extras\");\n lines.push(\"\");\n for (const extra of report.extras) {\n const icon = extra.status === \"pass\" ? \"✅\" : \"❌\";\n lines.push(`- ${icon} ${extra.title}`);\n }\n lines.push(\"\");\n }\n\n // Area breakdown\n if (report.areaReports?.length) {\n lines.push(\"## Per-Area Breakdown\");\n lines.push(\"\");\n for (const ar of report.areaReports) {\n const passed = ar.pillars.reduce(\n (sum: number, p: ReadinessPillarSummary) => sum + p.passed,\n 0\n );\n const total = ar.pillars.reduce((sum: number, p: ReadinessPillarSummary) => sum + p.total, 0);\n const pct = total ? Math.round((passed / total) * 100) : 0;\n lines.push(`### ${ar.area.name} — ${passed}/${total} (${pct}%)`);\n lines.push(\"\");\n const failures = ar.criteria.filter((c) => c.status === \"fail\");\n if (failures.length > 0) {\n for (const f of failures) {\n lines.push(`- ❌ ${f.title}${f.reason ? ` — ${f.reason}` : \"\"}`);\n }\n } else {\n lines.push(\"All criteria passing.\");\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\"---\");\n lines.push(\n `*Generated by [AgentRC](https://github.com/microsoft/agentrc) on ${report.generatedAt}*`\n );\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","import path from \"path\";\n\nimport { outputError } from \"@agentrc/core/utils/output\";\nimport { render } from \"ink\";\nimport React from \"react\";\n\nimport { AgentRCTui } from \"../ui/tui\";\n\ntype TuiOptions = {\n repo?: string;\n animation?: boolean;\n json?: boolean;\n quiet?: boolean;\n accessible?: boolean;\n};\n\nexport async function tuiCommand(options: TuiOptions): Promise<void> {\n const repoPath = path.resolve(options.repo ?? process.cwd());\n const skipAnimation = options.animation === false;\n try {\n const accessible = options.accessible ? true : undefined;\n const { waitUntilExit } = render(\n <AgentRCTui repoPath={repoPath} skipAnimation={skipAnimation || Boolean(accessible)} />,\n { isScreenReaderEnabled: accessible }\n );\n await waitUntilExit();\n } catch (error) {\n outputError(`TUI failed: ${error instanceof Error ? error.message : String(error)}`, false);\n }\n}\n","import fs from \"fs/promises\";\nimport path from \"path\";\n\nimport type { RepoApp, Area } from \"@agentrc/core/services/analyzer\";\nimport { analyzeRepo } from \"@agentrc/core/services/analyzer\";\nimport { getAzureDevOpsToken } from \"@agentrc/core/services/azureDevops\";\nimport { listCopilotModels } from \"@agentrc/core/services/copilot\";\nimport { generateEvalScaffold } from \"@agentrc/core/services/evalScaffold\";\nimport type { EvalConfig } from \"@agentrc/core/services/evalScaffold\";\nimport { runEval, type EvalResult } from \"@agentrc/core/services/evaluator\";\nimport { getGitHubToken } from \"@agentrc/core/services/github\";\nimport {\n generateCopilotInstructions,\n generateAreaInstructions,\n buildAreaInstructionContent,\n areaInstructionPath,\n writeAreaInstruction\n} from \"@agentrc/core/services/instructions\";\nimport { safeWriteFile, buildTimestampedName } from \"@agentrc/core/utils/fs\";\nimport { Box, Text, useApp, useInput, useStdout, useIsScreenReaderEnabled } from \"ink\";\nimport type { Key } from \"ink\";\nimport React, { useEffect, useMemo, useState } from \"react\";\n\nimport { AnimatedBanner, StaticBanner } from \"./AnimatedBanner\";\nimport { BatchTui } from \"./BatchTui\";\nimport { BatchTuiAzure } from \"./BatchTuiAzure\";\n\ntype Props = {\n repoPath: string;\n skipAnimation?: boolean;\n};\n\ntype Status =\n | \"intro\"\n | \"idle\"\n | \"generating\"\n | \"bootstrapping\"\n | \"evaluating\"\n | \"preview\"\n | \"done\"\n | \"error\"\n | \"batch-pick\"\n | \"batch-github\"\n | \"batch-azure\"\n | \"eval-pick\"\n | \"model-pick\"\n | \"generate-pick\"\n | \"generate-app-pick\"\n | \"generate-area-pick\"\n | \"generating-areas\"\n | \"bootstrapEvalCount\"\n | \"bootstrapEvalConfirm\";\n\ntype LogEntry = {\n text: string;\n type: \"info\" | \"success\" | \"error\" | \"progress\";\n time: string;\n};\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\n/** Track terminal columns reactively so resize triggers a re-render. */\nfunction useTerminalColumns(): number {\n const { stdout } = useStdout();\n const [columns, setColumns] = useState(stdout.columns ?? 80);\n useEffect(() => {\n const onResize = () => setColumns(stdout.columns ?? 80);\n stdout.on(\"resize\", onResize);\n return () => {\n stdout.off(\"resize\", onResize);\n };\n }, [stdout]);\n return columns;\n}\n\nfunction useSpinner(active: boolean): string {\n const [frame, setFrame] = useState(0);\n useEffect(() => {\n if (!active) return;\n const interval = setInterval(() => {\n setFrame((f) => (f + 1) % SPINNER_FRAMES.length);\n }, 80);\n return () => clearInterval(interval);\n }, [active]);\n return active ? SPINNER_FRAMES[frame] : \"\";\n}\n\nfunction timestamp(): string {\n return new Date().toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\"\n });\n}\n\nfunction KeyHint({ k, label }: { k: string; label: string }): React.JSX.Element {\n return (\n <Text>\n <Text color=\"gray\" dimColor>\n {\"[\"}\n </Text>\n <Text color=\"cyanBright\" bold>\n {k}\n </Text>\n <Text color=\"gray\" dimColor>\n {\"]\"}\n </Text>\n <Text color=\"gray\"> {label} </Text>\n </Text>\n );\n}\n\nfunction Divider({\n label,\n columns,\n accessible\n}: {\n label?: string;\n columns: number;\n accessible?: boolean;\n}): React.JSX.Element {\n // Account for root Box border (2) + padding (2) = 4 chars\n const innerWidth = Math.max(0, columns - 4);\n const lineChar = accessible ? \"-\" : \"─\";\n if (label) {\n const prefix = accessible ? \"-- \" : \"── \";\n const suffix = \" \";\n const used = prefix.length + label.length + suffix.length;\n const fill = lineChar.repeat(Math.max(1, innerWidth - used));\n return (\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n {prefix}\n </Text>\n <Text color=\"gray\" bold>\n {label}\n </Text>\n <Text color=\"gray\" dimColor>\n {suffix}\n {fill}\n </Text>\n </Box>\n );\n }\n const fill = lineChar.repeat(Math.max(1, innerWidth));\n return (\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>\n {fill}\n </Text>\n </Box>\n );\n}\n\nconst PREFERRED_MODELS = [\"claude-sonnet-4.5\", \"claude-sonnet-4\", \"gpt-4.1\", \"gpt-5\"];\n\nfunction pickBestModel(available: string[], fallback: string): string {\n for (const preferred of PREFERRED_MODELS) {\n if (available.includes(preferred)) return preferred;\n }\n return available[0] || fallback;\n}\n\nexport function AgentRCTui({ repoPath, skipAnimation = false }: Props): React.JSX.Element {\n const app = useApp();\n const accessible = useIsScreenReaderEnabled();\n const terminalColumns = useTerminalColumns();\n const [status, setStatus] = useState<Status>(skipAnimation || accessible ? \"idle\" : \"intro\");\n const [message, setMessage] = useState<string>(\"\");\n const [generatedContent, setGeneratedContent] = useState<string>(\"\");\n const [evalResults, setEvalResults] = useState<EvalResult[] | null>(null);\n const [evalViewerPath, setEvalViewerPath] = useState<string | null>(null);\n const [batchToken, setBatchToken] = useState<string | null>(null);\n const [batchAzureToken, setBatchAzureToken] = useState<string | null>(null);\n const [evalCaseCountInput, setEvalCaseCountInput] = useState<string>(\"\");\n const [evalBootstrapCount, setEvalBootstrapCount] = useState<number | null>(null);\n const [availableModels, setAvailableModels] = useState<string[]>([]);\n const [evalModel, setEvalModel] = useState<string>(\"claude-sonnet-4.5\");\n const [judgeModel, setJudgeModel] = useState<string>(\"claude-sonnet-4.5\");\n const [hideModelPicker, setHideModelPicker] = useState<boolean>(false);\n const [modelPickTarget, setModelPickTarget] = useState<\"eval\" | \"judge\">(\"eval\");\n const [modelCursor, setModelCursor] = useState(0);\n const [hasEvalConfig, setHasEvalConfig] = useState<boolean | null>(null);\n const [activityLog, setActivityLog] = useState<LogEntry[]>([]);\n const [generateTarget, setGenerateTarget] = useState<\"copilot-instructions\" | \"agents-md\">(\n \"copilot-instructions\"\n );\n const [generateSavePath, setGenerateSavePath] = useState<string>(\"\");\n const [repoApps, setRepoApps] = useState<RepoApp[]>([]);\n const [isMonorepo, setIsMonorepo] = useState(false);\n const [repoAreas, setRepoAreas] = useState<Area[]>([]);\n const [areaCursor, setAreaCursor] = useState(0);\n const repoLabel = useMemo(() => path.basename(repoPath), [repoPath]);\n const repoFull = useMemo(() => repoPath, [repoPath]);\n const isLoading =\n status === \"generating\" ||\n status === \"bootstrapping\" ||\n status === \"evaluating\" ||\n status === \"generating-areas\";\n const isMenu =\n status === \"model-pick\" ||\n status === \"eval-pick\" ||\n status === \"batch-pick\" ||\n status === \"generate-pick\" ||\n status === \"generate-app-pick\" ||\n status === \"generate-area-pick\";\n const spinner = useSpinner(isLoading);\n\n const addLog = (text: string, type: LogEntry[\"type\"] = \"info\") => {\n setActivityLog((prev) => [...prev.slice(-4), { text, type, time: timestamp() }]);\n };\n\n const handleAnimationComplete = () => {\n setStatus(\"idle\");\n };\n\n // Check for eval config and repo structure on mount\n useEffect(() => {\n const configPath = path.join(repoPath, \"agentrc.eval.json\");\n fs.access(configPath)\n .then(() => setHasEvalConfig(true))\n .catch(() => setHasEvalConfig(false));\n analyzeRepo(repoPath)\n .then((analysis) => {\n const apps = analysis.apps ?? [];\n setRepoApps(apps);\n setIsMonorepo(analysis.isMonorepo ?? false);\n setRepoAreas(analysis.areas ?? []);\n })\n .catch((err) => {\n addLog(`Repo analysis failed: ${err instanceof Error ? err.message : \"unknown\"}`, \"error\");\n });\n }, [repoPath]);\n\n useEffect(() => {\n let active = true;\n listCopilotModels()\n .then((models) => {\n if (!active) return;\n setAvailableModels(models);\n if (models.length === 0) return;\n setEvalModel((current) =>\n models.includes(current) ? current : pickBestModel(models, current)\n );\n setJudgeModel((current) =>\n models.includes(current) ? current : pickBestModel(models, current)\n );\n })\n .catch(() => {\n if (!active) return;\n setAvailableModels([]);\n });\n return () => {\n active = false;\n };\n }, []);\n\n const doGenerate = async (\n targetRepoPath: string,\n savePath: string,\n target: string\n ): Promise<void> => {\n setStatus(\"generating\");\n setMessage(`Generating ${target}...`);\n addLog(`Generating ${target}...`, \"progress\");\n try {\n const content = await generateCopilotInstructions({\n repoPath: targetRepoPath,\n onProgress: (msg) => setMessage(msg)\n });\n if (!content.trim()) {\n throw new Error(\"Copilot SDK returned empty content.\");\n }\n setGeneratedContent(content);\n setGenerateSavePath(savePath);\n setStatus(\"preview\");\n setMessage(\"Review the generated content below.\");\n addLog(`${target} generated — review and save.`, \"success\");\n } catch (error) {\n setStatus(\"error\");\n const msg = error instanceof Error ? error.message : \"Generation failed.\";\n if (msg.toLowerCase().includes(\"auth\") || msg.toLowerCase().includes(\"login\")) {\n setMessage(`${msg} Run 'copilot' then '/login' in a separate terminal.`);\n } else {\n setMessage(msg);\n }\n addLog(msg, \"error\");\n }\n };\n\n useEffect(() => {\n let active = true;\n const configPath = path.join(repoPath, \"agentrc.eval.json\");\n fs.readFile(configPath, \"utf8\")\n .then((raw) => {\n if (!active) return;\n const parsed = JSON.parse(raw) as EvalConfig;\n const setting = parsed.ui?.modelPicker;\n setHideModelPicker(setting === \"hidden\");\n })\n .catch(() => {\n if (!active) return;\n setHideModelPicker(false);\n });\n return () => {\n active = false;\n };\n }, [repoPath]);\n\n const bootstrapEvalConfig = async (count: number, force: boolean): Promise<void> => {\n const configPath = path.join(repoPath, \"agentrc.eval.json\");\n try {\n setStatus(\"bootstrapping\");\n setMessage(\"Generating eval cases with Copilot SDK...\");\n addLog(\"Generating eval scaffold...\", \"progress\");\n const config = await generateEvalScaffold({\n repoPath,\n count,\n model: evalModel,\n onProgress: (msg) => setMessage(msg)\n });\n await safeWriteFile(configPath, JSON.stringify(config, null, 2), force);\n setHasEvalConfig(true);\n setStatus(\"idle\");\n const msg = `Generated agentrc.eval.json with ${config.cases.length} cases.`;\n setMessage(msg);\n addLog(msg, \"success\");\n } catch (error) {\n setStatus(\"error\");\n const msg = error instanceof Error ? error.message : \"Failed to generate eval config.\";\n setMessage(msg);\n addLog(msg, \"error\");\n } finally {\n setEvalCaseCountInput(\"\");\n setEvalBootstrapCount(null);\n }\n };\n\n // NOTE: The useInput handler below is intentionally kept as a single callback\n // to avoid prop-drilling ~20 state setters. If this grows further, consider\n // extracting each status into a sub-component with its own useInput hook.\n const inputActive = status !== \"batch-github\" && status !== \"batch-azure\";\n useInput(\n (input: string, key: Key) => {\n void (async () => {\n try {\n if (status === \"intro\") {\n setStatus(\"idle\");\n return;\n }\n\n if (status === \"preview\") {\n if (input.toLowerCase() === \"s\") {\n try {\n const outputPath =\n generateSavePath || path.join(repoPath, \".github\", \"copilot-instructions.md\");\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n const { wrote, reason } = await safeWriteFile(outputPath, generatedContent, true);\n if (!wrote)\n throw new Error(reason === \"symlink\" ? \"Path is a symlink\" : \"Write failed\");\n setStatus(\"done\");\n const relPath = path.relative(repoPath, outputPath);\n const msg = `Saved to ${relPath}`;\n setMessage(msg);\n addLog(msg, \"success\");\n setGeneratedContent(\"\");\n } catch (error) {\n setStatus(\"error\");\n const msg = error instanceof Error ? error.message : \"Failed to save.\";\n setMessage(msg);\n addLog(msg, \"error\");\n }\n return;\n }\n if (input.toLowerCase() === \"d\") {\n setStatus(\"idle\");\n setMessage(\"Discarded generated instructions.\");\n addLog(\"Discarded instructions.\", \"info\");\n setGeneratedContent(\"\");\n return;\n }\n if (key.escape || input.toLowerCase() === \"q\") {\n app.exit();\n return;\n }\n return;\n }\n\n if (status === \"bootstrapEvalCount\") {\n if (key.return) {\n const trimmed = evalCaseCountInput.trim();\n const count = Number.parseInt(trimmed, 10);\n if (!trimmed || !Number.isFinite(count) || count <= 0) {\n setMessage(\"Enter a positive number of eval cases, then press Enter.\");\n return;\n }\n\n const configPath = path.join(repoPath, \"agentrc.eval.json\");\n setEvalBootstrapCount(count);\n try {\n await fs.access(configPath);\n setStatus(\"bootstrapEvalConfirm\");\n setMessage(\"agentrc.eval.json exists. Overwrite? (Y/N)\");\n } catch {\n await bootstrapEvalConfig(count, false);\n }\n return;\n }\n\n if (key.backspace || key.delete) {\n setEvalCaseCountInput((prev) => prev.slice(0, -1));\n return;\n }\n\n if (/^\\d$/.test(input)) {\n setEvalCaseCountInput((prev) => prev + input);\n return;\n }\n\n if (key.escape) {\n setStatus(\"idle\");\n setMessage(\"\");\n setEvalCaseCountInput(\"\");\n setEvalBootstrapCount(null);\n return;\n }\n return;\n }\n\n if (status === \"bootstrapEvalConfirm\") {\n if (input.toLowerCase() === \"y\") {\n const count = evalBootstrapCount ?? 0;\n if (count <= 0) {\n setStatus(\"error\");\n setMessage(\"Missing eval case count. Restart bootstrap.\");\n return;\n }\n await bootstrapEvalConfig(count, true);\n return;\n }\n\n if (input.toLowerCase() === \"n\" || key.escape) {\n setStatus(\"idle\");\n setMessage(\"Bootstrap cancelled.\");\n setEvalCaseCountInput(\"\");\n setEvalBootstrapCount(null);\n return;\n }\n if (input.toLowerCase() === \"q\") {\n app.exit();\n return;\n }\n return;\n }\n\n if (status === \"generate-pick\") {\n if (input.toLowerCase() === \"c\") {\n setGenerateTarget(\"copilot-instructions\");\n if (isMonorepo && repoApps.length > 1) {\n setStatus(\"generate-app-pick\");\n setMessage(\"Generate for root or per-app?\");\n } else {\n const savePath = path.join(repoPath, \".github\", \"copilot-instructions.md\");\n setGenerateSavePath(savePath);\n await doGenerate(repoPath, savePath, \"copilot-instructions\");\n }\n return;\n }\n if (input.toLowerCase() === \"a\") {\n setGenerateTarget(\"agents-md\");\n if (isMonorepo && repoApps.length > 1) {\n setStatus(\"generate-app-pick\");\n setMessage(\"Generate for root or per-app?\");\n } else {\n const savePath = path.join(repoPath, \"AGENTS.md\");\n setGenerateSavePath(savePath);\n await doGenerate(repoPath, savePath, \"agents-md\");\n }\n return;\n }\n if (input.toLowerCase() === \"f\") {\n if (repoAreas.length === 0) {\n setMessage(\"No areas detected. Add agentrc.config.json to define areas.\");\n return;\n }\n setAreaCursor(0);\n setStatus(\"generate-area-pick\");\n setMessage(\"Generate file-based instructions for areas.\");\n return;\n }\n if (key.escape) {\n setStatus(\"idle\");\n setMessage(\"\");\n return;\n }\n return;\n }\n\n if (status === \"generate-app-pick\") {\n if (input.toLowerCase() === \"r\") {\n // Root only\n const savePath =\n generateTarget === \"copilot-instructions\"\n ? path.join(repoPath, \".github\", \"copilot-instructions.md\")\n : path.join(repoPath, \"AGENTS.md\");\n setGenerateSavePath(savePath);\n await doGenerate(repoPath, savePath, generateTarget);\n return;\n }\n if (input.toLowerCase() === \"a\") {\n // All apps sequentially\n setStatus(\"generating\");\n addLog(`Generating ${generateTarget} for ${repoApps.length} apps...`, \"progress\");\n let count = 0;\n for (const app of repoApps) {\n const savePath =\n generateTarget === \"copilot-instructions\"\n ? path.join(app.path, \".github\", \"copilot-instructions.md\")\n : path.join(app.path, \"AGENTS.md\");\n setMessage(`Generating for ${app.name} (${count + 1}/${repoApps.length})...`);\n try {\n const content = await generateCopilotInstructions({\n repoPath: app.path,\n onProgress: (msg) => setMessage(`${app.name}: ${msg}`)\n });\n if (content.trim()) {\n await fs.mkdir(path.dirname(savePath), { recursive: true });\n const { wrote: saved } = await safeWriteFile(savePath, content, true);\n if (!saved) continue;\n count++;\n addLog(`${app.name}: saved ${path.basename(savePath)}`, \"success\");\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Failed.\";\n addLog(`${app.name}: ${msg}`, \"error\");\n }\n }\n setStatus(\"done\");\n setMessage(`Generated ${generateTarget} for ${count}/${repoApps.length} apps.`);\n return;\n }\n // Number to pick a specific app\n const num = Number.parseInt(input, 10);\n if (Number.isFinite(num) && num >= 1 && num <= repoApps.length) {\n const app = repoApps[num - 1];\n const savePath =\n generateTarget === \"copilot-instructions\"\n ? path.join(app.path, \".github\", \"copilot-instructions.md\")\n : path.join(app.path, \"AGENTS.md\");\n setGenerateSavePath(savePath);\n await doGenerate(app.path, savePath, generateTarget);\n return;\n }\n if (key.escape) {\n setStatus(\"generate-pick\");\n setMessage(\"Select what to generate.\");\n return;\n }\n return;\n }\n\n if (status === \"generate-area-pick\") {\n if (input.toLowerCase() === \"a\") {\n // All areas\n setStatus(\"generating-areas\");\n addLog(\n `Generating file-based instructions for ${repoAreas.length} areas...`,\n \"progress\"\n );\n let written = 0;\n for (const [i, area] of repoAreas.entries()) {\n setMessage(`Generating for \"${area.name}\" (${i + 1}/${repoAreas.length})...`);\n try {\n const body = await generateAreaInstructions({\n repoPath,\n area,\n onProgress: (msg) => setMessage(`${area.name}: ${msg}`)\n });\n const result = await writeAreaInstruction(repoPath, area, body);\n if (result.status === \"written\") {\n written++;\n addLog(`${area.name}: saved ${path.basename(result.filePath)}`, \"success\");\n } else if (result.status === \"skipped\") {\n addLog(`${area.name}: skipped (file exists)`, \"info\");\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Failed.\";\n addLog(`${area.name}: ${msg}`, \"error\");\n }\n }\n setStatus(\"done\");\n setMessage(\n `Generated file-based instructions for ${written}/${repoAreas.length} areas.`\n );\n return;\n }\n if (key.upArrow) {\n setAreaCursor((prev) => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow) {\n setAreaCursor((prev) => Math.min(repoAreas.length - 1, prev + 1));\n return;\n }\n if (key.return) {\n const area = repoAreas[areaCursor];\n if (!area) return;\n setStatus(\"generating-areas\");\n setMessage(`Generating for \"${area.name}\"...`);\n addLog(`Generating file-based instructions for \"${area.name}\"...`, \"progress\");\n try {\n const body = await generateAreaInstructions({\n repoPath,\n area,\n onProgress: (msg) => setMessage(`${area.name}: ${msg}`)\n });\n if (body.trim()) {\n const filePath = areaInstructionPath(repoPath, area);\n setGeneratedContent(buildAreaInstructionContent(area, body));\n setGenerateSavePath(filePath);\n setStatus(\"preview\");\n setMessage(\"Review the generated area instructions.\");\n addLog(`\"${area.name}\" generated — review and save.`, \"success\");\n } else {\n setStatus(\"done\");\n setMessage(`No content generated for \"${area.name}\".`);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Failed.\";\n setStatus(\"error\");\n setMessage(msg);\n addLog(`${area.name}: ${msg}`, \"error\");\n }\n return;\n }\n if (key.escape) {\n setStatus(\"generate-pick\");\n setMessage(\"Select what to generate.\");\n return;\n }\n return;\n }\n\n if (status === \"model-pick\") {\n if (key.escape) {\n setStatus(\"idle\");\n setMessage(\"\");\n return;\n }\n if (key.upArrow) {\n setModelCursor((prev) => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow) {\n setModelCursor((prev) => Math.min(availableModels.length - 1, prev + 1));\n return;\n }\n if (key.return) {\n const chosen = availableModels[modelCursor];\n if (chosen) {\n if (modelPickTarget === \"eval\") {\n setEvalModel(chosen);\n addLog(`Eval model → ${chosen}`, \"success\");\n } else {\n setJudgeModel(chosen);\n addLog(`Judge model → ${chosen}`, \"success\");\n }\n setStatus(\"idle\");\n setMessage(\n `${modelPickTarget === \"eval\" ? \"Eval\" : \"Judge\"} model set to ${chosen}`\n );\n }\n return;\n }\n return;\n }\n\n if (status === \"eval-pick\") {\n if (input.toLowerCase() === \"r\") {\n // Run eval\n const configPath = path.join(repoPath, \"agentrc.eval.json\");\n const outputPath = path.join(\n repoPath,\n \".agentrc\",\n \"evals\",\n buildTimestampedName(\"eval-results\")\n );\n try {\n await fs.access(configPath);\n } catch {\n setStatus(\"error\");\n const msg = \"No agentrc.eval.json found. Press [E] then [I] to create one.\";\n setMessage(msg);\n addLog(msg, \"error\");\n return;\n }\n\n setStatus(\"evaluating\");\n setMessage(\"Running evals... (this may take a few minutes)\");\n addLog(\"Running evals...\", \"progress\");\n setEvalResults(null);\n setEvalViewerPath(null);\n try {\n const { results, viewerPath } = await runEval({\n configPath,\n repoPath,\n model: evalModel,\n judgeModel: judgeModel,\n outputPath\n });\n setEvalResults(results);\n setEvalViewerPath(viewerPath ?? null);\n const passed = results.filter((r) => r.verdict === \"pass\").length;\n const failed = results.filter((r) => r.verdict === \"fail\").length;\n setStatus(\"done\");\n const msg = `Eval complete: ${passed} pass, ${failed} fail out of ${results.length} cases.`;\n setMessage(msg);\n addLog(msg, \"success\");\n } catch (error) {\n setStatus(\"error\");\n const msg = error instanceof Error ? error.message : \"Eval failed.\";\n setMessage(msg);\n addLog(msg, \"error\");\n }\n return;\n }\n if (input.toLowerCase() === \"i\") {\n setStatus(\"bootstrapEvalCount\");\n setMessage(\"Enter number of eval cases, then press Enter.\");\n setEvalCaseCountInput(\"\");\n setEvalBootstrapCount(null);\n return;\n }\n if (key.escape || input.toLowerCase() === \"b\") {\n setStatus(\"idle\");\n setMessage(\"\");\n return;\n }\n return;\n }\n\n if (status === \"batch-pick\") {\n if (input.toLowerCase() === \"g\") {\n setStatus(\"generating\");\n setMessage(\"Checking GitHub authentication...\");\n addLog(\"Starting batch (GitHub)...\", \"progress\");\n const token = await getGitHubToken();\n if (!token) {\n setStatus(\"error\");\n const msg = \"GitHub auth required. Run 'gh auth login' or set GITHUB_TOKEN.\";\n setMessage(msg);\n addLog(msg, \"error\");\n return;\n }\n setBatchToken(token);\n setStatus(\"batch-github\");\n return;\n }\n if (input.toLowerCase() === \"a\") {\n setStatus(\"generating\");\n setMessage(\"Checking Azure DevOps authentication...\");\n addLog(\"Starting batch (Azure DevOps)...\", \"progress\");\n const token = getAzureDevOpsToken();\n if (!token) {\n setStatus(\"error\");\n const msg = \"Azure DevOps PAT required. Set AZURE_DEVOPS_PAT or AZDO_PAT.\";\n setMessage(msg);\n addLog(msg, \"error\");\n return;\n }\n setBatchAzureToken(token);\n setStatus(\"batch-azure\");\n return;\n }\n if (key.escape || input.toLowerCase() === \"b\") {\n setStatus(\"idle\");\n setMessage(\"\");\n return;\n }\n return;\n }\n\n // Idle-state shortcuts — only active from idle, done, or error\n if (status === \"idle\" || status === \"done\" || status === \"error\") {\n if (input.toLowerCase() === \"g\") {\n setStatus(\"generate-pick\");\n setMessage(\"Select what to generate.\");\n return;\n }\n\n if (input.toLowerCase() === \"b\") {\n setStatus(\"batch-pick\");\n setMessage(\"Select batch provider.\");\n return;\n }\n\n if (input.toLowerCase() === \"e\") {\n setStatus(\"eval-pick\");\n setMessage(\"Select eval action.\");\n return;\n }\n\n if (input.toLowerCase() === \"m\") {\n if (hideModelPicker) {\n setMessage(\n 'Model picker hidden. Set ui.modelPicker to \"visible\" in agentrc.eval.json.'\n );\n return;\n }\n setModelPickTarget(\"eval\");\n setStatus(\"model-pick\");\n setMessage(\"Pick eval model.\");\n const idx = availableModels.indexOf(evalModel);\n setModelCursor(idx >= 0 ? idx : 0);\n return;\n }\n\n if (input.toLowerCase() === \"j\") {\n if (hideModelPicker) {\n setMessage(\n 'Model picker hidden. Set ui.modelPicker to \"visible\" in agentrc.eval.json.'\n );\n return;\n }\n setModelPickTarget(\"judge\");\n setStatus(\"model-pick\");\n setMessage(\"Pick judge model.\");\n const idx = availableModels.indexOf(judgeModel);\n setModelCursor(idx >= 0 ? idx : 0);\n return;\n }\n }\n\n if (key.escape || input.toLowerCase() === \"q\") {\n app.exit();\n return;\n }\n } catch (err) {\n setStatus(\"error\");\n setMessage(err instanceof Error ? err.message : \"Unexpected error\");\n }\n })();\n },\n { isActive: inputActive }\n );\n\n const statusIcon =\n status === \"error\"\n ? accessible\n ? \"ERROR\"\n : \"✗\"\n : status === \"done\"\n ? accessible\n ? \"OK\"\n : \"✓\"\n : isLoading\n ? spinner\n : accessible\n ? \"*\"\n : \"●\";\n const statusLabel =\n status === \"intro\"\n ? \"starting\"\n : status === \"idle\"\n ? \"ready\"\n : status === \"bootstrapEvalCount\"\n ? \"input\"\n : status === \"bootstrapEvalConfirm\"\n ? \"confirm\"\n : status === \"eval-pick\"\n ? \"eval\"\n : status === \"batch-pick\"\n ? \"batch\"\n : status === \"model-pick\"\n ? \"models\"\n : status;\n const statusColor =\n status === \"error\"\n ? \"red\"\n : status === \"done\"\n ? \"green\"\n : isLoading\n ? \"yellow\"\n : isMenu\n ? \"magentaBright\"\n : \"cyanBright\";\n\n const formatTokens = (result: EvalResult): string => {\n const withUsage = result.metrics?.withInstructions?.tokenUsage;\n const withoutUsage = result.metrics?.withoutInstructions?.tokenUsage;\n const withTotal =\n withUsage?.totalTokens ??\n (withUsage ? (withUsage.promptTokens ?? 0) + (withUsage.completionTokens ?? 0) : undefined);\n const withoutTotal =\n withoutUsage?.totalTokens ??\n (withoutUsage\n ? (withoutUsage.promptTokens ?? 0) + (withoutUsage.completionTokens ?? 0)\n : undefined);\n if (withTotal == null && withoutTotal == null) return \"tokens n/a\";\n if (accessible) return `tokens with: ${withTotal ?? \"n/a\"}, without: ${withoutTotal ?? \"n/a\"}`;\n return `tokens w/: ${withTotal ?? \"n/a\"} \\u2022 w/o: ${withoutTotal ?? \"n/a\"}`;\n };\n\n const previewLines = generatedContent.split(\"\\n\").slice(0, 20);\n const truncatedPreview =\n previewLines.join(\"\\n\") + (generatedContent.split(\"\\n\").length > 20 ? \"\\n...\" : \"\");\n\n if (status === \"batch-github\" && batchToken) {\n return <BatchTui token={batchToken} />;\n }\n\n if (status === \"batch-azure\" && batchAzureToken) {\n return <BatchTuiAzure token={batchAzureToken} />;\n }\n\n const innerWidth = Math.max(0, terminalColumns - 4);\n\n return (\n <Box\n flexDirection=\"column\"\n padding={1}\n {...(accessible ? {} : { borderStyle: \"round\" as const, borderColor: \"magenta\" })}\n width=\"100%\"\n >\n {status === \"intro\" ? (\n <AnimatedBanner onComplete={handleAnimationComplete} maxWidth={innerWidth} />\n ) : (\n <StaticBanner maxWidth={innerWidth} />\n )}\n\n {/* Status Bar */}\n <Box marginTop={1} justifyContent=\"space-between\">\n <Text color=\"cyanBright\" bold>\n Prime your repo for AI\n </Text>\n <Text color={statusColor}>\n {statusIcon} {statusLabel}\n </Text>\n </Box>\n\n {/* Context */}\n <Divider columns={terminalColumns} label=\"Context\" accessible={accessible} />\n <Box marginTop={0} flexDirection=\"column\" paddingLeft={1}>\n <Text>\n <Text color=\"gray\">Repo </Text>\n <Text color=\"white\" bold>\n {repoLabel}\n </Text>\n {isMonorepo && <Text color=\"magentaBright\"> monorepo · {repoApps.length} apps</Text>}\n {repoAreas.length > 0 && <Text color=\"cyan\"> · {repoAreas.length} areas</Text>}\n <Text color=\"gray\" dimColor>\n {\" \"}\n {repoFull}\n </Text>\n </Text>\n <Text>\n <Text color=\"gray\">Model </Text>\n <Text color=\"cyanBright\">{evalModel}</Text>\n <Text color=\"gray\"> • Judge </Text>\n <Text color=\"cyanBright\">{judgeModel}</Text>\n {availableModels.length > 0 && (\n <Text color=\"gray\" dimColor>\n {\" \"}\n ({availableModels.length} available)\n </Text>\n )}\n </Text>\n <Text>\n <Text color=\"gray\">Eval </Text>\n {hasEvalConfig === null ? (\n <Text color=\"gray\" dimColor>\n checking...\n </Text>\n ) : hasEvalConfig ? (\n <Text color=\"green\">agentrc.eval.json found</Text>\n ) : (\n <Text color=\"yellow\">no eval config — press [I] to create</Text>\n )}\n </Text>\n </Box>\n\n {/* Activity */}\n <Divider columns={terminalColumns} label=\"Activity\" accessible={accessible} />\n <Box marginTop={0} flexDirection=\"column\" paddingLeft={1}>\n {activityLog.length === 0 && !message ? (\n <Text color=\"gray\" dimColor>\n Awaiting input.\n </Text>\n ) : (\n <>\n {activityLog.slice(-3).map((entry, i) => (\n <Text key={i}>\n <Text color=\"gray\" dimColor>\n {entry.time}{\" \"}\n </Text>\n <Text\n color={\n entry.type === \"error\"\n ? \"red\"\n : entry.type === \"success\"\n ? \"green\"\n : entry.type === \"progress\"\n ? \"yellow\"\n : \"gray\"\n }\n dimColor={entry.type === \"info\"}\n >\n {entry.text}\n </Text>\n </Text>\n ))}\n {message && !activityLog.some((e) => e.text === message) && (\n <Text>\n <Text color={isLoading ? \"yellow\" : \"white\"}>\n {isLoading ? `${spinner} ` : \"\"}\n {message}\n </Text>\n </Text>\n )}\n </>\n )}\n </Box>\n\n {/* Model Picker */}\n {status === \"model-pick\" && availableModels.length > 0 && (\n <>\n <Divider\n columns={terminalColumns}\n label={`Pick ${modelPickTarget} model`}\n accessible={accessible}\n />\n <Box flexDirection=\"column\" paddingLeft={1}>\n {availableModels.map((model, i) => {\n const current = modelPickTarget === \"eval\" ? evalModel : judgeModel;\n const isCurrent = model === current;\n const isCursor = i === modelCursor;\n return (\n <Text key={model}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? (accessible ? \"> \" : \"\\u276F \") : \" \"}\n </Text>\n <Text\n color={isCurrent ? \"green\" : isCursor ? \"cyanBright\" : \"white\"}\n bold={isCursor}\n >\n {model}\n </Text>\n {isCurrent && (\n <Text color=\"green\" dimColor>\n {\" \"}\n (current)\n </Text>\n )}\n </Text>\n );\n })}\n {availableModels.length > 15 && (\n <Text color=\"gray\" dimColor>\n Use {\"\\u2191\\u2193\"} to scroll\n </Text>\n )}\n </Box>\n </>\n )}\n\n {/* App picker for monorepo generate */}\n {status === \"generate-app-pick\" && repoApps.length > 0 && (\n <>\n <Divider\n columns={terminalColumns}\n label={`Generate ${generateTarget}`}\n accessible={accessible}\n />\n <Box flexDirection=\"column\" paddingLeft={1}>\n {repoApps.map((app, i) => (\n <Text key={app.name}>\n <Text color=\"cyanBright\" bold>\n {i + 1}\n </Text>\n <Text color=\"gray\"> </Text>\n <Text color=\"white\">{app.name}</Text>\n <Text color=\"gray\" dimColor>\n {\" \"}\n {path.relative(repoPath, app.path)}\n </Text>\n </Text>\n ))}\n </Box>\n </>\n )}\n\n {/* Area picker for file-based instructions */}\n {status === \"generate-area-pick\" && repoAreas.length > 0 && (\n <>\n <Divider\n columns={terminalColumns}\n label=\"File-based instructions\"\n accessible={accessible}\n />\n <Box flexDirection=\"column\" paddingLeft={1}>\n {repoAreas.map((area, i) => (\n <Text key={area.name}>\n <Text color={i === areaCursor ? \"cyanBright\" : \"gray\"}>\n {i === areaCursor ? (accessible ? \">\" : \"▶\") : \" \"}\n </Text>\n <Text color=\"gray\"> </Text>\n <Text color={i === areaCursor ? \"white\" : \"gray\"} bold={i === areaCursor}>\n {area.name}\n </Text>\n <Text color=\"gray\" dimColor>\n {\" \"}\n {Array.isArray(area.applyTo) ? area.applyTo.join(\", \") : area.applyTo}\n </Text>\n {area.source === \"config\" && (\n <Text color=\"magentaBright\" dimColor>\n {\" \"}\n (config)\n </Text>\n )}\n </Text>\n ))}\n </Box>\n </>\n )}\n\n {/* Input: eval case count */}\n {status === \"bootstrapEvalCount\" && (\n <Box marginTop={1} paddingLeft={1}>\n <Text color=\"cyan\">Eval case count: </Text>\n <Text color=\"white\" bold>\n {evalCaseCountInput || (accessible ? \"|\" : \"▍\")}\n </Text>\n </Box>\n )}\n\n {/* Preview */}\n {status === \"preview\" && generatedContent && (\n <Box\n flexDirection=\"column\"\n marginTop={1}\n {...(accessible ? {} : { borderStyle: \"single\" as const, borderColor: \"gray\" })}\n paddingX={1}\n >\n <Text color=\"cyan\" bold>\n Preview ({path.relative(repoPath, generateSavePath) || generateTarget})\n </Text>\n <Text color=\"gray\">{truncatedPreview}</Text>\n </Box>\n )}\n\n {/* Eval Results */}\n {evalResults && evalResults.length > 0 && (\n <>\n <Divider columns={terminalColumns} label=\"Eval Results\" accessible={accessible} />\n <Box flexDirection=\"column\" paddingLeft={1}>\n {evalResults.map((r) => (\n <Text key={r.id}>\n <Text\n color={r.verdict === \"pass\" ? \"green\" : r.verdict === \"fail\" ? \"red\" : \"yellow\"}\n >\n {accessible\n ? `Verdict: ${r.verdict === \"pass\" ? \"PASS\" : r.verdict === \"fail\" ? \"FAIL\" : \"UNKNOWN\"} ${r.id} (score:${r.score} ${formatTokens(r)})`\n : `${r.verdict === \"pass\" ? \"✓\" : r.verdict === \"fail\" ? \"✗\" : \"?\"} `}\n </Text>\n {!accessible && (\n <>\n <Text>{r.id}</Text>\n <Text color=\"gray\">\n {\" \"}\n score:{r.score} • {formatTokens(r)}\n </Text>\n </>\n )}\n </Text>\n ))}\n {evalViewerPath && (\n <Text color=\"gray\" dimColor>\n Viewer: {evalViewerPath}\n </Text>\n )}\n </Box>\n </>\n )}\n\n {/* Commands */}\n <Divider columns={terminalColumns} label=\"Commands\" accessible={accessible} />\n <Box marginTop={0} paddingLeft={1} flexDirection=\"column\">\n {status === \"intro\" ? (\n <Text color=\"gray\">Press any key to skip animation...</Text>\n ) : status === \"preview\" ? (\n <Box>\n <KeyHint k=\"S\" label=\"Save\" />\n <KeyHint k=\"D\" label=\"Discard\" />\n <KeyHint k=\"Q\" label=\"Quit\" />\n </Box>\n ) : status === \"bootstrapEvalConfirm\" ? (\n <Box>\n <KeyHint k=\"Y\" label=\"Overwrite\" />\n <KeyHint k=\"N\" label=\"Cancel\" />\n <KeyHint k=\"Q\" label=\"Quit\" />\n </Box>\n ) : status === \"model-pick\" ? (\n <Box>\n <Text color=\"cyan\">Use </Text>\n <Text color=\"cyanBright\" bold>\n {\"\\u2191\\u2193\"}\n </Text>\n <Text color=\"cyan\"> to navigate, </Text>\n <Text color=\"cyanBright\" bold>\n Enter\n </Text>\n <Text color=\"cyan\"> to select </Text>\n <KeyHint k=\"Esc\" label=\"Back\" />\n </Box>\n ) : status === \"generate-pick\" ? (\n <Box>\n <KeyHint k=\"C\" label=\"Copilot instructions\" />\n <KeyHint k=\"A\" label=\"AGENTS.md\" />\n {repoAreas.length > 0 && <KeyHint k=\"F\" label=\"File-based (areas)\" />}\n <KeyHint k=\"Esc\" label=\"Back\" />\n </Box>\n ) : status === \"generate-app-pick\" ? (\n <Box>\n <KeyHint k=\"R\" label=\"Root only\" />\n <KeyHint k=\"A\" label=\"All apps\" />\n <Text color=\"gray\" dimColor>\n {\" \"}\n or press{\" \"}\n </Text>\n <Text color=\"cyanBright\" bold>\n 1\n </Text>\n <Text color=\"gray\" dimColor>\n -\n </Text>\n <Text color=\"cyanBright\" bold>\n {repoApps.length}\n </Text>\n <Text color=\"gray\" dimColor>\n {\" \"}\n </Text>\n <KeyHint k=\"Esc\" label=\"Back\" />\n </Box>\n ) : status === \"generate-area-pick\" ? (\n <Box>\n <KeyHint k=\"A\" label=\"All areas\" />\n <KeyHint k=\"↑↓\" label=\"Navigate\" />\n <KeyHint k=\"↵\" label=\"Select\" />\n <KeyHint k=\"Esc\" label=\"Back\" />\n </Box>\n ) : status === \"bootstrapEvalCount\" ? (\n <Box>\n <Text color=\"cyan\">Type number, then </Text>\n <Text color=\"cyanBright\" bold>\n Enter\n </Text>\n <Text color=\"cyan\"> to confirm </Text>\n <KeyHint k=\"Esc\" label=\"Cancel\" />\n </Box>\n ) : status === \"eval-pick\" ? (\n <Box>\n <KeyHint k=\"R\" label=\"Run eval\" />\n <KeyHint k=\"I\" label=\"Init eval\" />\n <KeyHint k=\"B/Esc\" label=\"Back\" />\n </Box>\n ) : status === \"batch-pick\" ? (\n <Box>\n <KeyHint k=\"G\" label=\"GitHub\" />\n <KeyHint k=\"A\" label=\"Azure DevOps\" />\n <KeyHint k=\"B/Esc\" label=\"Back\" />\n </Box>\n ) : isLoading ? (\n <Box>\n <KeyHint k=\"Q\" label=\"Quit\" />\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n <Box>\n <KeyHint k=\"G\" label=\"Generate\" />\n <KeyHint k=\"E\" label=\"Eval\" />\n <KeyHint k=\"B\" label=\"Batch\" />\n </Box>\n <Box>\n <KeyHint k=\"M\" label=\"Model\" />\n <KeyHint k=\"J\" label=\"Judge\" />\n <KeyHint k=\"Q\" label=\"Quit\" />\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n","import { runCli } from \"./cli\";\n\nconst [, , ...args] = process.argv;\nif (args.length === 0) {\n runCli([process.argv[0], process.argv[1], \"tui\"]);\n} else {\n runCli(process.argv);\n}\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["ErrorCodes","ResponseError","Message","Touch","Disposable","RAL","Event","args","CancellationToken","CancellationState","MessageReader","ResolvedMessageReaderOptions","MessageWriter","ResolvedMessageWriterOptions","result","CancelNotification","ProgressToken","ProgressNotification","StarRequestHandler","Trace","TraceValues","TraceFormat","SetTraceNotification","LogTraceNotification","ConnectionErrors","ConnectionError","ConnectionStrategy","IdCancellationReceiverStrategy","RequestCancellationReceiverStrategy","CancellationReceiverStrategy","CancellationSenderStrategy","CancellationStrategy","MessageStrategy","ConnectionOptions","ConnectionState","createMessageConnection","startTime","args","args","RIL","exports","path","os","process","StreamMessageReader","StreamMessageWriter","createMessageConnection","args","import_node","args","path","fs","path","fs","path","chalk","path","path","fs","path","getRepo","createPullRequest","checkRepoHasInstructions","checkReposForInstructions","fs","path","fs","execFile","promisify","path","fg","execFileAsync","args","spawn","args","spawn","approveAll","fs","path","args","fs","path","fs","path","path","fs","path","areas","fs","path","createPullRequest","Box","Text","useIsScreenReaderEnabled","useEffect","useState","jsx","useIsScreenReaderEnabled","useState","useEffect","checkReposForInstructions","Box","Text","Box","Text","useApp","useInput","useIsScreenReaderEnabled","useEffect","useState","jsx","jsxs","useApp","useIsScreenReaderEnabled","useState","useEffect","useInput","Box","Text","jsx","token","repos","results","getRepo","render","fs","path","impactWeight","effortWeight","Box","Text","useApp","useInput","useIsScreenReaderEnabled","useEffect","useState","jsx","jsxs","useApp","useIsScreenReaderEnabled","useState","useEffect","results","path","fs","useInput","Box","Text","jsx","render","path","fs","path","path","fs","path","path","path","path","path","path","path","path","path","path","token","match","name","path","getRepo","createPullRequest","path","chalk","path","path","render","fs","path","Box","Text","useApp","useInput","useIsScreenReaderEnabled","useEffect","useState","jsx","jsxs","useState","useEffect","Text","fill","Box","useApp","useIsScreenReaderEnabled","path","fs","msg","useInput","app","jsx","path","render"]}