autoforce 0.1.23 → 0.1.24

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/README.md CHANGED
@@ -35,19 +35,32 @@ En cada una de ellas buscamos automatizar o integrar las siguientes gestiones:
35
35
  - Calidad de codigo (PMD)
36
36
  - Uso de IA ( OpenAI, )
37
37
 
38
+ ## Tipos de Modelos
39
+
40
+ Al principio habia pensando en una lista de modelos, ejemplo paquetes de appexchange y otro para proyectos sobre salesforce.
41
+
42
+ Pero al final vi que los modelos son combinaciones de acuerdo a las siguientes variables:
43
+ - Branching strategy: En este sentido, el start y finish van a hacer task distintas, si quiero un gitflow o main
44
+ - Tipo de desarrollo: Si estoy desarrollando paquetes o usango scratch en el start voy a buscar que me arme un ambiente nuevo
45
+ - Tipo de Projecto: Si el projecto maneja milestones como releases, cambian o se agregan mas preguntas en algunos steps
46
+ - Modelo de documentacion: La documentacion estaria muy relacionada con el tipo de desarrollo, pero quedo como una variable aparte por orden.
47
+
48
+
38
49
  ## Roadmap Status
39
50
 
40
- 1. Modelos
41
- - [Model A] "Procesos de Negocio en Clientes de Salesforce": 70%
51
+ 1. Implementaciones
52
+ - "Procesos de Negocio en Clientes de Salesforce": 70%
42
53
  Salesforce: Scratchs con Tracking y deploys usando sf cli
43
54
  Documentacion: Markdowns de Procesos con Github pages
44
- Gestion de Proyecto: Github Project
45
- Source Control: Github
55
+ Gestion de Proyecto: Project con milestones
46
56
  Branching Strategy: Github workflow
47
57
 
48
- - [Model B] "Desarrollo de Producto": 0%
58
+ - "Desarrollo de Producto": 30%
59
+ Salesforce: Scratchs con Tracking y deploys con second generation package
60
+ Documentacion: Markdowns de Procesos con Github pages
61
+ Gestion de Proyecto: Project con milestones
62
+ Branching Strategy: Gitflow workflow
49
63
 
50
- - [Custom] "Modelo personalizado"
51
64
 
52
65
  2. Github Services
53
66
  - Github: Listo
@@ -72,9 +85,17 @@ En cada una de ellas buscamos automatizar o integrar las siguientes gestiones:
72
85
  - Documentation: 0%
73
86
 
74
87
 
88
+ ## Repositorio de Ejemplo
89
+ En el siguiente [repositorio](https://github.com/sebastianclaros/autoforce-test) tomamos como ejemplo un proyecto de Salesforce.
90
+ En la carpeta scripts/test hay una serie de comandos (all.sh), que hace de forma autamtizada lo siguiente:
91
+
92
+ * Hace un upgrade de autoforce
93
+ * Crea un Milestone representando un release nuevo
94
+ * Crea 3 issues dentro de ese Milestone
75
95
 
76
96
 
77
- ## Usos
97
+ ## Uso
98
+
78
99
  Una vez instalado se puede crear scripts a medida o bien ejecutar
79
100
 
80
101
  ```
@@ -102,7 +123,8 @@ https://github.com/sebastianclaros/autoforce-test
102
123
  La guia del readme sirve de ejemplo.
103
124
 
104
125
 
105
- ## Testear una version
126
+
127
+ ## Testear una version en forma local
106
128
 
107
129
  Para hacer un testeo local se puede generar una version nueva
108
130
 
@@ -23,6 +23,7 @@ declare class Context implements IObjectRecord {
23
23
  devModel: string | undefined;
24
24
  gitModel: string | undefined;
25
25
  docModel: string | undefined;
26
+ errorMessage: string;
26
27
  projectModel: string | undefined;
27
28
  gitServices: GitServices;
28
29
  isGitApi: boolean;
@@ -90,6 +90,7 @@ class Context {
90
90
  devModel; // Default Model de commands
91
91
  gitModel;
92
92
  docModel;
93
+ errorMessage = '';
93
94
  projectModel;
94
95
  gitServices = GitServices.None;
95
96
  isGitApi = false;
@@ -453,6 +454,12 @@ class Context {
453
454
  return this.newBranchName;
454
455
  }
455
456
  async askFornewIssueNumber() {
457
+ if (this.options.issue && this.projectApi) {
458
+ const issues = await this.projectApi.searchIssues(this.options.issue);
459
+ if (issues.length === 1) {
460
+ return `${issues[0].number}`;
461
+ }
462
+ }
456
463
  const answer = await prompts([
457
464
  {
458
465
  type: "text",
@@ -49,6 +49,7 @@ export declare class GitHubProjectApi extends GitHubApi implements IProjectApi {
49
49
  id: string;
50
50
  title: string;
51
51
  }[]>;
52
+ searchIssues(title: string): Promise<IIssueObject[]>;
52
53
  getIssuesWithFilter(filterBy: string): Promise<{
53
54
  id: string;
54
55
  title: string;
@@ -213,6 +213,21 @@ export class GitHubProjectApi extends GitHubApi {
213
213
  async getIssues() {
214
214
  return await this.getIssuesWithFilter(`{ states: OPEN }`);
215
215
  }
216
+ async searchIssues(title) {
217
+ const query = `query getIssues() {
218
+ search(query: "repo:${this.repoVar.owner}/${this.repoVar.repo} in:title ${title}", type: ISSUE, first: 10) {
219
+ nodes {
220
+ ... on Issue {
221
+ id
222
+ number
223
+ title
224
+ }
225
+ }
226
+ }
227
+ }`;
228
+ const { search } = await this.graphqlAuth(query, this.repoVar);
229
+ return search.nodes;
230
+ }
216
231
  async getIssuesWithFilter(filterBy) {
217
232
  const query = `
218
233
  query getIssues($owner:String!, $repo: String!) {
@@ -24,6 +24,7 @@ export declare class GitLabApi implements IGitApi, IProjectApi {
24
24
  state: string;
25
25
  url: string;
26
26
  }>;
27
+ searchIssues(title: string): Promise<IIssueObject[]>;
27
28
  updateMilestone(title: string, state?: string, description?: string, dueOn?: string): Promise<{
28
29
  id: string;
29
30
  title: string;
@@ -35,6 +35,10 @@ export class GitLabApi {
35
35
  console.log(title, state, description, dueOn);
36
36
  return { id: '', title: '', state: '', url: '' };
37
37
  }
38
+ async searchIssues(title) {
39
+ console.log(title);
40
+ return [];
41
+ }
38
42
  async updateMilestone(title, state = 'open', description, dueOn) {
39
43
  console.log(title, state, description, dueOn);
40
44
  return { id: '', title: '', state: '', url: '' };
@@ -375,14 +375,21 @@ export const taskFunctions = {
375
375
  },
376
376
  async validateIssue(issueNumber, states) {
377
377
  if (context.projectApi === undefined) {
378
+ context.errorMessage = 'context.projectApi esta undefined';
378
379
  return false;
379
380
  }
380
381
  const issue = await context.projectApi.getIssue(issueNumber);
381
382
  if (!issue.state) {
383
+ context.errorMessage = 'El state del issue es undefined';
382
384
  return false;
383
385
  }
384
386
  const arrayStates = states.toLocaleLowerCase().replace(' ', '').split(',');
385
- return arrayStates.includes(issue.state.toLocaleLowerCase().replace(' ', ''));
387
+ const validate = arrayStates.includes(issue.state.toLocaleLowerCase().replace(' ', ''));
388
+ if (!validate) {
389
+ context.errorMessage = `El state del issue es "${issue.state}", mientras deberia ser ${states}`;
390
+ return false;
391
+ }
392
+ return true;
386
393
  },
387
394
  async validaNoseaBranchActual(newBranchName) {
388
395
  return getBranchName() !== newBranchName;
@@ -7,9 +7,9 @@
7
7
  {
8
8
  "name": "validate issue",
9
9
  "function": "validateIssue",
10
- "arguments": ["${newIssueNumber}", "Ready,Backlog"],
11
- "description": "Valida que Issue este en la Columna Ready o Backlog",
12
- "errorMessage": "Por favor verifique que el issue ${newIssueNumber} este en la columna Ready o Backlog"
10
+ "arguments": ["${newIssueNumber}", "Todo"],
11
+ "description": "Valida que Issue este en la Columna Todo",
12
+ "errorMessage": "Por favor verifique que el issue ${newIssueNumber} este en la columna Todo. \n ${errorMessage}"
13
13
  },
14
14
  {
15
15
  "name": "check Issue type based on Labels",
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "autoforce",
3
3
  "homepage": "https://sebastianclaros.github.io/autoforce",
4
4
  "private": false,
5
- "version": "0.1.23",
5
+ "version": "0.1.24",
6
6
  "keywords": [
7
7
  "Salesforce",
8
8
  "Automation",