@opentask/taskin-task-manager 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/completion-blockers.test.d.ts +1 -0
  3. package/dist/completion-blockers.test.js +57 -0
  4. package/dist/completion-blockers.test.js.map +1 -0
  5. package/dist/filter-tasks/filter-criteria.d.ts +181 -0
  6. package/dist/filter-tasks/filter-criteria.js +115 -0
  7. package/dist/filter-tasks/filter-criteria.js.map +1 -0
  8. package/dist/filter-tasks/filter-criteria.test.d.ts +1 -0
  9. package/dist/filter-tasks/filter-criteria.test.js +86 -0
  10. package/dist/filter-tasks/filter-criteria.test.js.map +1 -0
  11. package/dist/filter-tasks/filter-tasks.js +17 -2
  12. package/dist/filter-tasks/filter-tasks.js.map +1 -1
  13. package/dist/filter-tasks/filter-tasks.test.js +38 -0
  14. package/dist/filter-tasks/filter-tasks.test.js.map +1 -1
  15. package/dist/filter-tasks/filter-tasks.types.d.ts +5 -23
  16. package/dist/filter-tasks/index.d.ts +3 -1
  17. package/dist/filter-tasks/index.js +1 -0
  18. package/dist/filter-tasks/index.js.map +1 -1
  19. package/dist/group-registry.contract.d.ts +18 -0
  20. package/dist/group-registry.contract.js +73 -0
  21. package/dist/group-registry.contract.js.map +1 -0
  22. package/dist/group-registry.types.d.ts +44 -0
  23. package/dist/group-registry.types.js +2 -0
  24. package/dist/group-registry.types.js.map +1 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.js +3 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/numerar-prioridade/index.d.ts +1 -0
  29. package/dist/numerar-prioridade/index.js +2 -0
  30. package/dist/numerar-prioridade/index.js.map +1 -0
  31. package/dist/numerar-prioridade/numerar-prioridade.d.ts +36 -0
  32. package/dist/numerar-prioridade/numerar-prioridade.js +75 -0
  33. package/dist/numerar-prioridade/numerar-prioridade.js.map +1 -0
  34. package/dist/numerar-prioridade/numerar-prioridade.test.d.ts +1 -0
  35. package/dist/numerar-prioridade/numerar-prioridade.test.js +55 -0
  36. package/dist/numerar-prioridade/numerar-prioridade.test.js.map +1 -0
  37. package/dist/ordenar-tarefas/index.d.ts +1 -0
  38. package/dist/ordenar-tarefas/index.js +2 -0
  39. package/dist/ordenar-tarefas/index.js.map +1 -0
  40. package/dist/ordenar-tarefas/ordenar-tarefas.d.ts +70 -0
  41. package/dist/ordenar-tarefas/ordenar-tarefas.js +79 -0
  42. package/dist/ordenar-tarefas/ordenar-tarefas.js.map +1 -0
  43. package/dist/ordenar-tarefas/ordenar-tarefas.test.d.ts +1 -0
  44. package/dist/ordenar-tarefas/ordenar-tarefas.test.js +70 -0
  45. package/dist/ordenar-tarefas/ordenar-tarefas.test.js.map +1 -0
  46. package/dist/task-manager.d.ts +26 -1
  47. package/dist/task-manager.js +48 -0
  48. package/dist/task-manager.js.map +1 -1
  49. package/dist/task-manager.types.d.ts +82 -0
  50. package/dist/testing.d.ts +8 -0
  51. package/dist/testing.js +9 -0
  52. package/dist/testing.js.map +1 -0
  53. package/dist/user-registry.contract.js +6 -6
  54. package/dist/user-registry.contract.js.map +1 -1
  55. package/package.json +7 -6
  56. package/src/completion-blockers.test.ts +77 -0
  57. package/src/filter-tasks/filter-criteria.test.ts +113 -0
  58. package/src/filter-tasks/filter-criteria.ts +175 -0
  59. package/src/filter-tasks/filter-tasks.test.ts +45 -0
  60. package/src/filter-tasks/filter-tasks.ts +17 -2
  61. package/src/filter-tasks/filter-tasks.types.ts +5 -23
  62. package/src/filter-tasks/index.ts +15 -1
  63. package/src/group-registry.contract.ts +99 -0
  64. package/src/group-registry.types.ts +47 -0
  65. package/src/index.ts +3 -0
  66. package/src/numerar-prioridade/index.ts +1 -0
  67. package/src/numerar-prioridade/numerar-prioridade.test.ts +69 -0
  68. package/src/numerar-prioridade/numerar-prioridade.ts +80 -0
  69. package/src/ordenar-tarefas/index.ts +1 -0
  70. package/src/ordenar-tarefas/ordenar-tarefas.test.ts +92 -0
  71. package/src/ordenar-tarefas/ordenar-tarefas.ts +135 -0
  72. package/src/task-manager.ts +59 -0
  73. package/src/task-manager.types.ts +83 -0
  74. package/src/testing.ts +8 -0
  75. package/src/user-registry.contract.ts +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"filter-tasks.test.js","sourceRoot":"","sources":["../../src/filter-tasks/filter-tasks.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filter-tasks.test.js","sourceRoot":"","sources":["../../src/filter-tasks/filter-tasks.test.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,12 @@
1
1
  import type { GroupId, TaskId, TaskStatus, TaskType } from '@opentask/taskin-types';
2
2
  /**
3
- * O que restringe uma listagem de tarefas.
3
+ * O que restringe uma listagem de tarefas — derivado do schema unico.
4
4
  *
5
- * Todos os campos sao opcionais e **se somam**: informar dois exige os dois.
6
- * Um criterio ausente nao restringe nada.
7
- *
8
- * @public
5
+ * Vive em `filter-criteria.ts`, onde os criterios sao definidos uma vez so e as
6
+ * superficies (CLI e MCP) derivam. Reexportado aqui para nao mudar os imports
7
+ * existentes.
9
8
  */
10
- export interface TaskFilterCriteria {
11
- /** Status exato. */
12
- readonly status?: TaskStatus;
13
- /** Tipo exato. */
14
- readonly type?: TaskType;
15
- /**
16
- * Responsavel, casado por id ou nome — inteiro ou em parte, sem distinguir
17
- * maiuscula. Tarefa sem responsavel nunca casa.
18
- */
19
- readonly assignee?: string;
20
- /** Apenas o que ainda esta em aberto. Ignorado quando `status` e informado. */
21
- readonly open?: boolean;
22
- /** Apenas o que foi encerrado. Ignorado quando `status` e informado. */
23
- readonly closed?: boolean;
24
- /** Busca livre em id, titulo, status e responsavel. */
25
- readonly text?: string;
26
- }
9
+ export type { TaskFilterCriteria } from './filter-criteria.js';
27
10
  /**
28
11
  * A forma de uma tarefa numa listagem — o que identifica, nao o que ela diz.
29
12
  *
@@ -40,6 +23,5 @@ export interface TaskSummary {
40
23
  };
41
24
  readonly priority?: number;
42
25
  readonly groupId?: GroupId;
43
- readonly groupName?: string;
44
26
  readonly difficulty?: number;
45
27
  }
@@ -1,2 +1,4 @@
1
+ export type { CriterionCli, CriterionSurface, FilterCliOption, FilterJsonSchema, TaskFilterCriteria, } from './filter-criteria.js';
2
+ export { FILTER_CRITERIA_SURFACES, FilterCriteriaSchema, filterCriteriaCliOptions, filterCriteriaJsonSchema, parseFilterCriteria, } from './filter-criteria.js';
1
3
  export { filterTasks, summarizeTask } from './filter-tasks.js';
2
- export type { TaskFilterCriteria, TaskSummary } from './filter-tasks.types.js';
4
+ export type { TaskSummary } from './filter-tasks.types.js';
@@ -1,2 +1,3 @@
1
+ export { FILTER_CRITERIA_SURFACES, FilterCriteriaSchema, filterCriteriaCliOptions, filterCriteriaJsonSchema, parseFilterCriteria, } from './filter-criteria.js';
1
2
  export { filterTasks, summarizeTask } from './filter-tasks.js';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/filter-tasks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/filter-tasks/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { IGroupRegistry } from './group-registry.types.js';
2
+ /**
3
+ * Contrato que toda implementacao de {@link IGroupRegistry} precisa cumprir.
4
+ *
5
+ * Vive no pacote agnostico pelo mesmo motivo do contrato de usuarios: um
6
+ * provider de arquivos, um do Redmine e um do GitHub provam o mesmo
7
+ * comportamento sem depender do pacote um do outro. Exportado pelo subcaminho
8
+ * `./testing`, para o `vitest` nunca entrar no grafo de execucao.
9
+ *
10
+ * @param createSubject - Devolve um registro vazio, e uma forma de saber quantas
11
+ * tarefas pertencem a um grupo — porque apagar precisa dizer quantas foram
12
+ * afetadas, e isso e o unico ponto onde o contrato toca em tarefas.
13
+ * @public
14
+ */
15
+ export declare function runGroupRegistryContractTests(createSubject: () => Promise<{
16
+ registry: IGroupRegistry;
17
+ atribuir: (groupId: string, quantas: number) => Promise<void>;
18
+ }>): void;
@@ -0,0 +1,73 @@
1
+ import { parseGroupId } from '@opentask/taskin-types';
2
+ import { describe, expect, it } from 'vitest';
3
+ /**
4
+ * Contrato que toda implementacao de {@link IGroupRegistry} precisa cumprir.
5
+ *
6
+ * Vive no pacote agnostico pelo mesmo motivo do contrato de usuarios: um
7
+ * provider de arquivos, um do Redmine e um do GitHub provam o mesmo
8
+ * comportamento sem depender do pacote um do outro. Exportado pelo subcaminho
9
+ * `./testing`, para o `vitest` nunca entrar no grafo de execucao.
10
+ *
11
+ * @param createSubject - Devolve um registro vazio, e uma forma de saber quantas
12
+ * tarefas pertencem a um grupo — porque apagar precisa dizer quantas foram
13
+ * afetadas, e isso e o unico ponto onde o contrato toca em tarefas.
14
+ * @public
15
+ */
16
+ export function runGroupRegistryContractTests(createSubject) {
17
+ const g = (id) => parseGroupId(id);
18
+ describe('IGroupRegistry contract', () => {
19
+ it('cria e lista', async () => {
20
+ const { registry } = await createSubject();
21
+ await registry.createGroup({ id: g('g-1'), name: 'Sprint' });
22
+ expect(await registry.listGroups()).toEqual([{ id: 'g-1', name: 'Sprint' }]);
23
+ });
24
+ it('acha pelo id, e devolve indefinido para o que nao existe', async () => {
25
+ const { registry } = await createSubject();
26
+ await registry.createGroup({ id: g('g-1'), name: 'Sprint' });
27
+ expect(await registry.findGroup(g('g-1'))).toEqual({ id: 'g-1', name: 'Sprint' });
28
+ expect(await registry.findGroup(g('g-2'))).toBeUndefined();
29
+ });
30
+ it('recusa id repetido', async () => {
31
+ const { registry } = await createSubject();
32
+ await registry.createGroup({ id: g('g-1'), name: 'Sprint' });
33
+ await expect(registry.createGroup({ id: g('g-1'), name: 'Outro' })).rejects.toThrow();
34
+ });
35
+ /*
36
+ * O ponto da entidade: o nome vive num lugar so, entao renomear e uma
37
+ * escrita — e nenhuma tarefa e tocada.
38
+ */
39
+ it('renomeia sem tocar em tarefa nenhuma', async () => {
40
+ const { registry, atribuir } = await createSubject();
41
+ await registry.createGroup({ id: g('g-1'), name: 'Sprint' });
42
+ await atribuir('g-1', 3);
43
+ await registry.renameGroup(g('g-1'), 'Sprint de outubro');
44
+ expect(await registry.findGroup(g('g-1'))).toEqual({ id: 'g-1', name: 'Sprint de outubro' });
45
+ });
46
+ it('recusa renomear o que nao existe', async () => {
47
+ const { registry } = await createSubject();
48
+ await expect(registry.renameGroup(g('g-404'), 'Qualquer')).rejects.toThrow();
49
+ });
50
+ it('apagar sem destino solta os membros, e diz quantos eram', async () => {
51
+ const { registry, atribuir } = await createSubject();
52
+ await registry.createGroup({ id: g('g-1'), name: 'Sprint' });
53
+ await atribuir('g-1', 3);
54
+ const resultado = await registry.deleteGroup(g('g-1'));
55
+ expect(resultado.reassigned).toBe(3);
56
+ expect(await registry.findGroup(g('g-1'))).toBeUndefined();
57
+ });
58
+ it('apagar com destino move os membros para la', async () => {
59
+ const { registry, atribuir } = await createSubject();
60
+ await registry.createGroup({ id: g('g-1'), name: 'Sprint' });
61
+ await registry.createGroup({ id: g('g-2'), name: 'Backlog' });
62
+ await atribuir('g-1', 2);
63
+ const resultado = await registry.deleteGroup(g('g-1'), { reassignTo: g('g-2') });
64
+ expect(resultado.reassigned).toBe(2);
65
+ expect(await registry.findGroup(g('g-2'))).toBeDefined();
66
+ });
67
+ it('recusa apagar o que nao existe', async () => {
68
+ const { registry } = await createSubject();
69
+ await expect(registry.deleteGroup(g('g-404'))).rejects.toThrow();
70
+ });
71
+ });
72
+ }
73
+ //# sourceMappingURL=group-registry.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-registry.contract.js","sourceRoot":"","sources":["../src/group-registry.contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { Group, GroupId } from '@opentask/taskin-types';
2
+ /**
3
+ * O que acontece com os membros quando o grupo e apagado.
4
+ *
5
+ * Nao ha opcao de "nao dizer": tarefa apontando para grupo inexistente em
6
+ * silencio foi o unico resultado considerado inaceitavel ao decidir isto. As
7
+ * duas escolhas cobrem o que Redmine (`reassign_to_id`) e Jira (`moveIssuesTo`)
8
+ * ja oferecem na propria chamada de exclusao.
9
+ *
10
+ * @public
11
+ */
12
+ export interface DeleteGroupOptions {
13
+ /**
14
+ * Para onde os membros vao. Ausente, eles ficam **sem grupo** — e a operacao
15
+ * informa quantos foram afetados, para o efeito nunca ser invisivel.
16
+ */
17
+ reassignTo?: GroupId;
18
+ }
19
+ /** @public */
20
+ export interface DeleteGroupResult {
21
+ /** Quantas tarefas pertenciam ao grupo apagado. */
22
+ reassigned: number;
23
+ }
24
+ /**
25
+ * Operacoes de grupo que um provider oferece.
26
+ *
27
+ * Separado de `ITaskProvider` de proposito: nem toda fonte tem o conceito. Um
28
+ * provider que tenha implementa isto; um que nao tenha simplesmente nao o
29
+ * expoe, e quem consome descobre pela ausencia em vez de receber uma operacao
30
+ * que falha — o mesmo erro do `-t sse` do `mcp-server`, que existia na flag e
31
+ * nao na implementacao.
32
+ *
33
+ * @public
34
+ */
35
+ export interface IGroupRegistry {
36
+ listGroups: () => Promise<Group[]>;
37
+ findGroup: (id: GroupId) => Promise<Group | undefined>;
38
+ /** Falha quando o id ja existe. */
39
+ createGroup: (group: Group) => Promise<void>;
40
+ /** Falha quando o grupo nao existe. */
41
+ renameGroup: (id: GroupId, name: string) => Promise<void>;
42
+ /** Falha quando o grupo nao existe. */
43
+ deleteGroup: (id: GroupId, options?: DeleteGroupOptions) => Promise<DeleteGroupResult>;
44
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=group-registry.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-registry.types.js","sourceRoot":"","sources":["../src/group-registry.types.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  export type { Task, TaskStatus, TaskType, User } from '@opentask/taskin-types';
2
2
  export * from './filter-tasks/index.js';
3
+ export * from './group-registry.types.js';
3
4
  export * from './metrics.types.js';
5
+ export * from './numerar-prioridade/index.js';
6
+ export * from './ordenar-tarefas/index.js';
4
7
  export * from './task-manager.js';
5
8
  export * from './task-manager.types.js';
6
9
  export * from './user-registry.types.js';
package/dist/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  export * from './filter-tasks/index.js';
2
+ export * from './group-registry.types.js';
2
3
  export * from './metrics.types.js';
4
+ export * from './numerar-prioridade/index.js';
5
+ export * from './ordenar-tarefas/index.js';
3
6
  export * from './task-manager.js';
4
7
  export * from './task-manager.types.js';
5
8
  export * from './user-registry.types.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './numerar-prioridade.js';
@@ -0,0 +1,2 @@
1
+ export * from './numerar-prioridade.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/numerar-prioridade/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Task } from '@opentask/taskin-types';
2
+ /**
3
+ * Passo largo de proposito.
4
+ *
5
+ * Com 100 cabem muitos movimentos entre dois vizinhos antes de a renumeracao
6
+ * local precisar acontecer. Com 10 — o passo que o quadro de priorizacao usava —
7
+ * o espaco acaba depressa, e cada esgotamento custa escrita em arquivo.
8
+ */
9
+ export declare const PASSO_DE_PRIORIDADE = 100;
10
+ /**
11
+ * Devolve as tarefas que precisam de um `order` novo, e so elas.
12
+ *
13
+ * ## Por que isto existe
14
+ *
15
+ * O custo de reordenar no quadro de priorizacao ja e de um arquivo por
16
+ * movimento — **exceto** num projeto meio numerado. Ali, dar numero a uma tarefa
17
+ * do meio obriga a numerar todos os antecessores, porque uma tarefa sem `order`
18
+ * ordena por ultimo e nao tem posicao propria entre as numeradas. Num projeto de
19
+ * 500 tarefas com metade sem numero, isso chegou a 124 arquivos.
20
+ *
21
+ * A saida nao e um algoritmo mais esperto: e acabar com o estado meio numerado.
22
+ * Depois desta passada, ou o projeto inteiro tem numero, ou nunca foi priorizado
23
+ * — e todo movimento seguinte custa um arquivo.
24
+ *
25
+ * ## O que ela preserva
26
+ *
27
+ * A ordem relativa em que as tarefas chegaram, e o numero de quem ja tem um.
28
+ * Quem priorizou tomou uma decisao; o comando preenche as lacunas em volta dela
29
+ * em vez de reescreve-la.
30
+ *
31
+ * @param tarefas - Na ordem em que devem ficar
32
+ * @returns Copias apenas das tarefas que mudaram, prontas para gravar. Vazio
33
+ * quando nao ha nada a fazer — o que torna uma segunda passada inofensiva.
34
+ * @public
35
+ */
36
+ export declare function numerarPrioridade(tarefas: readonly Task[], passo?: number): Task[];
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Passo largo de proposito.
3
+ *
4
+ * Com 100 cabem muitos movimentos entre dois vizinhos antes de a renumeracao
5
+ * local precisar acontecer. Com 10 — o passo que o quadro de priorizacao usava —
6
+ * o espaco acaba depressa, e cada esgotamento custa escrita em arquivo.
7
+ */
8
+ export const PASSO_DE_PRIORIDADE = 100;
9
+ /**
10
+ * Devolve as tarefas que precisam de um `order` novo, e so elas.
11
+ *
12
+ * ## Por que isto existe
13
+ *
14
+ * O custo de reordenar no quadro de priorizacao ja e de um arquivo por
15
+ * movimento — **exceto** num projeto meio numerado. Ali, dar numero a uma tarefa
16
+ * do meio obriga a numerar todos os antecessores, porque uma tarefa sem `order`
17
+ * ordena por ultimo e nao tem posicao propria entre as numeradas. Num projeto de
18
+ * 500 tarefas com metade sem numero, isso chegou a 124 arquivos.
19
+ *
20
+ * A saida nao e um algoritmo mais esperto: e acabar com o estado meio numerado.
21
+ * Depois desta passada, ou o projeto inteiro tem numero, ou nunca foi priorizado
22
+ * — e todo movimento seguinte custa um arquivo.
23
+ *
24
+ * ## O que ela preserva
25
+ *
26
+ * A ordem relativa em que as tarefas chegaram, e o numero de quem ja tem um.
27
+ * Quem priorizou tomou uma decisao; o comando preenche as lacunas em volta dela
28
+ * em vez de reescreve-la.
29
+ *
30
+ * @param tarefas - Na ordem em que devem ficar
31
+ * @returns Copias apenas das tarefas que mudaram, prontas para gravar. Vazio
32
+ * quando nao ha nada a fazer — o que torna uma segunda passada inofensiva.
33
+ * @public
34
+ */
35
+ export function numerarPrioridade(tarefas, passo = PASSO_DE_PRIORIDADE) {
36
+ const mudancas = [];
37
+ let anterior = 0;
38
+ for (let i = 0; i < tarefas.length; i++) {
39
+ const atual = tarefas[i];
40
+ if (!atual)
41
+ continue;
42
+ if (atual.order !== undefined && atual.order > anterior) {
43
+ anterior = atual.order;
44
+ continue;
45
+ }
46
+ /*
47
+ * Precisa de numero. O teto e o proximo valor ja existente que ainda esta a
48
+ * frente — respeita-lo e o que preserva a decisao de quem priorizou.
49
+ */
50
+ const teto = tarefas.slice(i + 1).find((t) => t?.order !== undefined && t.order > anterior)?.order;
51
+ const valor = teto === undefined ? anterior + passo : Math.floor((anterior + teto) / 2);
52
+ if (!(valor > anterior) || (teto !== undefined && valor >= teto)) {
53
+ /*
54
+ * Sem espaco entre os vizinhos: abre espaco andando para a frente e para
55
+ * no primeiro que ja estiver alem. A renumeracao fica na vizinhanca.
56
+ */
57
+ let corrido = anterior;
58
+ for (let j = i; j < tarefas.length; j++) {
59
+ const item = tarefas[j];
60
+ if (!item)
61
+ continue;
62
+ if (j > i && item.order !== undefined && item.order > corrido)
63
+ break;
64
+ corrido += passo;
65
+ mudancas.push({ ...item, order: corrido });
66
+ }
67
+ anterior = corrido;
68
+ continue;
69
+ }
70
+ mudancas.push({ ...atual, order: valor });
71
+ anterior = valor;
72
+ }
73
+ return mudancas;
74
+ }
75
+ //# sourceMappingURL=numerar-prioridade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numerar-prioridade.js","sourceRoot":"","sources":["../../src/numerar-prioridade/numerar-prioridade.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAwB,EAAE,KAAK,GAAG,mBAAmB;IACrF,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;YACxD,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;YACvB,SAAS;QACX,CAAC;QAED;;;WAGG;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,EAAE,KAAK,CAAC;QACnG,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAExF,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;YACjE;;;eAGG;YACH,IAAI,OAAO,GAAG,QAAQ,CAAC;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,IAAI;oBAAE,SAAS;gBACpB,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,GAAG,OAAO;oBAAE,MAAM;gBACrE,OAAO,IAAI,KAAK,CAAC;gBACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,QAAQ,GAAG,OAAO,CAAC;YACnB,SAAS;QACX,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { parseTaskId } from '@opentask/taskin-types';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { numerarPrioridade } from './numerar-prioridade.js';
4
+ const tarefa = (id, order) => ({ id: parseTaskId(id), title: `Tarefa ${id}`, status: 'pending', type: 'feat', order });
5
+ const ids = (ts) => ts.map((t) => String(t.id));
6
+ /**
7
+ * Numeracao inicial de prioridade.
8
+ *
9
+ * Existe para eliminar o estado que custa caro: um projeto **meio numerado**.
10
+ * Enquanto metade das tarefas nao tem `order`, dar numero a uma do meio obriga a
11
+ * numerar todos os antecessores — 124 arquivos num projeto de 500, medido. Com o
12
+ * projeto inteiro numerado de uma vez, num ato deliberado, todo movimento
13
+ * seguinte custa um arquivo.
14
+ *
15
+ * A funcao devolve **so** o que precisa mudar, e nao a lista inteira: quem chama
16
+ * grava exatamente isso.
17
+ */
18
+ describe('numerarPrioridade', () => {
19
+ it('num projeto sem nenhuma prioridade, numera todas preservando a ordem', () => {
20
+ const tarefas = [tarefa('001'), tarefa('002'), tarefa('003')];
21
+ const mudancas = numerarPrioridade(tarefas);
22
+ expect(ids(mudancas)).toEqual(['001', '002', '003']);
23
+ expect(mudancas.map((t) => t.order)).toEqual([100, 200, 300]);
24
+ });
25
+ /*
26
+ * Quem ja priorizou tomou uma decisao, e o comando preenche as lacunas em
27
+ * volta dela em vez de reescreve-la.
28
+ */
29
+ it('mantem o numero de quem ja tem, e so preenche as lacunas', () => {
30
+ const tarefas = [tarefa('001', 50), tarefa('002'), tarefa('003', 900)];
31
+ const mudancas = numerarPrioridade(tarefas);
32
+ expect(ids(mudancas)).toEqual(['002']);
33
+ const nova = mudancas[0]?.order ?? 0;
34
+ expect(nova).toBeGreaterThan(50);
35
+ expect(nova).toBeLessThan(900);
36
+ });
37
+ /*
38
+ * Seguro de pôr num script ou num hook: a segunda passada nao escreve nada.
39
+ */
40
+ it('rodar de novo nao muda nada', () => {
41
+ const tarefas = [tarefa('001'), tarefa('002'), tarefa('003')];
42
+ const primeira = numerarPrioridade(tarefas);
43
+ const segunda = numerarPrioridade(primeira.length ? aplicar(tarefas, primeira) : tarefas);
44
+ expect(segunda).toEqual([]);
45
+ });
46
+ it('nao devolve nada quando todas ja estao numeradas e em ordem', () => {
47
+ expect(numerarPrioridade([tarefa('001', 100), tarefa('002', 200)])).toEqual([]);
48
+ });
49
+ });
50
+ /** Aplica as mudancas devolvidas, como quem grava faria. */
51
+ function aplicar(tarefas, mudancas) {
52
+ const por = new Map(mudancas.map((t) => [String(t.id), t]));
53
+ return tarefas.map((t) => por.get(String(t.id)) ?? t);
54
+ }
55
+ //# sourceMappingURL=numerar-prioridade.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numerar-prioridade.test.js","sourceRoot":"","sources":["../../src/numerar-prioridade/numerar-prioridade.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './ordenar-tarefas.js';
@@ -0,0 +1,2 @@
1
+ export * from './ordenar-tarefas.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ordenar-tarefas/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,70 @@
1
+ import type { Task } from '@opentask/taskin-types';
2
+ /**
3
+ * Como uma listagem pode ser ordenada.
4
+ *
5
+ * O mesmo vocabulario que o quadro de priorizacao do dashboard usa. Manter as
6
+ * grafias iguais entre as superficies vale mais que elegancia local: quem le a
7
+ * documentacao de uma reconhece a outra.
8
+ *
9
+ * @public
10
+ */
11
+ export type ModoDeOrdenacao = 'manual' | 'diff-asc' | 'diff-desc';
12
+ /**
13
+ * O que a ordenacao precisa saber, e nada alem disso.
14
+ *
15
+ * Exigir `Task` inteira deixaria a funcao inalcancavel para quem tem outra
16
+ * forma de tarefa — o quadro de priorizacao do dashboard, por exemplo, usa um
17
+ * modelo de tela proprio. Pedir so os dois campos que ela le e o que permite as
18
+ * duas superficies compartilharem a regra em vez de cada uma ter a sua copia.
19
+ *
20
+ * @public
21
+ */
22
+ export interface OrdenavelPorPrioridade {
23
+ readonly order?: number;
24
+ readonly difficulty?: number;
25
+ }
26
+ /** Um no da listagem: uma tarefa solta, ou um grupo com os membros que casaram. */
27
+ export type NoDaListagem<TTask extends Task = Task> = {
28
+ readonly kind: 'task';
29
+ readonly task: TTask;
30
+ } | {
31
+ readonly kind: 'group';
32
+ readonly groupId: string;
33
+ /** `undefined` quando o registro nao conhece o grupo. */
34
+ readonly groupName: string | undefined;
35
+ readonly tasks: readonly TTask[];
36
+ /** Quantos membros o filtro deixou de fora. Zero quando o grupo veio inteiro. */
37
+ readonly hidden: number;
38
+ };
39
+ /**
40
+ * Ordena uma listagem, sem alterar a lista recebida.
41
+ *
42
+ * Vivia dentro do pacote Vue do dashboard, inalcancavel para a CLI e para o
43
+ * servidor MCP — e por isso `taskin list` devolvia as tarefas na ordem em que o
44
+ * provider as achava, que na pratica e por id.
45
+ *
46
+ * `manual` usa o `order`, com quem nao tem por ultimo e estabilidade no resto.
47
+ * Os dois modos de dificuldade usam o `difficulty`.
48
+ *
49
+ * @public
50
+ */
51
+ export declare function ordenarTarefas<TTask extends OrdenavelPorPrioridade>(tarefas: readonly TTask[], modo?: ModoDeOrdenacao): TTask[];
52
+ /**
53
+ * Junta os membros de um grupo num no so, **por identidade**.
54
+ *
55
+ * Separado de {@link ordenarTarefas} de proposito. No dashboard as duas coisas
56
+ * vinham juntas porque a arvore existia para desenhar caixas; aqui quem consome
57
+ * decide se quer agrupar.
58
+ *
59
+ * Agrupa pelo `groupId`, e nao por adjacencia: membros separados por um filtro
60
+ * ou por uma ordenacao continuam sendo **um** grupo. Agrupar por adjacencia era
61
+ * o defeito da task-072, que partia o mesmo grupo em dois nos com o mesmo nome.
62
+ *
63
+ * @param tarefas - Ja ordenadas; a ordem dos grupos segue a do primeiro membro
64
+ * @param nomes - O que o registro de grupos sabe, por id
65
+ * @param totais - Quantos membros cada grupo tem **antes** do filtro. O que
66
+ * falta vira `hidden`, para o leitor saber que nao esta vendo o grupo inteiro
67
+ * em vez de o filtro se alargar sozinho e trazer o resto.
68
+ * @public
69
+ */
70
+ export declare function agruparTarefas<TTask extends Task>(tarefas: readonly TTask[], nomes?: Readonly<Record<string, string>>, totais?: Readonly<Record<string, number>>): NoDaListagem<TTask>[];
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Ordena uma listagem, sem alterar a lista recebida.
3
+ *
4
+ * Vivia dentro do pacote Vue do dashboard, inalcancavel para a CLI e para o
5
+ * servidor MCP — e por isso `taskin list` devolvia as tarefas na ordem em que o
6
+ * provider as achava, que na pratica e por id.
7
+ *
8
+ * `manual` usa o `order`, com quem nao tem por ultimo e estabilidade no resto.
9
+ * Os dois modos de dificuldade usam o `difficulty`.
10
+ *
11
+ * @public
12
+ */
13
+ export function ordenarTarefas(tarefas, modo = 'manual') {
14
+ const comIndice = tarefas.map((task, index) => ({ task, index }));
15
+ const campo = (t) => (modo === 'manual' ? t.order : t.difficulty);
16
+ const sinal = modo === 'diff-desc' ? -1 : 1;
17
+ comIndice.sort((a, b) => {
18
+ const va = campo(a.task);
19
+ const vb = campo(b.task);
20
+ // Quem nao tem valor vai para o fim, qualquer que seja a direcao.
21
+ if (va === undefined && vb === undefined)
22
+ return a.index - b.index;
23
+ if (va === undefined)
24
+ return 1;
25
+ if (vb === undefined)
26
+ return -1;
27
+ if (va !== vb)
28
+ return (va - vb) * sinal;
29
+ return a.index - b.index;
30
+ });
31
+ return comIndice.map(({ task }) => task);
32
+ }
33
+ /**
34
+ * Junta os membros de um grupo num no so, **por identidade**.
35
+ *
36
+ * Separado de {@link ordenarTarefas} de proposito. No dashboard as duas coisas
37
+ * vinham juntas porque a arvore existia para desenhar caixas; aqui quem consome
38
+ * decide se quer agrupar.
39
+ *
40
+ * Agrupa pelo `groupId`, e nao por adjacencia: membros separados por um filtro
41
+ * ou por uma ordenacao continuam sendo **um** grupo. Agrupar por adjacencia era
42
+ * o defeito da task-072, que partia o mesmo grupo em dois nos com o mesmo nome.
43
+ *
44
+ * @param tarefas - Ja ordenadas; a ordem dos grupos segue a do primeiro membro
45
+ * @param nomes - O que o registro de grupos sabe, por id
46
+ * @param totais - Quantos membros cada grupo tem **antes** do filtro. O que
47
+ * falta vira `hidden`, para o leitor saber que nao esta vendo o grupo inteiro
48
+ * em vez de o filtro se alargar sozinho e trazer o resto.
49
+ * @public
50
+ */
51
+ export function agruparTarefas(tarefas, nomes = {}, totais = {}) {
52
+ const nos = [];
53
+ const porGrupo = new Map();
54
+ for (const task of tarefas) {
55
+ const id = task.groupId === undefined ? undefined : String(task.groupId);
56
+ if (id === undefined) {
57
+ nos.push({ kind: 'task', task });
58
+ continue;
59
+ }
60
+ const existente = porGrupo.get(id);
61
+ if (existente) {
62
+ existente.push(task);
63
+ continue;
64
+ }
65
+ const membros = [task];
66
+ porGrupo.set(id, membros);
67
+ nos.push({
68
+ kind: 'group',
69
+ groupId: id,
70
+ groupName: nomes[id],
71
+ tasks: membros,
72
+ hidden: 0,
73
+ });
74
+ }
75
+ return nos.map((no) => no.kind === 'group'
76
+ ? { ...no, hidden: Math.max(0, (totais[no.groupId] ?? no.tasks.length) - no.tasks.length) }
77
+ : no);
78
+ }
79
+ //# sourceMappingURL=ordenar-tarefas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ordenar-tarefas.js","sourceRoot":"","sources":["../../src/ordenar-tarefas/ordenar-tarefas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};