agiledigital / jiralint Goto Github PK
View Code? Open in Web Editor NEWA library and supporting CLI tool for linting deliveries, issues and people as they manifest in Jira.
A library and supporting CLI tool for linting deliveries, issues and people as they manifest in Jira.
This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
These updates are currently rate-limited. Click on a checkbox below to force their creation now.
@types/jest
, jest
)@typescript-eslint/eslint-plugin
, @typescript-eslint/parser
)@typescript-eslint/eslint-plugin
, @typescript-eslint/parser
)These updates have all been created already. Click a checkbox below to force a retry/rebase of any.
@commitlint/cli
, @commitlint/config-conventional
)@types/jest
, jest
, ts-jest
)@semantic-release/git
, semantic-release
)inquirer
, @types/inquirer
).github/workflows/build-test-release.yml
actions/checkout v3
actions/setup-node v3
actions/cache v3
cli/package.json
clear 0.1.0
clui 0.3.6
colors 1.4.0
date-fns 2.29.3
fp-ts 2.13.1
inquirer 8.2.4
io-ts 2.2.20
io-ts-types 0.5.19
monocle-ts 2.3.13
newtype-ts 0.3.5
oauth 0.10.0
readonly-types 4.5.0
string-length 4.0.2
ts-pattern 4.2.1
yargs 17.5.1
@types/clear 0.1.2
@types/clui 0.3.1
@types/inquirer 7.3.3
@types/jest 29.4.0
@types/oauth 0.9.1
@typescript-eslint/eslint-plugin 5.54.1
@typescript-eslint/parser 5.54.1
eslint 8.35.0
eslint-config-agile-digital ^2.6.0
eslint-config-prettier 8.7.0
eslint-config-typed-fp 4.4.0
eslint-plugin-functional 5.0.5
eslint-plugin-jest 27.2.1
eslint-plugin-prettier 4.2.1
eslint-plugin-sonarjs 0.18.0
eslint-plugin-total-functions 6.3.0
jest 29.5.0
prettier 2.8.4
rollup 2.79.0
rollup-plugin-cleanup 3.2.1
rollup-plugin-delete 2.0.0
rollup-plugin-typescript2 0.33.0
ts-jest 29.0.5
tsconfig-paths-webpack-plugin 4.0.0
type-coverage 2.24.1
typescript 4.9.5
node >=10
lib/package.json
colors ^1.4.0
date-fns ^2.29.3
fp-ts ^2.13.1
io-ts ^2.2.20
io-ts-types ^0.5.19
jira-client ^6.21.1
monocle-ts ^2.3.13
newtype-ts ^0.3.5
oauth ^0.10.0
readonly-types ^4.5.0
ts-pattern ^3.2.2
io-ts-reporters 2.0.1
@semantic-release/git 9.0.1
@types/jest 29.4.0
@types/jira-client 6.21.3
@types/oauth 0.9.1
@typescript-eslint/eslint-plugin 5.54.1
@typescript-eslint/parser 5.54.1
eslint 8.35.0
eslint-config-agile-digital ^2.6.0
eslint-config-prettier 8.7.0
eslint-config-typed-fp 4.4.0
eslint-plugin-functional 5.0.5
eslint-plugin-jest 27.2.1
eslint-plugin-prettier 4.2.1
eslint-plugin-sonarjs 0.18.0
eslint-plugin-total-functions 6.3.0
jest 29.5.0
prettier 2.8.4
semantic-release 19.0.5
ts-jest 29.0.5
type-coverage 2.24.1
typescript 4.9.5
ts-essentials 9.3.1
node >=10
package.json
io-ts-reporters ^2.0.1
semantic-release 19.0.5
ts-node ^10.9.1
@commitlint/cli 13.2.1
@commitlint/config-conventional 13.2.0
commitizen 4.3.0
cz-conventional-changelog 3.3.0
eslint-config-agile-digital ^2.6.0
fast-check 3.7.1
husky 7.0.4
node >=10
.nvmrc
node 16.17
Now that jiralint-pulumi is consuming the lib package from this repo via a true npm package (private; Github Package Registry), it would be good to automatically publish that package upon release of this repo (via github action, probably).
This will probably involve:
GITHUB_TOKEN
should give you permission to do this. The action at https://github.com/cycjimmy/semantic-release-action looks promising for this. If that action doesn't work, fall back on doingnpm publish
manually (https://docs.npmjs.com/cli/v6/commands/npm-publish). Ensure you're publishing to the private Github Package Registry associated with this repo, not the public npm registryIf that doesn't work, we may have to use a machine user and a corresponding PAT:
We want to break the build if:
a) the lib package is made to depend on the cli package
b) circular package dependencies are introduced in general
This might be the answer: https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-cycle.md
At some point we introduced a .jiralintrc
config file. This is cool, but I think we've accidentally broken the (now rarely used?) old command line version of the same options.
Even when I specify the host using -h
or --jira.host
, I still get:
Missing required arguments: jira.host, jira.consumerSecret
Currently one is 15 and the other is 16
In a step toward reproducible builds (or at least, less irrepreducible), we should set up an nvmrc file to try to get all devs aligned on the same node version.
This dynamic require
interacted badly with rollup and/or TypeScript, so I ripped it out and replaced it with explicit imports and function calls.
Evaluate the use of Jira Expressions instead of the current approach to fetch the data.
v3 of the plain REST APIs store descriptions as structured JSON objects instead of wikitext, so eventually a different approach (like Jira Expressions) will be necessary.
Some projects use custom description fields so that templates can be used.
Permit configuration of those description fields (a map of type -> custom field(s)) and check those as well.
Would make usage on client Jiras, etc much easier
Use the same approach as denim to authenticate.
jiralint currently only support on-prem Jira ("Jira Server"). We want to continue to benefit from it as we migrate to Jira Cloud.
Failed to decode issues [[\"Invalid value null supplied to : Readonly<Array<({ key: string, self: string, fields: ({ summary: string, description: fromNullable((string | undefined)), created: ReadonlyDate from ISO string, project: { key: string }, timetracking: fromNullable(Partial<{ originalEstimateSeconds: number, timeSpentSeconds: number, remainingEstimateSeconds: number, originalEstimate: string, timeSpent: string }>), fixVersions: ReadonlyArray<{ id: string, name: string, released: boolean }>, aggregateprogress: { progress: fromNullable((number | undefined)), total: fromNullable((number | undefined)), percent: fromNullable((number | undefined)) }, issuetype: { name: string, subtask: boolean }, status: { id: string, name: string, statusCategory: { id: fromNullable((number | undefined)), name: fromNullable((string | undefined)), colorName: fromNullable((string | undefined)) } }, comment: fromNullable((Readonly<(Readonly<{ maxResults: number, total: number, startAt: number }> & { comments: ReadonlyArray<{ id: string, author: fromNullable(({ name: fromNullable((string | undefined)) } | undefined)), body: string, created: ReadonlyDate from ISO string, updated: ReadonlyDate from ISO string }> })> | undefined)), worklog: fromNullable((Readonly<(Readonly<{ maxResults: number, total: number, startAt: number }> & { worklogs: ReadonlyArray<{ author: { name: fromNullable((string | undefined)) }, started: ReadonlyDate from ISO string, timeSpentSeconds: number, comment: fromNullable((string | undefined)) }> })> | undefined)), duedate: fromNullable((DateFromISOString | undefined)) } & Partial<{ aggregatetimeestimate: fromNullable((number | undefined)), aggregatetimeoriginalestimate: fromNullable((number | undefined)), aggregatetimespent: fromNullable((number | undefined)), parent: { id: string, key: string } }> & Readonly<{ [K in string]: unknown }>), changelog: fromNullable({ histories: ReadonlyArray<{ id: string, author: { name: fromNullable((string | undefined)) }, created: ReadonlyDate from ISO string, items: ReadonlyArray<{ field: string, fieldtype: string, from: (string | null), fromString: (string | null), to: (string | null), toString: (string | null) }> }> }) } & { fields: { assignee: { accountId: string, displayName: string } } })>>/0: ({ key: string, self: string, fields: ({ summary: string, description: fromNullable((string | undefined)), created: ReadonlyDate from ISO string, project: { key: string }, timetracking: fromNullable(Partial<{ originalEstimateSeconds: number, timeSpentSeconds: number, remainingEstimateSeconds: number, originalEstimate: string, timeSpent: string }>), fixVersions: ReadonlyArray<{ id: string, name: string, released: boolean }>, aggregateprogress: { progress: fromNullable((number | undefined)), total: fromNullable((number | undefined)), percent: fromNullable((number | undefined)) }, issuetype: { name: string, subtask: boolean }, status: { id: string, name: string, statusCategory: { id: fromNullable((number | undefined)), name: fromNullable((string | undefined)), colorName: fromNullable((string | undefined)) } }, comment: fromNullable((Readonly<(Readonly<{ maxResults: number, total: number, startAt: number }> & { comments: ReadonlyArray<{ id: string, author: fromNullable(({ name: fromNullable((string | undefined)) } | undefined)), body: string, created: ReadonlyDate from ISO string, updated: ReadonlyDate from ISO string }> })> | undefined)), worklog: fromNullable((Readonly<(Readonly<{ maxResults: number, total: number, startAt: number }> & { worklogs: ReadonlyArray<{ author: { name: fromNullable((string | undefined)) }, started: ReadonlyDate from ISO string, timeSpentSeconds: number, comment: fromNullable((string | undefined)) }> })> | undefined)), duedate: fromNullable((DateFromISOString | undefined)) } & Partial<{ aggregatetimeestimate: fromNullable((number | undefined)), aggregatetimeoriginalestimate: fromNullable((number | undefined)), aggregatetimespent: fromNullable((number | undefined)), parent: { id: string, key: string } }> & Readonly<{ [K in string]: unknown }>), changelog: fromNullable({ histories: ReadonlyArray<{ id: string, author: { name: fromNullable((string | undefined)) }, created: ReadonlyDate from ISO string, items: ReadonlyArray<{ field: string, fieldtype: string, from: (string | null), fromString: (string | null), to: (string | null), toString: (string | null) }> }> }) } & { fields: { assignee: { accountId: string, displayName: string } } })/1: { fields: { assignee: { accountId: string, displayName: string } } }/fields: { assignee: { accountId: string, displayName: string } }/assignee
Some ideas:
Add a new rule that will fail if an In Progress not stalled ticket hasn't been worked (as evidenced) by a worklog in the last business day.
Our current comment checking rule requires a comment if:
A conceptually simpler rule is to require a comment whenever time has been logged. i.e a comment must be added "around" the same time that a worklog is added.
The check would look at:
the rule would pass if the comment was <1d before the worklog or after it.
What makes it non-trivial is that worklogs and comments are both paginated fields, so they may be truncated. Issues are currently retrieved using the search API. We need to do one of:
On my screen the Sign only showed the first letter.
being able to pick or truncate the columns would be nice to have.
Some projects use the Epic link to tie work to a milestone or base camp, and should have an epic link before the work enters the board.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.