devworkspace 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/README.md +3 -1
  3. package/dist/agents/claude/content.js +27 -4
  4. package/dist/agents/claude/content.js.map +1 -1
  5. package/dist/cli/args.d.ts +45 -0
  6. package/dist/cli/args.js +13 -0
  7. package/dist/cli/args.js.map +1 -1
  8. package/dist/cli/help.js +67 -8
  9. package/dist/cli/help.js.map +1 -1
  10. package/dist/cli/render.d.ts +10 -0
  11. package/dist/cli/render.js +197 -1
  12. package/dist/cli/render.js.map +1 -1
  13. package/dist/cli/run.js +100 -6
  14. package/dist/cli/run.js.map +1 -1
  15. package/dist/config/schemas.d.ts +6 -0
  16. package/dist/config/schemas.js +6 -0
  17. package/dist/config/schemas.js.map +1 -1
  18. package/dist/core/version.d.ts +7 -0
  19. package/dist/core/version.js +13 -0
  20. package/dist/core/version.js.map +1 -1
  21. package/dist/core/workspace.d.ts +1 -0
  22. package/dist/core/workspace.js +1 -0
  23. package/dist/core/workspace.js.map +1 -1
  24. package/dist/discovery/commands.d.ts +1 -0
  25. package/dist/discovery/commands.js +3 -1
  26. package/dist/discovery/commands.js.map +1 -1
  27. package/dist/features/schema.d.ts +3 -0
  28. package/dist/features/schema.js +79 -0
  29. package/dist/features/schema.js.map +1 -0
  30. package/dist/features/types.d.ts +77 -0
  31. package/dist/features/types.js +2 -0
  32. package/dist/features/types.js.map +1 -0
  33. package/dist/features/validate.d.ts +14 -0
  34. package/dist/features/validate.js +124 -0
  35. package/dist/features/validate.js.map +1 -0
  36. package/dist/index.d.ts +5 -0
  37. package/dist/index.js +3 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/services/doctor.js +34 -0
  40. package/dist/services/doctor.js.map +1 -1
  41. package/dist/services/drift.d.ts +21 -0
  42. package/dist/services/drift.js +89 -0
  43. package/dist/services/drift.js.map +1 -0
  44. package/dist/services/features.d.ts +22 -0
  45. package/dist/services/features.js +105 -0
  46. package/dist/services/features.js.map +1 -0
  47. package/dist/services/graph.d.ts +97 -0
  48. package/dist/services/graph.js +342 -0
  49. package/dist/services/graph.js.map +1 -0
  50. package/dist/services/refresh.js +15 -0
  51. package/dist/services/refresh.js.map +1 -1
  52. package/dist/services/setup.d.ts +56 -0
  53. package/dist/services/setup.js +116 -0
  54. package/dist/services/setup.js.map +1 -0
  55. package/dist/services/status.d.ts +6 -0
  56. package/dist/services/status.js +16 -0
  57. package/dist/services/status.js.map +1 -1
  58. package/dist/services/taskContext.d.ts +28 -5
  59. package/dist/services/taskContext.js +221 -4
  60. package/dist/services/taskContext.js.map +1 -1
  61. package/dist/services/verify.d.ts +11 -0
  62. package/dist/services/verify.js +64 -2
  63. package/dist/services/verify.js.map +1 -1
  64. package/docs/architecture-report/01-executive-summary.md +168 -0
  65. package/docs/architecture-report/02-system-architecture.md +356 -0
  66. package/docs/architecture-report/03-tools-and-technologies.md +112 -0
  67. package/docs/architecture-report/04-execution-flows.md +257 -0
  68. package/docs/architecture-report/05-codebase-map.md +150 -0
  69. package/docs/architecture-report/06-command-reference.md +446 -0
  70. package/docs/architecture-report/07-data-flow-and-integrations.md +268 -0
  71. package/docs/architecture-report/08-build-test-deployment.md +185 -0
  72. package/docs/architecture-report/09-security-and-reliability.md +165 -0
  73. package/docs/architecture-report/10-feature-status.md +110 -0
  74. package/docs/architecture-report/11-glossary.md +97 -0
  75. package/docs/architecture-report/README.md +103 -0
  76. package/docs/architecture-report/diagrams.md +446 -0
  77. package/docs/getting-started.md +38 -1
  78. package/package.json +1 -1
package/dist/cli/run.js CHANGED
@@ -4,7 +4,10 @@ import { packageVersion } from '../core/version.js';
4
4
  import { createLogger } from '../utils/logger.js';
5
5
  import { bool, int, list, parseCli, str } from './args.js';
6
6
  import { COMMANDS, commandHelp, topHelp } from './help.js';
7
- import { makeStyle, renderAgentInstall, renderAgentList, renderAnalyze, renderContext, renderTaskContext, renderDoctor, renderExport, renderImport, renderInit, renderIntegrationsStatus, renderSetup, renderMigrate, renderRefresh, renderReset, renderStatus, renderTask, renderTaskBrief, renderTaskRun, } from './render.js';
7
+ import { makeStyle, renderAgentInstall, renderAgentList, renderAnalyze, renderContext, renderTaskContext, renderDoctor, renderExport, renderImport, renderInit, renderIntegrationsStatus, renderSetup, renderMigrate, renderRefresh, renderReset, renderStatus, renderTask, renderTaskBrief, renderTaskRun, renderFeature, renderFeatureList, renderFeatureValidation, renderGraphStatus, renderGraphTrace, renderProjectSetup, } from './render.js';
8
+ import { listFeaturesService, getFeatureService, validateFeatureMapService, saveFeatureService } from '../services/features.js';
9
+ import { getGraphStatusService, traceGraphService } from '../services/graph.js';
10
+ import { setupProject } from '../services/setup.js';
8
11
  import { requireWorkspace } from '../core/workspace.js';
9
12
  import { analyzeWorkspace } from '../services/analysis.js';
10
13
  import { installAgent, listAgents } from '../services/agent.js';
@@ -12,7 +15,7 @@ import { mutate } from '../services/common.js';
12
15
  import { runDoctor } from '../services/doctor.js';
13
16
  import { initWorkspace } from '../services/init.js';
14
17
  import { integrationsStatus, setupIntegrations } from '../services/integrations.js';
15
- import { getTaskContext } from '../services/taskContext.js';
18
+ import { getTaskContext, isContextRole, CONTEXT_ROLES } from '../services/taskContext.js';
16
19
  import { addFact, getContext, removeFactByKey, verifyFactByKey } from '../services/knowledge.js';
17
20
  import { migrateWorkspace } from '../services/migrate.js';
18
21
  import { exportWorkspace, importWorkspace } from '../services/portability.js';
@@ -91,10 +94,17 @@ const handlers = {
91
94
  c.exit = setupExitCode(r.setup);
92
95
  },
93
96
  async setup(c) {
94
- if (!bool(c.args.values, 'integrations')) {
95
- throw new DevWorkspaceError('USAGE', 'Say what to set up: devworkspace setup --integrations', { hint: 'Run "devworkspace setup --help".' });
97
+ if (bool(c.args.values, 'integrations')) {
98
+ await runSetupCommand(c, false);
99
+ return;
100
+ }
101
+ const r = await setupProject(c.svc);
102
+ c.data(r, renderProjectSetup(c.style, r));
103
+ if (!r.doctor.healthy)
104
+ c.exit = EXIT.FAILURE;
105
+ else if (bool(c.args.values, 'strict') && (r.doctor.warnings > 0 || r.verification.drift.length > 0)) {
106
+ c.exit = EXIT.WARNINGS;
96
107
  }
97
- await runSetupCommand(c, false);
98
108
  },
99
109
  async integrations(c) {
100
110
  const sub = c.rest[0] ?? 'status';
@@ -137,8 +147,22 @@ const handlers = {
137
147
  },
138
148
  async context(c) {
139
149
  const request = str(c.args.values, 'for');
150
+ const roleRaw = str(c.args.values, 'role');
151
+ let role;
152
+ if (roleRaw !== undefined) {
153
+ const lower = roleRaw.toLowerCase();
154
+ if (!isContextRole(lower)) {
155
+ throw new DevWorkspaceError('USAGE', `--role must be one of: ${CONTEXT_ROLES.join(', ')}.`);
156
+ }
157
+ role = lower;
158
+ }
159
+ if (role && !request) {
160
+ throw new DevWorkspaceError('USAGE', '--role requires --for "<request>".', {
161
+ hint: 'Run "devworkspace context --for \\"<request>\\" --role <explorer|tester|reviewer>".',
162
+ });
163
+ }
140
164
  if (request) {
141
- const t = await getTaskContext(c.svc, { request });
165
+ const t = await getTaskContext(c.svc, { request, role });
142
166
  c.data(t, renderTaskContext(c.style, t));
143
167
  return;
144
168
  }
@@ -181,6 +205,76 @@ const handlers = {
181
205
  else
182
206
  throw new DevWorkspaceError('USAGE', `Unknown fact subcommand "${sub}".`, { hint: 'Use: add, verify, remove, list.' });
183
207
  },
208
+ async feature(c) {
209
+ const sub = c.rest[0] ?? 'list';
210
+ const v = c.args.values;
211
+ if (sub === 'list') {
212
+ const list = await listFeaturesService(c.svc);
213
+ c.data(list, renderFeatureList(c.style, list));
214
+ }
215
+ else if (sub === 'show') {
216
+ const id = need(c.rest[1] ?? str(v, 'id'), 'id (positional or --id)');
217
+ const item = await getFeatureService(c.svc, id);
218
+ c.data(item, renderFeature(c.style, item));
219
+ }
220
+ else if (sub === 'validate') {
221
+ const rep = await validateFeatureMapService(c.svc);
222
+ c.data(rep, renderFeatureValidation(c.style, rep));
223
+ if (rep.unknown > 0 || rep.features.some((f) => !f.valid)) {
224
+ if (bool(v, 'strict'))
225
+ c.exit = EXIT.WARNINGS;
226
+ }
227
+ }
228
+ else if (sub === 'add') {
229
+ const id = need(str(v, 'id') ?? c.rest[1], 'id');
230
+ const name = need(str(v, 'name') ?? str(v, 'title'), 'name');
231
+ const entry = list(v, 'entry');
232
+ const route = list(v, 'route');
233
+ const service = list(v, 'service');
234
+ const model = list(v, 'model');
235
+ const test = list(v, 'test');
236
+ const tags = list(v, 'tag');
237
+ const symbol = str(v, 'symbol');
238
+ const toComp = (p) => ({
239
+ path: p,
240
+ ...(symbol ? { symbol } : {}),
241
+ status: 'inferred',
242
+ });
243
+ const saved = await saveFeatureService(c.svc, {
244
+ id,
245
+ name,
246
+ description: str(v, 'description'),
247
+ frontend: entry.length > 0 ? { entryPoints: entry.map(toComp) } : undefined,
248
+ backend: route.length > 0 || service.length > 0 ? { routes: route.map(toComp), services: service.map(toComp) } : undefined,
249
+ database: model.length > 0 ? { models: model.map(toComp) } : undefined,
250
+ tests: test.length > 0 ? { unit: test.map(toComp) } : undefined,
251
+ tags: tags.length > 0 ? tags : undefined,
252
+ });
253
+ c.data(saved, `${c.style.ok(c.style.sym.ok)} Saved feature ${saved.id} [${saved.status}]: ${saved.name}`);
254
+ }
255
+ else {
256
+ throw new DevWorkspaceError('USAGE', `Unknown feature subcommand "${sub}".`, { hint: 'Use: list, show, validate, add.' });
257
+ }
258
+ },
259
+ async graph(c) {
260
+ const sub = c.rest[0] ?? 'status';
261
+ const v = c.args.values;
262
+ if (sub === 'status') {
263
+ const res = await getGraphStatusService(c.svc);
264
+ c.data(res, renderGraphStatus(c.style, res));
265
+ }
266
+ else if (sub === 'trace') {
267
+ const query = str(v, 'from') ?? c.rest[1];
268
+ if (!query)
269
+ throw new DevWorkspaceError('USAGE', 'Specify a starting file or symbol: devworkspace graph trace <query> or --from <path>');
270
+ const depth = int(v, 'depth');
271
+ const trace = await traceGraphService(c.svc, query, { depth });
272
+ c.data(trace, renderGraphTrace(c.style, trace));
273
+ }
274
+ else {
275
+ throw new DevWorkspaceError('USAGE', `Unknown graph subcommand "${sub}".`, { hint: 'Use: status, trace.' });
276
+ }
277
+ },
184
278
  async task(c) {
185
279
  const v = c.args.values;
186
280
  let sub = c.rest[0];
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAmB,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,aAAa,GAEd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAuB,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGpF,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/G,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,UAAU,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAqD,MAAM,sBAAsB,CAAC;AAChI,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAYlD,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;KAC9B,CAAC;AACJ,CAAC;AAcD,SAAS,IAAI,CAAC,CAAqB,EAAE,IAAY;IAC/C,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,6BAA6B,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,sCAAsC,EAAE,CAAC,CAAC;IACrI,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,KAAK,CAAmB,CAAqB,EAAE,OAAqB,EAAE,IAAY,EAAE,QAAY;IACvG,MAAM,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;IACxB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAE,OAA6B,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,KAAK,IAAI,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,CAAM,CAAC;AAChB,CAAC;AAID,KAAK,UAAU,eAAe,CAAC,CAAM,EAAE,MAAe;IACpD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAA+D,EAAQ,EAAE;QAC9G,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM;YAAE,OAAO;QAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QACnJ,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,MAAM,iBAAiB,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9H,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,OAAO,CAAC,CAAuB;IACtC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,MAAM;QAAE,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,sCAAsC,CAAC,CAAC;IAClH,OAAO,CAAC,CAAC;AACX,CAAC;AAED,yIAAyI;AACzI,MAAM,UAAU,aAAa,CAAC,CAAc;IAC1C,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,EAAE,CAAC;IAC7B,IAAI,CAAC,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClF,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,uBAAuB,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IACxF,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,kBAAkB,CAAC;QAAE,OAAO,IAAI,CAAC,EAAE,CAAC;IACjF,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,MAAM,QAAQ,GAA4B;IACxC,KAAK,CAAC,IAAI,CAAC,CAAC;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC;YAC5B,GAAG,CAAC,CAAC,GAAG;YACR,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;YAChC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9H,CAAC,CAAC;QACH,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,KAAK;YAAE,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,uDAAuD,EAAE,EAAE,IAAI,EAAE,kCAAkC,EAAE,CAAC,CAAC;QAC9I,CAAC;QACD,MAAM,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,CAAC;QAClB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;QAClC,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,MAAM,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,MAAM,kBAAkB,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;YAChI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ;gBAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnF,CAAC;;YAAM,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,oCAAoC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAC7H,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,CAAC;QACb,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpH,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,KAAK,YAAY;YAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;aACrE,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChJ,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;aACjC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;YAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;IACtF,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,CAAC;QACb,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7G,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC;QACV,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,KAAK,CAAa,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;YAC/F,MAAM,KAAK,GAAG;gBACZ,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC;gBAC/B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC;gBACrC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;gBACxC,UAAU;gBACV,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC;gBACxB,UAAU,EAAE,KAAK,CAAa,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC;gBACtG,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAa,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAE,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;aACjH,CAAC;YACF,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACrH,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;YAC5E,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7E,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,iBAAiB,CAAC,WAAW,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAAC;YACrF,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;QAC5H,CAAC;;YAAM,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,4BAA4B,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,CAAC;IAChI,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC;QACV,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9F,mEAAmE;QACnE,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtB,GAAG,GAAG,KAAK,CAAC;QACd,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,sDAAsD,CAAC,CAAC;gBACxG,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC1F,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;gBAC7I,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;oBACR,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE;oBACpD,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,cAAc,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,wCAAwC,IAAI,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,EAAE;oBACxL,4BAA4B,MAAM,EAAE;oBACpC,eAAe,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;iBACrC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACd,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;gBACzE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;gBACzI,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,oDAAoD,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvJ,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;gBAC7D,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvD,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC1H,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;gBACxF,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;gBACvF,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,EAAE;oBAC7D,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;oBACtB,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC;oBAC1B,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC;oBAC7B,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC;oBACrB,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC;oBACtB,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe,CAAC;oBACnC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC;oBAC5B,aAAa,EAAE,IAAI,CAAC,CAAC,EAAE,gBAAgB,CAAC;oBACxC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC;iBAC5B,CAAC,CAAC;gBACH,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;gBACxD,MAAM,CAAC,GAAG,MAAM,kBAAkB,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,6CAA6C,CAAC,EAAE;oBAChJ,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC;oBACxB,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC;oBACxB,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC;iBAC3B,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;gBAC/D,MAAM,GAAG,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC/G,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,SAAS,KAAK,IAAI,EAAE,MAAM,IAAI,EAAE,iBAAiB,GAAG,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpI,MAAM;YACR,CAAC;YACD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAClC,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;gBACzL,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC/C,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACxG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC;oBAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;qBACjE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC;oBAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC1E,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAU,EAAE,OAAO,CAAC,CAAC;gBAC9E,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;gBACzH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1C,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,KAAK,MAAM,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpJ,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC,EAAE;oBAC7D,cAAc,EAAE,IAAI,CAAC,CAAC,EAAE,kBAAkB,CAAC,IAAI,SAAS;oBACxD,iBAAiB,EAAE,IAAI,CAAC,CAAC,EAAE,oBAAoB,CAAC,IAAI,SAAS;oBAC7D,mBAAmB,EAAE,IAAI,CAAC,CAAC,EAAE,uBAAuB,CAAC,IAAI,SAAS;iBACnE,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1C,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,uBAAuB,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjG,MAAM;YACR,CAAC;YACD;gBACE,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,CAAC;QAClH,CAAC;IACH,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,CAAC;QACb,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QAChC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAChL,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,oDAAoD,CAAC,CAAC;QACjL,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACpC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,6FAA6F,CAAC,CAAC;QACvO,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,iBAAiB,CAAC,WAAW,EAAE,kCAAkC,CAAC,CAAC;YACtF,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QACnF,CAAC;;YAAM,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,+BAA+B,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC;IAC/H,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,CAAC;QACd,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QAChC,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE;gBACpC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC;gBACrC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC;gBAC3C,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC;gBAC9C,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,cAAc,CAAC;gBAC1D,UAAU,EAAE,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC;aACjC,CAAC,CAAC;YACH,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,sBAAsB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAChH,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACzJ,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACnF,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,OAAO,kBAAkB,CAAC,CAAC,QAAQ,sBAAsB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3J,CAAC;;YAAM,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,gCAAgC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC1H,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,CAAC;QACb,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QAChC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE;gBACnC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC;gBAClC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC;gBAC1B,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC;gBACtB,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC;gBAC9B,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,eAAe,CAAC;gBACnC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC;gBAC/B,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE;gBAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;aACvB,CAAC,CAAC;YACH,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACpJ,CAAC;;YAAM,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,+BAA+B,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACpH,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC;YACvD,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5C,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,6BAA6B,GAAG,IAAI,EAAE,IAAI,EAAE;gBAC/E,IAAI,EAAE,uGAAuG;aAC9G,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,CAAC;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,MAAM,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,qBAAqB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAyB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACxK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,CAAC;QACX,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACjJ,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,CAAC,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YAC3E,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,CAAC;QACb,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;CACF,CAAC;AAEF,MAAM,OAAO,GAA2B,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAE1D,0GAA0G;AAC1G,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,KAAY,SAAS,EAAE;IAC/D,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACzB,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;QAC7F,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC9D,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAElF,IAAI,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5D,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,IAAI,MAAM,KAAK,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACrF,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,sDAAsD,EAAE,CAAC,CAAC;QACzI,CAAC;QACD,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;YACpB,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACvD,MAAM,GAAG,GAAQ;YACf,IAAI;YACJ,IAAI;YACJ,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;YACpJ,IAAI;YACJ,KAAK;YACL,IAAI,EAAE,IAAI,CAAC,EAAE;YACb,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;YAC/B,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YACxB,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;SACxF,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC;QAC1C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC;gBAChC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE;gBAC1F,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;YAC/G,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAC5D,CAAC;AACH,CAAC","sourcesContent":["import path from 'node:path';\nimport { DevWorkspaceError, EXIT, formatError, isDevWorkspaceError } from '../errors/index.js';\nimport { packageVersion } from '../core/version.js';\nimport { createLogger } from '../utils/logger.js';\nimport { bool, int, list, parseCli, str, type ParsedArgs } from './args.js';\nimport { COMMANDS, commandHelp, topHelp } from './help.js';\nimport {\n makeStyle,\n renderAgentInstall,\n renderAgentList,\n renderAnalyze,\n renderContext,\n renderTaskContext,\n renderDoctor,\n renderExport,\n renderImport,\n renderInit,\n renderIntegrationsStatus,\n renderSetup,\n renderMigrate,\n renderRefresh,\n renderReset,\n renderStatus,\n renderTask,\n renderTaskBrief,\n renderTaskRun,\n type Style,\n} from './render.js';\nimport { requireWorkspace } from '../core/workspace.js';\nimport { analyzeWorkspace } from '../services/analysis.js';\nimport { installAgent, listAgents } from '../services/agent.js';\nimport { mutate, type ServiceOptions } from '../services/common.js';\nimport { runDoctor } from '../services/doctor.js';\nimport { initWorkspace } from '../services/init.js';\nimport { integrationsStatus, setupIntegrations } from '../services/integrations.js';\nimport type { SetupResult } from '../integrations/manager.js';\nimport type { InstallScope, Runner } from '../integrations/types.js';\nimport { getTaskContext } from '../services/taskContext.js';\nimport { addFact, getContext, removeFactByKey, verifyFactByKey } from '../services/knowledge.js';\nimport { migrateWorkspace } from '../services/migrate.js';\nimport { exportWorkspace, importWorkspace } from '../services/portability.js';\nimport { getDecision, getDecisions, getSessions, recordDecision, recordSession } from '../services/records.js';\nimport { refreshWorkspace } from '../services/refresh.js';\nimport { resetWorkspace } from '../services/reset.js';\nimport { getStatus } from '../services/status.js';\nimport { declareTestEnv, listTestEnv, revokeTestEnv, runTaskCheck } from '../services/verify.js';\nimport {\n attestTask,\n createTask,\n listTasksService,\n recordTests,\n recordVerification,\n setTaskStatus,\n showTask,\n updateTask,\n} from '../services/tasks.js';\nimport { CONFIDENCE, FACT_STATUS, SOURCE_TYPES, type Confidence, type FactStatus, type SourceType } from '../config/schemas.js';\nimport { loadFacts } from '../knowledge/facts.js';\n\nexport interface CliIO {\n stdout: (s: string) => void;\n stderr: (s: string) => void;\n cwd: string;\n env: NodeJS.ProcessEnv;\n isTTY: boolean;\n /** Process runner used by the integration manager (tests inject a fake; the default runs real processes). */\n runner?: Runner;\n}\n\nexport function defaultIO(): CliIO {\n return {\n stdout: (s) => process.stdout.write(s),\n stderr: (s) => process.stderr.write(s),\n cwd: process.cwd(),\n env: process.env,\n isTTY: !!process.stdout.isTTY,\n };\n}\n\ninterface Ctx {\n args: ParsedArgs;\n rest: string[];\n svc: ServiceOptions;\n json: boolean;\n style: Style;\n out(text: string): void;\n err(text: string): void;\n data(value: unknown, text: string): void;\n exit: number;\n}\n\nfunction need(v: string | undefined, flag: string): string {\n if (!v) throw new DevWorkspaceError('USAGE', `Missing required option --${flag}.`, { hint: 'Run \"devworkspace <command> --help\".' });\n return v;\n}\n\nfunction oneOf<T extends string>(v: string | undefined, allowed: readonly T[], flag: string, fallback?: T): T {\n const x = v ?? fallback;\n if (x === undefined || !(allowed as readonly string[]).includes(x)) {\n throw new DevWorkspaceError('USAGE', `--${flag} must be one of: ${allowed.join(', ')}.`);\n }\n return x as T;\n}\n\ntype Handler = (c: Ctx) => Promise<void>;\n\nasync function runSetupCommand(c: Ctx, repair: boolean): Promise<void> {\n const v = c.args.values;\n const progress = c.json ? undefined : (e: { id: string; step: string; state: string; detail?: string }): void => {\n if (e.state === 'info' && !e.detail) return;\n const mark = e.state === 'ok' ? c.style.sym.ok : e.state === 'fail' ? c.style.sym.fail : e.state === 'skip' ? c.style.sym.info : c.style.sym.arrow;\n c.err(` ${mark} [${e.id}] ${e.detail ?? e.step}\\n`);\n };\n const r = await setupIntegrations(c.svc, { yes: bool(v, 'yes'), scope: scopeOf(v), only: list(v, 'only'), repair }, progress);\n c.data(r, renderSetup(c.style, r));\n c.exit = setupExitCode(r);\n}\n\nfunction scopeOf(v: ParsedArgs['values']): InstallScope {\n const s = str(v, 'scope');\n if (s === undefined) return 'project';\n if (s !== 'project' && s !== 'user') throw new DevWorkspaceError('USAGE', '--scope must be \"project\" or \"user\".');\n return s;\n}\n\n/** Exit code for a setup run: 0 verified/awaiting restart, 1 failed or blocked, 2 approval needed, 3 finished but not fully verified. */\nexport function setupExitCode(r: SetupResult): number {\n if (r.dryRun) return EXIT.OK;\n if (r.approvalRequired) return EXIT.USAGE;\n const s = r.outcomes.filter((o) => o.report.required).map((o) => o.report.status);\n if (s.some((x) => x === 'FAILED' || x === 'PREREQUISITES_MISSING')) return EXIT.FAILURE;\n if (s.every((x) => x === 'VERIFIED' || x === 'RESTART_REQUIRED')) return EXIT.OK;\n return EXIT.WARNINGS;\n}\n\nconst handlers: Record<string, Handler> = {\n async init(c) {\n const withInt = bool(c.args.values, 'with-integrations');\n const r = await initWorkspace({\n ...c.svc,\n root: str(c.args.values, 'root'),\n ...(withInt && !c.svc.dryRun ? { withIntegrations: { yes: bool(c.args.values, 'yes'), scope: scopeOf(c.args.values) } } : {}),\n });\n c.data(r, renderInit(c.style, r));\n if (r.setup) c.exit = setupExitCode(r.setup);\n },\n async setup(c) {\n if (!bool(c.args.values, 'integrations')) {\n throw new DevWorkspaceError('USAGE', 'Say what to set up: devworkspace setup --integrations', { hint: 'Run \"devworkspace setup --help\".' });\n }\n await runSetupCommand(c, false);\n },\n async integrations(c) {\n const sub = c.rest[0] ?? 'status';\n if (sub === 'repair') {\n await runSetupCommand(c, true);\n } else if (sub === 'status') {\n const r = await integrationsStatus(c.svc, { deep: !bool(c.args.values, 'quick'), restarted: bool(c.args.values, 'restarted') });\n c.data(r, renderIntegrationsStatus(c.style, r));\n if (bool(c.args.values, 'strict') && !r.summary.complete) c.exit = EXIT.WARNINGS;\n } else throw new DevWorkspaceError('USAGE', `Unknown integrations subcommand \"${sub}\".`, { hint: 'Use: status, repair.' });\n },\n async analyze(c) {\n const ws = await requireWorkspace(c.svc.cwd);\n const r = c.svc.dryRun ? await analyzeWorkspace(ws, c.svc) : await mutate(c.svc, (w) => analyzeWorkspace(w, c.svc));\n c.data(r, renderAnalyze(c.style, r));\n },\n async status(c) {\n const r = await getStatus(c.svc, { deep: bool(c.args.values, 'deep') });\n c.data(r, renderStatus(c.style, r));\n if (!r.initialized || r.workspace === 'Unreadable') c.exit = EXIT.FAILURE;\n else if (bool(c.args.values, 'strict') && (r.workspace !== 'Healthy' || r.knowledge.stale > 0 || !r.onboarding.ready)) c.exit = EXIT.WARNINGS;\n },\n async doctor(c) {\n const r = await runDoctor({ ...c.svc, fix: bool(c.args.values, 'fix') });\n c.data(r, renderDoctor(c.style, r));\n if (!r.healthy) c.exit = EXIT.FAILURE;\n else if (bool(c.args.values, 'strict') && r.counts.warn > 0) c.exit = EXIT.WARNINGS;\n },\n async refresh(c) {\n const r = await refreshWorkspace(c.svc);\n c.data(r, renderRefresh(c.style, r));\n },\n async context(c) {\n const request = str(c.args.values, 'for');\n if (request) {\n const t = await getTaskContext(c.svc, { request });\n c.data(t, renderTaskContext(c.style, t));\n return;\n }\n const r = await getContext(c.svc, { topic: str(c.args.values, 'topic'), full: bool(c.args.values, 'full') });\n c.data(r, renderContext(c.style, r));\n },\n async fact(c) {\n const sub = c.rest[0];\n const v = c.args.values;\n if (sub === 'add') {\n const sourceType = oneOf<SourceType>(str(v, 'source-type'), SOURCE_TYPES, 'source-type', 'ai');\n const input = {\n key: need(str(v, 'key'), 'key'),\n value: need(str(v, 'value'), 'value'),\n source: need(str(v, 'source'), 'source'),\n sourceType,\n sources: list(v, 'file'),\n confidence: oneOf<Confidence>(str(v, 'confidence')?.toUpperCase(), CONFIDENCE, 'confidence', 'MEDIUM'),\n status: str(v, 'status') ? oneOf<FactStatus>(str(v, 'status')!.toUpperCase(), FACT_STATUS, 'status') : undefined,\n };\n const r = await addFact(c.svc, input);\n c.data(r, `${c.style.ok(c.style.sym.ok)} Fact ${r.action}: ${r.fact.key} [${r.fact.status}/${r.fact.confidence}]`);\n } else if (sub === 'verify') {\n const f = await verifyFactByKey(c.svc, need(c.rest[1], 'key (positional)'));\n c.data(f, `${c.style.ok(c.style.sym.ok)} Verified ${f.key} [${f.status}]`);\n } else if (sub === 'remove') {\n const key = need(c.rest[1], 'key (positional)');\n const removed = await removeFactByKey(c.svc, key);\n if (!removed) throw new DevWorkspaceError('NOT_FOUND', `No fact with key \"${key}\".`);\n c.data({ removed: key }, `${c.style.ok(c.style.sym.ok)} Removed ${key}`);\n } else if (sub === 'list' || sub === undefined) {\n const ws = await requireWorkspace(c.svc.cwd);\n const facts = (await loadFacts(ws)).facts;\n c.data(facts, facts.length ? facts.map((f) => `${f.key} [${f.status}] ${f.value}`).join('\\n') : 'No facts recorded yet.');\n } else throw new DevWorkspaceError('USAGE', `Unknown fact subcommand \"${sub}\".`, { hint: 'Use: add, verify, remove, list.' });\n },\n async task(c) {\n const v = c.args.values;\n let sub = c.rest[0];\n const known = ['new', 'list', 'show', 'status', 'update', 'verify', 'tests', 'attest', 'run'];\n // `devworkspace task \"<description>\"` is shorthand for `task new`.\n if (sub !== undefined && !known.includes(sub)) {\n c.rest.unshift('new');\n sub = 'new';\n }\n const id = c.rest[1];\n switch (sub) {\n case 'new': {\n const text = c.rest.slice(1).join(' ').trim();\n if (!text) throw new DevWorkspaceError('USAGE', 'Describe the task: devworkspace task new \"<request>\"');\n const r = await createTask(c.svc, { text, type: str(v, 'type'), title: str(v, 'title') });\n const checks = r.task.verification.map((x) => `${x.check}${x.status === 'SKIPPED' ? ' (skipped: user override)' : ''}`).join(', ') || 'none';\n c.data(r, [\n `${c.style.ok(c.style.sym.ok)} Created ${r.task.id}`,\n ` type: ${r.task.type} (${r.classification.confidence === 'high' ? 'classified' : 'low confidence - confirm with the user'})${r.classification.readOnly ? ' - read-only request' : ''}`,\n ` required verification: ${checks}`,\n ` workflow: ${r.workflow.steps[0]}`,\n ].join('\\n'));\n break;\n }\n case 'list': {\n const { tasks, corrupt } = await listTasksService(c.svc, bool(v, 'all'));\n const text = tasks.length ? tasks.map((t) => `${t.id} ${t.status.padEnd(11)} ${t.type.padEnd(13)} ${t.title}`).join('\\n') : 'No tasks.';\n c.data({ tasks, corrupt }, text + (corrupt.length ? `\\n${c.style.sym.warn} ${corrupt.length} unreadable task file(s); run: devworkspace doctor` : ''));\n break;\n }\n case 'show': {\n const r = await showTask(c.svc, need(id, 'id (positional)'));\n c.data(r, renderTask(c.style, r.task, r.gate, r.next));\n break;\n }\n case 'status': {\n const r = await setTaskStatus(c.svc, need(id, 'id (positional)'), need(c.rest[2], 'status (positional)'), str(v, 'note'));\n const warn = r.gate?.warnings.map((w) => `\\n ${c.style.sym.warn} ${w}`).join('') ?? '';\n c.data(r, `${c.style.ok(c.style.sym.ok)} ${r.task.id} is now ${r.task.status}${warn}`);\n break;\n }\n case 'update': {\n const t = await updateTask(c.svc, need(id, 'id (positional)'), {\n title: str(v, 'title'),\n summary: str(v, 'summary'),\n criteria: list(v, 'criteria'),\n plan: list(v, 'plan'),\n areas: list(v, 'area'),\n decisions: list(v, 'decision-note'),\n blockers: list(v, 'blocker'),\n clearBlockers: bool(v, 'clear-blockers'),\n require: list(v, 'require'),\n });\n c.data(t, renderTask(c.style, t));\n break;\n }\n case 'verify': {\n const checkName = need(c.rest[2], 'check (positional)');\n const t = await recordVerification(c.svc, need(id, 'id (positional)'), checkName, need(c.rest[3], 'result (positional: pass|fail|skip|pending)'), {\n reason: str(v, 'reason'),\n detail: str(v, 'detail'),\n package: str(v, 'package'),\n });\n const after = await showTask(c.svc, t.id);\n const item = t.verification.find((x) => x.check === checkName);\n const how = item?.evidence?.some((e) => e.kind === 'claimed') ? 'a claim, not an executed result' : 'reported';\n c.data(t, renderTaskBrief(c.style, after.task, `${checkName}: ${item?.status ?? ''} (recorded as ${how})`, after.gate, after.next));\n break;\n }\n case 'run': {\n const seconds = int(v, 'timeout');\n const r = await runTaskCheck(c.svc, need(id, 'id (positional)'), need(c.rest[2], 'check (positional)'), { package: str(v, 'package'), timeoutMs: seconds ? seconds * 1000 : undefined });\n const after = await showTask(c.svc, r.task.id);\n c.data({ ...r, gate: after.gate, next: after.next }, renderTaskRun(c.style, r, after.gate, after.next));\n if (r.runs.some((x) => x.outcome === 'failed')) c.exit = EXIT.FAILURE;\n else if (r.runs.some((x) => x.outcome === 'refused')) c.exit = EXIT.USAGE;\n break;\n }\n case 'tests': {\n const phase = oneOf(str(v, 'phase'), ['baseline', 'after'] as const, 'phase');\n const t = await recordTests(c.svc, need(id, 'id (positional)'), phase, int(v, 'passed') ?? NaN, int(v, 'failed') ?? NaN);\n const after = await showTask(c.svc, t.id);\n c.data(t, renderTaskBrief(c.style, after.task, `tests (${phase}): ${int(v, 'passed')} passed, ${int(v, 'failed')} failed`, after.gate, after.next));\n break;\n }\n case 'attest': {\n const t = await attestTask(c.svc, need(id, 'id (positional)'), {\n userWorkIntact: bool(v, 'user-work-intact') || undefined,\n knowledgeReviewed: bool(v, 'knowledge-reviewed') || undefined,\n finalStateInspected: bool(v, 'final-state-inspected') || undefined,\n });\n const after = await showTask(c.svc, t.id);\n c.data(t, renderTaskBrief(c.style, after.task, 'attestations recorded', after.gate, after.next));\n break;\n }\n default:\n throw new DevWorkspaceError('USAGE', 'Missing task subcommand.', { hint: 'Run \"devworkspace task --help\".' });\n }\n },\n async testenv(c) {\n const v = c.args.values;\n const sub = c.rest[0] ?? 'list';\n if (sub === 'declare') {\n const d = await declareTestEnv(c.svc, { package: need(str(v, 'package'), 'package'), checks: list(v, 'check'), target: need(str(v, 'target'), 'target'), yes: bool(v, 'yes') });\n c.data(d, `${c.style.ok(c.style.sym.ok)} Declared test environment for [${d.package}]: ${d.checks.join(', ')} (${d.target}). Stored locally; DevWorkspace did not verify it.`);\n } else if (sub === 'list') {\n const ds = await listTestEnv(c.svc);\n c.data(ds, ds.length ? ds.map((d) => `[${d.package}] ${d.checks.join(', ')} - ${d.target} (declared ${d.declaredAt})`).join('\\n') : 'No test environments declared. Checks that may touch a database will not run automatically.');\n } else if (sub === 'revoke') {\n const ok = await revokeTestEnv(c.svc, need(str(v, 'package'), 'package'));\n if (!ok) throw new DevWorkspaceError('NOT_FOUND', 'No declaration for that package.');\n c.data({ revoked: str(v, 'package') }, `${c.style.ok(c.style.sym.ok)} Revoked.`);\n } else throw new DevWorkspaceError('USAGE', `Unknown testenv subcommand \"${sub}\".`, { hint: 'Use: declare, list, revoke.' });\n },\n async decision(c) {\n const v = c.args.values;\n const sub = c.rest[0] ?? 'list';\n if (sub === 'add') {\n const d = await recordDecision(c.svc, {\n title: need(str(v, 'title'), 'title'),\n context: need(str(v, 'context'), 'context'),\n decision: need(str(v, 'decision'), 'decision'),\n consequences: need(str(v, 'consequences'), 'consequences'),\n supersedes: int(v, 'supersedes'),\n });\n c.data(d, `${c.style.ok(c.style.sym.ok)} Recorded decision ${String(d.number).padStart(4, '0')}: ${d.title}`);\n } else if (sub === 'list') {\n const ds = await getDecisions(c.svc);\n c.data(ds, ds.length ? ds.map((d) => `${String(d.number).padStart(4, '0')} [${d.status}] ${d.date} ${d.title}`).join('\\n') : 'No decisions recorded.');\n } else if (sub === 'show') {\n const d = await getDecision(c.svc, Number(need(c.rest[1], 'number (positional)')));\n c.data(d, `# ${d.number}. ${d.title} [${d.status}] ${d.date}\\n\\nContext:\\n${d.context}\\n\\nDecision:\\n${d.decision}\\n\\nConsequences:\\n${d.consequences}`);\n } else throw new DevWorkspaceError('USAGE', `Unknown decision subcommand \"${sub}\".`, { hint: 'Use: add, list, show.' });\n },\n async session(c) {\n const v = c.args.values;\n const sub = c.rest[0] ?? 'list';\n if (sub === 'save') {\n const s = await recordSession(c.svc, {\n goal: need(str(v, 'goal'), 'goal'),\n completed: list(v, 'done'),\n areas: list(v, 'area'),\n testsRun: list(v, 'tests-run'),\n decisions: list(v, 'decision-note'),\n remaining: list(v, 'remaining'),\n next: str(v, 'next') ?? '',\n taskId: str(v, 'task'),\n });\n c.data(s, `${c.style.ok(c.style.sym.ok)} Saved session ${s.id}`);\n } else if (sub === 'list') {\n const ss = await getSessions(c.svc, int(v, 'limit') ?? 10);\n c.data(ss, ss.length ? ss.map((s) => `${s.id} ${s.goal} ${c.style.sym.arrow} ${s.next || '(no next step)'}`).join('\\n') : 'No sessions saved.');\n } else throw new DevWorkspaceError('USAGE', `Unknown session subcommand \"${sub}\".`, { hint: 'Use: save, list.' });\n },\n async agent(c) {\n const sub = c.rest[0];\n if (sub === 'install') {\n const target = str(c.args.values, 'agent') ?? 'claude';\n const r = await installAgent(c.svc, target);\n c.data(r, renderAgentInstall(c.style, r));\n } else if (sub === 'list') {\n const r = await listAgents(c.svc);\n c.data(r, renderAgentList(c.style, r));\n } else {\n throw new DevWorkspaceError('USAGE', `Unknown agent subcommand \"${sub ?? ''}\".`, {\n hint: 'Use: devworkspace agent install [--agent claude|codex|cursor|copilot|all], or devworkspace agent list',\n });\n }\n },\n async export(c) {\n const r = await exportWorkspace(c.svc, str(c.args.values, 'out'));\n c.data(r, renderExport(c.style, r));\n },\n async import(c) {\n const file = need(c.rest[0], 'file (positional)');\n const r = await importWorkspace({ ...c.svc, overwrite: bool(c.args.values, 'overwrite'), allowDifferentProject: bool(c.args.values, 'allow-different-project') }, file);\n c.data(r, renderImport(c.style, r));\n },\n async reset(c) {\n const r = await resetWorkspace({ ...c.svc, confirm: bool(c.args.values, 'yes'), includeAgentFiles: bool(c.args.values, 'include-agent-files') });\n c.data(r, renderReset(c.style, r));\n if (!r.executed && !c.svc.dryRun) {\n if (!c.json) c.out('\\nNothing was deleted. Re-run with --yes to confirm.');\n c.exit = EXIT.USAGE;\n }\n },\n async migrate(c) {\n const r = await migrateWorkspace(c.svc);\n c.data(r, renderMigrate(c.style, r));\n },\n};\n\nconst ALIASES: Record<string, string> = { tasks: 'task' };\n\n/** Run the CLI and return the process exit code. Never calls process.exit, so it is directly testable. */\nexport async function run(argv: string[], io: CliIO = defaultIO()): Promise<number> {\n let debug = argv.includes('--debug');\n let json = argv.includes('--json');\n try {\n const args = parseCli(argv);\n const v = args.values;\n debug = bool(v, 'debug');\n json = bool(v, 'json');\n const color = io.isTTY && !io.env.NO_COLOR && !bool(v, 'no-color') && io.env.TERM !== 'dumb';\n const ascii = bool(v, 'ascii') || !!io.env.DEVWORKSPACE_ASCII;\n const style = makeStyle({ color, ascii });\n const logger = createLogger(debug ? 'debug' : 'warn', (l) => io.stderr(l + '\\n'));\n\n if (bool(v, 'version') || args.positionals[0] === 'version') {\n io.stdout(packageVersion() + '\\n');\n return EXIT.OK;\n }\n const [rawCmd, ...rest] = args.positionals;\n const cmd = rawCmd ? (ALIASES[rawCmd] ?? rawCmd) : undefined;\n if (rawCmd === 'tasks') rest.unshift('list');\n if (!cmd || cmd === 'help') {\n const target = cmd === 'help' ? COMMANDS.find((c) => c.name === rest[0]) : undefined;\n io.stdout((target ? commandHelp(target) : topHelp(packageVersion())) + '\\n');\n return EXIT.OK;\n }\n const help = COMMANDS.find((c) => c.name === cmd);\n const handler = handlers[cmd];\n if (!help || !handler) {\n throw new DevWorkspaceError('USAGE', `Unknown command \"${rawCmd}\".`, { hint: 'Run \"devworkspace --help\" to see available commands.' });\n }\n if (bool(v, 'help')) {\n io.stdout(commandHelp(help) + '\\n');\n return EXIT.OK;\n }\n\n const cwd = path.resolve(io.cwd, str(v, 'cwd') ?? '.');\n const ctx: Ctx = {\n args,\n rest,\n svc: { cwd, dryRun: bool(v, 'dry-run'), env: io.env, runner: io.runner, ...(io.env.DEVWORKSPACE_HOME ? { homeDir: io.env.DEVWORKSPACE_HOME } : {}) },\n json,\n style,\n exit: EXIT.OK,\n out: (t) => io.stdout(t + '\\n'),\n err: (t) => io.stderr(t),\n data: (value, text) => io.stdout((json ? JSON.stringify(value, null, 2) : text) + '\\n'),\n };\n logger.debug(`command=${cmd} cwd=${cwd}`);\n await handler(ctx);\n return ctx.exit;\n } catch (e) {\n if (json) {\n const err = isDevWorkspaceError(e)\n ? { code: e.code, message: e.message, hint: e.hint ?? null, stateChanged: e.stateChanged }\n : { code: 'INTERNAL', message: e instanceof Error ? e.message : String(e), hint: null, stateChanged: false };\n io.stdout(JSON.stringify({ error: err }, null, 2) + '\\n');\n } else {\n io.stderr(formatError(e, debug) + '\\n');\n }\n return isDevWorkspaceError(e) ? e.exitCode : EXIT.FAILURE;\n }\n}\n"]}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'node:path';\nimport { DevWorkspaceError, EXIT, formatError, isDevWorkspaceError } from '../errors/index.js';\nimport { packageVersion } from '../core/version.js';\nimport { createLogger } from '../utils/logger.js';\nimport { bool, int, list, parseCli, str, type ParsedArgs } from './args.js';\nimport { COMMANDS, commandHelp, topHelp } from './help.js';\nimport {\n makeStyle,\n renderAgentInstall,\n renderAgentList,\n renderAnalyze,\n renderContext,\n renderTaskContext,\n renderDoctor,\n renderExport,\n renderImport,\n renderInit,\n renderIntegrationsStatus,\n renderSetup,\n renderMigrate,\n renderRefresh,\n renderReset,\n renderStatus,\n renderTask,\n renderTaskBrief,\n renderTaskRun,\n renderFeature,\n renderFeatureList,\n renderFeatureValidation,\n renderGraphStatus,\n renderGraphTrace,\n renderProjectSetup,\n type Style,\n} from './render.js';\nimport { listFeaturesService, getFeatureService, validateFeatureMapService, saveFeatureService } from '../services/features.js';\nimport { getGraphStatusService, traceGraphService } from '../services/graph.js';\nimport { setupProject } from '../services/setup.js';\nimport type { FeatureComponent } from '../features/types.js';\nimport { requireWorkspace } from '../core/workspace.js';\nimport { analyzeWorkspace } from '../services/analysis.js';\nimport { installAgent, listAgents } from '../services/agent.js';\nimport { mutate, type ServiceOptions } from '../services/common.js';\nimport { runDoctor } from '../services/doctor.js';\nimport { initWorkspace } from '../services/init.js';\nimport { integrationsStatus, setupIntegrations } from '../services/integrations.js';\nimport type { SetupResult } from '../integrations/manager.js';\nimport type { InstallScope, Runner } from '../integrations/types.js';\nimport { getTaskContext, isContextRole, CONTEXT_ROLES, type ContextRole } from '../services/taskContext.js';\nimport { addFact, getContext, removeFactByKey, verifyFactByKey } from '../services/knowledge.js';\nimport { migrateWorkspace } from '../services/migrate.js';\nimport { exportWorkspace, importWorkspace } from '../services/portability.js';\nimport { getDecision, getDecisions, getSessions, recordDecision, recordSession } from '../services/records.js';\nimport { refreshWorkspace } from '../services/refresh.js';\nimport { resetWorkspace } from '../services/reset.js';\nimport { getStatus } from '../services/status.js';\nimport { declareTestEnv, listTestEnv, revokeTestEnv, runTaskCheck } from '../services/verify.js';\nimport {\n attestTask,\n createTask,\n listTasksService,\n recordTests,\n recordVerification,\n setTaskStatus,\n showTask,\n updateTask,\n} from '../services/tasks.js';\nimport { CONFIDENCE, FACT_STATUS, SOURCE_TYPES, type Confidence, type FactStatus, type SourceType } from '../config/schemas.js';\nimport { loadFacts } from '../knowledge/facts.js';\n\nexport interface CliIO {\n stdout: (s: string) => void;\n stderr: (s: string) => void;\n cwd: string;\n env: NodeJS.ProcessEnv;\n isTTY: boolean;\n /** Process runner used by the integration manager (tests inject a fake; the default runs real processes). */\n runner?: Runner;\n}\n\nexport function defaultIO(): CliIO {\n return {\n stdout: (s) => process.stdout.write(s),\n stderr: (s) => process.stderr.write(s),\n cwd: process.cwd(),\n env: process.env,\n isTTY: !!process.stdout.isTTY,\n };\n}\n\ninterface Ctx {\n args: ParsedArgs;\n rest: string[];\n svc: ServiceOptions;\n json: boolean;\n style: Style;\n out(text: string): void;\n err(text: string): void;\n data(value: unknown, text: string): void;\n exit: number;\n}\n\nfunction need(v: string | undefined, flag: string): string {\n if (!v) throw new DevWorkspaceError('USAGE', `Missing required option --${flag}.`, { hint: 'Run \"devworkspace <command> --help\".' });\n return v;\n}\n\nfunction oneOf<T extends string>(v: string | undefined, allowed: readonly T[], flag: string, fallback?: T): T {\n const x = v ?? fallback;\n if (x === undefined || !(allowed as readonly string[]).includes(x)) {\n throw new DevWorkspaceError('USAGE', `--${flag} must be one of: ${allowed.join(', ')}.`);\n }\n return x as T;\n}\n\ntype Handler = (c: Ctx) => Promise<void>;\n\nasync function runSetupCommand(c: Ctx, repair: boolean): Promise<void> {\n const v = c.args.values;\n const progress = c.json ? undefined : (e: { id: string; step: string; state: string; detail?: string }): void => {\n if (e.state === 'info' && !e.detail) return;\n const mark = e.state === 'ok' ? c.style.sym.ok : e.state === 'fail' ? c.style.sym.fail : e.state === 'skip' ? c.style.sym.info : c.style.sym.arrow;\n c.err(` ${mark} [${e.id}] ${e.detail ?? e.step}\\n`);\n };\n const r = await setupIntegrations(c.svc, { yes: bool(v, 'yes'), scope: scopeOf(v), only: list(v, 'only'), repair }, progress);\n c.data(r, renderSetup(c.style, r));\n c.exit = setupExitCode(r);\n}\n\nfunction scopeOf(v: ParsedArgs['values']): InstallScope {\n const s = str(v, 'scope');\n if (s === undefined) return 'project';\n if (s !== 'project' && s !== 'user') throw new DevWorkspaceError('USAGE', '--scope must be \"project\" or \"user\".');\n return s;\n}\n\n/** Exit code for a setup run: 0 verified/awaiting restart, 1 failed or blocked, 2 approval needed, 3 finished but not fully verified. */\nexport function setupExitCode(r: SetupResult): number {\n if (r.dryRun) return EXIT.OK;\n if (r.approvalRequired) return EXIT.USAGE;\n const s = r.outcomes.filter((o) => o.report.required).map((o) => o.report.status);\n if (s.some((x) => x === 'FAILED' || x === 'PREREQUISITES_MISSING')) return EXIT.FAILURE;\n if (s.every((x) => x === 'VERIFIED' || x === 'RESTART_REQUIRED')) return EXIT.OK;\n return EXIT.WARNINGS;\n}\n\nconst handlers: Record<string, Handler> = {\n async init(c) {\n const withInt = bool(c.args.values, 'with-integrations');\n const r = await initWorkspace({\n ...c.svc,\n root: str(c.args.values, 'root'),\n ...(withInt && !c.svc.dryRun ? { withIntegrations: { yes: bool(c.args.values, 'yes'), scope: scopeOf(c.args.values) } } : {}),\n });\n c.data(r, renderInit(c.style, r));\n if (r.setup) c.exit = setupExitCode(r.setup);\n },\n async setup(c) {\n if (bool(c.args.values, 'integrations')) {\n await runSetupCommand(c, false);\n return;\n }\n const r = await setupProject(c.svc);\n c.data(r, renderProjectSetup(c.style, r));\n if (!r.doctor.healthy) c.exit = EXIT.FAILURE;\n else if (bool(c.args.values, 'strict') && (r.doctor.warnings > 0 || r.verification.drift.length > 0)) {\n c.exit = EXIT.WARNINGS;\n }\n },\n async integrations(c) {\n const sub = c.rest[0] ?? 'status';\n if (sub === 'repair') {\n await runSetupCommand(c, true);\n } else if (sub === 'status') {\n const r = await integrationsStatus(c.svc, { deep: !bool(c.args.values, 'quick'), restarted: bool(c.args.values, 'restarted') });\n c.data(r, renderIntegrationsStatus(c.style, r));\n if (bool(c.args.values, 'strict') && !r.summary.complete) c.exit = EXIT.WARNINGS;\n } else throw new DevWorkspaceError('USAGE', `Unknown integrations subcommand \"${sub}\".`, { hint: 'Use: status, repair.' });\n },\n async analyze(c) {\n const ws = await requireWorkspace(c.svc.cwd);\n const r = c.svc.dryRun ? await analyzeWorkspace(ws, c.svc) : await mutate(c.svc, (w) => analyzeWorkspace(w, c.svc));\n c.data(r, renderAnalyze(c.style, r));\n },\n async status(c) {\n const r = await getStatus(c.svc, { deep: bool(c.args.values, 'deep') });\n c.data(r, renderStatus(c.style, r));\n if (!r.initialized || r.workspace === 'Unreadable') c.exit = EXIT.FAILURE;\n else if (bool(c.args.values, 'strict') && (r.workspace !== 'Healthy' || r.knowledge.stale > 0 || !r.onboarding.ready)) c.exit = EXIT.WARNINGS;\n },\n async doctor(c) {\n const r = await runDoctor({ ...c.svc, fix: bool(c.args.values, 'fix') });\n c.data(r, renderDoctor(c.style, r));\n if (!r.healthy) c.exit = EXIT.FAILURE;\n else if (bool(c.args.values, 'strict') && r.counts.warn > 0) c.exit = EXIT.WARNINGS;\n },\n async refresh(c) {\n const r = await refreshWorkspace(c.svc);\n c.data(r, renderRefresh(c.style, r));\n },\n async context(c) {\n const request = str(c.args.values, 'for');\n const roleRaw = str(c.args.values, 'role');\n let role: ContextRole | undefined;\n if (roleRaw !== undefined) {\n const lower = roleRaw.toLowerCase();\n if (!isContextRole(lower)) {\n throw new DevWorkspaceError('USAGE', `--role must be one of: ${CONTEXT_ROLES.join(', ')}.`);\n }\n role = lower;\n }\n if (role && !request) {\n throw new DevWorkspaceError('USAGE', '--role requires --for \"<request>\".', {\n hint: 'Run \"devworkspace context --for \\\\\"<request>\\\\\" --role <explorer|tester|reviewer>\".',\n });\n }\n if (request) {\n const t = await getTaskContext(c.svc, { request, role });\n c.data(t, renderTaskContext(c.style, t));\n return;\n }\n const r = await getContext(c.svc, { topic: str(c.args.values, 'topic'), full: bool(c.args.values, 'full') });\n c.data(r, renderContext(c.style, r));\n },\n async fact(c) {\n const sub = c.rest[0];\n const v = c.args.values;\n if (sub === 'add') {\n const sourceType = oneOf<SourceType>(str(v, 'source-type'), SOURCE_TYPES, 'source-type', 'ai');\n const input = {\n key: need(str(v, 'key'), 'key'),\n value: need(str(v, 'value'), 'value'),\n source: need(str(v, 'source'), 'source'),\n sourceType,\n sources: list(v, 'file'),\n confidence: oneOf<Confidence>(str(v, 'confidence')?.toUpperCase(), CONFIDENCE, 'confidence', 'MEDIUM'),\n status: str(v, 'status') ? oneOf<FactStatus>(str(v, 'status')!.toUpperCase(), FACT_STATUS, 'status') : undefined,\n };\n const r = await addFact(c.svc, input);\n c.data(r, `${c.style.ok(c.style.sym.ok)} Fact ${r.action}: ${r.fact.key} [${r.fact.status}/${r.fact.confidence}]`);\n } else if (sub === 'verify') {\n const f = await verifyFactByKey(c.svc, need(c.rest[1], 'key (positional)'));\n c.data(f, `${c.style.ok(c.style.sym.ok)} Verified ${f.key} [${f.status}]`);\n } else if (sub === 'remove') {\n const key = need(c.rest[1], 'key (positional)');\n const removed = await removeFactByKey(c.svc, key);\n if (!removed) throw new DevWorkspaceError('NOT_FOUND', `No fact with key \"${key}\".`);\n c.data({ removed: key }, `${c.style.ok(c.style.sym.ok)} Removed ${key}`);\n } else if (sub === 'list' || sub === undefined) {\n const ws = await requireWorkspace(c.svc.cwd);\n const facts = (await loadFacts(ws)).facts;\n c.data(facts, facts.length ? facts.map((f) => `${f.key} [${f.status}] ${f.value}`).join('\\n') : 'No facts recorded yet.');\n } else throw new DevWorkspaceError('USAGE', `Unknown fact subcommand \"${sub}\".`, { hint: 'Use: add, verify, remove, list.' });\n },\n async feature(c) {\n const sub = c.rest[0] ?? 'list';\n const v = c.args.values;\n if (sub === 'list') {\n const list = await listFeaturesService(c.svc);\n c.data(list, renderFeatureList(c.style, list));\n } else if (sub === 'show') {\n const id = need(c.rest[1] ?? str(v, 'id'), 'id (positional or --id)');\n const item = await getFeatureService(c.svc, id);\n c.data(item, renderFeature(c.style, item));\n } else if (sub === 'validate') {\n const rep = await validateFeatureMapService(c.svc);\n c.data(rep, renderFeatureValidation(c.style, rep));\n if (rep.unknown > 0 || rep.features.some((f) => !f.valid)) {\n if (bool(v, 'strict')) c.exit = EXIT.WARNINGS;\n }\n } else if (sub === 'add') {\n const id = need(str(v, 'id') ?? c.rest[1], 'id');\n const name = need(str(v, 'name') ?? str(v, 'title'), 'name');\n const entry = list(v, 'entry');\n const route = list(v, 'route');\n const service = list(v, 'service');\n const model = list(v, 'model');\n const test = list(v, 'test');\n const tags = list(v, 'tag');\n const symbol = str(v, 'symbol');\n\n const toComp = (p: string): FeatureComponent => ({\n path: p,\n ...(symbol ? { symbol } : {}),\n status: 'inferred',\n });\n\n const saved = await saveFeatureService(c.svc, {\n id,\n name,\n description: str(v, 'description'),\n frontend: entry.length > 0 ? { entryPoints: entry.map(toComp) } : undefined,\n backend: route.length > 0 || service.length > 0 ? { routes: route.map(toComp), services: service.map(toComp) } : undefined,\n database: model.length > 0 ? { models: model.map(toComp) } : undefined,\n tests: test.length > 0 ? { unit: test.map(toComp) } : undefined,\n tags: tags.length > 0 ? tags : undefined,\n });\n c.data(saved, `${c.style.ok(c.style.sym.ok)} Saved feature ${saved.id} [${saved.status}]: ${saved.name}`);\n } else {\n throw new DevWorkspaceError('USAGE', `Unknown feature subcommand \"${sub}\".`, { hint: 'Use: list, show, validate, add.' });\n }\n },\n async graph(c) {\n const sub = c.rest[0] ?? 'status';\n const v = c.args.values;\n if (sub === 'status') {\n const res = await getGraphStatusService(c.svc);\n c.data(res, renderGraphStatus(c.style, res));\n } else if (sub === 'trace') {\n const query = str(v, 'from') ?? c.rest[1];\n if (!query) throw new DevWorkspaceError('USAGE', 'Specify a starting file or symbol: devworkspace graph trace <query> or --from <path>');\n const depth = int(v, 'depth');\n const trace = await traceGraphService(c.svc, query, { depth });\n c.data(trace, renderGraphTrace(c.style, trace));\n } else {\n throw new DevWorkspaceError('USAGE', `Unknown graph subcommand \"${sub}\".`, { hint: 'Use: status, trace.' });\n }\n },\n async task(c) {\n const v = c.args.values;\n let sub = c.rest[0];\n const known = ['new', 'list', 'show', 'status', 'update', 'verify', 'tests', 'attest', 'run'];\n // `devworkspace task \"<description>\"` is shorthand for `task new`.\n if (sub !== undefined && !known.includes(sub)) {\n c.rest.unshift('new');\n sub = 'new';\n }\n const id = c.rest[1];\n switch (sub) {\n case 'new': {\n const text = c.rest.slice(1).join(' ').trim();\n if (!text) throw new DevWorkspaceError('USAGE', 'Describe the task: devworkspace task new \"<request>\"');\n const r = await createTask(c.svc, { text, type: str(v, 'type'), title: str(v, 'title') });\n const checks = r.task.verification.map((x) => `${x.check}${x.status === 'SKIPPED' ? ' (skipped: user override)' : ''}`).join(', ') || 'none';\n c.data(r, [\n `${c.style.ok(c.style.sym.ok)} Created ${r.task.id}`,\n ` type: ${r.task.type} (${r.classification.confidence === 'high' ? 'classified' : 'low confidence - confirm with the user'})${r.classification.readOnly ? ' - read-only request' : ''}`,\n ` required verification: ${checks}`,\n ` workflow: ${r.workflow.steps[0]}`,\n ].join('\\n'));\n break;\n }\n case 'list': {\n const { tasks, corrupt } = await listTasksService(c.svc, bool(v, 'all'));\n const text = tasks.length ? tasks.map((t) => `${t.id} ${t.status.padEnd(11)} ${t.type.padEnd(13)} ${t.title}`).join('\\n') : 'No tasks.';\n c.data({ tasks, corrupt }, text + (corrupt.length ? `\\n${c.style.sym.warn} ${corrupt.length} unreadable task file(s); run: devworkspace doctor` : ''));\n break;\n }\n case 'show': {\n const r = await showTask(c.svc, need(id, 'id (positional)'));\n c.data(r, renderTask(c.style, r.task, r.gate, r.next));\n break;\n }\n case 'status': {\n const r = await setTaskStatus(c.svc, need(id, 'id (positional)'), need(c.rest[2], 'status (positional)'), str(v, 'note'));\n const warn = r.gate?.warnings.map((w) => `\\n ${c.style.sym.warn} ${w}`).join('') ?? '';\n c.data(r, `${c.style.ok(c.style.sym.ok)} ${r.task.id} is now ${r.task.status}${warn}`);\n break;\n }\n case 'update': {\n const t = await updateTask(c.svc, need(id, 'id (positional)'), {\n title: str(v, 'title'),\n summary: str(v, 'summary'),\n criteria: list(v, 'criteria'),\n plan: list(v, 'plan'),\n areas: list(v, 'area'),\n decisions: list(v, 'decision-note'),\n blockers: list(v, 'blocker'),\n clearBlockers: bool(v, 'clear-blockers'),\n require: list(v, 'require'),\n });\n c.data(t, renderTask(c.style, t));\n break;\n }\n case 'verify': {\n const checkName = need(c.rest[2], 'check (positional)');\n const t = await recordVerification(c.svc, need(id, 'id (positional)'), checkName, need(c.rest[3], 'result (positional: pass|fail|skip|pending)'), {\n reason: str(v, 'reason'),\n detail: str(v, 'detail'),\n package: str(v, 'package'),\n });\n const after = await showTask(c.svc, t.id);\n const item = t.verification.find((x) => x.check === checkName);\n const how = item?.evidence?.some((e) => e.kind === 'claimed') ? 'a claim, not an executed result' : 'reported';\n c.data(t, renderTaskBrief(c.style, after.task, `${checkName}: ${item?.status ?? ''} (recorded as ${how})`, after.gate, after.next));\n break;\n }\n case 'run': {\n const seconds = int(v, 'timeout');\n const r = await runTaskCheck(c.svc, need(id, 'id (positional)'), need(c.rest[2], 'check (positional)'), { package: str(v, 'package'), timeoutMs: seconds ? seconds * 1000 : undefined });\n const after = await showTask(c.svc, r.task.id);\n c.data({ ...r, gate: after.gate, next: after.next }, renderTaskRun(c.style, r, after.gate, after.next));\n if (r.runs.some((x) => x.outcome === 'failed')) c.exit = EXIT.FAILURE;\n else if (r.runs.some((x) => x.outcome === 'refused')) c.exit = EXIT.USAGE;\n break;\n }\n case 'tests': {\n const phase = oneOf(str(v, 'phase'), ['baseline', 'after'] as const, 'phase');\n const t = await recordTests(c.svc, need(id, 'id (positional)'), phase, int(v, 'passed') ?? NaN, int(v, 'failed') ?? NaN);\n const after = await showTask(c.svc, t.id);\n c.data(t, renderTaskBrief(c.style, after.task, `tests (${phase}): ${int(v, 'passed')} passed, ${int(v, 'failed')} failed`, after.gate, after.next));\n break;\n }\n case 'attest': {\n const t = await attestTask(c.svc, need(id, 'id (positional)'), {\n userWorkIntact: bool(v, 'user-work-intact') || undefined,\n knowledgeReviewed: bool(v, 'knowledge-reviewed') || undefined,\n finalStateInspected: bool(v, 'final-state-inspected') || undefined,\n });\n const after = await showTask(c.svc, t.id);\n c.data(t, renderTaskBrief(c.style, after.task, 'attestations recorded', after.gate, after.next));\n break;\n }\n default:\n throw new DevWorkspaceError('USAGE', 'Missing task subcommand.', { hint: 'Run \"devworkspace task --help\".' });\n }\n },\n async testenv(c) {\n const v = c.args.values;\n const sub = c.rest[0] ?? 'list';\n if (sub === 'declare') {\n const d = await declareTestEnv(c.svc, { package: need(str(v, 'package'), 'package'), checks: list(v, 'check'), target: need(str(v, 'target'), 'target'), yes: bool(v, 'yes') });\n c.data(d, `${c.style.ok(c.style.sym.ok)} Declared test environment for [${d.package}]: ${d.checks.join(', ')} (${d.target}). Stored locally; DevWorkspace did not verify it.`);\n } else if (sub === 'list') {\n const ds = await listTestEnv(c.svc);\n c.data(ds, ds.length ? ds.map((d) => `[${d.package}] ${d.checks.join(', ')} - ${d.target} (declared ${d.declaredAt})`).join('\\n') : 'No test environments declared. Checks that may touch a database will not run automatically.');\n } else if (sub === 'revoke') {\n const ok = await revokeTestEnv(c.svc, need(str(v, 'package'), 'package'));\n if (!ok) throw new DevWorkspaceError('NOT_FOUND', 'No declaration for that package.');\n c.data({ revoked: str(v, 'package') }, `${c.style.ok(c.style.sym.ok)} Revoked.`);\n } else throw new DevWorkspaceError('USAGE', `Unknown testenv subcommand \"${sub}\".`, { hint: 'Use: declare, list, revoke.' });\n },\n async decision(c) {\n const v = c.args.values;\n const sub = c.rest[0] ?? 'list';\n if (sub === 'add') {\n const d = await recordDecision(c.svc, {\n title: need(str(v, 'title'), 'title'),\n context: need(str(v, 'context'), 'context'),\n decision: need(str(v, 'decision'), 'decision'),\n consequences: need(str(v, 'consequences'), 'consequences'),\n supersedes: int(v, 'supersedes'),\n });\n c.data(d, `${c.style.ok(c.style.sym.ok)} Recorded decision ${String(d.number).padStart(4, '0')}: ${d.title}`);\n } else if (sub === 'list') {\n const ds = await getDecisions(c.svc);\n c.data(ds, ds.length ? ds.map((d) => `${String(d.number).padStart(4, '0')} [${d.status}] ${d.date} ${d.title}`).join('\\n') : 'No decisions recorded.');\n } else if (sub === 'show') {\n const d = await getDecision(c.svc, Number(need(c.rest[1], 'number (positional)')));\n c.data(d, `# ${d.number}. ${d.title} [${d.status}] ${d.date}\\n\\nContext:\\n${d.context}\\n\\nDecision:\\n${d.decision}\\n\\nConsequences:\\n${d.consequences}`);\n } else throw new DevWorkspaceError('USAGE', `Unknown decision subcommand \"${sub}\".`, { hint: 'Use: add, list, show.' });\n },\n async session(c) {\n const v = c.args.values;\n const sub = c.rest[0] ?? 'list';\n if (sub === 'save') {\n const s = await recordSession(c.svc, {\n goal: need(str(v, 'goal'), 'goal'),\n completed: list(v, 'done'),\n areas: list(v, 'area'),\n testsRun: list(v, 'tests-run'),\n decisions: list(v, 'decision-note'),\n remaining: list(v, 'remaining'),\n next: str(v, 'next') ?? '',\n taskId: str(v, 'task'),\n });\n c.data(s, `${c.style.ok(c.style.sym.ok)} Saved session ${s.id}`);\n } else if (sub === 'list') {\n const ss = await getSessions(c.svc, int(v, 'limit') ?? 10);\n c.data(ss, ss.length ? ss.map((s) => `${s.id} ${s.goal} ${c.style.sym.arrow} ${s.next || '(no next step)'}`).join('\\n') : 'No sessions saved.');\n } else throw new DevWorkspaceError('USAGE', `Unknown session subcommand \"${sub}\".`, { hint: 'Use: save, list.' });\n },\n async agent(c) {\n const sub = c.rest[0];\n if (sub === 'install') {\n const target = str(c.args.values, 'agent') ?? 'claude';\n const r = await installAgent(c.svc, target);\n c.data(r, renderAgentInstall(c.style, r));\n } else if (sub === 'list') {\n const r = await listAgents(c.svc);\n c.data(r, renderAgentList(c.style, r));\n } else {\n throw new DevWorkspaceError('USAGE', `Unknown agent subcommand \"${sub ?? ''}\".`, {\n hint: 'Use: devworkspace agent install [--agent claude|codex|cursor|copilot|all], or devworkspace agent list',\n });\n }\n },\n async export(c) {\n const r = await exportWorkspace(c.svc, str(c.args.values, 'out'));\n c.data(r, renderExport(c.style, r));\n },\n async import(c) {\n const file = need(c.rest[0], 'file (positional)');\n const r = await importWorkspace({ ...c.svc, overwrite: bool(c.args.values, 'overwrite'), allowDifferentProject: bool(c.args.values, 'allow-different-project') }, file);\n c.data(r, renderImport(c.style, r));\n },\n async reset(c) {\n const r = await resetWorkspace({ ...c.svc, confirm: bool(c.args.values, 'yes'), includeAgentFiles: bool(c.args.values, 'include-agent-files') });\n c.data(r, renderReset(c.style, r));\n if (!r.executed && !c.svc.dryRun) {\n if (!c.json) c.out('\\nNothing was deleted. Re-run with --yes to confirm.');\n c.exit = EXIT.USAGE;\n }\n },\n async migrate(c) {\n const r = await migrateWorkspace(c.svc);\n c.data(r, renderMigrate(c.style, r));\n },\n};\n\nconst ALIASES: Record<string, string> = { tasks: 'task' };\n\n/** Run the CLI and return the process exit code. Never calls process.exit, so it is directly testable. */\nexport async function run(argv: string[], io: CliIO = defaultIO()): Promise<number> {\n let debug = argv.includes('--debug');\n let json = argv.includes('--json');\n try {\n const args = parseCli(argv);\n const v = args.values;\n debug = bool(v, 'debug');\n json = bool(v, 'json');\n const color = io.isTTY && !io.env.NO_COLOR && !bool(v, 'no-color') && io.env.TERM !== 'dumb';\n const ascii = bool(v, 'ascii') || !!io.env.DEVWORKSPACE_ASCII;\n const style = makeStyle({ color, ascii });\n const logger = createLogger(debug ? 'debug' : 'warn', (l) => io.stderr(l + '\\n'));\n\n if (bool(v, 'version') || args.positionals[0] === 'version') {\n io.stdout(packageVersion() + '\\n');\n return EXIT.OK;\n }\n const [rawCmd, ...rest] = args.positionals;\n const cmd = rawCmd ? (ALIASES[rawCmd] ?? rawCmd) : undefined;\n if (rawCmd === 'tasks') rest.unshift('list');\n if (!cmd || cmd === 'help') {\n const target = cmd === 'help' ? COMMANDS.find((c) => c.name === rest[0]) : undefined;\n io.stdout((target ? commandHelp(target) : topHelp(packageVersion())) + '\\n');\n return EXIT.OK;\n }\n const help = COMMANDS.find((c) => c.name === cmd);\n const handler = handlers[cmd];\n if (!help || !handler) {\n throw new DevWorkspaceError('USAGE', `Unknown command \"${rawCmd}\".`, { hint: 'Run \"devworkspace --help\" to see available commands.' });\n }\n if (bool(v, 'help')) {\n io.stdout(commandHelp(help) + '\\n');\n return EXIT.OK;\n }\n\n const cwd = path.resolve(io.cwd, str(v, 'cwd') ?? '.');\n const ctx: Ctx = {\n args,\n rest,\n svc: { cwd, dryRun: bool(v, 'dry-run'), env: io.env, runner: io.runner, ...(io.env.DEVWORKSPACE_HOME ? { homeDir: io.env.DEVWORKSPACE_HOME } : {}) },\n json,\n style,\n exit: EXIT.OK,\n out: (t) => io.stdout(t + '\\n'),\n err: (t) => io.stderr(t),\n data: (value, text) => io.stdout((json ? JSON.stringify(value, null, 2) : text) + '\\n'),\n };\n logger.debug(`command=${cmd} cwd=${cwd}`);\n await handler(ctx);\n return ctx.exit;\n } catch (e) {\n if (json) {\n const err = isDevWorkspaceError(e)\n ? { code: e.code, message: e.message, hint: e.hint ?? null, stateChanged: e.stateChanged }\n : { code: 'INTERNAL', message: e instanceof Error ? e.message : String(e), hint: null, stateChanged: false };\n io.stdout(JSON.stringify({ error: err }, null, 2) + '\\n');\n } else {\n io.stderr(formatError(e, debug) + '\\n');\n }\n return isDevWorkspaceError(e) ? e.exitCode : EXIT.FAILURE;\n }\n}\n"]}
@@ -68,6 +68,12 @@ export interface CommandEntry {
68
68
  * DevWorkspace never runs a mutating command on its own.
69
69
  */
70
70
  mutates?: boolean;
71
+ /** Human-readable explanation of why this check is required, conditional, or optional. */
72
+ reason?: string;
73
+ /** Safe prerequisite services or environments required before running (e.g. ['database', 'redis']). */
74
+ prerequisites?: string[];
75
+ /** Set to true when this check entry has been manually edited or confirmed by a user. Preserved across refresh/analysis. */
76
+ userOverride?: boolean;
71
77
  }
72
78
  export interface CommandsFile {
73
79
  schemaVersion: number;
@@ -73,6 +73,12 @@ export function validateCommands(v, file = 'commands.json') {
73
73
  ec.at_('origin').oneOf(eo.origin, ['repository-script', 'inferred', 'user']);
74
74
  if (eo.mutates !== undefined)
75
75
  ec.at_('mutates').bool(eo.mutates);
76
+ if (eo.reason !== undefined)
77
+ ec.at_('reason').str(eo.reason, { max: 1000 });
78
+ if (eo.prerequisites !== undefined)
79
+ ec.at_('prerequisites').strArr(eo.prerequisites, 50);
80
+ if (eo.userOverride !== undefined)
81
+ ec.at_('userOverride').bool(eo.userOverride);
76
82
  if (eo.cwd !== undefined) {
77
83
  const cwd = ec.at_('cwd').str(eo.cwd, { max: 240 });
78
84
  const err = validateRelativePath(cwd);
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/config/schemas.ts"],"names":[],"mappings":"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","sourcesContent":["import { DevWorkspaceError } from '../errors/index.js';\nimport { validateRelativePath } from '../utils/paths.js';\nimport { Check } from './validate.js';\n\nexport const SCHEMA_VERSION = 1;\n\nexport const CONFIDENCE = ['HIGH', 'MEDIUM', 'LOW'] as const;\nexport const FACT_STATUS = ['VERIFIED', 'DETECTED', 'INFERRED', 'USER_DECISION', 'UNKNOWN', 'STALE'] as const;\nexport const SOURCE_TYPES = ['detector', 'file', 'git', 'user', 'ai'] as const;\nexport const REVIEW_LEVELS = ['off', 'light', 'strict'] as const;\n\nexport type Confidence = (typeof CONFIDENCE)[number];\nexport type FactStatus = (typeof FACT_STATUS)[number];\nexport type SourceType = (typeof SOURCE_TYPES)[number];\nexport type ReviewLevel = (typeof REVIEW_LEVELS)[number];\n\nexport interface ManagedFile {\n path: string;\n mode: 'owned' | 'section';\n agent?: string;\n}\n\nexport interface ProjectConfig {\n schemaVersion: number;\n projectId: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n devworkspaceVersion: string;\n settings: { review: ReviewLevel; maxFiles: number; /** The project intentionally has no tests/lint/build; doctor stops warning about it. */ acknowledgeNoVerification?: boolean };\n managedFiles: ManagedFile[];\n}\n\nexport function validateProject(v: unknown, file = 'project.json'): ProjectConfig {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n c.at_('projectId').str(o.projectId, { min: 8, max: 64 });\n c.at_('name').str(o.name, { min: 1, max: 200 });\n c.at_('createdAt').iso(o.createdAt);\n c.at_('updatedAt').iso(o.updatedAt);\n c.at_('devworkspaceVersion').str(o.devworkspaceVersion, { max: 40 });\n const s = c.at_('settings').obj(o.settings);\n c.at_('settings.review').oneOf(s.review, REVIEW_LEVELS);\n c.at_('settings.maxFiles').int(s.maxFiles, 100);\n if (s.acknowledgeNoVerification !== undefined) c.at_('settings.acknowledgeNoVerification').bool(s.acknowledgeNoVerification);\n const mf = c.at_('managedFiles').arr(o.managedFiles, 200);\n mf.forEach((m, i) => {\n const mc = c.at_(`managedFiles.${i}`);\n const mo = mc.obj(m);\n mc.at_('path').str(mo.path, { max: 240 });\n mc.at_('mode').oneOf(mo.mode, ['owned', 'section'] as const);\n });\n return o as unknown as ProjectConfig;\n}\n\nexport interface Fact {\n id: string;\n key: string;\n value: string;\n source: string;\n sourceType: SourceType;\n sources: string[];\n sourceHashes: Record<string, string>;\n confidence: Confidence;\n status: FactStatus;\n createdAt: string;\n updatedAt: string;\n lastVerifiedAt: string | null;\n staleReason?: string;\n}\n\nexport interface FactsFile {\n schemaVersion: number;\n facts: Fact[];\n}\n\nexport function validateFacts(v: unknown, file = 'facts.json'): FactsFile {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n const facts = c.at_('facts').arr(o.facts, 5000);\n facts.forEach((f, i) => {\n const fc = c.at_(`facts.${i}`);\n const fo = fc.obj(f);\n fc.at_('id').str(fo.id, { max: 64 });\n fc.at_('key').str(fo.key, { min: 1, max: 100 });\n fc.at_('value').str(fo.value, { max: 4000 });\n fc.at_('source').str(fo.source, { max: 500 });\n fc.at_('sourceType').oneOf(fo.sourceType, SOURCE_TYPES);\n fc.at_('sources').strArr(fo.sources, 100);\n fc.at_('sourceHashes').obj(fo.sourceHashes);\n fc.at_('confidence').oneOf(fo.confidence, CONFIDENCE);\n fc.at_('status').oneOf(fo.status, FACT_STATUS);\n fc.at_('createdAt').iso(fo.createdAt);\n fc.at_('updatedAt').iso(fo.updatedAt);\n if (fo.lastVerifiedAt !== null) fc.at_('lastVerifiedAt').iso(fo.lastVerifiedAt);\n });\n return o as unknown as FactsFile;\n}\n\nexport const CHECK_IDS = ['typecheck', 'unit', 'integration', 'e2e', 'lint', 'format', 'build', 'migrations', 'security'] as const;\nexport type CheckId = (typeof CHECK_IDS)[number];\nexport const REQUIRED_LEVELS = ['yes', 'context', 'no'] as const;\n\nexport interface CommandEntry {\n id: CheckId;\n available: boolean;\n command: string | null;\n required: (typeof REQUIRED_LEVELS)[number];\n source: string | null;\n /** 'repository-script' = defined by repo config (untrusted input); 'inferred' = guessed from tooling; 'user' = set by a human. */\n origin: 'repository-script' | 'inferred' | 'user';\n /**\n * Working directory, relative to the project root (POSIX separators). Absent means the project root.\n * Package-specific commands (backend vs frontend) must carry it so they are never run in the wrong place.\n */\n cwd?: string;\n /**\n * True when running the command rewrites project files (a formatter, a fixer). Absent means read-only or unknown.\n * DevWorkspace never runs a mutating command on its own.\n */\n mutates?: boolean;\n}\n\nexport interface CommandsFile {\n schemaVersion: number;\n checks: CommandEntry[];\n trustNote: string;\n}\n\nexport function validateCommands(v: unknown, file = 'commands.json'): CommandsFile {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n c.at_('trustNote').str(o.trustNote);\n c.at_('checks')\n .arr(o.checks, 100)\n .forEach((e, i) => {\n const ec = c.at_(`checks.${i}`);\n const eo = ec.obj(e);\n ec.at_('id').oneOf(eo.id, CHECK_IDS);\n ec.at_('available').bool(eo.available);\n if (eo.command !== null) ec.at_('command').str(eo.command, { max: 500 });\n ec.at_('required').oneOf(eo.required, REQUIRED_LEVELS);\n ec.at_('origin').oneOf(eo.origin, ['repository-script', 'inferred', 'user'] as const);\n if (eo.mutates !== undefined) ec.at_('mutates').bool(eo.mutates);\n if (eo.cwd !== undefined) {\n const cwd = ec.at_('cwd').str(eo.cwd, { max: 240 });\n const err = validateRelativePath(cwd);\n if (err) throw new DevWorkspaceError('SCHEMA', `Invalid ${file}: checks.${i}.cwd ${err}.`);\n }\n });\n return o as unknown as CommandsFile;\n}\n\nexport interface AnalysisState {\n schemaVersion: number;\n analyzedAt: string;\n refreshedAt: string | null;\n gitHead: string | null;\n fileCount: number;\n truncated: boolean;\n discoveryHash: string;\n}\n\nexport function validateAnalysisState(v: unknown, file = 'analysis.json'): AnalysisState {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n c.at_('analyzedAt').iso(o.analyzedAt);\n c.at_('fileCount').int(o.fileCount);\n c.at_('truncated').bool(o.truncated);\n c.at_('discoveryHash').str(o.discoveryHash, { max: 100 });\n return o as unknown as AnalysisState;\n}\n"]}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/config/schemas.ts"],"names":[],"mappings":"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","sourcesContent":["import { DevWorkspaceError } from '../errors/index.js';\nimport { validateRelativePath } from '../utils/paths.js';\nimport { Check } from './validate.js';\n\nexport const SCHEMA_VERSION = 1;\n\nexport const CONFIDENCE = ['HIGH', 'MEDIUM', 'LOW'] as const;\nexport const FACT_STATUS = ['VERIFIED', 'DETECTED', 'INFERRED', 'USER_DECISION', 'UNKNOWN', 'STALE'] as const;\nexport const SOURCE_TYPES = ['detector', 'file', 'git', 'user', 'ai'] as const;\nexport const REVIEW_LEVELS = ['off', 'light', 'strict'] as const;\n\nexport type Confidence = (typeof CONFIDENCE)[number];\nexport type FactStatus = (typeof FACT_STATUS)[number];\nexport type SourceType = (typeof SOURCE_TYPES)[number];\nexport type ReviewLevel = (typeof REVIEW_LEVELS)[number];\n\nexport interface ManagedFile {\n path: string;\n mode: 'owned' | 'section';\n agent?: string;\n}\n\nexport interface ProjectConfig {\n schemaVersion: number;\n projectId: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n devworkspaceVersion: string;\n settings: { review: ReviewLevel; maxFiles: number; /** The project intentionally has no tests/lint/build; doctor stops warning about it. */ acknowledgeNoVerification?: boolean };\n managedFiles: ManagedFile[];\n}\n\nexport function validateProject(v: unknown, file = 'project.json'): ProjectConfig {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n c.at_('projectId').str(o.projectId, { min: 8, max: 64 });\n c.at_('name').str(o.name, { min: 1, max: 200 });\n c.at_('createdAt').iso(o.createdAt);\n c.at_('updatedAt').iso(o.updatedAt);\n c.at_('devworkspaceVersion').str(o.devworkspaceVersion, { max: 40 });\n const s = c.at_('settings').obj(o.settings);\n c.at_('settings.review').oneOf(s.review, REVIEW_LEVELS);\n c.at_('settings.maxFiles').int(s.maxFiles, 100);\n if (s.acknowledgeNoVerification !== undefined) c.at_('settings.acknowledgeNoVerification').bool(s.acknowledgeNoVerification);\n const mf = c.at_('managedFiles').arr(o.managedFiles, 200);\n mf.forEach((m, i) => {\n const mc = c.at_(`managedFiles.${i}`);\n const mo = mc.obj(m);\n mc.at_('path').str(mo.path, { max: 240 });\n mc.at_('mode').oneOf(mo.mode, ['owned', 'section'] as const);\n });\n return o as unknown as ProjectConfig;\n}\n\nexport interface Fact {\n id: string;\n key: string;\n value: string;\n source: string;\n sourceType: SourceType;\n sources: string[];\n sourceHashes: Record<string, string>;\n confidence: Confidence;\n status: FactStatus;\n createdAt: string;\n updatedAt: string;\n lastVerifiedAt: string | null;\n staleReason?: string;\n}\n\nexport interface FactsFile {\n schemaVersion: number;\n facts: Fact[];\n}\n\nexport function validateFacts(v: unknown, file = 'facts.json'): FactsFile {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n const facts = c.at_('facts').arr(o.facts, 5000);\n facts.forEach((f, i) => {\n const fc = c.at_(`facts.${i}`);\n const fo = fc.obj(f);\n fc.at_('id').str(fo.id, { max: 64 });\n fc.at_('key').str(fo.key, { min: 1, max: 100 });\n fc.at_('value').str(fo.value, { max: 4000 });\n fc.at_('source').str(fo.source, { max: 500 });\n fc.at_('sourceType').oneOf(fo.sourceType, SOURCE_TYPES);\n fc.at_('sources').strArr(fo.sources, 100);\n fc.at_('sourceHashes').obj(fo.sourceHashes);\n fc.at_('confidence').oneOf(fo.confidence, CONFIDENCE);\n fc.at_('status').oneOf(fo.status, FACT_STATUS);\n fc.at_('createdAt').iso(fo.createdAt);\n fc.at_('updatedAt').iso(fo.updatedAt);\n if (fo.lastVerifiedAt !== null) fc.at_('lastVerifiedAt').iso(fo.lastVerifiedAt);\n });\n return o as unknown as FactsFile;\n}\n\nexport const CHECK_IDS = ['typecheck', 'unit', 'integration', 'e2e', 'lint', 'format', 'build', 'migrations', 'security'] as const;\nexport type CheckId = (typeof CHECK_IDS)[number];\nexport const REQUIRED_LEVELS = ['yes', 'context', 'no'] as const;\n\nexport interface CommandEntry {\n id: CheckId;\n available: boolean;\n command: string | null;\n required: (typeof REQUIRED_LEVELS)[number];\n source: string | null;\n /** 'repository-script' = defined by repo config (untrusted input); 'inferred' = guessed from tooling; 'user' = set by a human. */\n origin: 'repository-script' | 'inferred' | 'user';\n /**\n * Working directory, relative to the project root (POSIX separators). Absent means the project root.\n * Package-specific commands (backend vs frontend) must carry it so they are never run in the wrong place.\n */\n cwd?: string;\n /**\n * True when running the command rewrites project files (a formatter, a fixer). Absent means read-only or unknown.\n * DevWorkspace never runs a mutating command on its own.\n */\n mutates?: boolean;\n /** Human-readable explanation of why this check is required, conditional, or optional. */\n reason?: string;\n /** Safe prerequisite services or environments required before running (e.g. ['database', 'redis']). */\n prerequisites?: string[];\n /** Set to true when this check entry has been manually edited or confirmed by a user. Preserved across refresh/analysis. */\n userOverride?: boolean;\n}\n\nexport interface CommandsFile {\n schemaVersion: number;\n checks: CommandEntry[];\n trustNote: string;\n}\n\nexport function validateCommands(v: unknown, file = 'commands.json'): CommandsFile {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n c.at_('trustNote').str(o.trustNote);\n c.at_('checks')\n .arr(o.checks, 100)\n .forEach((e, i) => {\n const ec = c.at_(`checks.${i}`);\n const eo = ec.obj(e);\n ec.at_('id').oneOf(eo.id, CHECK_IDS);\n ec.at_('available').bool(eo.available);\n if (eo.command !== null) ec.at_('command').str(eo.command, { max: 500 });\n ec.at_('required').oneOf(eo.required, REQUIRED_LEVELS);\n ec.at_('origin').oneOf(eo.origin, ['repository-script', 'inferred', 'user'] as const);\n if (eo.mutates !== undefined) ec.at_('mutates').bool(eo.mutates);\n if (eo.reason !== undefined) ec.at_('reason').str(eo.reason, { max: 1000 });\n if (eo.prerequisites !== undefined) ec.at_('prerequisites').strArr(eo.prerequisites, 50);\n if (eo.userOverride !== undefined) ec.at_('userOverride').bool(eo.userOverride);\n if (eo.cwd !== undefined) {\n const cwd = ec.at_('cwd').str(eo.cwd, { max: 240 });\n const err = validateRelativePath(cwd);\n if (err) throw new DevWorkspaceError('SCHEMA', `Invalid ${file}: checks.${i}.cwd ${err}.`);\n }\n });\n return o as unknown as CommandsFile;\n}\n\nexport interface AnalysisState {\n schemaVersion: number;\n analyzedAt: string;\n refreshedAt: string | null;\n gitHead: string | null;\n fileCount: number;\n truncated: boolean;\n discoveryHash: string;\n}\n\nexport function validateAnalysisState(v: unknown, file = 'analysis.json'): AnalysisState {\n const c = new Check(file);\n const o = c.obj(v);\n c.at_('schemaVersion').int(o.schemaVersion, 1);\n c.at_('analyzedAt').iso(o.analyzedAt);\n c.at_('fileCount').int(o.fileCount);\n c.at_('truncated').bool(o.truncated);\n c.at_('discoveryHash').str(o.discoveryHash, { max: 100 });\n return o as unknown as AnalysisState;\n}\n"]}
@@ -1,2 +1,9 @@
1
1
  /** The package version, read from package.json so the CLI and the package can never drift apart. */
2
2
  export declare function packageVersion(): string;
3
+ export type CliExecutionMode = 'source-checkout' | 'installed-package' | 'npx-cache';
4
+ export interface CliProvenance {
5
+ version: string;
6
+ path: string;
7
+ mode: CliExecutionMode;
8
+ }
9
+ export declare function detectCliProvenance(): CliProvenance;
@@ -1,4 +1,5 @@
1
1
  import { readFileSync } from 'node:fs';
2
+ import path from 'node:path';
2
3
  let cached;
3
4
  /** The package version, read from package.json so the CLI and the package can never drift apart. */
4
5
  export function packageVersion() {
@@ -9,4 +10,16 @@ export function packageVersion() {
9
10
  cached = pkg.version;
10
11
  return cached;
11
12
  }
13
+ export function detectCliProvenance() {
14
+ const cliPath = process.argv[1] ? path.resolve(process.argv[1]) : 'unknown';
15
+ const norm = cliPath.replace(/\\/g, '/');
16
+ let mode = 'installed-package';
17
+ if (norm.includes('/_npx/') || norm.includes('\\_npx\\')) {
18
+ mode = 'npx-cache';
19
+ }
20
+ else if (norm.includes('/devworkspace/dist/') || norm.endsWith('/dist/cli/main.js') || norm.endsWith('/src/cli/main.ts')) {
21
+ mode = 'source-checkout';
22
+ }
23
+ return { version: packageVersion(), path: cliPath, mode };
24
+ }
12
25
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,IAAI,MAA0B,CAAC;AAE/B,oGAAoG;AACpG,MAAM,UAAU,cAAc;IAC5B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAwB,CAAC;IACzE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { readFileSync } from 'node:fs';\n\nlet cached: string | undefined;\n\n/** The package version, read from package.json so the CLI and the package can never drift apart. */\nexport function packageVersion(): string {\n if (cached) return cached;\n const url = new URL('../../package.json', import.meta.url);\n const pkg = JSON.parse(readFileSync(url, 'utf8')) as { version: string };\n cached = pkg.version;\n return cached;\n}\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,IAAI,MAA0B,CAAC;AAE/B,oGAAoG;AACpG,MAAM,UAAU,cAAc;IAC5B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAwB,CAAC;IACzE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC;AAUD,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,GAAqB,mBAAmB,CAAC;IACjD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,IAAI,GAAG,WAAW,CAAC;IACrB,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC3H,IAAI,GAAG,iBAAiB,CAAC;IAC3B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC5D,CAAC","sourcesContent":["import { readFileSync } from 'node:fs';\nimport path from 'node:path';\n\nlet cached: string | undefined;\n\n/** The package version, read from package.json so the CLI and the package can never drift apart. */\nexport function packageVersion(): string {\n if (cached) return cached;\n const url = new URL('../../package.json', import.meta.url);\n const pkg = JSON.parse(readFileSync(url, 'utf8')) as { version: string };\n cached = pkg.version;\n return cached;\n}\n\nexport type CliExecutionMode = 'source-checkout' | 'installed-package' | 'npx-cache';\n\nexport interface CliProvenance {\n version: string;\n path: string;\n mode: CliExecutionMode;\n}\n\nexport function detectCliProvenance(): CliProvenance {\n const cliPath = process.argv[1] ? path.resolve(process.argv[1]) : 'unknown';\n const norm = cliPath.replace(/\\\\/g, '/');\n let mode: CliExecutionMode = 'installed-package';\n if (norm.includes('/_npx/') || norm.includes('\\\\_npx\\\\')) {\n mode = 'npx-cache';\n } else if (norm.includes('/devworkspace/dist/') || norm.endsWith('/dist/cli/main.js') || norm.endsWith('/src/cli/main.ts')) {\n mode = 'source-checkout';\n }\n return { version: packageVersion(), path: cliPath, mode };\n}\n"]}
@@ -8,6 +8,7 @@ export interface Ws {
8
8
  contextDir: string;
9
9
  facts: string;
10
10
  commands: string;
11
+ features: string;
11
12
  decisionsDir: string;
12
13
  tasksActive: string;
13
14
  tasksCompleted: string;
@@ -15,6 +15,7 @@ export function wsPaths(root) {
15
15
  contextDir: j('context'),
16
16
  facts: j('context', 'facts.json'),
17
17
  commands: j('context', 'commands.json'),
18
+ features: j('context', 'features.json'),
18
19
  decisionsDir: j('decisions'),
19
20
  tasksActive: j('tasks', 'active'),
20
21
  tasksCompleted: j('tasks', 'completed'),