imdone-core 1.53.4 → 1.53.6

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.
@@ -29,7 +29,7 @@ function getRenderer(filePath) {
29
29
  .use(imageSize)
30
30
  .use(obsidianTopicLinks(filePath))
31
31
  .use(replaceImagePaths(filePath))
32
- .use(replaceLinkPaths(filePath))
32
+ .use(replaceLinkPathsAndTitles(filePath))
33
33
  .validateLink = () => true
34
34
 
35
35
  return md
@@ -50,11 +50,12 @@ function obsidianTopicLinks(filePath) {
50
50
  let topic = match[1].trim();
51
51
  const alias = match[2] ? match[2].trim() : topic;
52
52
  if (!topic.endsWith('.md')) topic = `${topic}.md`;
53
- const href = encodeURI(resolveFileUrl(topic, filePath));
53
+ const unencodedHref = resolveFileUrl(topic, filePath);
54
+ const href = encodeURI(unencodedHref);
54
55
 
55
56
  // Create a new token
56
57
  const token = state.push("obsidian_link", "", 0);
57
- token.content = `<a href="${href}">${md.utils.escapeHtml(alias)}</a>`;
58
+ token.content = `<a href="${href}" title="${unencodedHref}">${md.utils.escapeHtml(alias)}</a>`;
58
59
 
59
60
  // Move parsing position forward
60
61
  state.pos += fullMatch.length;
@@ -92,7 +93,7 @@ function replaceImagePaths(filePath) {
92
93
  }
93
94
  }
94
95
 
95
- function replaceLinkPaths(filePath) {
96
+ function replaceLinkPathsAndTitles(filePath) {
96
97
 
97
98
  return function(md) {
98
99
  const defaultRender = md.renderer.rules.link_open || function(tokens, idx, options, env, self) {
@@ -108,6 +109,12 @@ function replaceLinkPaths(filePath) {
108
109
  if (srcUrl) token.attrs[srcIndex][1] = srcUrl;
109
110
  }
110
111
 
112
+ // set the title to the href if it's not already set
113
+ const titleIndex = token.attrIndex('title');
114
+ if (titleIndex < 0) {
115
+ const title = token.attrs[srcIndex][1];
116
+ token.attrPush(['title', title]);
117
+ }
111
118
  return defaultRender(tokens, idx, options, env, self);
112
119
  };
113
120
  }
package/lib/card.js CHANGED
@@ -117,6 +117,7 @@ module.exports = function newCard(task, _project, dontParse) {
117
117
  'source',
118
118
  'due',
119
119
  'created',
120
+ 'started',
120
121
  'completed',
121
122
  'tags',
122
123
  'context',
package/lib/config.js CHANGED
@@ -70,6 +70,12 @@ class Config {
70
70
  return _get(this, 'settings.cards.doneList', defaultValue)
71
71
  }
72
72
 
73
+ getDoingList() {
74
+ const lists = _cloneDeep(this.lists).reverse().filter((list) => !list.filter)
75
+ const defaultValue = lists && lists.length ? lists[1].name : undefined
76
+ return _get(this, 'settings.cards.doingList', defaultValue)
77
+ }
78
+
73
79
  isAddNewCardsToTop() {
74
80
  return _get(this, 'settings.cards.addNewCardsToTop', false)
75
81
  }
@@ -21,6 +21,7 @@ cards:
21
21
  metaNewLine: false #override
22
22
  addCompletedMeta: false #override
23
23
  addCheckBoxTasks: false #override
24
+ doingList: DOING #override if
24
25
  doneList: DONE #override if
25
26
  tokenPrefix: '#' #override
26
27
  taskPrefix: '##' #override
package/lib/file.js CHANGED
@@ -78,10 +78,8 @@ function File(opts) {
78
78
  }
79
79
  }
80
80
  util.inherits(File, events.EventEmitter)
81
- const CODE_BLOCK_REGEX = (File.CODE_BLOCK_REGEX = /`{3}[\s\S]*?`{3}/gm)
82
- const INLINE_CODE_REGEX = (File.INLINE_CODE_REGEX = /`[\s\S]*?`/g)
83
- const CODE_STYLE_END = '((:)(-?[\\d.]+(?:e-?\\d+)?)?)?[ \\t]+(.+)$'
84
81
 
82
+ const CODE_STYLE_END = '((:)(-?[\\d.]+(?:e-?\\d+)?)?)?[ \\t]+(.+)$'
85
83
  const CODE_STYLE_PATTERN = (File.CODE_STYLE_PATTERN =
86
84
  '([A-Z]+[A-Z-_]+?)' + CODE_STYLE_END)
87
85
 
@@ -103,6 +101,10 @@ function getDoneList(config) {
103
101
  return config.getDoneList()
104
102
  }
105
103
 
104
+ function getDoingList(config) {
105
+ return config.getDoingList()
106
+ }
107
+
106
108
  function getFrontMeta(meta) {
107
109
  const metadata = {}
108
110
  Object.entries(meta).forEach(([prop, val]) => {
@@ -137,6 +139,37 @@ File.isMarkdown = function (relPath) {
137
139
  return /\.md$/i.test(relPath) || path.extname(relPath) === ''
138
140
  }
139
141
 
142
+ File.prototype.removeCompleted = function ({ task, content, config }) {
143
+ const doneList = getDoneList(config)
144
+ if (doneList === task.list) return content
145
+ if (
146
+ task.meta.completed &&
147
+ task.meta.completed.length > 0
148
+ ) {
149
+ content = this.removeMetaData(
150
+ content,
151
+ 'completed',
152
+ task.meta.completed[0]
153
+ )
154
+ }
155
+ return content
156
+ }
157
+
158
+ File.addStarted = function ({ task, content, config }) {
159
+ if (!task || !config || !config.settings) return content
160
+ if (!config.settings.cards.addStartedMeta) return content
161
+ if (task.meta.started) return content
162
+ if (task.list !== getDoingList(config)) return content
163
+ const now = getIsoDateWithOffset()
164
+ content = task.addToLastCommentInContent(
165
+ content,
166
+ `started${config.getMetaSep()}${now}`,
167
+ File.isMetaNewLine(config)
168
+ )
169
+ const lines = eol.split(content)
170
+ return lines.join(lineEnd)
171
+ }
172
+
140
173
  File.addCompleted = function ({ task, content, config }) {
141
174
  const doneList = getDoneList(config)
142
175
  if (
@@ -220,7 +253,6 @@ File.prototype.trackListChanges = function ({ task, content, config, modify }) {
220
253
  .filter((list) => !list.filter)
221
254
  .map((list) => list.name)
222
255
 
223
- const doneList = getDoneList(config)
224
256
  let beforeTextModified = false
225
257
  if (this.isMarkDownFile()) {
226
258
  beforeTextModified = trackMarkdownChecklistChanges({task, config, modify})
@@ -239,18 +271,6 @@ File.prototype.trackListChanges = function ({ task, content, config, modify }) {
239
271
  if (!task.meta[list]) task.meta[list] = []
240
272
  task.meta[list].push(now)
241
273
  }
242
-
243
- if (
244
- doneList !== task.list &&
245
- task.meta.completed &&
246
- task.meta.completed.length > 0
247
- ) {
248
- content = this.removeMetaData(
249
- content,
250
- 'completed',
251
- task.meta.completed[0]
252
- )
253
- }
254
274
  }
255
275
 
256
276
  return { content, beforeTextModified }
@@ -278,7 +298,9 @@ File.prototype.transformTask = function ({config, modify, task}) {
278
298
  content = File.parseDueDate(config, content)
279
299
  content = File.parseRemindDate(config, content)
280
300
  content = File.parseDeferDate(config, content)
301
+ content = File.addStarted({ task, content, config })
281
302
  content = File.addCompleted({ task, content, config })
303
+ content = this.removeCompleted({ task, content, config })
282
304
  content = task.format(content)
283
305
  if (
284
306
  content.trim() !== task.content.trim()
@@ -290,7 +312,6 @@ File.prototype.transformTask = function ({config, modify, task}) {
290
312
  }
291
313
 
292
314
  File.prototype.transformTasks = function (config, modify) {
293
- // if (this.isCodeFile()) return
294
315
  fastSort(this.getTasks())
295
316
  .desc(u => u.line)
296
317
  .forEach(task => this.transformTask({config, modify, task}))
@@ -360,7 +381,7 @@ File.prototype.extractHashStyleTasks = function (config, pos, content) {
360
381
  if (!config.listExists(list)) continue
361
382
 
362
383
  const posInContent = result.index + pos
363
- if (this.hasCodeSpanOrBlockAtPos(posInContent)) continue
384
+ if (this.isWithinCodeSpanOrBlock(posInContent, content)) continue
364
385
 
365
386
  const line = this.getLineNumber(posInContent)
366
387
  if (this.hasTaskAtLine(line)) continue
@@ -395,7 +416,7 @@ File.prototype.extractLinkStyleTasks = function (config, pos, content) {
395
416
  let [match, before, rawTask, text, list, colon, order] = result
396
417
  const beforeLength = before ? before.length : 0
397
418
  const posInContent = result.index + pos + beforeLength
398
- if (this.hasCodeSpanOrBlockAtPos(posInContent)) continue
419
+ if (this.isWithinCodeSpanOrBlock(posInContent, content)) continue
399
420
  var line = this.getLineNumber(posInContent)
400
421
  if (self.hasTaskAtLine(line)) continue
401
422
  if (!config.listExists(list)) continue
@@ -521,7 +542,6 @@ File.prototype.extractTasksInCodeFile = function (config) {
521
542
  }
522
543
 
523
544
  File.prototype.extractTasksInNonCodeFile = function (config) {
524
- this.codeSpanAndBlockPositions = File.getCodePositions(this.getContent())
525
545
  this.extractHashStyleTasks(config, 0, this.getContent())
526
546
  this.extractLinkStyleTasks(config, 0, this.getContent())
527
547
  this.extractCheckboxTasks(config, 0, this.getContent())
@@ -1105,27 +1125,6 @@ File.prototype.removeTask = function (task) {
1105
1125
  }
1106
1126
  }
1107
1127
 
1108
- File.prototype.ignoreCodeBlocks = function () {
1109
- // BACKLOG This is not used, but we need a way to ignore tasks in code blocks. Maybe save position ranges
1110
- // ```javascript
1111
- // var cleanContent = this.content
1112
- // var replacer = function (block) {
1113
- // block = block.replace(new XRegExp(LINK_STYLE_REGEX), '**TASK**')
1114
- // block = block.replace(getHashStyleRegex(config.tokenPrefix), '**TASK**')
1115
- // return block
1116
- // }
1117
- // if (this.isMarkDownFile()) {
1118
- // cleanContent = this.content
1119
- // .replace(new RegExp(CODE_BLOCK_REGEX), replacer)
1120
- // .replace(new RegExp(INLINE_CODE_REGEX), replacer)
1121
- // }
1122
- // return cleanContent
1123
- // ```
1124
- // <!--
1125
- // order:-640
1126
- // -->
1127
- }
1128
-
1129
1128
  File.prototype.isMarkDownFile = function () {
1130
1129
  return /^md|markdown$/i.test(this.getExt())
1131
1130
  }
@@ -1345,19 +1344,9 @@ File.prototype.getSource = function () {
1345
1344
  }
1346
1345
  }
1347
1346
 
1348
- File.getCodePositions = function(content) {
1349
- const regex = /```.*?```|`.*?`/gms
1350
- const indicies = []
1351
- let result
1352
- while ((result = regex.exec(content)) !== null) {
1353
- indicies.push([result.index, regex.lastIndex])
1354
- }
1355
- return indicies
1356
- }
1357
-
1358
- File.prototype.hasCodeSpanOrBlockAtPos = function(pos) {
1359
- const positions = this.codeSpanAndBlockPositions || File.getCodePositions(this.content)
1360
- return positions.find(([start, end]) => pos > start && pos < end)
1347
+ File.prototype.isWithinCodeSpanOrBlock = function(pos, content) {
1348
+ const positions = Task.getMarkdownCodePositions(content)
1349
+ return Task.isResultInMarkdownCode(positions, pos)
1361
1350
  }
1362
1351
 
1363
1352
  module.exports = File
@@ -109,6 +109,10 @@ module.exports = function (repo, defaultSettings = defaultSettingsObject) {
109
109
  if (config.settings.cards.doneList === undefined) {
110
110
  config.settings.cards.doneList = lists ? lists[lists.length - 1] : ''
111
111
  }
112
+ // Set up default doingList
113
+ if (config.settings.cards.doingList === undefined) {
114
+ config.settings.cards.doingList = lists ? lists[lists.length - 1] : ''
115
+ }
112
116
  // Add name
113
117
  if (config.settings.name === undefined) {
114
118
  config.settings.name = _path.basename(path)
@@ -12,6 +12,7 @@ module.exports = class DefaultCardPropertiesPlugin extends Plugin {
12
12
  return {
13
13
  date: `${getIsoDateWithOffset(new Date()).substring(0, 10)}`,
14
14
  timestamp: getIsoDateWithOffset(new Date()),
15
+ clearFilterURL: self.getFilterURL(''),
15
16
  getFilterURL: (filter) => self.getFilterURL(filter),
16
17
  getFilterLink: (filter) => `[Filter By: ${filter}](${self.getFilterURL(filter)})`
17
18
  }
package/lib/project.js CHANGED
@@ -108,9 +108,10 @@ module.exports = class WorkerProject extends Project {
108
108
  )
109
109
  let allLists = this.allLists
110
110
  allLists = allLists.map((list) => {
111
- list.tasks = list.tasks.map((card) => {
111
+ list.tasks = list.tasks.map((card, index) => {
112
112
  card.interpretedContent = ''
113
113
  card.totals = totals
114
+ card.index = index
114
115
  return card
115
116
  })
116
117
  return list
package/lib/task.js CHANGED
@@ -70,6 +70,7 @@ class Task {
70
70
  this.content = obj.content
71
71
  this.lastLine = this.getLastLine()
72
72
  this.orderModified = obj.orderModified
73
+ this.index = undefined
73
74
  if (dontParse || !this.text) return
74
75
  this.parse()
75
76
  }
@@ -135,26 +136,17 @@ class Task {
135
136
 
136
137
  getTextAndDescription() {
137
138
  const description = _clone(this.description)
138
- const text = this.getText({
139
- stripMeta: true,
140
- sanitize: true,
141
- stripTags: true,
142
- stripContext: true,
143
- })
144
- const descriptionMD = description.map((line) => {
145
- return this.getText(
146
- {
147
- stripMeta: true,
148
- sanitize: true,
149
- stripTags: true,
150
- stripContext: true,
151
- },
152
- line
153
- )
154
- })
155
- return `${this.markdownBeforeText}${text}${lineEnd}${descriptionMD.join(
139
+ const taskContent = `${this.markdownBeforeText}${this.text}${lineEnd}${description.join(
156
140
  lineEnd
157
141
  )}`.replace(/<!--\s*\[\s*([\s\S]*?)\s*\]\s*-->/gm, '$1')
142
+ return this.getText(
143
+ {
144
+ stripMeta: true,
145
+ sanitize: true,
146
+ stripTags: true,
147
+ stripContext: true,
148
+ },
149
+ taskContent);
158
150
  }
159
151
 
160
152
  getRawTextAndDescription() {
@@ -205,7 +197,7 @@ class Task {
205
197
  })
206
198
  }
207
199
  }
208
- const DATE_META_KEYS = Task.DATE_META_KEYS = ['due', 'defer', 'created', 'remind', 'completed', 'archivedAt']
200
+ const DATE_META_KEYS = Task.DATE_META_KEYS = ['due', 'defer', 'created', 'started', 'remind', 'completed', 'archivedAt']
209
201
 
210
202
  Task.hasCheckPrefix = function (content) {
211
203
  return new RegExp(CHECK_REGEX).test(content)
@@ -251,25 +243,44 @@ Task.getTagRegexp = function (prefix = '+') {
251
243
  )
252
244
  }
253
245
  Task.getTags = function (text, prefix = '+') {
254
- const tags = []
255
- var codePositions = Task.getMarkdownCodePositions(text)
256
- var result,
257
- re = Task.getTagRegexp(prefix)
246
+ const tags = [];
247
+ const codePositions = Task.getMarkdownCodePositions(text);
248
+ const linkLabelPositions = Task.getMarkdownLinkLabelPositions(text);
249
+ let result;
250
+ const re = Task.getTagRegexp(prefix);
258
251
 
259
252
  while ((result = re.exec(text)) !== null) {
260
- if (Task.isResultInMarkdownCode(codePositions, result.index)) continue
261
- const tag = result[2]
262
- if (tags.includes(tag) || /^[#]+$/.test(tag)) continue
263
- tags.push(tag)
253
+ if (Task.isResultInMarkdownCode(codePositions, result.index)) continue;
254
+ if (Task.isResultInMarkdownLinkLabel(linkLabelPositions, result.index)) continue;
255
+ const tag = result[2];
256
+ if (tags.includes(tag) || /^[#]+$/.test(tag)) continue;
257
+ tags.push(tag);
264
258
  }
265
259
 
266
- return tags
267
- }
260
+ return tags;
261
+ };
262
+
263
+ Task.getMarkdownLinkLabelPositions = function (text) {
264
+ const positions = [];
265
+ const re = /\[([^\]]+)\]\([^\)]+\)/g;
266
+ let match;
267
+
268
+ while ((match = re.exec(text)) !== null) {
269
+ positions.push({ start: match.index, end: re.lastIndex });
270
+ }
271
+
272
+ return positions;
273
+ };
274
+
275
+ Task.isResultInMarkdownLinkLabel = function (linkLabelPositions, index) {
276
+ return linkLabelPositions.some(pos => index >= pos.start && index < pos.end);
277
+ };
268
278
 
269
279
  Task.ContextRegExp = new RegExp(
270
280
  `(^|\\s)@([${Task.AnyLanguageGroup}${Task.EmojiGroup}]+)`,
271
281
  'gmiu'
272
282
  )
283
+
273
284
  Task.getContext = function (text) {
274
285
  const context = []
275
286
  var codePositions = Task.getMarkdownCodePositions(text)
@@ -483,16 +494,16 @@ Task.isTask = function (task) {
483
494
  }
484
495
 
485
496
  Task.getMarkdownCodePositions = function (text) {
486
- const re = /`([^`]+)`/g
487
- let result
488
- let positions = []
497
+ const re = /(```[\s\S]*?```|`[^`]+`)/g;
498
+ let result;
499
+ let positions = [];
489
500
  while ((result = re.exec(text)) !== null) {
490
- const start = result.index
491
- const end = start + result[0].length
492
- positions.push({ start, end })
501
+ const start = result.index;
502
+ const end = start + result[0].length;
503
+ positions.push({ start, end });
493
504
  }
494
- return positions
495
- }
505
+ return positions;
506
+ };
496
507
 
497
508
  Task.isResultInMarkdownCode = function (positions, index) {
498
509
  for (let i = 0; i < positions.length; i++) {
@@ -509,12 +520,15 @@ Task.prototype.parseTodoTxt = function () {
509
520
  }
510
521
 
511
522
  Task.removeTags = function (text, prefix = '+') {
512
- const positions = Task.getMarkdownCodePositions(text)
523
+ const codePositions = Task.getMarkdownCodePositions(text);
524
+ const linkLabelPositions = Task.getMarkdownLinkLabelPositions(text);
513
525
  return text.replace(Task.getTagRegexp(prefix), (match, p1, p2, offset) => {
514
- if (Task.isResultInMarkdownCode(positions, offset) || match.includes('##')) return match
515
- return ''
516
- })
517
- }
526
+ if (Task.isResultInMarkdownCode(codePositions, offset) || Task.isResultInMarkdownLinkLabel(linkLabelPositions, offset) || match.includes('##')) {
527
+ return match;
528
+ }
529
+ return '';
530
+ });
531
+ };
518
532
 
519
533
  Task.removeContext = function (text) {
520
534
  const positions = Task.getMarkdownCodePositions(text)
@@ -713,7 +727,7 @@ Task.prototype.getList = function () {
713
727
  // order:-700
714
728
  // -->
715
729
  Task.prototype.getText = function (opts, text) {
716
- if (text === undefined) text = this.text
730
+ if (text === undefined) return
717
731
  if (opts) {
718
732
  if (opts.stripMeta) {
719
733
  text = Task.removeMetaDataFromText(this.config || {}, text)
@@ -732,14 +746,6 @@ Task.prototype.getText = function (opts, text) {
732
746
  return text
733
747
  }
734
748
 
735
- Task.prototype.getDescription = function (opts) {
736
- return this.description
737
- .map((line) => {
738
- return this.getText(opts, line)
739
- })
740
- .join(lineEnd)
741
- }
742
-
743
749
  Task.prototype.getChecksFromHtml = function (html) {
744
750
  let $ = cheerio.load(html)
745
751
  let checks = $('.task-description').find("input[type='checkbox']")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "imdone-core",
3
- "version": "1.53.4",
3
+ "version": "1.53.6",
4
4
  "description": "imdone-core",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,11 +0,0 @@
1
- # Running a git remote in docker
2
-
3
- [GitHub - 1nfiniteloop/git-remote: Docker image for a minimal git remote](https://github.com/1nfiniteloop/git-remote)
4
-
5
- ## setup the container before each test
6
-
7
- ```bash
8
- ./setup-remote.sh
9
- ```
10
-
11
- The remote will remain running after the testing has completed
@@ -1,6 +0,0 @@
1
- #!/bin/bash
2
-
3
- docker rm -f git-remote
4
- docker volume rm git-remote.home
5
- docker volume rm git-remote.host-keys
6
- ssh-keygen -R '[localhost]:8022'
@@ -1,31 +0,0 @@
1
- #!/bin/bash
2
-
3
- SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
4
-
5
- $SCRIPT_DIR/remove-remote.sh
6
-
7
- docker run \
8
- --name=git-remote \
9
- --detach \
10
- --publish 0.0.0.0:8022:22 \
11
- --volume git-remote.home:/home/git \
12
- --volume git-remote.host-keys:/etc/ssh/host_keys \
13
- 1nfiniteloop/git-remote:latest
14
-
15
- docker exec git-remote mkdir /home/git/authorized_keys
16
-
17
- # TODO Generate a key in the container and use that instead of copying the key from the host
18
- # Update to use `GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example`
19
- # <!--
20
- # order:0
21
- # -->
22
-
23
-
24
- docker cp ~/.ssh/id_rsa.pub git-remote:/home/git/authorized_keys
25
-
26
- echo "make authorized_keys owned by git"
27
- docker exec git-remote chown -R git:git /home/git/authorized_keys/id_rsa.pub
28
- docker exec git-remote chmod 777 /home/git/authorized_keys/id_rsa.pub
29
-
30
- echo "create the test project"
31
- docker exec git-remote su - git -s /bin/bash -c "mkdir /home/git/test-project.git; cd /home/git/test-project.git; git init --bare;"
@@ -1,102 +0,0 @@
1
- keepEmptyPriority: true
2
- code:
3
- include_lists:
4
- - TODO
5
- - DOING
6
- - DONE
7
- - PLANNING
8
- - FIXME
9
- - ARCHIVE
10
- - HACK
11
- - CHANGED
12
- - XXX
13
- - IDEA
14
- - NOTE
15
- - REVIEW
16
- - CURRENT
17
- - BACKLOG
18
- lists:
19
- - name: BACKLOG
20
- hidden: true
21
- ignore: false
22
- id: jea67colm3nm22s
23
- - name: TODO
24
- hidden: false
25
- ignore: false
26
- id: jea6phpllxpsj7j
27
- - name: DOING
28
- hidden: false
29
- ignore: false
30
- id: jea6phpllxpsj7k
31
- - name: DONE
32
- hidden: false
33
- ignore: false
34
- id: jea6phpllxpsj7l
35
- settings:
36
- openIn: default
37
- customOpenIn: ''
38
- editorTheme: blackboard
39
- journalType: New File
40
- journalPath: stories
41
- appendNewCardsTo: imdone-tasks.md
42
- newCardSyntax: HASHTAG
43
- replaceSpacesWith: '-'
44
- plugins:
45
- devMode: false
46
- CliBacklogPlugin:
47
- projectType: BACKLOG_PROJECT
48
- storyTemplate: |
49
- # Story id
50
-
51
- As a <role>, I want <feature>, so that <benefit>.
52
-
53
- ## Acceptance Criteria
54
-
55
- - [ ] Criteria 1
56
- - [ ] Criteria 2
57
-
58
- ## Tasks
59
-
60
- ### Phase One Tasks
61
-
62
- - [ ] Task 1
63
-
64
- ### DoD
65
-
66
- - [ ] Acceptance criteria are met
67
- - [ ] Refactoring is complete
68
- - [ ] Code builds with no error
69
- - [ ] Unit tests are written and pass
70
- - [ ] Existing Unit Tests pass
71
- - [ ] Sufficient diagnostics/telemetry are logged
72
- - [ ] Code review is complete
73
- - [ ] UX review is complete (if applicable)
74
- - [ ] Documentation is updated
75
- - [ ] The feature is merged into the develop branch
76
- - [ ] The feature is signed off by the product owner
77
- journalTemplate: ''
78
- theme: dark
79
- views: []
80
- name: backlog
81
- cards:
82
- colors: []
83
- template: |
84
-
85
- <!--
86
- #story
87
- created:${(new Date()).toISOString()}
88
- task-id:${sid}
89
- -->
90
- trackChanges: false
91
- metaNewLine: true
92
- addCompletedMeta: true
93
- addCheckBoxTasks: false
94
- doneList: DONE
95
- taskPrefix: '##'
96
- tagPrefix: '#'
97
- metaSep: ':'
98
- orderMeta: true
99
- maxLines: 6
100
- addNewCardsToTop: true
101
- defaultList: TODO
102
- defaultFilter: allTags = "story"
@@ -1 +0,0 @@
1
- # stories/**/tasks
@@ -1,71 +0,0 @@
1
- keepEmptyPriority: true
2
- code:
3
- include_lists:
4
- - TODO
5
- - DOING
6
- - DONE
7
- - PLANNING
8
- - FIXME
9
- - ARCHIVE
10
- - HACK
11
- - CHANGED
12
- - XXX
13
- - IDEA
14
- - NOTE
15
- - REVIEW
16
- - CURRENT
17
- - BACKLOG
18
- lists:
19
- - name: TODO
20
- hidden: false
21
- ignore: false
22
- id: jea6phpllxpsj7j
23
- - name: DOING
24
- hidden: false
25
- ignore: false
26
- id: jea6phpllxpsj7k
27
- - name: DONE
28
- hidden: false
29
- ignore: false
30
- id: jea6phpllxpsj7l
31
- settings:
32
- openIn: default
33
- customOpenIn: ''
34
- editorTheme: blackboard
35
- journalType: New File
36
- journalPath: tasks
37
- appendNewCardsTo: imdone-tasks.md
38
- newCardSyntax: HASHTAG
39
- replaceSpacesWith: '-'
40
- plugins:
41
- devMode: false
42
- CliBacklogPlugin:
43
- projectType: STORY_PROJECT
44
- journalTemplate: null
45
- theme: dark
46
- views: []
47
- name: Add-a-command-to-show-defaults
48
- defaultFilter: allTags = "task"
49
- cards:
50
- colors: []
51
- template: |
52
-
53
- <!--
54
- #task
55
- created:${(new Date()).toISOString()}
56
- group:"${ungroupedTasks}"
57
- story-id:${projectName}
58
- task-id:${sid}
59
- -->
60
- trackChanges: false
61
- metaNewLine: true
62
- addCompletedMeta: true
63
- addCheckBoxTasks: false
64
- doneList: DONE
65
- taskPrefix: '##'
66
- tagPrefix: '#'
67
- metaSep: ':'
68
- orderMeta: true
69
- maxLines: 6
70
- addNewCardsToTop: true
71
- defaultList: TODO