izanagi-ai 2.9.3 → 2.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.manifest CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "izanagi-ai",
3
- "version": "2.9.3",
3
+ "version": "2.9.4",
4
4
  "description": "Izanagi AI - Modular Skill-Oriented AI Prompt & Agent Framework for Autonomous Software Engineering",
5
5
  "author": "Pedro Henrique Sanches Leal",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/pedrohenriquesanchesleal4-debug/izanagi-ai#readme",
8
- "generatedAt": "2026-08-11T11:45:59.900Z",
8
+ "generatedAt": "2026-08-11T12:04:25.684Z",
9
9
  "agents": [
10
10
  {
11
11
  "id": "animation",
@@ -432,7 +432,7 @@
432
432
  },
433
433
  {
434
434
  "id": "architecture-patterns",
435
- "name": "Skill Architecture Patterns — Izanagi",
435
+ "name": "architecture-patterns",
436
436
  "version": "1.0.0",
437
437
  "path": "skills/architecture-patterns/SKILL.md"
438
438
  },
@@ -918,7 +918,7 @@
918
918
  },
919
919
  {
920
920
  "id": "qa",
921
- "name": "Skill QA",
921
+ "name": "qa",
922
922
  "version": "1.0.0",
923
923
  "path": "skills/qa/SKILL.md"
924
924
  },
@@ -1014,7 +1014,7 @@
1014
1014
  },
1015
1015
  {
1016
1016
  "id": "security-privacy",
1017
- "name": "Skill Security & Privacy — Izanagi",
1017
+ "name": "security-privacy",
1018
1018
  "version": "1.0.0",
1019
1019
  "path": "skills/security-privacy/SKILL.md"
1020
1020
  },
@@ -1206,7 +1206,7 @@
1206
1206
  },
1207
1207
  {
1208
1208
  "id": "web-perf-engineer",
1209
- "name": "Skill Web Performance & SEO — Izanagi",
1209
+ "name": "web-perf-seo",
1210
1210
  "version": "1.0.0",
1211
1211
  "path": "skills/web-perf-seo/SKILL.md"
1212
1212
  },
@@ -24,4 +24,5 @@ Você é o **Tech Lead** do Izanagi AI, responsável por elevar o patamar técni
24
24
  ## Sempre & Nunca
25
25
 
26
26
  - **Sempre**: Exigir code review estruturado em 5 dimensões; fornecer o fix funcional em diff; atualizar a memória persistente do projeto.
27
- - **Nunca**: Aprovar PRs sem análise profunda ("LGTM"); fazer comentários de review vagos ou ríspidos; aceitar acúmulo de débitos técnicos críticos sem mitigação.
27
+ - **Nunca**: Aprovar PRs sem análise profunda ("LGTM"); fazer comentários de review vagos ou ríspidos; aceitar acúmulo de débitos técnicos críticos sem mitigação.
28
+
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Observability / Tracing — registra cada execução do runtime em disco (JSON).
3
+ *
4
+ * Cada run gera um arquivo `.izanagi/state/traces/<runId>.json` com spans
5
+ * estruturados: task, decisões, agentes, skills, tools, modelo, tokens,
6
+ * latência, retries, falhas, artefatos, avaliação e score final.
7
+ */
8
+ import type { RunTrace, TraceSpan } from '../types.js';
9
+ export declare const TRACE_DIR_REL: string;
10
+ export interface TraceStoreOptions {
11
+ baseDir: string;
12
+ }
13
+ /**
14
+ * Store de traces em disco. Thread-safe o suficiente para CLI single-process.
15
+ */
16
+ export declare class TraceStore {
17
+ private readonly opts;
18
+ private readonly dir;
19
+ constructor(opts: TraceStoreOptions);
20
+ get directory(): string;
21
+ ensure(): void;
22
+ /** Gera um novo run id legível (izanagi-YYYYMMDD-HHMMSS-xxxx). */
23
+ static newRunId(): string;
24
+ private fileFor;
25
+ /** Persiste um trace completo. */
26
+ save(trace: RunTrace): string;
27
+ /** Carrega um trace pelo runId (ou path). */
28
+ load(runId: string): RunTrace | null;
29
+ /** Lista traces, mais recentes primeiro. */
30
+ list(limit?: number): RunTrace[];
31
+ }
32
+ export interface TraceContext {
33
+ runId: string;
34
+ task: string;
35
+ command: string;
36
+ startedAt: string;
37
+ agents: Set<string>;
38
+ skills: Set<string>;
39
+ tools: Set<string>;
40
+ retries: number;
41
+ failures: number;
42
+ spans: TraceSpan[];
43
+ }
44
+ /**
45
+ * Sessão de tracing ativa durante um run. Fecha o span ao finalizar e
46
+ * produz um RunTrace persistível.
47
+ */
48
+ export declare class Tracer {
49
+ private readonly ctx;
50
+ private readonly store;
51
+ private tokensIn;
52
+ private tokensOut;
53
+ constructor(store: TraceStore, opts: {
54
+ runId?: string;
55
+ task: string;
56
+ command: string;
57
+ });
58
+ get runId(): string;
59
+ get task(): string;
60
+ /**
61
+ * Abre um span; retorna uma função close(ok?, error?) que registra duração.
62
+ */
63
+ span(name: string, type: TraceSpan['type'], metadata?: Record<string, unknown>): (ok?: boolean, error?: string) => void;
64
+ markAgent(agent: string): void;
65
+ markSkill(skill: string): void;
66
+ markTool(tool: string): void;
67
+ addTokens(input: number, output: number): void;
68
+ /** Finaliza a sessão e devolve o RunTrace montado. */
69
+ finish(extra?: Partial<RunTrace>): RunTrace;
70
+ /** Finaliza e persiste. Retorna o runId. */
71
+ finishAndSave(extra?: Partial<RunTrace>): {
72
+ trace: RunTrace;
73
+ file: string;
74
+ };
75
+ }
76
+ //# sourceMappingURL=tracer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../../src/runtime/observability/tracer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEvD,eAAO,MAAM,aAAa,QAA2C,CAAC;AAUtE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEA,IAAI,EAAE,iBAAiB;IAIpD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,MAAM,IAAI,IAAI;IAId,kEAAkE;IAClE,MAAM,CAAC,QAAQ,IAAI,MAAM;IAOzB,OAAO,CAAC,OAAO;IAIf,kCAAkC;IAClC,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAO7B,6CAA6C;IAC7C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAUpC,4CAA4C;IAC5C,IAAI,CAAC,KAAK,SAAK,GAAG,QAAQ,EAAE;CAgB7B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;gBAEV,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAgBtF,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI;IA8BzC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI5B,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAK9C,sDAAsD;IACtD,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ;IAuB3C,4CAA4C;IAC5C,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG;QAAE,KAAK,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;CAK5E"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Observability / Tracing — registra cada execução do runtime em disco (JSON).
3
+ *
4
+ * Cada run gera um arquivo `.izanagi/state/traces/<runId>.json` com spans
5
+ * estruturados: task, decisões, agentes, skills, tools, modelo, tokens,
6
+ * latência, retries, falhas, artefatos, avaliação e score final.
7
+ */
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import crypto from 'crypto';
11
+ export const TRACE_DIR_REL = path.join('.izanagi', 'state', 'traces');
12
+ function nowIso() {
13
+ return new Date().toISOString();
14
+ }
15
+ function nowMs() {
16
+ return Date.now();
17
+ }
18
+ /**
19
+ * Store de traces em disco. Thread-safe o suficiente para CLI single-process.
20
+ */
21
+ export class TraceStore {
22
+ opts;
23
+ dir;
24
+ constructor(opts) {
25
+ this.opts = opts;
26
+ this.dir = path.join(opts.baseDir, TRACE_DIR_REL);
27
+ }
28
+ get directory() {
29
+ return this.dir;
30
+ }
31
+ ensure() {
32
+ fs.mkdirSync(this.dir, { recursive: true });
33
+ }
34
+ /** Gera um novo run id legível (izanagi-YYYYMMDD-HHMMSS-xxxx). */
35
+ static newRunId() {
36
+ const d = new Date();
37
+ const pad = (n, l = 2) => String(n).padStart(l, '0');
38
+ const stamp = `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;
39
+ return `izanagi-${stamp}-${crypto.randomBytes(2).toString('hex')}`;
40
+ }
41
+ fileFor(runId) {
42
+ return path.join(this.dir, `${runId}.json`);
43
+ }
44
+ /** Persiste um trace completo. */
45
+ save(trace) {
46
+ this.ensure();
47
+ const file = this.fileFor(trace.runId);
48
+ fs.writeFileSync(file, JSON.stringify(trace, null, 2), 'utf-8');
49
+ return file;
50
+ }
51
+ /** Carrega um trace pelo runId (ou path). */
52
+ load(runId) {
53
+ const file = path.join(this.dir, `${runId}.json`);
54
+ if (!fs.existsSync(file))
55
+ return null;
56
+ try {
57
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ /** Lista traces, mais recentes primeiro. */
64
+ list(limit = 20) {
65
+ if (!fs.existsSync(this.dir))
66
+ return [];
67
+ return fs
68
+ .readdirSync(this.dir)
69
+ .filter((f) => f.endsWith('.json'))
70
+ .map((f) => {
71
+ try {
72
+ return JSON.parse(fs.readFileSync(path.join(this.dir, f), 'utf-8'));
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ })
78
+ .filter((t) => t !== null)
79
+ .sort((a, b) => (a.startedAt < b.startedAt ? 1 : -1))
80
+ .slice(0, limit);
81
+ }
82
+ }
83
+ /**
84
+ * Sessão de tracing ativa durante um run. Fecha o span ao finalizar e
85
+ * produz um RunTrace persistível.
86
+ */
87
+ export class Tracer {
88
+ ctx;
89
+ store;
90
+ tokensIn = 0;
91
+ tokensOut = 0;
92
+ constructor(store, opts) {
93
+ this.store = store;
94
+ this.ctx = {
95
+ runId: opts.runId || TraceStore.newRunId(),
96
+ task: opts.task,
97
+ command: opts.command,
98
+ startedAt: nowIso(),
99
+ agents: new Set(),
100
+ skills: new Set(),
101
+ tools: new Set(),
102
+ retries: 0,
103
+ failures: 0,
104
+ spans: [],
105
+ };
106
+ }
107
+ get runId() {
108
+ return this.ctx.runId;
109
+ }
110
+ get task() {
111
+ return this.ctx.task;
112
+ }
113
+ /**
114
+ * Abre um span; retorna uma função close(ok?, error?) que registra duração.
115
+ */
116
+ span(name, type, metadata) {
117
+ const started = nowMs();
118
+ const startedAt = nowIso();
119
+ const id = `${this.ctx.spans.length + 1}-${name.replace(/[^a-z0-9-]/gi, '').slice(0, 24)}`;
120
+ let closed = false;
121
+ const close = (ok = true, error) => {
122
+ if (closed)
123
+ return;
124
+ closed = true;
125
+ const ended = nowMs();
126
+ this.ctx.spans.push({
127
+ id,
128
+ name,
129
+ type,
130
+ status: ok ? 'ok' : 'error',
131
+ startedAt,
132
+ endedAt: nowIso(),
133
+ durationMs: ended - started,
134
+ metadata,
135
+ error,
136
+ });
137
+ if (!ok) {
138
+ this.ctx.failures++;
139
+ if (metadata?.retry)
140
+ this.ctx.retries++;
141
+ }
142
+ };
143
+ return close;
144
+ }
145
+ markAgent(agent) {
146
+ this.ctx.agents.add(agent);
147
+ }
148
+ markSkill(skill) {
149
+ this.ctx.skills.add(skill);
150
+ }
151
+ markTool(tool) {
152
+ this.ctx.tools.add(tool);
153
+ }
154
+ addTokens(input, output) {
155
+ this.tokensIn += input;
156
+ this.tokensOut += output;
157
+ }
158
+ /** Finaliza a sessão e devolve o RunTrace montado. */
159
+ finish(extra) {
160
+ const ended = nowMs();
161
+ const startedMs = Date.parse(this.ctx.startedAt);
162
+ const trace = {
163
+ runId: this.ctx.runId,
164
+ task: this.ctx.task,
165
+ startedAt: this.ctx.startedAt,
166
+ endedAt: nowIso(),
167
+ durationMs: ended - startedMs,
168
+ command: this.ctx.command,
169
+ tokens: { input: this.tokensIn, output: this.tokensOut, total: this.tokensIn + this.tokensOut },
170
+ retries: this.ctx.retries,
171
+ failures: this.ctx.failures,
172
+ agents: Array.from(this.ctx.agents),
173
+ skills: Array.from(this.ctx.skills),
174
+ tools: Array.from(this.ctx.tools),
175
+ artifacts: [],
176
+ spans: this.ctx.spans,
177
+ ...extra,
178
+ };
179
+ return trace;
180
+ }
181
+ /** Finaliza e persiste. Retorna o runId. */
182
+ finishAndSave(extra) {
183
+ const trace = this.finish(extra);
184
+ const file = this.store.save(trace);
185
+ return { trace, file };
186
+ }
187
+ }
188
+ //# sourceMappingURL=tracer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../../src/runtime/observability/tracer.ts"],"names":[],"mappings":"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"}