@hasna/todos 0.9.55 → 0.9.57

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/dist/cli/index.js CHANGED
@@ -2883,17 +2883,20 @@ var init_sync_utils = __esm(() => {
2883
2883
  // src/lib/config.ts
2884
2884
  import { existsSync as existsSync3 } from "fs";
2885
2885
  import { join as join3 } from "path";
2886
+ function getConfigPath() {
2887
+ return join3(process.env["HOME"] || HOME, ".todos", "config.json");
2888
+ }
2886
2889
  function normalizeAgent(agent) {
2887
2890
  return agent.trim().toLowerCase();
2888
2891
  }
2889
2892
  function loadConfig() {
2890
2893
  if (cached)
2891
2894
  return cached;
2892
- if (!existsSync3(CONFIG_PATH)) {
2895
+ if (!existsSync3(getConfigPath())) {
2893
2896
  cached = {};
2894
2897
  return cached;
2895
2898
  }
2896
- const config = readJsonFile(CONFIG_PATH) || {};
2899
+ const config = readJsonFile(getConfigPath()) || {};
2897
2900
  if (typeof config.sync_agents === "string") {
2898
2901
  config.sync_agents = config.sync_agents.split(",").map((a) => a.trim()).filter(Boolean);
2899
2902
  }
@@ -2929,10 +2932,9 @@ function getCompletionGuardConfig(projectPath) {
2929
2932
  }
2930
2933
  return global;
2931
2934
  }
2932
- var CONFIG_PATH, cached = null, GUARD_DEFAULTS;
2935
+ var cached = null, GUARD_DEFAULTS;
2933
2936
  var init_config = __esm(() => {
2934
2937
  init_sync_utils();
2935
- CONFIG_PATH = join3(HOME, ".todos", "config.json");
2936
2938
  GUARD_DEFAULTS = {
2937
2939
  enabled: false,
2938
2940
  min_work_seconds: 30,
@@ -11866,6 +11868,25 @@ data: ${JSON.stringify({ type: "connected", agent_id: agentId, timestamp: new Da
11866
11868
  return json({ error: e instanceof Error ? e.message : "Failed" }, 500, port);
11867
11869
  }
11868
11870
  }
11871
+ if (path === "/api/report" && method === "GET") {
11872
+ const days = parseInt(url.searchParams.get("days") || "7", 10);
11873
+ const projectId = url.searchParams.get("project_id") || undefined;
11874
+ const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
11875
+ const { getTasksChangedSince: getTasksChangedSince2, getTaskStats: getTaskStats2 } = await Promise.resolve().then(() => (init_tasks(), exports_tasks));
11876
+ const filters = projectId ? { project_id: projectId } : undefined;
11877
+ const changed = getTasksChangedSince2(since, filters);
11878
+ const all = listTasks(filters || {});
11879
+ const stats = getTaskStats2(filters);
11880
+ const completed = changed.filter((t) => t.status === "completed");
11881
+ const failed = changed.filter((t) => t.status === "failed");
11882
+ const byDay = {};
11883
+ for (const t of changed) {
11884
+ const day = t.updated_at.slice(0, 10);
11885
+ byDay[day] = (byDay[day] || 0) + 1;
11886
+ }
11887
+ const completionRate = changed.length > 0 ? Math.round(completed.length / changed.length * 100) : 0;
11888
+ return json({ days, period_since: since, total: all.length, stats, changed: changed.length, completed: completed.length, failed: failed.length, completion_rate: completionRate, by_day: byDay }, 200, port);
11889
+ }
11869
11890
  if (path === "/api/activity" && method === "GET") {
11870
11891
  const limit = parseInt(url.searchParams.get("limit") || "50", 10);
11871
11892
  const { getRecentActivity: getRecentActivity2 } = await Promise.resolve().then(() => (init_audit(), exports_audit));
@@ -13262,7 +13283,7 @@ program2.command("add <title>").description("Create a new task").option("-d, --d
13262
13283
  console.log(formatTaskLine(task));
13263
13284
  }
13264
13285
  });
13265
- program2.command("list").description("List tasks").option("-s, --status <status>", "Filter by status").option("-p, --priority <priority>", "Filter by priority").option("--assigned <agent>", "Filter by assigned agent").option("--tags <tags>", "Filter by tags (comma-separated)").option("--tag <tags>", "Filter by tags (alias for --tags)").option("-a, --all", "Show all tasks (including completed/cancelled)").option("--list <id>", "Filter by task list ID").option("--task-list <id>", "Filter by task list ID (alias for --list)").option("--project-name <name>", "Filter by project name").option("--agent-name <name>", "Filter by agent name/assigned").option("--sort <field>", "Sort by: updated, created, priority, status").option("--format <fmt>", "Output format: table (default), compact, csv, json").action((opts) => {
13286
+ program2.command("list").description("List tasks").option("-s, --status <status>", "Filter by status").option("-p, --priority <priority>", "Filter by priority").option("--assigned <agent>", "Filter by assigned agent").option("--tags <tags>", "Filter by tags (comma-separated)").option("--tag <tags>", "Filter by tags (alias for --tags)").option("-a, --all", "Show all tasks (including completed/cancelled)").option("--list <id>", "Filter by task list ID").option("--task-list <id>", "Filter by task list ID (alias for --list)").option("--project-name <name>", "Filter by project name").option("--agent-name <name>", "Filter by agent name/assigned").option("--sort <field>", "Sort by: updated, created, priority, status").option("--format <fmt>", "Output format: table (default), compact, csv, json").option("--due-today", "Only tasks due today or earlier").option("--overdue", "Only overdue tasks (past due_at)").option("--recurring", "Only recurring tasks").option("--limit <n>", "Max tasks to return").action((opts) => {
13266
13287
  const globalOpts = program2.opts();
13267
13288
  opts.tags = opts.tags || opts.tag;
13268
13289
  opts.list = opts.list || opts.taskList;
@@ -13303,7 +13324,20 @@ program2.command("list").description("List tasks").option("-s, --status <status>
13303
13324
  if (opts.agentName) {
13304
13325
  filter["assigned_to"] = opts.agentName;
13305
13326
  }
13306
- const tasks = listTasks(filter);
13327
+ if (opts.recurring)
13328
+ filter["has_recurrence"] = true;
13329
+ if (opts.limit)
13330
+ filter["limit"] = parseInt(opts.limit, 10);
13331
+ let tasks = listTasks(filter);
13332
+ if (opts.dueToday) {
13333
+ const todayEnd = new Date;
13334
+ todayEnd.setHours(23, 59, 59, 999);
13335
+ tasks = tasks.filter((t) => t.due_at && t.due_at <= todayEnd.toISOString());
13336
+ }
13337
+ if (opts.overdue) {
13338
+ const now2 = new Date().toISOString();
13339
+ tasks = tasks.filter((t) => t.due_at && t.due_at < now2 && t.status !== "completed");
13340
+ }
13307
13341
  if (opts.sort) {
13308
13342
  const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
13309
13343
  tasks.sort((a, b) => {
@@ -14908,6 +14942,71 @@ program2.command("summary").description("Generate a markdown summary of recent t
14908
14942
  console.log(lines.join(`
14909
14943
  `));
14910
14944
  });
14945
+ program2.command("report").description("Analytics report: task activity, completion rates, agent breakdown").option("--days <n>", "Days to include in report", "7").option("--project <id>", "Filter to project").option("--markdown", "Output as markdown").option("--json", "Output as JSON").action(async (opts) => {
14946
+ const globalOpts = program2.opts();
14947
+ const db = getDatabase();
14948
+ const days = parseInt(opts.days, 10);
14949
+ const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
14950
+ const projectId = opts.project || autoProject(globalOpts);
14951
+ const filter = {};
14952
+ if (projectId)
14953
+ filter.project_id = projectId;
14954
+ const { getTasksChangedSince: getTasksChangedSince2, getTaskStats: getTaskStats2 } = (init_tasks(), __toCommonJS(exports_tasks));
14955
+ const changed = getTasksChangedSince2(since, Object.keys(filter).length ? filter : undefined, db);
14956
+ const completed = changed.filter((t) => t.status === "completed");
14957
+ const failed = changed.filter((t) => t.status === "failed");
14958
+ const all = listTasks(filter);
14959
+ const stats = getTaskStats2(Object.keys(filter).length ? filter : undefined, db);
14960
+ const byDay = {};
14961
+ for (const t of changed) {
14962
+ const day = t.updated_at.slice(0, 10);
14963
+ byDay[day] = (byDay[day] || 0) + 1;
14964
+ }
14965
+ const dayValues = Object.values(byDay);
14966
+ const maxDay = Math.max(...dayValues, 1);
14967
+ const sparkline = dayValues.map((v) => "\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588"[Math.min(7, Math.floor(v / maxDay * 7))] || "\u2581").join("");
14968
+ const byAgent = {};
14969
+ for (const t of completed) {
14970
+ const agent = t.assigned_to || "unassigned";
14971
+ byAgent[agent] = (byAgent[agent] || 0) + 1;
14972
+ }
14973
+ const completionRate = changed.length > 0 ? Math.round(completed.length / changed.length * 100) : 0;
14974
+ if (opts.json || globalOpts.json) {
14975
+ console.log(JSON.stringify({ days, period_since: since, changed: changed.length, completed: completed.length, failed: failed.length, completion_rate: completionRate, total: all.length, stats, by_agent: byAgent, by_day: byDay }, null, 2));
14976
+ return;
14977
+ }
14978
+ const lines = [];
14979
+ if (opts.markdown) {
14980
+ lines.push(`## Todos Report \u2014 last ${days} days`);
14981
+ lines.push(`*${new Date().toLocaleDateString()}*
14982
+ `);
14983
+ lines.push(`| Metric | Value |`);
14984
+ lines.push(`|--------|-------|`);
14985
+ lines.push(`| Active tasks | ${all.length} total (${stats.pending} pending, ${stats.in_progress} active) |`);
14986
+ lines.push(`| Changed (${days}d) | ${changed.length} tasks |`);
14987
+ lines.push(`| Completed (${days}d) | ${completed.length} (${completionRate}% rate) |`);
14988
+ lines.push(`| Failed (${days}d) | ${failed.length} |`);
14989
+ if (sparkline)
14990
+ lines.push(`| Activity | \`${sparkline}\` |`);
14991
+ } else {
14992
+ lines.push(chalk.bold(`todos report \u2014 last ${days} day${days !== 1 ? "s" : ""}`));
14993
+ lines.push("");
14994
+ lines.push(` Total: ${chalk.bold(String(all.length))} tasks (${chalk.yellow(String(stats.pending))} pending, ${chalk.blue(String(stats.in_progress))} active)`);
14995
+ lines.push(` Changed: ${chalk.bold(String(changed.length))} in period`);
14996
+ lines.push(` Completed: ${chalk.green(String(completed.length))} (${completionRate}% rate)`);
14997
+ if (failed.length > 0)
14998
+ lines.push(` Failed: ${chalk.red(String(failed.length))}`);
14999
+ if (sparkline)
15000
+ lines.push(` Activity: ${chalk.dim(sparkline)}`);
15001
+ if (Object.keys(byAgent).length > 0) {
15002
+ lines.push(` By agent: ${Object.entries(byAgent).map(([a, n]) => `${a}=${n}`).join(" ")}`);
15003
+ }
15004
+ if (stats.in_progress > 0)
15005
+ lines.push(` Stale risk: check \`todos stale\` for stuck tasks`);
15006
+ }
15007
+ console.log(lines.join(`
15008
+ `));
15009
+ });
14911
15010
  program2.action(async () => {
14912
15011
  if (process.stdout.isTTY) {
14913
15012
  try {
package/dist/index.js CHANGED
@@ -991,7 +991,9 @@ function appendSyncConflict(metadata, conflict, limit = 5) {
991
991
  }
992
992
 
993
993
  // src/lib/config.ts
994
- var CONFIG_PATH = join3(HOME, ".todos", "config.json");
994
+ function getConfigPath() {
995
+ return join3(process.env["HOME"] || HOME, ".todos", "config.json");
996
+ }
995
997
  var cached = null;
996
998
  function normalizeAgent(agent) {
997
999
  return agent.trim().toLowerCase();
@@ -999,11 +1001,11 @@ function normalizeAgent(agent) {
999
1001
  function loadConfig() {
1000
1002
  if (cached)
1001
1003
  return cached;
1002
- if (!existsSync3(CONFIG_PATH)) {
1004
+ if (!existsSync3(getConfigPath())) {
1003
1005
  cached = {};
1004
1006
  return cached;
1005
1007
  }
1006
- const config = readJsonFile(CONFIG_PATH) || {};
1008
+ const config = readJsonFile(getConfigPath()) || {};
1007
1009
  if (typeof config.sync_agents === "string") {
1008
1010
  config.sync_agents = config.sync_agents.split(",").map((a) => a.trim()).filter(Boolean);
1009
1011
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CAC3D;AASD,wBAAgB,UAAU,IAAI,WAAW,CAYxC;AAED,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,GAAG,IAAI,CAKzD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM7D;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAG7D;AAUD,wBAAgB,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CASrG"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CAC3D;AAWD,wBAAgB,UAAU,IAAI,WAAW,CAYxC;AAED,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,GAAG,IAAI,CAKzD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM7D;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAG7D;AAUD,wBAAgB,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CASrG"}
package/dist/mcp/index.js CHANGED
@@ -5028,7 +5028,9 @@ function appendSyncConflict(metadata, conflict, limit = 5) {
5028
5028
  }
5029
5029
 
5030
5030
  // src/lib/config.ts
5031
- var CONFIG_PATH = join3(HOME, ".todos", "config.json");
5031
+ function getConfigPath() {
5032
+ return join3(process.env["HOME"] || HOME, ".todos", "config.json");
5033
+ }
5032
5034
  var cached = null;
5033
5035
  function normalizeAgent(agent) {
5034
5036
  return agent.trim().toLowerCase();
@@ -5036,11 +5038,11 @@ function normalizeAgent(agent) {
5036
5038
  function loadConfig() {
5037
5039
  if (cached)
5038
5040
  return cached;
5039
- if (!existsSync3(CONFIG_PATH)) {
5041
+ if (!existsSync3(getConfigPath())) {
5040
5042
  cached = {};
5041
5043
  return cached;
5042
5044
  }
5043
- const config = readJsonFile(CONFIG_PATH) || {};
5045
+ const config = readJsonFile(getConfigPath()) || {};
5044
5046
  if (typeof config.sync_agents === "string") {
5045
5047
  config.sync_agents = config.sync_agents.split(",").map((a) => a.trim()).filter(Boolean);
5046
5048
  }
@@ -751,14 +751,17 @@ var init_sync_utils = __esm(() => {
751
751
  // src/lib/config.ts
752
752
  import { existsSync as existsSync3 } from "fs";
753
753
  import { join as join2 } from "path";
754
+ function getConfigPath() {
755
+ return join2(process.env["HOME"] || HOME, ".todos", "config.json");
756
+ }
754
757
  function loadConfig() {
755
758
  if (cached)
756
759
  return cached;
757
- if (!existsSync3(CONFIG_PATH)) {
760
+ if (!existsSync3(getConfigPath())) {
758
761
  cached = {};
759
762
  return cached;
760
763
  }
761
- const config = readJsonFile(CONFIG_PATH) || {};
764
+ const config = readJsonFile(getConfigPath()) || {};
762
765
  if (typeof config.sync_agents === "string") {
763
766
  config.sync_agents = config.sync_agents.split(",").map((a) => a.trim()).filter(Boolean);
764
767
  }
@@ -773,10 +776,9 @@ function getCompletionGuardConfig(projectPath) {
773
776
  }
774
777
  return global;
775
778
  }
776
- var CONFIG_PATH, cached = null, GUARD_DEFAULTS;
779
+ var cached = null, GUARD_DEFAULTS;
777
780
  var init_config = __esm(() => {
778
781
  init_sync_utils();
779
- CONFIG_PATH = join2(HOME, ".todos", "config.json");
780
782
  GUARD_DEFAULTS = {
781
783
  enabled: false,
782
784
  min_work_seconds: 30,
@@ -3061,6 +3063,25 @@ data: ${JSON.stringify({ type: "connected", agent_id: agentId, timestamp: new Da
3061
3063
  return json({ error: e instanceof Error ? e.message : "Failed" }, 500, port);
3062
3064
  }
3063
3065
  }
3066
+ if (path === "/api/report" && method === "GET") {
3067
+ const days = parseInt(url.searchParams.get("days") || "7", 10);
3068
+ const projectId = url.searchParams.get("project_id") || undefined;
3069
+ const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
3070
+ const { getTasksChangedSince: getTasksChangedSince2, getTaskStats: getTaskStats2 } = await Promise.resolve().then(() => (init_tasks(), exports_tasks));
3071
+ const filters = projectId ? { project_id: projectId } : undefined;
3072
+ const changed = getTasksChangedSince2(since, filters);
3073
+ const all = listTasks(filters || {});
3074
+ const stats = getTaskStats2(filters);
3075
+ const completed = changed.filter((t) => t.status === "completed");
3076
+ const failed = changed.filter((t) => t.status === "failed");
3077
+ const byDay = {};
3078
+ for (const t of changed) {
3079
+ const day = t.updated_at.slice(0, 10);
3080
+ byDay[day] = (byDay[day] || 0) + 1;
3081
+ }
3082
+ const completionRate = changed.length > 0 ? Math.round(completed.length / changed.length * 100) : 0;
3083
+ return json({ days, period_since: since, total: all.length, stats, changed: changed.length, completed: completed.length, failed: failed.length, completion_rate: completionRate, by_day: byDay }, 200, port);
3084
+ }
3064
3085
  if (path === "/api/activity" && method === "GET") {
3065
3086
  const limit = parseInt(url.searchParams.get("limit") || "50", 10);
3066
3087
  const { getRecentActivity: getRecentActivity2 } = await Promise.resolve().then(() => (init_audit(), exports_audit));
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/server/serve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiHH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4wB1G"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/server/serve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiHH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8xB1G"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/todos",
3
- "version": "0.9.55",
3
+ "version": "0.9.57",
4
4
  "description": "Universal task management for AI coding agents - CLI + MCP server + interactive TUI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",